第 3章 MCS-51单片机的内部资源及应用主要内容:
MCS-51单片机内部各器件的具体结构、组成原理、
工作方式的设置及典型应用,为读者后续学习单片机应用系统设计、充分利用单片机内部资源解决工程实际问题奠定基础。 重点 在于各器件工作方式的设置及灵活应用,难点 在于中断系统和定时器 /计数器的应用。
3.1.1 MCS-51内部并行 I/O口
8051有 4个 8位并行 I/O口,分别命名为 P0,P1,P2和 P3口。
1,P0口
P0口为双向三态输入 /输出口,P0口既可作为地址 /数据总线口,又可作为通用 I/O口,可驱动 8个 TTL输入。在访问
3.1 MCS-51单片机的并行 I/O口外部存储器时,P0口作地址 /
数据总线复用口,是一个真正的双向口,并分时送出地址的低 8位和送出(或接收)
相应存储单元的数据。作通用 I/O口时,P0口只是一个准双向口,需要在外部引脚处外接上拉电阻。 P0口的位结构如右图所示。
2,P2口
P2口常用做外部存储器的高 8位地址口 。 当不用做地址口时,P2口也可作为通用 I/O口,这时它也是一个准双向
I/O口 。 不必外接上拉电阻就可以驱动任何 MOS驱动电路,且只能驱动 4个
TTL输入 。 P2口的位结构如右图所示 。
3,P1口
P1口常用做通用 I/O口,它也是一个标准的准双向 I/O口,不必外接上拉电阻就可以驱动任何 MOS驱动电路,
且只能驱动 4个 TTL输入。 P1口的位结构如右图所示。
4,P3口
P3口是一个双功能口,
第一功能与 P1口一样可用做通用 I/O口,也是一个准双向
I/O口,能驱动 4个 TTL输入 。
另外还具有第二功能 。 P3口工作在第二功能时各管脚定义如下表所示 。 P3口的位结构图如右图所示 。
3.1.2 MCS-51内部并行 I/O口的应用
MCS-51I/O端口的操作方式:
( 1) 输出数据方式,CPU通过一条数据传送指令就可以把输出数据写入 P0~ P3的端口锁存器,然后通过输出驱动器送到端口引脚线 。 例如,下面的指令均可在 P0口输出数据 。
MOV P0,A
ANL P0,#data
ORL P0,A
( 2) 读端口数据方式,CPU读入的这个数据并非端口引脚线上的数据 。 读端口数据可以直接读端口 。 例如,下面的指令均可以从 P1口输入数据,这是锁存器上的数据 。
MOV A,P1
MOV 20H,P1
MOV R0,P1
MOV @R0,P1
( 3) 读端口引脚方式,读端口引脚方式可以从端口引脚上读入信息 。 在这种方式下,CPU首先必须使欲读端口引脚所对应的锁存器置 1,然后才能读端口引脚 。 因此,用户在读引脚时必须先置位锁存器后读,连续使用两条指令 。 例如,下面的程序可以读 P1引脚上的信号 。
MOV P1,#0FFH ; 置位 P1引脚的锁存器
MOV A,P1 ; 读 P1引脚上的信号送累加器 A
注意:写引脚时是直接向端口输出要写的数据,
读引脚时就要区分是读端口的引脚信号还是读锁存器信号 。
读端口信号是必须先向端口写,1”,然后再读,这就是单片机口信号的准双向的含义 。 切记 ! ( 见 P106)
在 I/O口直接用做输入 /输出时,CPU既可以把它们看做数据口,也可以看做状态口,这是由用户决定的 。
[例题 1]要求设计跑马灯 。
硬件电路设计,
1.设计单片机最小系统
2.设计带按键的复位电路
3.使用一个 P口连接八个 led发光二极管
4.软件设计各引脚功能如下:
VCC,接正电源;
Vss,接地;
1,I/O口直接用于输入 /输出程序设计:;实验一:单片机最小系统及流水灯程序
org 00h ;源程序起始地址
jmp main ;跳转到 MAIN
org 0050h ;主程序开始地址
main,mov a,#11111110B ;立即数送入 A
loop,mov p1,a ;数据送 P1口
rr a ;右循环一下
lcall delay ;延时子程序
ajmp loop ;重复循环
delay,mov r3,#250 ;延时子程序
d1,mov r4,#235
d2,nop
nop
nop
djnz r4,d2
djnz r3,d1
ret
end
2,I/O口扩展外部锁存器为了输出数据并保持这个输出状态,MCS-51单片机常常需要使 I/O
口通过外部锁存器和输出设备相连 。 如下图所示为 8051通过 74LS273与输出设备连接的接口图 。 8051通过下面的指令输出数据至数码管:
MOV DPTR,#7FFFH ; DPTR指向 74LS273端口,地址为 7FFFH)
MOVX @DPTR,A ; 输出数据到数码管上
74LS273是带有清除端的 8D触发器,只有在清除端保持高电平时,才具有锁存功能,锁存控制端为 11脚
CLK,采用上升沿锁存 。 CPU 的 ALE信号 必须经过反相器反相之后才能 与 74LS273的控制端 CLK 端相连 。
地址锁存器使用 74LS373较多 。 引脚图如下页图所示 。
与 8051连接电路如下页图所示 。
WR
上图中的 a~ g七个笔划(段)及小数点 dp均为发光二极管。
数码管显示器根据公共端的连接方式,可以分为共阴极数码管
(将所有发光二极管的阴极连在一起)和共阳极数码管(将所有发光二极管的阳极连在一起)。
单片机系统扩展 LED数码管时多用共阳 LED。共阳数码管每个段笔画是用低电平 (“0”)点亮的,要求驱动功率很小;而共阴数码管段笔画是用高电平 (“0”)点亮的,要求驱动功率较大。但是共阴管的亮度比共阳管的要亮些。
通常每个段笔画要串一个数百欧姆的降压电阻。
笔画的选择称为段选,公共端的选择称为位选。; 八个数码管动态显示程序
org 00h
ajmp main
org 50h
main,mov r2,#00h ;将要显示的数字送 R2
sss,mov dptr,#tab ;查表取得数字的字型码送 R0
mov a,r2
movc a,@a+dptr
mov r0,a
mov r6,#40h ;循环调用显示程序延时 1.5S
xsh1,lcall disp1
djnz r6,xsh1
inc r2 ;将下一个要显示数字送 R2
cjne r2,#0ah,sss;判断数字 9显示完否?
ajmp main
disp1,mov r5,#08h ;显示程序开始,将要显示的位数送 R5
mov r1,#0feh ;将要显示的位码送 R1
dis00,mov dptr,#7fffh ;将要显示的字型码送 74LS273
mov a,r0
movx @dptr,a
mov a,r1 ;将位选码送入 R1
mov p2,a
lcall delay ;调延时 1MS子程序
rl a ;位选左移,选中下一位,如果 8位数字
mov r1,a ;显示完了则返回
djnz r5,dis00
ret
delay,mov r3,#08h ;延时 1MS程序
loop,mov r4,#0a0h
djnz r4,$
djnz r3,loop
ret
tab,db 0c0h,0f9h,0a4h,0b0h,99h ;字型表
db 92h,82h,0f8h,80h,90h
end
3.2 MCS-51单片机的中断系统计算机与外界的联系是通过外部设备 ( 也称为外设,输入
/输出设备或 I/O设备 ) 与外界联系的 。 计算机与外设之间不是直接相连的,而是通过不同的接口电路来达到彼此间的信息传送的目的 。
计算机与外设之间交换信息的方式:
( 1)无条件传送方式,外设对计算机来说总是准备好的。
( 2)查询传送方式,传送前计算机先查询外设的状态,若已经准备好就传送,否则就继续查询 /等待。
( 3)中断传送方式,外设通过申请中断的方式与计算机进行数据传送。
( 4)直接存储器存取方式 (DMA),传送数据的双方直接通过总线传送数据,不经 CPU中转。
3.2.1 中断的基本概念
1,中断的定义所谓,中断,,是指 CPU执行正常程序时,系统中出现特殊请求,CPU暂时中止当前的程序,转去处理更紧急的事件
( 执行中断服务程序 ),处理完毕 ( 中断服务完成 ) 后,CPU
自动返回原程序的过程 。
作用,采用中断技术可以提高 CPU效率、解决速度矛盾、实现并行工作、分时操作、实时处理、故障处理、应付突发事件,
可使多项任务共享一个资源( CPU)。
中断与子程序的最主要区别,子程序是预先安排好的,中断是随机发生的。
中断涉及的几个环节,中断源,中断申请,开放中断,保护现场,中断服务,恢复现场,中断返回 。
2,中断源中断源是指引起中断的设备或事件,或发出中断请求的源头。
3,中断的分类中断按功能通常可分为可屏蔽中断、非屏蔽中断和软件中断三类。
可屏蔽中断是指 CPU可以通过指令来允许或屏蔽中断的请求。
非屏蔽中断是指 CPU对中断请求是不可屏蔽的,一旦出现,CPU必须响应。
软件中断则是指通过相应的中断指令使 CPU响应中断。
4,中断优先权与中断嵌套中断优先级 ( 也称为中断优先权 ),给每个中断源指定中断响应的优先级别,CPU按中断源的优先级高低顺序响应各中断源发出的中断请求 。
中断嵌套,在某一瞬间,CPU因响应某一中断源的中断请求而正在执行它的中断服务程序时,若又有一级别高的中断源向 CPU发出中断请求,且 CPU
的中断是开放的,CPU可以把正在执行的中断服务程序暂停下来,转而响应和处理优先权更高的中断源的中断请求,等处理完后再转回来,继续执行原来的中断服务程序,这就是中断嵌套 。
中断嵌套的过程和子程序嵌套过程类似,子程序的返回指令是 RET,而中断服务程序的返回指令是 RETI。
5,中断响应及处理过程
① 保护断点
② 寻找中断源
③ 中断处理
④ 中断返回保护断点和寻找中断源都是由硬件 自动 完成的,用户不用考虑 。
6,中断系统的功能中断系统,能够实现中断功能的硬件电路和软件程序 。
中断系统的功能,能够实现中断优先权排队,中断嵌套,自动响应中断和中断返回等功能 。
MCS-51单片机的大部分中断电路都是集成在芯片内部的,只有外部中断请求信号产生电路才分散在各中断源电路和接口电路中 。
3.2.2 MCS-51的中断系统
MCS-51提供了 5个中断源,2个中断优先级控制,可实现
2个中断服务嵌套。可通过程序设置中断的允许或屏蔽,设置中断的优先级。
1,MCS-51的中断源
8051允许 5个中断源:
( 1) 外部中断源 ( 中断标志为 IE0和 IE1 )
由 ( P3.2 ) 端口线引入,低电平或下降沿引起 。
由 ( P3.3 ) 端口线引入,低电平或下降沿引起 。
( 2) 内部中断源 ( 中断标志为 TF0,TF1和 TI/RI )
T0:定时 /计数器 0中断,由 T0回零溢出引起 。
T1:定时 /计数器 1中断,由 T1回零溢出引起 。
TI/RI:串行 I/O中断,完成一帧字符发送 /接收引起 。
0INT
1INT
8051的中断结构如下图所示。
CPU识别中断申请的依据:
CPU在每个机器周期的 S5P2期间,会自动查询各个中断申请标志位,若查到某标志位被置位,将启动中断机制。
2,中断控制
MCS-51单片机设置了 4个专用寄存器用于中断控制,用户通过设置其状态来管理中断系统 。
( 1) 定时器控制寄存器 TCON ( 88H)
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
TF0/TF1,定时器溢出中断申请标志位 (由硬件 自动 置位) 。
=0,定时器未溢出;
=1,定时器溢出 (由全,1”变成全,0”) 时由硬件自动置位,申请中断,中断被 CPU响应后由硬件 自动 清零 。
TR0/TR1,定时器运行启停控制位 (可由用户通过软件设置 ) 。
=0,定时器停止运行;
=1,定时器启动运行。
IE0/IE1,外部中断申请标志位 (由硬件自动置位,中断响应后转向中断服务程序时,由硬件 自动 清 0 ) 。
=0,没有外部中断申请;
=1,有外部中断申请。
IT0/IT1,外部中断请求的触发方式控制位 (可由用户通过软件设置 ) 。
=0,在 INT0/INT1端申请中断的信号低电平有效;
=1,在 INT0/INT1端申请中断的信号负跳变有效。
( 2)串行口控制寄存器 SCON ( 98H)
TI/RI,串行口发送 /接收 中断申请标志位 ( 由硬件 自动 置位,必须由用户在中断服务程序中用软件清 0) 。
=0,没有串行口 发送 /接收 中断申请;
=1,有串行口 发送 /接收 中断申请。
SCON的高 6位用于串行口工作方式设置和串行口发送 /接收控制。
( 3)中断允许控制寄存器 IE ( 0A8H)
SM0 SM1 SM2 REN TB8 RB8 TI RI
EA ES ET1 EX1 ET0 EX0
( 3)中断允许控制寄存器 IE ( 0A8H)
EA ES ET1 EX1 ET0 EX0
EX0/EX1/ET1/ET0/ES 位,分别是 /,T0/T1,串行口的中断允许控制位。
=0,禁止中断;
=1,允许中断。
EA,总的中断允许控制位(总开关):
=0,禁止全部中断;
=1,允许中断。
0INT 1INT
( 4)中断优先级控制寄存器 IP ( 0B8H)
8051有两个中断优先级,即高优先级和低优先级,每个中断源都可设置为高或低中断优先级,以便 CPU对所有的中断实现两级中断嵌套 。
8051内部中断系统对各中断源的中断优先级有一个统一的规定,称为自然优先级(也称为系统缺省优先级)。如下表所示。
8051单片机的中断优先级采用了自然优先级和人工设置高、低优先级的策略,中断处于同一级别时,就由自然优先级确定。开机时,每个中断都处于低优先级,中断优先级可以通过程序来设定,由中断优先级寄存器
IP来统一管理。
( 4)中断优先级控制寄存器 IP ( 0B8H)
PS PT1 PX1 PT0 PX0
0INT 1INTPX0/PX1,/ 优先级控制位:
=0,属低优先级;
=1,属高优先级。
PT0/PT1,T0/T1中断优先级控制位:
=0,属低优先级;
=1,属高优先级。
PS1,串行口中断优先级控制位:
=0,属低优先级;
=1,属高优先级。
中断优先级处理原则:
对 同时发生多个中断申请时:
不同优先级的中断同时申请:先高后低相同优先级的中断同时申请:按序执行正处理低优先级中断又接到高级别中断:高打断低正处理高优先级中断又接到低级别中断:高不理低
3.中断响应
( 1) 中断响应的条件
MCS-51单片机工作时,在每个机器周期中都会去查询各个中断标志,如果有中断请求 。 必须满足下列条件单片机才能响应中断 。
① 相应的中断是开放的;
② 没有同级的中断或更高级别的中断正在处理;
③ 正在执行的指令必须执行完最后 1个机器周期;
④ 若正在执行 RETI,或正在访问 IE或 IP寄存器,则必须执行完当前指令的下一条指令 。 后方 能响应中断 。
( 2)中断响应的过程中断过程包括中断请求,中断响应,中断服务,中断返回四个阶段 。
中断请求,中断源将相应请求中断的标志位置,1”,表示发出请求,并由 CPU 查询 。
中断响应,在中断允许条件下相应中断 。 断点入栈 → 撤除中断标志 → 关闭低同级中断允许 → 中断入口地址送 PC。 这些工作都是由硬件自动完成的 。
中断服务,根据入口地址转中断服务程序,包含保护现场,执行中断主体,恢复现场 。
中断返回,执行中断返回 RETI指令 → 断点出栈 → 开放中断允许
→ 返回原程序 。
中断服务程序入口地址:
中断响应的主要内容就是由硬件自动生成一条长调用指令
( LCALL addr16),CPU执行这条长调用指令便响应中断,转入相应的中断服务程序。这里的 addr16就是程序存储器中相应的中断服务程序的入口地址,MCS-51的 5个中断源的中断服务程序入口地址是固定的,如下表所示。
8051的 5个中断源的中断服务入口地址之间相差 8个单元 。
这 8个存储单元用来存储中断服务程序一般来说是不够的 。 用户常在中断服务程序地址入口处放一条三字节的长转移指令 。 一般地,主程序从 0030H单元以后开始存放 。 例如:
ORG 0000H
LJMP START ; 转入主程序,START为主程序地址标号
ORG 0003H
LJMP INT0 ; 转外中断中断服务程序
ORG 000BH
LJMP T0 ; 转定时器 T0中断服务程序
ORG 0030H
START,…… ; 主程序开始
( 3) 中断响应时间正常中断响应时间至少为 3~ 8个机器周期,如果有同级或高级中断服务,将延长中断响应时间 。
4.中断请求的撤除为了避免中断请求标志没有及时撤除而造成的重复响应同一中断请求的错误,CPU在相应中断时必须及时将其中断请求标志位撤除 。
8051的 5个中断源的中断请求撤除的方法是不同的 。
( 1) 定时器溢出中断请求的撤除定时器溢出中断得到响应后,其中断请求的标志位 TF0和
TF1由硬件 自动 复位 。
( 2) 串行口中断请求的撤除串行口中断得到响应后,其中断请求的标志位 TI和 RI不能由硬件自动复位,必须由用户在中断服务程序的适当位置通过如下指令将它们撤除 。
CLR TI ; 撤除发送中断请求标志
CLR RI ; 撤除接收中断请求标志或采用字节型指令,ANL SCON,#0FCH
( 3)外部中断请求的撤除外部中断请求的两种触发方式 ( 电平触发和负边沿触发 )
的中断请求撤除的方法是不同的 。
负边沿触发方式,CPU在前一机器周期采到 / 引脚为高,
后一机器周期采到为低才认为是一次中断请求,即依靠 CPU
两次检测 ( 或 ) 上的负边沿触发电平状态而置位外部中断标志位 IE0或 IE1 。 CPU 可记忆申请,可由硬件 自动 撤除中断申请 。
电平触发方式,/ 引脚上的低电平须持续到中断发生 。
若中断返回前仍未及时撤除低电平,虽然 CPU在响应中断时能由硬件自动复位 IE0或 IE1,但引脚上的低电平仍会使已经复位的 IE0或 IE1再次置位,产生重复中断的错误 。
0INT
0INT
1INT
1INT
0INT 1INT
电平触发型外部中断请求的撤除必须由外部硬件使 ( 或 ) 上的低电平随着其中断被响应而变为高电平 。 其中断请求撤除的电路如下图所示 。
外来的低电平 → 反相 → CP端产生上跳沿 → D端的,0”输出到 Q端 → 申请中断,中断服务返回前对 P1.0送,0” → 令 Q端变为,1”
指令如下:
ANL P1,#0FEH (或 CLR P1.0 );令 Q端置,1”
ORL P1,#01H ( SETB P1.0 );令 SD端置,1”,以免下次中断来时 Q端不能变,0”
3.2.3 MCS-51中断系统的编程
( 1) 中断初始化设置,开相应中断允许 ( IE ),根据需要选择优先级 ( IP ) 和选择外中断触发方式 ( TCON),设置计数器,
串行口的有关参数 。
( 2) 中断服务程序的编写,中断入口,保护现场,关中断,中断服务主体程序,恢复现场,开中断,设置计数器,串行口的有关参数,中断返回指令 RETI 。
[例题 2] 设 8051外部中断源接引脚,中断触发方式为电平触发,试编制 8051中断系统的初始化程序 。
解:采用位操作指令实现 ( 也可以采用传送指令和逻辑指令 ) 。
SETB EA ; 开总中断
SETB EX0 ; 开中断
SETB PX0 ; 设置为高优先级
CLR IT0 ; 设置为电平触发方式
0INT
[例题 3] 通过 外部中断控制八盏灯循环点亮。
解,通过 P1口扩展八盏灯,在 引脚接一个按钮开关到地,
每按一下按钮就申请一次中断,点亮一盏灯,中断服务则是:
依次点亮八盏灯中的一盏。采用边沿触发。硬件电路如下图所示。
1INT
程序如下:
ORG 0000H
LJMP MAIN
ORG 0013H ; 中断服务程序入口地址
LJMP IN11
MAIN,SETB EA ; 开总中断允许“开关”
SETB EX1 ; 开分中断允许“开关”
CLR PX1 ; 低 优先级(也可不要此句)
SETB IT1 ; 边沿触发
MOV A,#01H ; 给累加器 A赋初值
SJMP $ ; 原地等待中断申请
IN11,RL A ; 左环移一次
MOV P1,A ; 输出到 P1口
RETI ; 中断返回
END
3.2.4 MCS-51扩展外部中断请求输入口
8051单片机只提供了两个外部中断请求输入端,如果需要使用多于两个的中断源,就必须扩展外部中断请求输入口 。
1.定时器 /计数器用于扩展外部中断请求输入口
8051单片机有两个定时器 /计数器,它们作为计数器使用时,
计数输入端 T0( 或 T1) 发生负跳变将使计数器加 1,利用此特性,
适当设置计数初值,就可以把计数输入端 T0( 或 T1) 作为外部中断请求输入口 。 其特点是以占用内部定时中断为代价的 。 中断服务程序的入口地址 仍然为 000BH或 001BH。
2,查询方式扩展外部中断请求输入口把多个中断源通过硬件 ( 如与非门 ) 引入外部中断输入端,
同时又连到某个 I/O口 。 当有中断源申请中断时,在中断服务程序中通过软件查询可确定哪一个是正在申请的中断源,其查询的次序可由中断优先级决定 。 其特点是中断响应速度较慢 。 适用于外部中断源较多的场合 。 下页例题中,我们采用 74LS21A四输入端双与门实现该任务 。
3,使用专用芯片扩展外部中断请求输入口当外部中断源较多,同时又要求中断响应速度很高时,查询方式扩展外部中断请求输入口的方法很难满足要求。这时可以使用专用接口芯片进行外部中断请求输入口的扩展。下面例题中,我们采用 74LS21A四输入端双与门实现该任务。
查询方式扩展外部中断请求输入口的 电路实现:
74ls21的逻辑表是:当输入全高时输出为高,任一输入低则输出就为低。
电路分析:当没有按键按下时,由于上拉电阻的作用,74ls21输出高,使
INT0口为高电平,此时中断程序不被触发。如果任何一个按键按下,则
74ls21输出低电平,触发中断程序。
中断程序设计为:如果程序设计检测次序是 P1.0,P1.1,P1.2,P1.3口,优先级即按顺序排列,如果同时有多个键被按下,可根据实际要求设定为
1、仅仅只响应最优先中断; 2、按优先级顺序依次执行各个中断。
设计程序如下:
ORG 0000H
LJMP MAIN
ORG 0003H ; 外部中断 0中断服务入口地址
LJMP INT ; 转中断服务
ORG 0100H
MAIN,SETB EA ; 开总中断允许
SETB EX0 ; 开 INT0中断
SETB IT0 ; 下降沿有效
……
中断服务程序清单如下:
INTI CALL D20 ; 延时去抖动
MOV P1,#0FFH ;P1口送全 1值 ( 准双向口原因 )
MOV A,P1 ; 读 P1口各引脚 (设另四口未用 )
CJNE A,#0FFH,CLOSE ; 验证是否确实有键闭合
AJMP INT0 ; 无键按下 ( 按键时间过短 ) 则退;出中断
CLOSE,JNB ACC.3,KEY 0 ; 查询 0号键
JNB ACC.2,KEY 1 ; 查询 1号键
JNB ACC.1,KEY 2 ; 查询 2号键
JNB ACC.0,KEY 3 ; 查询 3号键
INT0,RETI
KEY 0,…… ; 7号键处理程序
KEY 01,MOV A,P1 ; 再读 P1口各引脚
JNB ACC.0,FUNC71 ; 确认键是否释放
RETI
KEY 1,…… ; 其他键处理程序
……
D20,…… ; 20ms延时子程序
……
END
3.3 MCS-51单片机的定时器 /计数器
3.3.1 定时器 /计数器
1,基本概念
( 1) 计数,计数是指对外部事件的个数进行计量 。 其实质就是对外部输入脉冲的个数进行计量 。 实现计数功能的器件称为计数器 。
( 2) 定时,8051单片机中的定时器和计数器是一个部件,只不过计数器记录的是外界发生的事件,而定时器则是由单片机内部提供一个非常稳定的计数源进行定时的 。 这个计数源是由单片机的晶振经过 12分频后获得的一个脉冲源 。 所以定时器计数脉冲的时间间隔与晶振有关 。
( 3) 定时的种类软件定时,利用执行一个循环程序进行时间延迟 。 其特点是定时时间精确,不需外加硬件电路,但占用 CPU时间 。 因此软件定时的时间不宜过长 。
硬件定时,利用硬件电路实现定时 。 其特点是不占用 CPU时间,
通过改变电路元器件参数来调节定时,但使用不够灵活方便 。
对于时间较长的定时,常用硬件电路来实现 。
可编程定时器,通过专用的定时器 /计数器芯片实现 。 其特点是通过对系统时钟脉冲进行计数实现定时,定时时间可通过程序设定的方法改变,使用灵活方便 。 也可实现对外部脉冲的计数功能 。
MCS-51单片机内部有两个 16位可编程的定时器 /计数器,简称为 T0和 T1,均可作定时器用也可计数器,它们均是二进制加法计数器,当计数器计满回零时能自动产生溢出中断请求,表示定时时间已到或计数已终止。适用于定时控制、延时、外部计数和检测等。
计数器,对引脚 T0( P 3.4 )和 T1( P3.5.)输入的外部脉冲信号计数,当输入脉冲信号从 1到 0的负跳变时,计数器就自动加 1。
计数的最高频率一般为振荡频率的 1/24。
定时器,对系统晶振振荡脉冲的 12分频输出进行计数。
( 1) 定时器 /计数器的结构组成,16位加法计数器、工作方式寄存器 TMOD和控制寄存器 TCON。
T0,TL0(低 8位)和 TH0(高 8位)
T1,TL1(低 8位)和 TH1(高 8位)
2,MCS-51内部定时器 /计数器
8051单片机内部的定时器 /计数器的结构如下图所示。
( 2)控制寄存器 TCON (88H)
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
TF0/TF1,T0/1计数溢出标志位。可用于申请中断或供 CPU查询。在进入中断服务程序时会自动清零;但在查询方式时必须软件清零。
=1,计数溢出 ;
=0,计数未满。
TR0/TR1,T0/1启停控制位。
=1,启动计数;
=0,停止计数。
IE0/IE1和 IT0/IT1,用于管理外部中断(前面已介绍过)。
M1,M0,工作方式选择位 。
=00,13位定时器 /计数器;
=01,16位定时器 /计数器(常用);
=10,可自动重装的 8位定时器 /计数器(常用);
=11,T0 分为 2个 8位定时器 /计数器;仅适用于 T0。
C/,定时方式 /计数方式选择位。
= 1,选择计数器工作方式,对 T0/T1引脚输入的外部事件的负脉冲计数;
= 0,选择定时器工作方式,对机器周期脉冲计数定时。
如下页图所示。
( 2)工作方式寄存器 TMOD
GATE C / T M1 M0 GATE C / T M1 M0
T1 T2
T
GATE,门控位,定时器 /计数器的启 /停可由软件与硬件两者控制
= 0,软件控制,只由 TCON中的启 /停控制位 TR0/TR1控制定时器 /计数器的启 /停。
= 1,硬件控制,由外部中断请求信号 / 和 TCON中的启 /停控制位 TR0/TR1组合状态控制定时器 /计数器的启 /停。
其控制逻辑如下图所示。
0INT
1INT
1INT
3.3.2 定时器 /计数器的工作方式
8051单片机的定时器 /计数器共有四种工作模式,现以 T0为例加以介绍,T1与 T0的工作原理相同,但方式 3下 T1停止计数 。 方式 ( 如 F0) 和用户定义名称等几种 方式 。
1,工作方式 0( M1M0=00,13位定时器 /计数器 )
由 TH0的全部 8位和 TL0的低 5位 ( TL0的高 3位未用 ) 构成 13位加 1计数器,当 TL0低 5位计数满时直接向 TH0进位,并当全部 13位计数满溢出时,溢出标志位 TF0置,1”。
2,工作方式 1( M1M0=01,16位定时器 /计数器 )
由 TH0和 TL0构成 16位加 1计数器,其他特性与工作方式 0相同 。
3,工作方式 2 ( M1M0=10,自动重装计数初值的 8位定时器 /
计数器 )
16位定时器 /计数器被拆成两个 8位寄存器 TH0和 TL0,CPU在对它们初始化时必须装入相同的定时器 /计数器初值 。 以 TL0作计数器,而 TH0
作为预置寄存器 。 当计数满溢出时,TF0置,1”,同时 TH0将计数初值以硬件方法自动装入 TL0。 这种工作方式很适合于那些重复计数的应用场合 ( 如串行数据通信的波特率发生器 ) 。
4,工作方式 3 ( M1M0=11,2个 8位定时器 /计数器,仅适用于 T0)
TL0,8位定时器 /计数器,使用 T0原有控制资源 TR0和 TF0,其功能和操作与方式 0或方式 1完全相同 。
TH0,只能作为 8位定时器,借用 T1的控制位 TR1和 TF1,只能对片内机器周期脉冲计数 。
在方式 3模式下,定时器 /计数器 0可以构成两个定时器或者一个定时器和一个计数器 。
T0方式 3下的 T1方式 2,因定时初值能自动恢复,用作波特率发生器更为合适 。
定时器 /计数器可按片内机器周期定时,也可对由 T0/T1
引脚输入一个负脉冲进行加法计数 。 在应用时,其工作方式和工作过程均可通过程序设定和控制,因此,定时器 /计数器在工作前必须先对其进行初始化,计算和设置初值 。
1,定时器 T0/T1 中断申请过程
( 1)在已经开放 T0/T1中断允许且已被启动的前提下,T0/T1
加 1计满溢出时 TF0/TF1标志位自动置,1” ;
( 2) CPU 检测到 TCON中 TF0/TF1变,1”后,将产生指令:
LCALL 000BH/LCALL 001BH 执行中断服务程序;
( 3) TF0/TF1标志位由硬件自动清,0”,以备下次中断申请。
3.3.3 定时器 /计数器的应用
2,定时器 /计数器初始化的步骤
( 1)写 TMOD,设置定时器 /计数器的工作方式;
( 2)计算定时器 /计数器的初值,写入 TH0/TH1,TL0/TL1。
( 3)设置 IE,IP,以开放相应的中断和设定中断优先级。
3,定时器 /计数器的定时器 /计数器范围
( 1) 工作方式 0,13位定时器 /计数器方式最大计数值 = 213 = 8192
( 2) 工作方式 1,16位定时器 /计数器方式最大计数值 = 216 = 65536
( 3) 工作方式 2和工作方式 3,8位的定时器 /计数器方式因此,
最大计数值 = 28 = 256
3,计数器初值的计算方法,用最大计数量减去需要的计数次数 。 即:
TC=M?C
其中,TC——计数器需要预置的初值;
M——计数器的模值 ( 最大计数值 ) ;
方式 0时,M=213;方式 1时,M=216;方式 2,3时,M=28;
C——计数器计满回 0所需的计数值,即设计任务要求的计数值 。
例如,流水线上一个包装是 12盒,要求每到 12盒就产生一个动作,用单片机的工作方式 0来控制,则应当预置的初值为:
TC = M? C = 213?12=8180
4,定时器初值的计算定时时间的计算公式为:
T=( M?TC) 〓 T0 ( 或 TC=M?T/T0 )
其中,T——定时器的定时时间,即设计任务要求的定时时间;
T0——计数器计数脉冲的周期,即单片机系统主频周期的 12倍;
M——计数器的模值;
TC——定时器需要预置的初值 。
若设初值 TC=0,则定时器定时时间为最大 。 若设单片机系统主频为 12MHz,则各种工作方式定时器的最大定时时间为:
工作方式 0,Tmax=213〓 1?s=8.192ms
工作方式 1,Tmax=216〓 1?s=65.536ms
工作方式 2和 3,Tmax=28〓 1?s=0.256ms
5,定时器 /计数器应用举例
[例题 ] 设一只发光二极管 LED和 8051的 P1.0脚相连 。 当 P1.0脚是高电平时,LED发亮;当 P1.0脚是低电平时,LED不亮 。 编制程序用定时器来实现发光二极管 LED的闪烁功能,设置 LED
每 1s闪烁一次 。 已知单片机系统主频为 12MHz( 这意味着每个时钟周期 × 12= [1/(12× 1000000]× 12=1?s。 见 p127和 p29) 。
要是主频为 11.0592MHz的话,就是 12/11.0592?s。
解,定时器 /计数器的最长的定时是 65.536ms,无法实现 1s的定时 。 可以采用软件计数器来进行设计 。
设计思想,定义一个软件计数器单元 30H,先用定时器 /计数器
0做一个 50ms的定时器,定时时间到了以后将软件计数器中的值加 1,如果软件计数器计到了 20,取反 P1.0,并清掉软件计数器中的值,否则直接返回 。 则完成了 20次定时中断才取反一次 P1.0,因此定时时间就为 20〓 50=1000ms=1s。
定时器 /计数器 0采用工作方式 1,其初值为:
216?50ms/1?s=65536?50000=15536=3CB0H
电路图如下:
×
程序如下:
ORG 0000H
AJMP START ; 转入主程序
ORG 000BH ; 定时器 /计数器 0的中断服务程序入口地址
AJMP TIME0 ; 跳转到真正的定时器中断服务程序处
ORG 0030H
START,MOV SP,#60H ; 设置堆栈指针
MOV P1,#0FFH ; 关发光二极管 LED( 使其灭 )
MOV 30H,#00H ; 软件计数器预清 0
MOV TMOD,# 01H ; 定时器 /计数器 0工作于方式 1
MOV TH0,#3CH ; 设置定时器 /计数器的初值
MOV TL0,#0B0H
SETB EA ; 开总中断允许
SETB ET0 ; 开定时器 /计数器 0中断允许
SETB TR0 ; 启动定时器 /计数器 0
LOOP,AJMP LOOP ; 循环等待
( 真正工作时,这里可写任意其他程序 )
定时器 /计数器 0的中断服务程序如下:
TIME0,PUSH ACC ; 将 PSW和 ACC推入堆栈保护
PUSH PSW
INC 30H ; 软件计数器加 1
MOV A,30H
CJNE A,#20,T_LP2 ; 软件计数器单元中的值到了 20了吗?
到了,继续执行 ;否则,转入 T_LP2
T_LP1,CPL P1.0 ; 到了,P1.0取反
MOV 30H,#00H ; 清软件计数器
T_LP2,MOV TH0,#3CH ; 重置定时器 /计数器的初值
MOV TL0,#0B0H
POP PSW ; 恢复 PSW和 ACC
POP ACC
RETI ; 中断返回
END
[例题 ] 设电路图如本课件第 10页所示 ( 或见 01计本实验 ddb图 )
编制程序,对 RAM中某单元内容进行显示 。
解,设使用内存 70H- 75H 6个单元存放当前时钟数据,用定时器功能以及数码管动态显示技术可该值显示出来 。
程序如下:;YanQing于 2006年 5月 7日调试成功,
org 0000h
jmp main
org 001bh
jmp display
org 50h
main,nop
mov tmod,#00h
mov tl1,#0b0h
mov th1,#00h
setb ea
setb et1
setb tr1
mov 70h,#1
mov 71h,#2
mov 72h,#7
mov 73h,#4
mov 74h,#5
mov 75h,#0
sss,jmp sss
display,mov r1,#6fh
mov r4,#11011111b
play,mov a,r4
mov p2,a
inc r1
mov a,r4
rr a
mov r4,a
mov a,@r1
mov dptr,#tab
movc a,@a+dptr
mov dptr,#7fffh
movx @dptr,a
dl1ms,mov r6,#14h
dl1,mov r7,#19h
djnz r7,$
djnz r6,dl1
mov a,r4
jb acc.7,play
reti
tab,db 0c0h,0f9h,0a4h,0b0h,99h
db 92h,82h,0f8h,80h,90h
end
该程序的实用意义在于:不论主程序是怎么运行,
显示数码管总能显示特定单元的内容,电子钟、温度控制,GPS数据等等都可以使用。只要你把数据送到指定的内存单元即可。
3.4 MCS-51 单片机的串行通信
3.4.1 概述
1.通信通信,单片机与外界进行信息交换统称为通信 。
8051单片机的通信方式有两种:
并行通信,数据的各位同时发送或接收 。 特点是传送速度快,效率高,但成本高 。 适用于短距离传送数据 。 计算机内部的数据传送一般均采用并行方式 。
串行通信,数据一位一位顺序发送或接收。特点是传送速度慢,
但成本低。适用于较长距离传送数据。计算机与外界的数据传送一般均采用串行方式。
2,数据通信的制式单工方式,数据仅按一个固定方向传送;
半双工方式,数据可实现双向传送,但不能同时进行;
全双工方式,允许双方同时进行数据双向传送;
多工方式,在同一线路上实现资源共享 。
3,串行通信的分类串行数据通信按数据传送方式可分为异步通信和同步通信两种形式:
同步方式,以 数据块 为单位进行数据传送,包括同步字符,数据块和校验字符 CRC。 优点是数据传输速率较高,缺点是要求发送时钟和接收时钟保持严格同步 。 数据格式如下图所示 。
异步方式,以 字符为单位进行数据传送,每一个字符均按固定的字符格式传送,又被称为帧 。 优点是不需要传送同步脉冲,
可靠性高,所需设备简单;缺点是字符帧中因包含有起始位和停止位而降低了有效数据的传输速率 。
数据格式如下图所示:
4,串行数据通信的波特率波特率是指每秒钟传送信号的数量,单位为波特 ( Baud) 。
而每秒钟传送二进制数的信号数 ( 即二进制数的位数 ) 定义为比特率,单位是 bps( bit per second) 或写成 b/s( 位 /秒 ) 。
在单片机串行通信中,传送的信号是二进制信号,波特率与比特率数值上相等 。 单位采用 bps。
例如,异步串行通信的数据传送的速率是 120字符 /秒,而每个字符规定包含 10位数字,则传输波特率为:
120字符 /秒 〓 10位 /字符 =1200位 /秒 = 1200bps
3.4.2 MCS-51的串行口
MCS-51单片机内部有一个全双工的串行通信口 ( P3.0、
P3.1),既可作 UART( 通用异步接收 /发送器 ) 用,也可作同步移位寄存器使用,还可用于网络通信,其帧格式可有 8位,10
位和 11位,并能设置各种波特率 。
1,串行口寄存器结构
( 1)两个物理上独立的同名的接收 /发送缓冲寄存器 SBUF
指令 MOV SBUF,A 启动一次数据发送,指令 MOV A,SBUF
完成一次数据接收,即向发送缓冲器 SBUF写入数据即可发送数据,从接收缓冲器 SBUF读出数据即可接收数据。
( 2) 输入和输出移位寄存器和控制器等组成 。
( 3) 2个 SFR寄存器 SCON和 PCON,用于串行口的初始化编程 。
( 4) 接收 /发送数据,无论是否采用中断方式工作,每接收 /发送一个数据都必须用指令对 RI/TI 清 0,以备下一次收 /发 。
SBUF
(发)
SBUF
(收)
发送控制器 TI
接收控制器 RI
移位寄存器波特率发生器
T1
1
A
累加器
(门 )移位寄存器
RxD
(P3.1)
TxD
(P3.1)
去申请中断引脚引脚
CP
U
内部
MCS-51串行口的结构如下图所示:
2,串行通信控制寄存器 SCON ( 98H)
SM0 SM1 SM2 REN TB8 RB8 TI R1
SM0,SM1,串行口 4种工作方式控制位。
=00,方式 0,8位同步移位寄存器,其波特率为 fosc/12;
=01,方式 1,10位 UART,其波特率为可变,由定时器控制;
=10,方式 2,11位 UART,其波特率为 fosc/64或 fosc/32;
=11,方式 3,11位 UART,其波特率为可变,由定时器控制 。
其中,fosc为系统晶振频率。
RI,TI,串行口收 /发数据申请中断标志位
= 1 申请中断;
= 0 不申请中断。
RB8,在方式 2,3中,用于存放收到的第 9位数据;在双机通信中,作为奇偶校验;在多机通信中,用作区别地址帧 /数据帧的标志。
TB8,方式 2,3中,是要发送的第 9位数据;在双机通信中,用于对接收到的数据进行奇偶校验;在多机通信中,用作判断地址帧 /数据帧,TB8=0 表示发送的是数据,TB8=1 表示发送的是地址。
REN,串行口接收允许控制位
= 1,表示允许接收;
= 0,禁止接收。
SM2,串行口多机通信控制位,作为方式 2、方式 3的附加控制位。
3,中断允许寄存器 IE( 0A8H)
中断允许寄存器 IE在 3.2.2节中已介绍。其中对串行口有影响的位 ES。 ES为串行中断允许控制位。
ES=1,允许串行中断;
ES=0,禁止串行中断。
4,电源管理寄存器 PCON( 87H)
不可位寻址 。 PCON主要用于实现电源控制而设置的专用寄存器,已在 1.3.3节中介绍过 。 其格式如下图所示 。
SMOD GF1 GF0 PD 1DL
SMOD,串行口波特率倍增位
=1,串行口波特率加倍。
=0,串行口波特率不变,系统复位时默认为 SMOD=0。
3.4.3 串行口的工作方式
1,工作方式 0( 8位移位寄存器 I/O方式)
发送 /接收过程,SBUF中的串行数据由 RxD逐位移出 /移入(低位在先,高位在后); TxD输出移位时钟,频率 =fosc1/12;每送出 /接收 8位数据 TI/ RI自动置 1;需要用软件清零 TI/ RI 。
注意,串行口在方式 0下的工作并非是一种同步通信方式,经常配合“串入并出”“并入串出”移位寄存器一起使用,以达到扩展一个并行口的目的。 扩展电路如下图所示。
如要发送数据,查询方式的程序如下:
MOV SCON,#00H ;串行口方式 0
MOV SBUF,A ;将数据送出
JNB TI,$ ;等待数据发送完毕
CLR TI ;为下次发送作准备注意,复位时,SCON 已经被清零,缺省值为方式 0。
发送条件,TI=0。
接收条件,TI=0,置位 REN=1 (允许接收数据)。
2,方式 1( 波特率可变的 10位异步通信方式 )
发送 /接收数据的格式,一帧信息包括 1个起始位 0,8个数据位和
1个停止位 1。
发送 /接收过程,SBUF中的串行数据由 RXD逐位移出 /移入; TXD输出移位时钟,频率 = ( 2SMOD/32)?T1的溢出率,波特率可变。每送出 /接收 8位数据
TI/ RI自动置 1;需要用软件清零 TI/ RI 。工作时,发送端自动添加一个起始位和一个停止位;接收端自动去掉一个起始位和一个停止位。
发送 /接收条件,同方式 0。
3,方式 2( 固定波特率的 11位异步接收 /发送方式 )
发送 /接收过程,方式 2的接收 /发送过程类似于方式 1,所不同的是它比方式 1增加了一位,第 9位,数据 (TB8/RB8),用于,奇偶校验,。 方式 2常用于单片机间通信 。 波特率 = fosc? 2SMOD/64 。
发送 /接收条件,同方式 0。
3,方式 3( 可变波特率的 11位异步接收 /发送方式 )
方式 3和方式 2唯一的区别是波特率机制不同,方式 3的波特率 =(2SMOD/32)?T1的溢出率 。
奇偶校验,奇偶校验是检验串行通信双方传输的数据正确与否的一个措施,并不能保证通信数据的传输一定正确。即 如果 奇偶校验发生错误,表明数据传输一定出错了;如果奇偶校验没有出错,绝不等于数据传输完全正确。
奇校验规定,8位有效数据连同 1位附加位中,二进制,1”的个数为奇数。
偶校验规定,8位有效数据连同 1位附加位中,二进制,1”的个数为偶数。
约定发送采用 奇校验,若发送的 8位有效数据中,1”的个数为偶数,则要人为在附加位中添加一个,1”一起发送;若发送的 8位有效数据中,1”的个数为奇数,则要人为在附加位中添加一个
,0”一起发送。
约定接收采用 奇校验,若接收到的 9位数据中,1”的个数为奇数,
则表明接收正确,取出 8位有效数据即可;若接收到的 9位数据中,1”的个数为偶数,则表明接收出错!应当进行出错处理。
采用 偶校验时,处理方法与奇校验类似。
3.4.4 串行口的通信波特率串行口的通信波特率恰到好处地反映了串行传输数据的速率 。 在 MCS-51
串行口的四种工作方式中,方式 0和 2的波特率是固定的,而方式 1和 3的波特率是可变的,由定时器 T1的溢出率 ( T1溢出信号的频率 ) 控制 。 各种方式的通信波特率如下:
方式 0,波特率固定为 fosc/12。
其中,fosc——系统主机晶振频率方式 2,波特率由 PCON中的选择位 SMOD来决定,可由下式表示:
波特率 =( 2SMOD/64) 〓 fosc
方式 1和方式 3,波特率是可变的,由定时器 T1的溢出率控制 。 波特率为:
波特率 =( 2SMOD/32) 〓 定时器 T1溢出率
T1溢出率 =T1计数率 /产生溢出所需的周期
= ( fosc/12) /( 2K?TC)
其中,K——定时器 T1的位数,定时器 T1用作波特率发生器时,通常工作在方式 2,所以 T1的溢出所需的周期数 = 28?TC。
TC——定时器 T1的预置初值 。
下表列出了定时器 T1工作于方式 2的常用波特率及初值。
定时器的工作方式 2是自动重装入初值的 8位定时器 /计数器模式,所以用它来做波特率发生器最恰当。
为什么 51系列单片机常用
11.0592MHz的晶振设计?
因为它能够准确地划分成时钟频率,与
UART(通用异步接收器 /发送器 )常见的波特率相关。
特别是较高的波特率 (19600,19200),不管多么古怪的值,这些晶振都是准确,常被使用的。用
11.0592MHz可以得到准确的数值,而用 12MHz就不能得到整数数值。通信是一定要准确发送和接受的,否则积累误差就会产生。
常用波特率通常按规范取 1200,2400,4800,9600,…,
若采用晶振 12MHz和 6MHz,则计算得出的 T1定时初值将不是一个整数,产生波特率误差而影响串行通信的同步性能。解决的方法只有调整单片机的时钟频率 fosc,通常采用
11.0592MHz晶振。
方式 1波特率可变,由定时 /计数器 T1的计数溢出率来决定。
波特率 = 2SMOD〓 ( T1溢出率) / 32
其中 SMOD为 PCON寄存器中最高位的值,SMOD=1表示波特率倍增。
在实际应用时,通常是先确定波特率,后根据波特率求 T1定时初值,因此上式又可写为:
T1初值 = 256 - 2SMOD32 × fosc12 × 波特率
【 例题 】 设晶振 fosc为 11.0592MHz,选定定时器工作方式 2,求 4800bps,9600bps时的初值。
解:定时器方式 2的初始值 X的公式经过推导可得到:
X ≌ 256- [fosc× ( SMOD+ 1) ]/(384× 波特率)
故:
X1≌ 256-( 11.0592× 106× 1) /(384× 4800)
= FAH
X2 ≌ 256-( 11.0592× 106× 1) /(384× 9600)
= FDH
看得出来,采用 11.0592MHz全是整数值结果,而采用
12MHz则不是整数结果。
网上可以找到程序来快捷计算,51初值设定
×
3.4.5 串行口的应用
1.串口方式 0应用编程
[例题 6] 用 8051串行口外接 CD4094扩展 8位并行输出口,8位并行口的各位都接一个发光二极管,要求发光二极管呈流水灯状态(轮流点亮)。
解,硬件连接电路如下图所示。
在开始通信之前,应先对控制寄存器 SCON进行初始化 。 将
00H送 SCON即设置方式 0。 数据传送采用查询方式,通过查询 TI
的状态,来决定是否发送下一帧数据 。 在串行接收时,通过对 RI
查询来确定何时接收下一帧数据 。 程序如下:
ORG 1000H
START,MOV SCON,#00H ; 置串行口工作方式 0
MOV A,#80H ; 最高位灯先亮
CLR P1.0 ; 关闭并行输出
OUT0,MOV SBUF,A ; 开始串行输出
OUT1,JNB TI,OUT1 ; 输出完否? 未完,等待;完了,继续执行
CLR TI ; 完了,清 TI标志,以备下次发送
SETB P1.0 ; 打开并行口输出
ACALL DELAY ; 延时一段时间
RR A ; 循环右移
CLR P1.0 ; 关闭并行输出
SJMP OUT0 ; 循环
DELAY,MOV R7,#250 ; 延时子程序
D1,MOV R6,#250
D2,DJNZ R6,D2
DJNZ R7,D1
RET
END
2.双机通信双机通信的硬件连接图如下图所示。
通信协议如下:
设 1号机是发送方,2号机是接收方 。 采用串行口方式 1进行通信,一帧信息为 10位,其中有 1个起始位,8个数据位和 1个停止位;波特率为 2400bps,T1工作在定时器方式 2,单片机时钟振荡频率选用 11.0592MHz,查表 3.4.3可得 TH1=TL1=0F4H,
PCON寄存器的 SMOD位为 0。
当 1号机发送时,先发送一个,E1”联络信号,2号机收到后回答一个,E2”应答信号,表示同意接收 。 当 1号机收到应答信号,E2”后,开始发送数据,每发送一个字节数据都要计算,校验和,,假定数据块长度为 16个字节,起始地址为 40H,一个数据块发送完毕后立即发送,校验和,。 2号机接收数据并转存到数据缓冲区,起始地址也为 40H,每接收到一个字节数据便计算一次,校验和,,当收到一个数据块后,再接收 1号机发来的
,校验和,,并将它与 2号机求出的校验和进行比较 。 若两者相等,说明接收正确,2号机回答 00H;若两者不相等,说明接收不正确,2号机回答 0FFH,请求重发 。 1号机接到 00H后结束发送 。 若收到的答复非零,则重新发送数据一次 。 程序框图如下页图所示 。
发送程序如下:
ORG 1000H
ASTART,CLR EA
MOV TMOD,#20H ; 定时器 1置为方式 2
MOV TH1,#0F4H ; 装载定时器初值,波特率 2400
MOV TL1,#0F4H
MOV PCON,#00H
SETB TR1 ; 启动定时器
MOV SCON,#50H ; 设定串口方式 1,且准备接收应答信号
ALOOP1,MOV SBUF,#0E1H ; 发联络信号
JNB TI,$ ; 等待一帧发送完毕
CLR TI ; 允许再发送
JNB RI,$ ; 等待 2号机的应答信号
CLR RI ; 允许再接收
MOV A,SBUF ; 2号机应答后,读至 A
XRL A,#0E2H; 判断 2号机是否准备完毕
JNZ ALOOP1 ; 2号机未准备好,继续联络
ALOOP2,MOV R0,#40H ; 2号机准备好,设定数据块地址指针初值
MOV R7,#10H ; 设定数据块长度初值
MOV R6,#00H ; 清校验和单元
ALOOP3,MOV SBUF,@R0 ; 发送一个数据字节
MOV A,R6
ADD A,@R0 ; 求校验和
MOV R6,A ; 保存校验和
INC R0
JNB TI,$
CLR TI
DJNZ R7,ALOOP3 ; 整个数据块是否发送完毕
MOV SBUF,R6 ; 发送校验和
JNB TI,$
CLR TI
JNB RI,$ ; 等待 2号机的应答信号
CLR RI
MOV A,SBUF ; 2号机应答,读至 A
JNZ ALOOP2 ; 2号机应答,错误,,转重新发送
RET ; 2号机应答,正确,,返回
END
接收程序如下,
ORG 1000H
BSTART,CLR EA
MOV TMOD,#20H
MOV TH1,#0F4H
MO V TL1,#0F4H
MOV PCON,#00H
SETB TR1
MOV SCON,#50H ; 设定串口方式 1,且准备接收
BLOOP1,JNB RI,$ ; 等待 1号机的联络信号
CLR RI
MOV A,SBUF ; 收到 1号机信号
XRL A,#0E1H; 判断是否为 1号机联络信号
JNZ BLOOP1 ; 不是 1号机联络信号,再等待
MOV SBUF,#0E2H ; 是 1号机联络信号,发应答信号
JNB TI,$
CLR TI
MOV R0,#40H ; 设定数据块地址指针初值
MOV R7,#10H ; 设定数据块长度初值
MOV R6,#00H ; 清校验和单元
BLOOP2,JNB RI,$
CLR RI
MOV A,SBUF
MOV @R0,A ; 接收数据转储
INC R0
ADD A,R6 ; 求校验和
MOV R6,A
DJNZ R7,BLOOP2 ; 判断数据块是否接收完毕
JNB RI,$ ; 完毕,接收 1号机发来的校验和
CLR RI
MOV A,SBUF
XRL A,R6 ; 比较校验和
JZ END1 ; 校验和相等,跳至发正确标志
MOV SBUF,#0FFH ; 校验和不相等,发错误标志
JNB TI,$ ; 转重新接收
CLR TI
END1,MOV SBUF,#00H
RET
END
3,多机通信
( 1) 硬件连接单片机构成的多机系统常使串行口工作在方式 2和方式 3,
采用总线型主从式结构 ( 一个是主机,其余的是从机,从机要服从主机的调度,支配 ) 。 有时还要对信号进行光电隔离,电平转换等 。 在实际的多机应用系统中,常采用 RS-485串行标准总线进行数据传输 。 简单的硬件连接如下图所示 ( 图中没有画出 RS-485接口 ) 。
( 2) 通信协议
主机置 SM2位 0,所有从机的 SM2位置 1,处于接收地址帧状态 。
主机发送一地址帧,其中,8位是地址,第 9位为 1表示该帧为地址帧 。
所有从机收到地址帧后,都将接收的地址与本机的地址比较 。
对于地址相符的从机,使自己的 SM2位置 0( 以接收主机随后发来的数据帧 ),并把本站地址发回主机作为应答;对于地址不符的从机,仍保持 SM2=1,对主机随后发来的数据帧不予理睬 。
从机发送数据结束后,要发送一帧校验和,并置第 9位 ( TB8)
为 1,作为从机数据传送结束的标志 。
主机接收数据时先判断数据接收标志 ( RB8),若接收帧的
RB8=0,则存储数据到缓冲区,并准备接收下帧信息 。 若 RB8=1,
表示数据传送结束,并比较此帧校验和,若正确则回送正确信号
00H,此信号命令该从机复位 ( 即重新等待地址帧 ) ;若校验和出错,则发送 0FFH,命令该从机重发数据 。 发送数据 。
主机收到从机应答地址后,确认地址是否相符,如果地址不符,发复位信号 ( 数据帧中 TB8=1) ;如果地址相符,则清 TB8,
开始发送数据 。
从机收到复位命令后回到监听地址状态 ( SM2=1) 。 否则开始接收数据和命令 。
( 3) 应用程序 设计
设主机发送的地址联络信号为,00H,01H,02H,…… ( 即从机设备地址 ),地址 FFH为命令各从机复位,即恢复 SM2=1。
主机命令编码为,01H,主机命令从机接收数据; 02H,主机命令从机发送数据 。 其他都按 02H对待 。
程序分为主机程序和从机程序 。 约定一次传递数据为 16个字节 。
程序清单见教材 ( 略 ) 。
4.单片机与 PC的通信
1台 PC既可以与 1个 8051单片机应用系统通信,也可以与多个 8051单片机应用系统通信;可以近距离也可以远距离 。 单片机与 PC机通信时,其硬件接口技术主要是电平转换,控制接口设计和通信距离不同的接口等处理技术 。 其硬件连接电路如下图所示 。 在 Windows的环境下,可使用 VB通信控件 ( MSComm)
却可以很容易实现 PC机与单片机之间的通信 。
单片机程序如下:
ORG 3000H
MAIN,MOV TMOD,#20H ; 在 11.0592MHz下,串行口波特率
MOV TH1,#0FDH ; 9600bps,方式 3
MOV TL1,#0FDH
MOV PCON,#00H
SETB TR1
MOV SCON,#0D8H
LOOP,JBC RI,RECEIVE ; 接收到数据后立即发出去
SJMP LOOP
RECEIVE,MOV A,SBUF
MOV SBUF,A
SEND,JBC TI,SENDEND
SJMP SEND
SENDEND,SJMP LOOP
END
PC程序如下,( VB语言 )
Sub Form_Load( )
MSComm1.CommPort=2
MSComm1.PortOpen=TURE
MSComm1.Settings="9600,N,8,1"
End Sub
Sub command1_Click( )
Instring as string
MSComm1.InBufferCount=0
MSComm1.Output="A"
Do
Dummy=DoEvents( )
Loop Until( MSComm1.InBufferCount>2)
Instring=MSComm1.Input
End Sub
Sub command2_Click( )
MSComm1.PortOpen=FALSE
UnLoad Me
End Sub
3.4.5 串行芯片 MAX232的应用
3.4.5.1 EIA RS-232C总线标准与接口电路
EIA RS-232C是异步串行通信中应用最广泛的标准总线,
是美国 EIA( Electronic Industries Association,
电子工业联合会)开发公布的通信协议。适合于数据传输速率在 0~ 20kb/s范围内的通信,包括了按位串行传输的电气和机械方面的规定。在微机通信接口中被广泛采用。
其特点为:
( 1)采取不平衡传输方式,是为点对点(即只用一对收、发设备)通信而设计的;
( 2)采用负逻辑。
( 3)适用于传送距离不大于 15m,速度不高于 20kb/s
的本地设备之间通信的场合。
2,连接器
( 1) DB-25连接器
DB-25型连接器的外形及信号线分配如图右所示。 25
芯 RS-232C接口具有 20mA电流环接口功能,用 9,11,
18,25针来实现。
( 2) DB-9连接器
DB-9连接器只提供异步通信的 9个信号,其外形及信号线分配如图右所示。
DB-25与 DB-9型连接器的引脚分配信号完全不同。
3,RS-232C的接口信号
RS-232C标准接口有 25条线,其中常用的有如下几条:
DSR:数据装置准备好; DTR:数据终端准备好;
RTS:请求发送; CTS:允许发送;
DCD:接收线信号检出; RI:振铃指示;
TXD:发送数据; RXD:接收数据;
SGND,PGND:地线,SGND(信号地),PGND(保护地)。
4,电平转换
RS-232C采用负逻辑,为了能够同计算机接口或终端的 TTL
器件连接,必须在 RS-232C与 TTL电路之间进行电平和逻辑关系的变换 。 常用的转换器件是 MAX232CPE(16),( 完成 TTL到 EIA
的双向电平转换 ) 。 MAX232芯片是 Maxim公司生产的低功耗,
单电源,双 RS-232发送 /接收器,可实现 TTL到 EIA的双向电平转换 。 其引脚排列如下图所示 。
MAX232芯片内部有一个电荷泵,可以把+ 5V电源变换成
〒 10V电压,所以采用 此芯片的串行通信系统只需要单一的+ 5V电源就可以 。 这也是它最大的优点 。
5,EIA RS-232C与单片机系统的接口
RS-232C与单片机系统的接口电路如图下所示 。 MAX232外围的 4个电解电容 Cl,C2,C3,C4,是内部电源转换所需电容,其取值均为 1?F/25V,C5为 0.1?F的去耦电容 。 MAX232的引脚
T1IN,T2IN,R1OUT,R2OUT为接 TTL/CMOS电平的引脚,引脚
T1OUT,T2OUT,R1IN,R2IN为接 RS-232C电平的引脚 。
所以,T1IN,T2IN引脚应与 MCS-51的串行发送引脚 TXD 相连接 。 R1OUT,
R2OUT应与 MCS-51的串行接收引脚 RXD 相 连 接 。
T1OUT,T2OUT应与 PC机的接收端 RD 相连接 。 R1IN,
R2IN应与 PC的发送端 TD相连接 。
实际设计的电路图如下:
作业与练习:
3.1 3.3
3.4 3.5
3.6 3.8
3.9 3.12
3.13 3.15
3.18 3.21
3.24 3.25
3.27 3.28
3.31 3.33