单片机学习总结

  • Post author:
  • Post category:其他




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



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(可位操作)

在222这里插入图片描述

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接口技术



版权声明:本文为qq_51197244原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。