C51单片机知识总结
单片机I/O口的使用
51单片机总共有P0、P1、P2、P3四个8位双向输入输出端口,每个端口都有锁存器、输出驱动器和输入缓冲器。4个I/O端口都能作输入输出口用,其中P0和P2通常用于对外部存储器的访问。
在无片外扩展存储器的系统中,这4个端口的每一位都可以作为准双向通用I/O端口使用。在具有片外扩展存储器的系统中,P2口作为高8位地址线,P0口分时作为低8位地址线和双向数据总线。
下图为P0口的某位P0.n(n=0~7)结构图,它由一个输出锁存器、两个三态输入缓冲器和输出驱动电路及控制电路组成。从图中可以看出,P0口既可以作为I/O用,也可以作为地址/数据线用。①输出时CPU发出控制电平“0”封锁“与”门,将输出上拉场效应管T1截止,同时使多路开关MUX把锁存器与输出驱动场效应管T2栅极接通。故内部总线与P0口同相。由于输出驱动级是漏极开路电路,若驱动NMOS或其它拉流负载时,需要外接上拉电阻。P0的输出级可驱动8个LSTTL负载。②输入时----分读引脚或读锁存器读引脚:由传送指令(MOV)实现;下面一个缓冲器用于读端口引脚数据,当执行一条由端口输入的指令时,读脉冲把该三态缓冲器打开,这样端口引脚上的数据经过缓冲器读入到内部总线。读锁存器:有些指令如:ANLP0,A称为“读-改-写”指令,需要读锁存器。上面一个缓冲器用于读端口锁存器数据。**原因:如果此时该端口的负载恰是一个晶体管基极,且原端口输出值为1,那么导通了的PN结会把端口引脚高电平拉低;若此时直接读端口引脚信号,将会把原输出的“1”电平误读为“0”电平。现采用读输出锁存器代替读引脚,图中,上面的三态缓冲器就为读锁存器Q端信号而设,读输出锁存器可避免上述可能发生的错误。**P0口必须接上拉电阻;在读信号之前数据之前,先要向相应的锁存器做写1操作的I/O口称为准双向口;三态输入缓冲器的作用:(ANLP0,A)准双向口:从图中可以看出,在读入端口数据时,由于输出驱动FET并接在引脚上,如果T2导通,就会将输入的高电平拉成低电平,产生误读。所以在端口进行输入操作前,应先向端口锁存器写“1”,使T2截止,引脚处于悬浮状态,变为高阻抗输入。这就是所谓的准双向口。在系统扩展时,P0端口作为地址/数据总线使用时,分为:P0引脚输出地址/数据信息。CPU发出控制电平“1”,打开“与”门,又使多路开关MUX把CPU的地址/数据总线与T2栅极反相接通,输出地址或数据。由图上可以看出,上下两个FET处于反相,构成了推拉式的输出电路,其负载能力大大增强。P0引脚输出地址/输入数据输入信号是从引脚通过输入缓冲器进入内部总线。此时,CPU自动使MUX向下,并向P0口写“1”,“读引脚”控制信号有效,下面的缓冲器打开,外部数据读入内部总线。1.P2口作为普通I/O口CPU发出控制电平“0”,使多路开关MUX倒向锁存器输出Q端,构成一个准双向口。其功能与P1相同。2.P2口作为地址总线在系统扩展片外程序存储器扩展数据存储器且容量超过256B(用MOVX@DPTR指令)时,CPU发出控制电平“1”,使多路开关MUX倒内部地址线。此时,P2输出高8位地址。P1口、P3口的内部结构①P1口的一位的结构它由一个输出锁存器、两个三态输入缓冲器和输出驱动电路组成----准双向口。一、作为通用I/O口与P1口类似----准双向口(W=1)二、二、P3第二功能(Q=1)此时引脚部分输入(Q=1、W=1),部分输出(Q=1、W输出。综上所述:当P0作为I/O口使用时,特别是作为输出时,输出级属于开漏电路,必须外接上拉电阻才会有高电平输出;如果作为输入,必须先向相应的锁存器写“1”,才不会影响输入电平。当CPU内部控制信号为“1”时,P0口作为地址/数据总线使用,这时,P0口就无法再作为I/O口使用了。P1、P2和P3口为准双向口,在内部差别不大,但使用功能有所不同。P1口是用户专用8位准双向I/O口,具有通用输入/输出功能,每一位都能独立地设定为输入或输出。当有输出方式变为输入方式时,该位的锁存器必须写入“1”,然后才能进入输入操作。P2口是8位准双向I/O口。外接I/O设备时,可作为扩展系统的地址总线,输出高8位地址,与P0口一起组成16位地址总线。对于8031而言,P2口一般只作为地址总线使用,而不作为I/O线直接与外部设备相连P3第二功能各引脚功能定义:P3.0:RXD串行口输入P3.1:TXD串行口输出P3.2:INT0外部中断0输入P3.3:INT1外部中断1输入P3.4:T0定时器0外部输入P3.5:T1定时器1外部输入P3.6:WR外部写控制P3.7:RD外部读控制寄存器
中断系统
引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。80C51的中断系统有5个中断源(8052有6个),2个优先级,可实现二级中断嵌套。
1、(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。2、(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。3、TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。
4、TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断。
5、RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。二、中断请求标志1、TCON的中断标志
IT0(TCON.0),外部中断0触发方式控制位。当IT0=0时,为电平触发方式。
当IT0=1时,为边沿触发方式(下降沿有效)。IE0(TCON.1),外部中断0中断请求标志位。IT1(TCON.2),外部中断1触发方式控制位。IE1(TCON.3),外部中断1中断请求标志位。
TF0(TCON.5),定时/计数器T0溢出中断请求标志位。TF1(TCON.7),定时/计数器T1溢出中断请求标志位。2、SCON的中断标志
RI(SCON.0),串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。注意,RI必须由软件清除。
TI(SCON.1),串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI。CPU响应中断时,不能自动清除TI,TI必须由软件清除。
380C51中断的控制一、中断允许控制
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。EX0(IE.0),外部中断0允许位;
ET0(IE.1),定时/计数器T0中断允许位;EX1(IE.2),外部中断0允许位;ET1(IE.3),定时/计数器T1中断允许位;ES(IE.4),串行口中断允许位;
EA(IE.7),CPU中断允许(总允许)位。二、中断优先级控制
80C51单片机有两个中断优先级,即可实现二级中断服务嵌套。每个中断源的中断优先级都是由中断优先级寄存器IP中的相应位的状态来规定的。PX0(IP.0),外部中断0优先级设定位;PT0(IP.1),定时/计数器T0优先级设定位;PX1(IP.2),外部中断0优先级设定位;PT1(IP.3),定时/计数器T1优先级设定位;PS(IP.4),串行口优先级设定位;
PT2(IP.5),定时/计数器T2优先级设定位。
而80C52单片机有四个中断优先级,即可实现四级中断服务嵌套。每个中断源的中断优先级由中断优先级寄存器IP和IPH中的相应位的状态来规定的。PX0(IPH.0),外部中断0优先级设定位;PT0(IPH.1),定时/计数器T0优先级设定位;PX1(IPH.2),外部中断0优先级设定位;PT1(IPH.3),定时/计数器T1优先级设定位;PS(IPH.4),串行口优先级设定位;
PT2(IPH.5),定时/计数器T2优先级设定位。
同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:80C51单片机的中断优先级有三条原则:
CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。正在进行的低优先级中断服务,能被高优先级中断请求所中断。为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器。其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求。中断响应条件中断源有中断请求;此中断源的中断允许位为1;CPU开中断(即EA=1)。
以上三条同时满足时,CPU才有可能响应中断。80C51的定时/计数器
实现定时功能,比较方便的办法是利用单片机内部的定时/计数器。也可以采用下面三种方法:软件定时:软件定时不占用硬件资源,但占用了CPU时间,降低了CPU的利用率。
采用时基电路定时:例如采用555电路,外接必要的元器件(电阻和电容),即可构成硬件定时电路。但在硬件连接好以后,定时值与定时范围不能由软件进行控制和修改,即不可编程。
采用可编程芯片定时:这种定时芯片的定时值及定时范围很容易用软件来确定和修改,此种芯片定时功能强,使用灵活。在单片机的定时/计数器不够用时,可以考虑进行扩展。
扩展阅读:51单片机初学知识点总结
51单片机初学知识点总结
经过这半个月的学习,我对于单片机的定时器、对I/O口的随意操作、输入检测、中断(定时器的中断、单片机的外部中断)、串口通信等几大学习模块有了一定了解和掌握。
1.软件。我主要是在keiluvision3实现用C语言进行编程和调试。使用keil时,新建或者打开已有文件,按步骤一步步来,漏掉哪一步都会影响最后程序是否能顺利写入单片机中。其中应注意保存C文档、添加文件到工程中和建立hex文档这几个关键步骤。
2.发光二极管和数码管的显示。发光二极管的静态显示是学习单片机的入门路标。分析相关模块的电路图,弄清楚引脚连接情况,根据电路图直接控制LED引脚电位的高低就能实现对相应LED亮灭的控制。了解后完成走马灯(流水线)或更多其他规则的LED显示。数码管的显示较LED稍微复杂一点点,它分位选和段选,位选控制整个数码管的亮灭,段选控制各数码管以何种形式亮或灭。数码管的显示分三步:(1).全部数码管显示一样的字符;(2).选定的数码管以规定的形式亮;(3).数码管的动态显示。其中利用定时器或者延时程序控制数码管动态显示的频率,以调节其显示亮度和视觉稳定度。
用延时函数完成动态扫描:while(1){D1=nn/100;D2=nn%100/10;D3=nn%10;P1=0x01;P0=tab[D1];delay(10);P1=0x02;P0=tab[D2];delay(10);P1=0x04;P0=tab[D3];delay(10);}
延时子程序:voiddelay(x)//延时1ms子程序
{unsignedchary;while(x--){for(y=110;y>0;y--);}
}3.定时/计数器。编号中断源0外部中断0(INT0)中断标志位终端服务程序入口优先级IE00003H最高1234定时/计数器0(T0)TF0外部中断1(INT1)串口IE1RI或TI定时/计数器1(T1)TF1000BH0013H001BH0023H次之次之次之最低关于定时/计数器的两个特殊功能寄存器TMOD用于T1GATETCON用于定时/计数器TF1TR1TF0TR0IE1说明13位T/C16位T/C8位自动重装T/CT0分成两个独立的8位T/C,T1停止M1M0:工作方式设置位M1M0工作方式001101010123用于中断IT1IE0IT0C/TM1M0GATE用于T0C/TM1M0GATE:门控位。GATE=0,用软件使TR0或TR1为1,就能启动定时/计数器;GATE=1,用软件使TR0或TR1为1,同事外部中断引脚也为高,启动。我们一般置GATE=0。C/T=0,位定时器;C/T=1,位计数器。
对于定时时间的计算:t计数值N机器周期TN121focs或:要定时时间t=(65536-x)*(12/晶振频率)
定时/计数器初始化步骤:
(1)根据上面的信息,对TMOD赋初值,确定T0、T1的工作方式。(2)计算初值,将其写入TH0、TL0或TH1、TL1。(3)为中断方式时,对IE赋值,开放中断。(4)使TR0或TR1置高,启动定时/计数器。例:
TMOD=0x01;//T0处于工作方式1,为十六位定时/计数器TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;
TR0=1;//T0初始化完毕定时子程序:
voidtimer0()interrupt1//定时子程序{TH0=(65536-50000)/256;TL0=(65536-50000)%256;aa++;if(aa==10)
{}
aa=0;
}4.键盘。单片机键盘分独立键盘和矩阵键盘两类,矩阵键盘涉及键盘扫描程序。而与键盘按下有关的程序就要注意到消除抖动和松手检测两个重要的细节。松手检测原理是,当键按下时,key2为低,!key2=1,此时程序一直在while语句里面循环,无法跳出来,一旦松手,key2为高,程序即可跳出while循环,执行下面接下来的语句。
if(key2==0)
{delay(5);//延时5msif(key2==0)//确定key2键的确按下,,消抖{while(!key2);//松手检测}}
5.串口通信。串行通信的传输速率用波特率表示。波特率定义为:每秒发送二进制数码的位数,单位为“bps”。波特率的计算公式:
方式0的波特率=12SMOD方式1的波特率=(2方式2的波特率=(2SMODfosc)(T1溢出率)32)f64osc)(T1溢出率)32SMOD2方式3的波特率=(其中,T1溢出率=fosc12256-TH17698H。
串行口控制寄存器SCONSCON
其中SM0与SM1为串行口工作方式选择位SM0SM1工作方式功能0011010101238位同步移位方式波特率543210(98H)RISM0SM1SM2RENTB8RB8TIfosc1210位异步收发器(UART)可变11位异步收发器(UART)fosc32或fosc6412位异步收发器(UART)可变
(1)51单片机串行口工作方式0实质是并行的工作方式,为同步的移位输出和输入,但要实现工作方式0必须要借助外接移位寄存芯片,实际应用中常用作并行I/O口得扩展。它的波特率固定,且数据传送是以8位数为一帧,没有起始和停止位。。
(2)我主要研究学习了串行口工作方式1,它的数据格式是:一个起始位,8个数据位和一个停止位。设fosc=11.0592MHz,波特率为9600,则根据上面的公式,SMOD=0时,TH1=TL1=0xfd;SMOD=1时,TH1=TL1=0xfa。
(3)工作方式2和3的帧格式一样,与工作方式1的类似,只是在原基础上多加了一位内容由用户决定的数据位。工作方式2的波特率与PCON个SMOD位有关。SMOD=1时,波特率为
fosc32,SMOD=0时,波特率为
fosc64。
电源控制寄存器PCON(它不能位寻址)PCON797H6543210SMODSMOD为波特率倍增位。SMOD=1时,波特率增加一倍;复位时,SMOD=0。
REN是允许接收控制位:REN=1时允许接收数据;REN=0时禁止接收数据。
TI是发送中断标志位:当发送完一帧数据后,该位由单片机自动置1,向CPU发送中断请求信号。在中断服务程序中,必须用软件将其清0.
RI是接收中断标志位:与TI类似,接收完一帧后自动被置1,需由软件置0.6.液晶显示。常见的单片液晶显示屏分16引脚和20引脚两种,我使用的是16引脚的YJD1602A-2。安装LCD时按如下三步走:(1)关闭开发板电源。(2)下载一个关闭数码管个流水灯的程序进单片机。(3)顺时针旋转相应电位器以调节LCD的对比度,知道看到5*7点阵。功能读状态读数据写数据输入RS=L,RE=H,E=HRS=H,RW=H,E=HRS=H,RW=L,D0~D7=数据,E=高脉冲输出D0~D7=状态字无D0~D7=数据无写指令RS=L,RW=L,D0~D7=指令码,E=高脉冲这四种功能里面,读状态与读数据实用性不大,我们学习单片机时主要联系写指令和写数据,所以我们对RW置高,给E高脉冲,5引脚直接接地。
关于数据指针:显示模式:0x38控制信号RS0控制位DLR/W0指令代码D70D60D51D4D3D2FD10说明D00DLN具体设置表为:控制信号功能DL=0DL=1NFN=0N=1F=0接口总线为4位长度(仅D7~D4有效),8位数据与指令代码按先高后低位的方向分两次传输显示1行字符行显示2行字符行5*7字符体LCD与单片机接口形式。(数据的传输方式)接口总线为8位长度(D7~D0有效)F=15*10字符体显示开关及光标:00001DCB
D1开显示0关显示C显示光标不显示光标B光标闪烁光标不闪烁
00001NS10当读/写一个字节后地址指针减一,且光标减一N当读/写一个字节后地址指针加一,且光标加一S当写一个字符,(N=1)整屏左移,当写一个字符,整屏显示不(N=1)整屏左移移动清屏:指令代码0x01。执行此指令,HD44780将DDRAM的数据全部写入“空白”
的代码,清除所显示的内容,同事光标移到左上角。
光标归位:指令代码0x02或0x03。AC(地址计数器)的值被清“0”,但是DDRAM(显示数据存储器)的逐句不变,光标移到左上角。
移动光标:
控制信号0
其中S/C和R/L的取值控制光标或字符的左右移动:控制位S/C0011写指令函数:
voidwrite_com(ucharcom){
rs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}
写数据函数:
voidwrite_date(uchardate){
R/L01010x100x140x180x1c指令代码说明光标左移光标右移字符左移字符右移0000指令代码D2D1D01S/CR/L------RSR/WD7D6D5D4Drs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}
7.IIC总线。
IIC总线是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。IIC总线在数据传送过程中有四种类型信号,他们分别是:起始信号、终止信号、应答信号和非应答信号。
起始信号:SCL为高时,SDA有一个下降跳变。起始信号由主机产生。voidstart()//起始信号{
sda=1;
delay();//5us就够了,所以这里只需一个指令周期scl=1;delay();sda=0;delay();}
终止信号:SCL为高时,SDA有一个上升跳变。终止信号也只能由主机产生。voidstop()//终止信号{
sda=0;delay();scl=1;delay();sda=1;delay();}
应答信号:IIC总线传送时每字节为8位,从机在接收到一个字节的数据后,在第9位以低电平作为应答信号,,同时要求主机在第9个时钟脉冲位上释放SDA线,以便从机发出应答信号,将SDA拉低,表示接收数据的应答
voidrespons()//应答信号{
sda=0;delay();scl=1;delay();scl=0;delay();}非应答信号:主机在第9位接收到非应答信号,则表示停止数据的发送或接收。
voiddisrespons()//非应答信号{
sda=1;delay();scl=1;delay();scl=0;delay();}移位操作:
左移:最低位补0,最高位移入PSW的CY位右移:最高位补0,最低位移除
器件地址:高四位固定,最低位决定读/写,另外A0~A2位与从机和总线的接法有关。
1010A2A1A0R/W=0,写R/E=1,读主机进行写操作时,首先由主机发送起始信号,接着是高四位固定为1010而最低位位0的写器件地址,从机发送应答信号后,主机发送写数据地址,从机再次应答之后主机就可以发送数据了,接着从机发送应答信号或者非应答信号之后主机发送终止信号,如下图所示。
主机进行读操作时,首先由主机发送起始信号,接着是高四位固定为1010而最低位位0的写器件地址,从机发送应答信号后,主机发送写数据地址,从机再次应答之后主机再次发送起始信号,接着是高四位固定为1010而最低位位1的读器件地址,从机应答之后就可以读数据了,接着主机发送应答信号或者非应答信号之后主机发送终止信号,如下图。
心得体会:
以上是我根据这半个月学习的单片机知识和编写程序时的程序文档笔记整理的重要知识点和一些经常会用到的基本子函数。学习单片机的这半个月里,我由开始时想一口吃成胖子的急躁心理慢慢调整为了平心静气,循序渐进的学习心态。我是跟着单片机相关的学习视频在学习,而只是跟着视频里面老师的讲解听的话,理解的总不会那么透彻,记忆也不会很深刻,只有举一反三的学习视频资料里面的内容加上自己亲手进行编程与调试后才能更好地掌握所学的知识。在进行C语言编程过程中一定要认真仔细,并注意养成良好的变成习惯,尽量保持程序工整明了,这也方便在出现问题时进行纠错和改错。
友情提示:本文中关于《C51单片机知识总结》给出的范例仅供您参考拓展思维使用,C51单片机知识总结:该篇文章建议您自主创作。
来源:网络整理 免责声明:本文仅限学习分享,如产生版权问题,请联系我们及时删除。