51单片机的学习总结
经过一个学期的51单片机的学习,对于51单片机有了很大的理解。
由于我学的是汇编语言,实验也是用的汇编语言。
首先对于51单片机要了解他的内部结构。
一个8位的CPU,一个片内振荡器及时钟电路;
4KB的ROM程序存储器,128字节RAM数据存储器;
32条可编程的I/O线(P0、P1、P2、P3);
两个16位的定时/计数器;
5个中断源、两个优先级嵌套中断结构。
一、32条可编程的I/O线及其它引脚
它有4个8位并行I/O端口,分别是P0、P1、P2、P3口,下面分别讲述。
1.1P0口结构(最强驱动8个ISTTL输入)
1.1.1P0口作I/O口--准双向口--普通I/O口
a)I/O口输出:需要上拉电阻。
b)I/O口输入:读引脚的时候--必须先向锁存器写“1”,也就是高电平;
读锁存器的时候--只有“读-改-写”指令的时候,才读取锁存器,例如ANL PO,A;
1.1.2 P0口的第二功能
c)P0口作为DB(数据总线)/AB(A7-A0)低8位(地址总线)--分时复用 MOVX指令
1.2 P1口结构–作普通I/O口使用,无条件
1.3 P2口结构
1.3.1 P2口作I/O口--准双向口--普通I/O口
1.3.2 P2口的第二功能
d)作为地址总线AB(A15-A8)的高8位
1.4 P3口结构
1.4.1 P3口作I/O口–准双向口–普通I/O口无条件
1.4.2 P3口的第二功能
P3.0—RXD串口接收
P3.1—TXD串口发送
P3.2—INT0外部中断0
P3.3—INT1外部中断1
P3.4—T0硬启动,计数输入
P3.5—T1硬启动,计数输入
P3.6—WR—写RAM
P3.7—RD—读RAM
1.5其它引脚的理解
1.5.1
VCC:电源端接+5V;VSS:接地端;
XTAL1:外部晶体的一个引脚,CHMOS单片机采用外部时钟信号的时候,由此接入;XTAL2::外部晶体的另一个引脚,HMOS单片机采用外部时钟信号的时候,由此接入。
RST/VPD:1.复位信号的输入,2.VCC掉电后,此引脚可以接备用电源,保持RAM中的数据。
EA/VPP:EA=0,单片机访问外部ROM,EA=1的时候,单片机访问内部ROM。
ALE/PROG:第一个是作为地址锁存器允许,这里口直P0低八位地址总线AB的允许,ALE输出的频率为时钟频率的1/6。
PSEN:外部程序存储器ROM的选通信号,与OE相连。
二、51单片机的中断系统
首先理解什么是中断:面对于突发的事件发生的时候,向COU提出请求,CPU暂停正在执行的程序转而为该外设服务(或者处理紧急事件),处理完后返回到原点继续执行源程序;然后,能够实现中断功能并且对中断继续管理的硬件和软件称为中断系统。
两级中断,遵循自然优先级,优先级从上到下
2.1 理解中断源
中断 名称 中断引起的原因 中断入口
INT0 外部中断0 P3.2引脚的低电平或下降沿信号 0003H
T0 定时器0中断 TF0=1 000BH
INT1 外部中断1 P3.3引脚的低电平或下降沿信号 0013H
T1 定时器1中断 TF1=1 001BH
TI/RI 串行口中断 TI=1/RI=1
2.2中断控制寄存器IE(可位操作)
例如:SETB EA;SETB ES;开总中断,开串口中断
2.3中断优先级管理寄存器IP(可位操作)
需要将低级中断设置成为高级中断,优先响应
SETB PS;将串口拉到高级中断
SETB PT1;将T1拉到高级中断
高级中断仍然遵循自然优先级
2.4中断请求标志及外部中断方式选择寄存器
1)TCON(可位操作)
TF1\TF0:在查询方式下,必须手动清0,利用JBC指令最好;在中断方式下,响应中断时候自动清0。
IE1\IE0:在低电平的方式下,必须手动清0;在下降沿触发的方式下,响应中断的时候自动清0。
IT1\IT0: IT1\IT0=0,低电平方式触发,不设置的话为默认; IT1\IT0=1,下降沿方式触发。
2)SCON(可位操作)
TI/RI:无论是查询模式下还是中断方式下,都必须手动清0;
2.5中断响应的过程
中断请求标志TCON、SCON—中断控制寄存器IE—中断优先级管理寄存器IP—高级中断请求—低级中断请求
2.6中断程序设计
1)设置中断入口地址
2)开总中断EA,开中断允许位
3)外部中断选择触发方式
4)为多个中断源设置中断优先级(可选)
5)编写中断服务程序,注意保护现场和恢复现场
三、中断应用程序
3.1 编程例题1
用中断的方法设计秒计时脉冲发生器,即由8051的P1.0每秒钟产生一个机器周期的正脉冲,由P1.1每分钟产生一个机器周期的正脉冲。
解:假设系统时钟脉冲为6MHZ,由定时器T0完成,在方式1的条件下工作,最大定时时间为655362us=131.096ms,所以定时为100ms,10次定时为1秒钟,60次1秒为1分钟,使用定时器方式一需要重装初值。
ORG 0000H
AJMP MAIN
ORG 000BH
AIMP L0
ORG 0030H
MAIN:
MOV TH0,#3CH
MOV TL0,#0B0H
MOV TMOD,#01H
SETB TR0
SETB ET0
SETB EA
CLR P1.0
CLR P1.1
MOV R1,#60
MOV R2,#10
SJMP $
L0:
MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ R2,L1
SETB P1.0
CLR P1.0
MOV R2,#10
DJNZ R1,L1
SETB P1.1
CLR P1.1
MOV R1,#60
L1:
RETI
3.2 编程例题2
用定时器中断技术设计一个秒闪电路,其功能是使发光二极管LED每秒钟闪亮400ms,设系统主频为6MHZ。
解:LED每秒钟亮400ms,则有600ms灭,则需要定时器T1,工作方式1,定时时间为100ms,400ms4次,600ms6次。初值的计算C=65536-100ms/2us=15536=3CB0H.
ORG 0000H
AJMP MAIN
ORG 001BH
AIMP L1
ORG 0030H
MAIN:
MOV TH1,#3CH
MOV TL1,#0B0H
MOV TMOD,#10H
SETB TR1
SETB ET1
SETB EA
SETB P1.1
MOV R1,#00H
SJMP $
L1:
MOV TH1,#3CH
MOV TL1,#0B0H
INC R1
CJNE R1,#04H,NEXT
CLR P1.1
AJMP L2
NEXT:
CJNE R1,#0AH,L2
SETB P1.1
MOV R1,#00H
L2:
RETI
四、单片机的定时计数器
4.1定时/计数器的方式寄存器TMOD(不可位操作)
GATE=0软启动,GATE=1,硬启动,由P3.2INT0或者P3.3INT1控制,高电平计数
C/T:C/T=1计数;C/T=0定时。
M1M0:工作方式的选择
00 工作方式0(13位)
01 工作方式1(16位)
10 工作方式2(8位自动重装初值)
11 工作方式3(T0为2个8位方式)
一般使用的是工作方式1(131.072ms 主频为6MHZ时)
工作方式2(512us 主频为6MHZ时)
4.2 定时/计数器的控制寄存器TCON(可位操作)
4.3定时/计数初值的计算
a)定时初值的计算:C=2N-定时/Tcyc Tcyc=12/系统的主频
b)计数初值的计算:C=2N-X(个数)
4.4定时/计数的编程
a)计算初值,装初值;
b)确定TMOD的工作方式;
c)启动定时/计数器。
五、定时/计数器的应用
5.1 定时/计数编程1
1.知道8051单片机系统的主频为6MHZ,试利用定时器T0和P1口输出矩形脉冲。
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV TH0,#0ECH
MOV TL0,#0ECH
MOV TMOD,#02H
SETB TR0
CLR P1.0
NEXT:
MOV R0,#09
SETB P1.0
WAIT:
JNB TF0,$
CLR TF0
DJNZ R0,WAIT
AJMP NEXT
5.2 定时/计数编程2
2.要求用8051单片机的定时值内部RAM的20H单元的内容为条件而改变;当(20H)=00H时,定时值为10ms,当(20H) =10H时,定时值为20ms,编写。
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV A,20H
CJNE A,#00H,NEXT1
MOV TH0,#0ECH
MOV TL0,#78H
MOV TMOD,#01H
SETB TR0
NEXT:
CJNE A,#01H,L0-END
MOV TH0,#0D8H
MOV TL0,#0F0H
MOV TMOD,#01H
SETB TR0
WAIT:
JBC TF0,$
AJMP NEXT
L0-END:
RET
5.3 定时/计数编程3
3.试用定时器T1设计外部事件计数器,要求每一万个脉冲,就将T1转为10ms定时,当定时到后又转为计数方式,如此反复,设系统的主频为6MHZ,方式1。
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV TH1,#0D8H
MOV TL1,#0F0H
MOV TMOD,#50H
SETB TR1
WAIT1:
JBC TF0,NEXT
AJMP WAIT1
NEXT:
MOV TH1,#0ECH
MOV TL1,#78H
MOV TMOD,#10H
WAIT2:
JBC TF0,MAIN
AJMP WAIT2
六、串行接口
6.1串口控制寄存器SCON(可位寻址)
SM0\SM1:作为串口工作方式的选择;
REN:串行接收允许位,0禁止接收,1允许接收,在接收机的时候需要设置为1;
TB8:在方式2和方式3中,TB8是发送机要发送的第9位数据;
RB8:在方式2和方式3中,RB8是接收机收到的第9位数据,该数据来自发送机的TB8;
TI: 发送中断的标志位,发送完一帧完必须手动清0,进行下一次的发送;
RI:接收中断的标志位,接收完一帧完必须手动清0,进行下一次的接收;
SM2:多机通信控制位。
6.2串口的工作方式
方式0:SM0/SM1=00,8位数据,波特率的计算=Fosc/12(Fosc为外部晶振频率);
方式1:SM0/SM1=01,10位波特率异步通信,1位起始位0,8个数据位,1位终止位1,它的波特率可变,跟定时器T1的溢出率有关,T1必须要工作在方式2,波特率=(2SMOD/32)xFosc/(12(256-X));
方式2:SM0/SM1=10,11位异步通信,1位起始位0,9个数据位,1位终止位1,第9个数据可作为校验位,波特率的计算=2SMODxFosc/64;
方式3:SM0/SMI=11,11位异步通信,1位起始位0,9个数据位,1位终止位1,第9个数据可作为校验位,波特率可变,与定时器 T1的定时器有关,T1必须要工作在方式2,
波特率= (2*SMOD/32)xFosc/(12(256-X));
注意:当串口工作在方式1和方式3的时候,T1不可以在用来作为定时,因为T1作为波特率稳定发生,如果再用来定时,就会造成不稳定。
6.3串口的编程运用
1)选择好串口的工作方式,定好波特率;
2)对于SCON进行设置,将TI、RI清0,如果接收的时候,将REN=1;
3)用查询方式还是中断方式。
6.3.1编程例题
设计一个8051单片机的双机通讯系统,并编写程序将A机片内RAM40H—5FH的数据块,通过串口发送B机片内RAM60H—7FH。
解:分析:首先,两个机子需要进行通讯,那么波特率必须要设置一样,其次,选择工作方式1,波特率自己设置。
A机查询的方法:
MOV TL1,#0F3H
MOV TH1,#0F3H
MOV TMOD,#20H
SETB TR1
MOV SCON,#40H;工作方式1,SM0/SM1=01,就是0100 0000H=40H
MOV R0,#40H;开始需要传输数据的地址,可以用R0来间址
NEXT:
CLR TI
MOV A,@R0
INC R0
MOV SUBF,A
JNB TI,$
CJNE R0,#60H,NEXT;判断是否结束,如果到了60H就说明已经发送完
AJMP $;发送完,动态停机
B机查询的方法
MOV TL1,#0F3H
MOV TH1,#0F3H
MOV TMOD,#20H
SETB TR1
MOV SCON,#50H;工作方式1,SM0/SM1=01,开REN允许位就是0101 0000H=50H
MOV R0,#60H;开始需要存储数据的地址,可以用R0来间址
NEXT:
CLR RI
JNB RI,$
MOV A,SUBF
MOV @R0,A
INC R0
CJNE R0,#80H,NEXT;判断是否结束,如果到了80H就说明已经存储完
AJMP $;发送完,动态停机
A机使用串口中断的方法
ORG 0000H
AJMP MAIN
ORG 0023H
AIMP L0
ORG 0030H
MAIN:
MOV TH1,#0E6H
MOV TL1,#0E6H
MOV TMOD,#20H
SETB TR1;对于T1的初始化
MOV SCON,#40H
CLR TI
SETB ES
SETB EA;对于串口的初始化
MOV R0,#20H
MOV A,@R0
MOV SBUF,A;对于第一个数据传输准备,并且发送
SJMP $
L0:
INC R0
CJNE R0,#60H,NEXT;判断是否发送结束,没有结束就进行发送
CLR EA;发送结束,关闭中断响应
AJMP L0-END
NEXT:
CLR TI;进行下一次发送做准备
MOV A,@R0
MOV SBUF,A
L0-END:
RETI
七、总线与系统扩展
7.1 单片机的外部扩展
首先,关于外部扩展有存储扩展、I/O扩展、T/C扩展、中断系统的扩展,其中存储扩展包括了ROM和RAM的扩展,重点掌握。
其次,扩展的原则—三总线原则
1)数据线与数据线相连接(P0口)
2)地址线与地址线相连接(P0口接锁存器低8位,P2口高8位地址线)
注意1:P0口通过接锁存器,为了确定使用的是地址线,而不是数据线
3)控制线与外部芯片控制线相连
注意2:常用的控制线有WR\RD外扩RAM的时候,由于RAM可以写和读,所以WR和外部RAM的WR连接,RD和外部RAM的RD连接,汇编使用的是MOVX指令。
注意3: PSEN外扩ROM的时候,由于ROM只可以读操作,所以PSEN和外部ROM的OE连接,汇编使用的是MOVC指令。
注意4:ALE—用于控制锁存器使得P0口使用的是地址总线低8位地址,接线的时候,与外接地址锁存器的门控端相连。
7.2 外扩芯片地址的确定
外扩芯片的地址=地址线(字选)+片选线共同决定
明确一个概念,地址总线是CPU的AB=P2口的高8位和P0口经过锁存器的低8位共同组成
7.2.1 地址线也称为字选,这个是芯片的容量,它包括了本芯片自带多少根地址线,比如8Kx8RAM—13根地址线,1K=2的10次方,8K就是2的13次方,就是13根地址线,x8这个是多少位,一般都是8位的数据,用P0口就可以了,这个一般不用管,我们的目的就是从这个芯片中看它自己带多少个地址线,可以得出有13根地址线A12-A0;
另一个例子4Kx8 可以直接得出它有12根地址线,A11-A0。
7.2.2 片选线:为了确定使用那个外扩芯片
有两种方法,第一个是线选法—直接与片选端相连,就比如上面能够例子8Kx8RAM,它已经有了13根地址线,那么根据三总线原则,地址总线AB与地址总线AB相连接,还有3根地址总线没有用到,按顺序来连接,就剩下了A15\A14\A13这三根地址总线没有用到,如果刚好有三片外扩的ROM的话,我们就可以直接相连接,如果有2片的话,我们也可以直接相连接;
但是,如果问到了最少使用多少根线就可以完成总线连接,我们要从这个芯片的容量出发,例如提供了4Kx8B的ROM(2732),扩展成为8Kx8的ROM,需要两片2732,最少需要13根地址总线就可以完成了,这是为什么呢,8Kx8的ROM需要两片,4K自己有12根地址总线A11-A0,然后再用一根A12就可以完成了,A12接一个非门就可以实现,不一定是A12也可以是其他没有用到的如A13/A14/A15,一般按照顺序来。
第二种方法是译码法,也就是说剩下的地址线不够用了,外扩芯片的数量多,或者明确使用译码法。可以使用**二四译码法,三八译码法,**通过使用译码器的方法来确定。
7.3 外扩芯片的例题
例1.8031外扩8KB的ROM,2KB的RAM,提供了4KBROM(2732)、2KB的RAM(6116)
解: 分析8KB的ROM,需要2片的2732,2KB的RAM,需要一片的6116,;2732它的芯片自己带有12根地址线,A11-A0;6116它的芯片自己带有11根地址线,A10-A0;然后根据三总线原则进行连接即可。如下图所示:
根据三总线原则: 首先,数据线,一般都是8位的,直接通过P0口连接即可,它是双向口,注意要标双向箭头,分别连接到各个芯片;其次,控制线,关于外部的ROM就只有读操作,所以门控信号OE分别直接与PSEN连接即可,关于外部的RAM有读和写操作,RD分别连接到单片机的RD端,WR分别连接到单片机的WR端,然后就是锁存器的门控信号G与ALE连接,就完成了控制线的连接;最后,首先是字选,地址总线的连接,先是P0口的低8位,需要经过锁存器连接,分时复用,然后连接到各个芯片,注意这个是单向箭头,这里已经完成了 P0.7-P0.0与A7-A0的连接,然后由于2732自己带有12根地址线,所以还需要四根地址线使用分别P2.3-P2.0与A11-A8的连接,但是6116自己带有11根,多一根也没关系,把它固定为高或者低就行了,然后是片选,需要确定使用的是哪个芯片,还有4根地址总线没有用到,我们可以使用线选法,P2.4与第一片的门控信号端连接,P2.5与第二片的门控信号端连接,P2.6与第二片的门控信号端连接,到这里我们就完成了外部芯片的扩展。如上图所示:
确定芯片的地址范围:方便我们对芯片操作,确定第一芯片地址范围,题目没有说的话,没有用到的我们都拉高为1,或者都拉低为0,这里都拉高,P2.4为0选择第一片,然后就可以得出第一片的地址范围是E000H-EFFFH;第二片也是这样确定,不过是P2.5位0,地址范围是D000H-DFFFH;第三片有点区别,P2.6为0,然后注意到它的P2.3是没有用到的,因为它自己带了11根地址线,连接到A10也就是P2.2,所以我们需要对P2.3进行都拉高或者拉低操作,这里使用的是拉高,所以它的芯片地址范围是B800H-BFFFH。
当然,对于芯片的片选我们也可以通过译码法实现。