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的条件下工作,最大定时时间为65536
    
    2us=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=2
    
     N-定时/Tcyc Tcyc=12/系统的主频
     
     b)计数初值的计算:C=2
    
    N-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,波特率=(2
    
     SMOD/32)xFosc/(12(256-X));
     
     方式2:SM0/SM1=10,11位异步通信,1位起始位0,9个数据位,1位终止位1,第9个数据可作为校验位,波特率的计算=2
    
    SMODxFosc/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
    
    。
    
    当然,对于芯片的片选我们也可以通过
    
     译码法实现
    
    。
   
    
    
    8 D/A接口技术与A/D接口技术
   
 
