版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第7章
MCS-51单片机串行口
12内容概要
本章介绍MCS-51单片机片内全双工通用异步收发(UART)串行口的基本结构与工作原理以及相关的特殊功能寄存器,串行口的4种工作方式。
本章还介绍如何利用单片机串行口实现多机串行通信,以及多种拓展I/O口方法的应用。此外,以两个实际的案例从应用角度解析对目前单片机I/O口的使用。37.1串行通信基础知识单片机通信是指单片机与计算机或单片机与单片机之间的信息交换,通常单片机与计算机之间的通信用得较多。
通信方式有并行通信和串行通信两种。
在单片机系统及现代单片机测控系统中,信息的交换通常采用串行通信方式。7.1.1串行通信与并行通信单片机的数据通信有并行通信与串行通信两种方式。1.并行通信单片机并行通信是指数据的各位同时在多根数据线上进行传输的通信方式。
每一位数据都需要一根传输线,此外还需要一根或几根控制信号线。并行通信的示意图见图7-1。4图7-1
并行通信示意图5并行通信的传输特点:①传输速度快:由于数据的各位同时传输,相比于串行通信每次只传输一位数据,并行通信能在相同时间内传输更多的数据,大大提高了数据传输速率,适用于对传输速度要求较高的场景。②线路成本高:并行通信需要多根数据线同时传输数据,随着数据位数的增加,数据线的数量也会相应增多,这不仅增加了硬件成本,还会使电路板布线更加复杂,从而增加了设计的难度和成本。
③抗干扰能力弱:多根数据线并行传输时,各数据线之间容易产生电磁干扰,导致信号失真,影响数据传输的准确性。随着传输距离的增加,干扰问题会更加严重,因此并行通信通常适用于短距离的数据传输。6
2.串行通信单片机的串行通信是将数据字节分成一位一位的形式在一条传输线上逐个传送。
一次只能传送一位,对于一个字节的数据,至少要分
,
位才能传送完毕,如图7.2所示。。串行通信在发送时,要把并行数据变成串行数据发送到线路上去,接收时要把串行数据再变成并行数据。
串行通信的传输特点如下:①线路简单:与并行通信相比,串行通信只需较少的数据线,一般只需一根或两根线就可以完成数据传输,从而大大降低了硬件成本和布线的复杂程度,适合远距离通信。7
②传输速度慢:由于数据是逐位传输的,与并行通信同时传输多位数据相比,串行通信的传输速度相对较慢。
不过,随着技术的发展,高速串行通信标准的出现已经在很大程度上提高了传输速率。
③抗干扰能力强:串行通信的数据传输线少,线间干扰小,并且可采用一些抗干扰措施,如差分信号传输,使得它在复杂电磁环境下具有更好的稳定性和可靠性。图7-2
串行通信的示意图87.1.2串行通信的分类串行通信可以分为两种:同步串行通信和异步串行通信。(1)同步串行通信
通信双方使用同一个时钟信号来同步数据的传输。
发送方在时钟信号的控制下逐位发送数据,接收方在相同的时钟信号控制下逐位接收数据。
此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,这种方式传输效率高,适用于高速、大批量数据传输,但需要额外的时钟线来传输时钟信号,从而增加了硬件成本和复杂性。
常见的同步串行通信接口有SPI(SerialPeripheralInterface)、I2C(Inter-IntegratedCircuit)等,如图7-3所示。
9图7-3
同步通信及数据格式10(2)异步串行通信
通信双方不需要使用同一个时钟信号,而是通过约定好的波特率(数据传输速率)来协调数据的传输。
发送方在发送数据时会在数据帧的前后添加起始位和停止位,接收方根据起始位和停止位来判断数据的开始和结束,并按照约定的波特率进行数据接收。
异步串行通信不需要额外的时钟线,硬件实现简单,但传输效率相对较低,适用于低速、少量数据的传输。
常见的异步串行通信接口有UART(UniversalAsynchronousReceiver/Transmitter)。
图7-4所示为异步串行通信示意图及数据帧格式。
异步串行通信是以数据帧为单位进行的数据传输,各数据帧之间的间隔是任意的,但每个数据帧中的各位是以固定的时间传送的。
11图7-4
异步串行通信12
异步串行通信不要求收、发双方时钟严格一致,实现容易,成本低,但是每个数据帧要附加起始位和停止位,有时还要再加上奇偶校验位来构成一个通信帧。
起始位:在数据发送线上规定无数据时电平为1,当要发送数据时,首先发送一个低电平0,表示数据传送开始。
数据位:真正要传送的数据,由于字符编码方式不同,可以是5位、6位或多位。
数据位是由低位开始,高位结束,即低位在前、高位在后。
奇偶校验位:数据发送完后,发送奇偶校验信息以检验数据传送的正确性。
停止位:表示数据传送的结束,可以是1位、5位或者是4位。
高电平有效。
同步串行通信相比异步串行通信,同步串行通信数据传输的效率较高,但需额外增加一条同步时钟线。137.1.3串行通信的传输模式串行通信按照按照数据传输的方向及时间关系可分为单工、半双工和全双工3种。1.单工数据传输仅能按一个固定方向传输,不能反向传输,如图7-5(a)。2.半双工数据传输可双向传输,但不能同时传输,如图7-5(b)。3.全双工数据传输可同时进行双向传输,如图7-5(c)所示。14(b)半双工(a)单工(c)全双工图7-5
单工、半双工和全双工的数据传输模式157.1.4串行通信的错误校验在串行通信中,往往需要对数据传送的正确性进行校验。
校验是保证传输数据准确无误的关键。
常用的有奇偶校验、代码和校验和循环冗余码校验等方法。1.奇偶校验串行发送数据时,数据位尾随1位奇偶校验位(1或0)。当约定为奇校验时,数据中“1”的个数与校验位“1”的个数之和应为奇数;当约定为偶校验时,数据中“1”的个数与校验位“1”的个数之和应为偶数。数据发送方与接收方应一致。在接收数据帧时,对“1”的个数进行校验,若发现不一致,则说明数据传输过程中出现了差错,则通知发送端重发。162.代码和校验代码和校验是发送方将所发数据块求和或各字节异或,产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据时同时对数据块(除校验字节)求和或各字节异或,将所得结果与发送方的“校验和”进行比较,如果相符,则无差错,否则即认为在传输过程中出现了差错。3.循环冗余码校验循环冗余码校验纠错能力强,容易实现。校验是通过某种数学运算实现有效信息与校验位之间的循环校验,常用于对磁盘信息的传输、存储区的完整性校验等。是目前应用最广的检错码编码方式之一,广泛用于同步通信中。177.1.5串行通信的传输速率传输速率有多种表示方法,如波特率、比特率数目或信号变化的次数。
波特率(BaudRate):是指每秒事件发生的在单片机的串行数据传输中,事件和信号变化都反映在二进制位上,因此一般以波特率表示其速率。
单片机使用波特率作为串行通信传输速率的单位,每秒传送1个格式位/1波特,即1波特=1b/s(位Q秒)。
在串行数据传输中,波特率除表明数据传送速率外,还可表示串行口中移位脉冲频率的高低。
因为串行数据发送和接收的速率是由移位脉冲决定的,波特率高表示移位脉冲频高,串行数据传输速度快;反之,波特率低表示串行数据传输速度慢。187.2MCS-51的串行口及控制寄存器单片机串行口的内部结构见图7-6。有两个物理上独立的接收、发送缓冲器SBUF(属于特殊功能寄存器),可同时发送、接收数据。
发送缓冲器只能写入不能读出接收缓冲器只能读出不能写入两个缓冲器共用一个特殊功能寄存器字节地址(99H)。控制寄存器共有两个:特殊功能寄存器SCON和PCON。1819
图7-6
串行口的内部结构图19207.2.1串行口控制寄存器SCON
字节地址98H,可位寻址,位地址为98H~9FH。可用软件对SCON的所有位进行位操作清0或置1,格式如图7-7。
20介绍SCON中各位的功能。(1)SM0、SM1——串行口4种工作方式选择位SM0、SM1所对应的4种工作方式见表7-1。图7-7
串行口控制寄存器SCON的格式21(2)SM2——多机通信控制位多机通信是在方式2和方式3下进行。当串口以方式2或方式3接收时,如果SM2=1,则只有当接收到的第9位数据(RB8)为“1”时,才使RI置“1”,产生中断请求,并将接收到的前8位数据送入SBUF。当接收到的第9位数据(RB8)为“0”时,则将接收到的前8位数据丢弃。2122当SM2=
0时,则不论第9位数据是1还是0,都将前8位数据送入SBUF中,并使RI置1,产生中断请求。在方式1时,如果SM2=1,则只有收到有效的停止位时才会激活RI。在方式0时,SM2必须为0。(3)REN——允许串行接收位。由软件置“1”或清“0”。REN=1,允许串行口接收数据。REN=0,禁止串行口接收数据。2223(4)TB8——发送的第9位数据方式2和方式3,TB8是要发送的第9位数据,其值由软件置“1”或清“0”。在双机串行通信时,一般作为奇偶校验位使用;在多机串行通信中用来表示主机发送的是地址帧还是数据帧,TB8=1为地址帧,TB8=0为数据帧。(5)RB8——接收的第9位数据方式2和方式3,RB8存放接收到的第9位数据。在方式1,如SM2=0,RB8是接收到的停止位。在方式0,不使用RB8。(6)TI——发送中断标志位方式0,串行发送的第8位数据结束时TI由硬件置“1”,在其他方式中,串行口发送停止位的开始时置TI为“1”。2324TI
=1,表示一帧数据发送结束。TI的状态可供软件查询,也可申请中断。CPU响应中断后,在中断服务程序中向SBUF写入要发送的下一帧数据。TI必须由软件清“0”。(7)RI—接收中断标志位方式0时,接收完第8位数据时,RI由硬件置“1”。在其他工作方式中,串行接收到停止位时,该位置“1”。RI
=
1,表示一帧数据接收完毕,并申请中断,要求CPU从接收SBUF取走数据。该位的状态也可供软件查询。RI必须由软件清“0”。
SCON的所有位都可进行位操作清“0”或置“1”。257.2.2特殊功能寄存器PCON字节地址为87H,不能位寻址。格式如图7-8所示。
25图7-8
特殊功能寄存器PCON的格式26下面介绍PCON中各位功能。仅最高位SMOD与串口有关,其他各位的功能与单片机的节电工作方式有关。SMOD:波特率选择位。例如,方式1的波特率计算公式为
26当SMOD
=
1时,要比SMOD
=
0时的波特率加倍,所以也称SMOD位为波特率倍增位。277.3串行口的工作方式4种工作方式由SCON中SM0、SM1位定义,编码见表7-1。7.3.1方式0方式0为同步移位寄存器输入/输出方式。该方式并不用于两个单片机之间的异步串行通信,而是用于串行口外接移位寄存器,扩展并行I/O口。
方式0以8位数据为一帧,无起始位和停止位,先发送或接收最低位。波特率固定,为fosc/12。帧格式如图7-9所示。27图7-9
方式0的帧格式281.方式0输出(1)方式0输出的工作原理
当CPU执行一条将数据写入发送缓冲器SBUF的指令时,产生一个正脉冲,串行口开始把SBUF中的8位数据以fosc/12的固定波特率从RXD引脚串行输出,低位在先,TXD引脚输出同步移位脉冲,发送完8位数据,中断标志位TI置“1”。发送时序如图7-10所示。282929图7-10
方式0发送时序30(2)方式0输出的应用案例方式0输出的典型应用是串行口外接串行输入/并行输出的同步移位寄存器74LS164,实现并行输出端口的扩展。图7-11所示为串行口工作在方式0,通过74LS164的输出来控制8个外接LED发光二极管亮灭的接口电路。当串行口被设置在方式0输出时,串行数据由RXD端(P3.0)送出,移位脉冲由TXD端(P3.1)送出。在移位脉冲的作用下,串行口发送缓冲器的数据逐位地从RXD端串行地移入74LS164中。303131图8-11
方式0输出外接8个LED发光二极管接口电路
32【例7-1】
如图7-11所示,编写程序控制8个发光二极管流水点亮。图中74LS164的8脚(CLK端)为同步脉冲输入端,9脚为控制端,由单片机的P1.0控制,当9脚为0时,允许串行数据由RXD端(P3.0)向74LS164的串行数据输入端(1脚和2脚)输入,此时74LS164的8位并行输出端关闭;当9脚为1时,串行数据输入端(1脚和2脚)关闭,但是允许74LS164中的8位数据并行输出。当串行口将8位串行数据发送完毕后,申请中断,在中断服务程序中,单片机向串行口输出下一个8位数据。采用中断方式的参考程序如下:
33#include<reg51.h>#include<stdio.h> //包含移位函数的头文件sbitP1_0=0x90;unsignedcharnSendByte;voiddelay(unsignedinti) //延时函数{ unsignedcharj; for(;i>0;i--) //变量i由实际参数传入一个值,因此i不能赋初值
for(j=0;j<125;j++) ;}main()
//主函数{ SCON=0x00; //设置串行口为方式0 EA=1; //全局中断允许
34 ES=1; //允许串行口中断 nSendByte=1; //点亮数据初始值为00000001送入nSendByte SBUF=nSendByte; //CPU向SBUF写入点亮数据,启动串行发送 P1_0=0; //P1.0=0控制串行口向74LS164串行发送数据 while(1){;}}voidSerial_Port()interrupt4using0
//串行口中断函数{ if(TI) //判TI的值,如果TI=1,1个字节串行发完 { P1_0=1; //P1_0=1,允许74LS164并行输出,流水点亮二极管35 SBUF=nSendByte; //向SBUF写入数据,启动串行发送
delay(500); //延时,点亮二极管持续一段时间
P1_0=0; //P1_0=0,允许向74LS164串行写入,关闭并行输出
nSendByte=nSendByte<<1; //点亮二极管的数据左移1位 if(nSendByte==0)nSendByte=1; //判点亮数据是否左移8次?是,重新向nSendByte//写入点亮数据00000001 SBUF=nSendByte; //向74LS164再次串行发送点亮数据 } TI=0; RI=0;} 36程序说明如下:
(1)程序的第4行定义了全局变量nSendByte,以便在中断函数中能访问该变量。全局变量nSendByte用于存放从串行口发出的点亮数据,在程序中使用左移1位操作符“<<”对变量nSendByte进行移位,使得从串口发出的数据为0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80,从而流水点亮各个发光二极管。
(2)程序中if语句的作用是当nSendByte左移1位8次由0x80变为0x00后,需对变量nSendByte重新赋值为0x01。
(3)主程序中的SBUF=nSendByte语句必不可少,如果没有该语句,主程序就不会启动从串行口发送数据,也就不会产生随后的发送完成中断。
(4)语句“while(1){;}”用于实现反复循环。372.方式0输入(1)方式0输入的工作原理方式0输入,REN为串行口允许接收控制位,0—禁止接收;
1—允许接收。当向SCON寄存器写入控制字(设置为方式0,并使REN位置1,同时RI
=
0)时,产生一个正脉冲,串行口开始接收数据。引脚RXD为数据输入端,TXD为移位脉冲信号输出端,接收器以fosc/12的固定波特率采样RXD引脚的数据信息,当接收完8位数据时,中断标志RI置1,表示一帧数据接收完毕,可进行下一帧数据的接收,时序如图7-12所示。3738图7-12方式0接收时序39(2)方式0输入的应用举例
【例7-2】图7-13所示为串行口外接一片8位并行输入、串行输出的同步移位寄存器74LS165,从而实现了扩展一个8位并行输入口,可将接在74LS165的8个开关S0~S7的状态通过串行口的方式0输入方式读入到单片机内。74LS165的SH/LD*端(1脚)为控制端,由单片机的P1.1脚控制。若SH/LD*=0,则允许74LS165可以并行输入数据,且串行输出端关闭;当SH/LD*=1,则并行输入关断,可向单片机串行发送数据。当P1.0连接的开关k合上时,可对反映开关S0~S7的状态数字量并行读入,见图7-13。单片机采用中断方式来对S0~S7状态进行读取,并由单片机的P2口控制对应的开关按下的二极管发光点亮。3940图7-13
串口方式0外接并行输入、串行输出的同步移位寄存器41参考程序如下:#include<reg51.h>#include"intrins.h"#include<stdio.h>sbitP1_0=0x90;sbitP1_1=0x91;unsignedcharnRxByte;voiddelay(unsignedinti) //延时函数{ unsignedcharj; for(;i>0;i--) //变量i由实际参数传入一个值
for(j=0;j<125;j++); }42main(){ SCON=0x10; //向SCON写入控制字,初始化为方式0 ES=1; //允许串行口中断
EA=1; //允许全局中断
for(;;);}voidSerial_Port()interrupt4using0 //串行口中断函数{ if(P1_0==0) //如果P1_0=0表示开关k按下,可以读开关S0~S7的状态 { P1_1=0; //P1_1=0并行读入开关S0~S7的状态 delay(1); P1_1=1; //P1_1=1将开关S0~S7状态数据,串行读入到串行口中
RI=0; //接收中断标志RI清043
nRxByte=SBUF;//接收的开关状态数据从SBUF读入到nRxByte单元中 P2=nRxByte;//开关S0~S7的状态数据送P2口,驱动发光二极管发光}}
程序说明当P1.0为0,即开关k按下,表示允许并行读入开关S0~S7的状态数字量,通过P1.1把SH/LD*=0,则并行读入开关S0~S7的状态。再让P1.1=1,即SH/LD*=1,74LS165将刚才读入的S0~S7状态数据通过QH端(RXD脚)串行读入到单片机的SBUF中,在中断函数中把SBUF中的数据读到nRxByte单元,并送到P2口控制驱动8个发光二极管点亮。447.3.2方式1方式1为双机串行通信方式,如图7-14所示。当SM0、SM1=01时,串行口设为方式1的双机串行通信。TXD脚和RXD脚分别用于发送和接收数据。
44图7-14
方式1双机串行通信的连接电路45方式1一帧为10位,1个起始位(0),8个数据位,1个停止位(1),先发送或接收最低位。帧格式如图7-15所示。
图7-15方式1的帧格式
方式1为波特率可变的8位异步通信接口。波特率由下式确定:
45式中,SMOD为PCON寄存器的最高位的值(0或1)。461.方式1发送
串行口以方式1输出时,数据位由TXD端输出,发送一帧信息为10位,1位起始位0,8位数据位(先低位)和1位停止位1,当CPU执行写数据到发送缓冲器SBUF的命令后,就启动发送。方式1发送时序如图7-16所示。
图7-16中发送时钟为TX,TX时钟的频率就是发送的波特率。发送开始时,内部逻辑将起始位向TXD引脚(P3.1)输出,此后每经过1个TX时钟周期,便产生1个移位脉冲,并由TXD引脚输出1个数据位。8位数据位全部发送完毕后,中断标志位TI置“1”。464747图7-16
方式1发送时序482.方式1接收方式1接收时(REN
=
1),数据从RXD(P3.0)引脚输入。当检测到起始位的负跳变,则开始接收。
接收时序见图7-17。
接收时,定时控制信号有两种,一种是接收移位时钟(RX时钟),它的频率和传送的波特率相同,另一种是位检测器采样脉冲,频率是RX时钟的16倍。以波特率的16倍速率采样RXD脚状态。当采样到RXD端从1到0的负跳变时就启动检测器,接收的值是3次连续采样(第7、8、9个脉冲时采样)取两次相同的值,以确认起始位(负跳变)的开始,较好地消除干扰引起的影响,以保证可靠无误地开始接收数据。4849
49当确认起始位有效时,开始接收一帧信息。每一位数据,也都进行3次连续采样(第7、8、9个脉冲采样),接收的值是3次采样中至少两次相同的值。当一帧数据接收完毕后,同时满足以下两个条件,接收才有效。图7-17
方式1接收时序50(1)RI=
0,即上一帧数据接收完成时,RI
=
1发出的中断请求已被响应,SBUF中的数据已被取走,说明“接收SBUF”已空。(2)SM2=0或收到的停止位=1(方式1时,停止位已进入RB8),则将接收到的数据装入SBUF和RB8(装入的是停止位),且中断标志RI置“1”。若不同时满足两个条件,收的数据不能装入SBUF,该帧数据将丢弃。50517.3.3方式2方式2和方式3,为9位异步通信接口。每帧数据为11位,1位起始位0,8位数据位(先低位),1位可程控为1或0的第9位数据和1位停止位。方式2、方式3帧格式如图7-18所示。
图7-18
方式2、方式3的帧格式
51521.方式2发送发送前,先根据通信协议由软件设置TB8(如奇偶校验位或多机通信的地址/数据标志位),然后将要发送的数据写入SBUF,即启动发送。TB8自动装入第9位数据位,逐一发送。发送完毕,使TI位置“1”。发送时序如图7-19所示。
52图7-19
方式2和方式3发送时序532.方式2接收SM0、SM1=10,且REN=1时,以方式2接收数据。数据由RXD端输入,接收11位信息。当位检测逻辑采样到RXD的负跳变,判断起始位有效,便开始接收一帧信息。在接收完第9位数据后,需满足以下两个条件,才能将接收到的数据送入SBUF(接收缓冲器)。
(1)RI=0,意味着接收缓冲器为空。(2)SM2=0或RB8=1。5354当满足上述两个条件时,收到的数据送SBUF(接收缓冲器),第9位数据送入RB8,且RI置“1”。若不满足这两个条件,接收的信息将被丢弃。串行口方式2和方式3接收时序如图7-20所示。
54图7-20
方式2和方式3接收时序55557.3.4方式3当SM0、SM1两位为11时,串行口被定义为方式3。方式3为波特率可变的9位异步通信方式。方式3发送和接收时序如图8-19和图8-20所示。方式3的波特率由下式确定:567.4MCS-51的串行通信技术及其他扩展接口7.4.1多机通信多个单片机可利用串行口进行多机通信,常采用图7-21的主从式结构。系统有1个主机(单片机或其他有串行接口的微机)和多个单片机组成的从机系统。主机RXD与所有从机的TXD端相连,TXD与所有从机的RXD端相连。从机地址分别为01H、02H和03H。56图7-21
多机通信系统示意图57主从式是指多机系统中,只有一个主机,其余全是从机。主机发送的信息可以被所有从机接收,任何一个从机发送的信息,只能由主机接收。从机和从机之间不能进行直接通信,只能经主机才能实现。多机通信的工作原理:要保证主机与所选择的从机通信,须保证串口有识别功能。SCON中的SM2位就是为满足这一条件设置的多机通信控制位。其工作原理是在串行口以方式2(或方式3)接收时,若SM2=1,则表示进行多机通信,可能以下两种情况:5758(1)从机接收到的主机发来的第9位数据RB8=1时,前8位数据才装入SBUF,并置中断标志RI
=
1,向CPU发出中断请求。在中断服务程序中,从机把接收到的SBUF中的数据存入数据缓冲区中。(2)如果从机接收到的第9位数据RB8=0时,则不产生中断标志RI=1,不引起中断,从机不接收主机发来的数据。
若SM2
=
0,则接收的第9位数据不论是0还是1,从机都将产生RI
=
1中断标志,接收到的数据装入SBUF中。应用这一特性,可实现AT89S52单片机的多机通信。59多机通信的工作过程:(1)各从机初始化程序允许从机的串行口中断,将串行口编程为方式2或方式3接收,即9位异步通信方式,且SM2和REN位置“1”,使从机处于多机通信且只接收地址帧的状态。(2)在主机和某个从机通信之前,先将从机地址(即准备接收数据的从机)发送给各个从机,接着才传送数据(或命令),主机发出的地址帧信息的第9位为1,数据(或命令)帧的第9位为0。
当主机向各从机发送地址帧时,各从机的串行口接收到的第9位信息RB8为1,且由于各从机的SM2=1,则RI置“1”,各从机响应中断,在中5960断服务子程序中,判断主机送来的地址是否和本机地址相符合,若为本机地址,则该从机SM2位清“0”,准备接收主机的数据或命令;若地址不相符,则保持SM2=1。(3)接着主机发送数据(或命令)帧,数据帧的第9位为0。此时各从机接收到的RB8=0。只有与前面地址相符合的从机(即SM2位已清“0”的从机)才能激活中断标志位RI,从而进入中断服务程序,接收主机发来的数据(或命令);与主机发来的地址不相符的从机,由于SM2保持为1,又RB8=0,因此不能激活中断标志RI,就不能接受主机发来的数据帧。从而保证主机与从机间通信的6061正确性。此时主机与建立联系的从机已经设置为单机通信模式,即在整个通信中,通信的双方都要保持发送数据的第9位(即TB8位)为0,防止其他的从机误接收数据。(4)结束数据通信并为下一次的多机通信做好准备。在多机系统,每个从机都被赋予唯一的地址。例如,图8-21三个从机的地址可设为:01H、02H、03H。还要预留1~2个“广播地址”,它是所有从机共有的地址,例如将“广播地址”设为00H。当主机与从机的数据通信结束后,一定要将从机再设置为多机通信模式,以便进行下一次的多机通信。62这时要求与主机正在进行数据传输的从机必须随时注意,一旦接收的数据第9位(RB8)为“1”,说明主机传送的不再是数据,而是地址,这个地址就有可能是“广播地址”。当收到“广播地址”后,便将从机的通信模式再设置成多机模式,为下一次的多机通信做好准备。62637.4.2MCS-51单片机的I/O口拓展技术
MCS-51单片机有4组8I/O口,共占用32个引脚:P0、P1、P2和P3口通常作为总线使用,即P0口工作于地址总线低8位和数据总线,P2口工作于地址总线高8位,P3口通常工作于第二功能,即特殊功能。这样,MCS-51单片机真正可以使用的普通I/O管脚非常少,在测控应用场合中,需要进行I/O接口扩展。
用82C55扩展并行I/O接口82C55是Intel公司生产的可编程并行I/O接口芯片,它具有3个8位并行I/O口,3种工作方式,可编程,因而使用灵活方便,可作为单片机与多种外设连接时的中间接口电路。82C55引脚见图7-22。636464图7-2282C55引脚图65
引脚说明
双列直插封装,40只引脚,功能如下。
D7~D0:三态双向数据线,与单片机的P0口连接,用来与单片机之间传送数据信息。
CS:片选信号线,低电平有效,表示本芯片被选中。
RD:读信号线,低有效,用来读出82C55端口数据的控制信号。
WR:写信号线,低有效,用来向82C55写入端口数据的控制信号。
Vcc:+5V电源。
PA7~PA0:端口A输入/输出线。
PB7~PB0:端口B输入/输出线。
PC7~PC0:端口C输入/输出线。
A1、A0:地址线,选择82C55内部4个端口。
RESET:复位引脚,高有效。656666
内部结构
82C55内部结构见图7-24。左侧引脚与单片机连接,右侧引脚与外设连接。各部件功能如下。
(1)端口PA、PB、PC
3个8位并行口PA、PB和PC,它们都可选为输入/输出工作模式,但功能和结构上有些差异。
PA口:1个8位数据输出锁存器和缓冲器,1个8位数据输入锁存器。
PB口:1个8位数据输出锁存器和缓冲器,1个8位数据输入缓冲器。
PC口:1个8位数据输出锁存器,1个8位数据输入缓冲器。6767图7-2382C55的内部结构68通常PA口、PB口作为输入/输出端口。PC口既可以作为输入/输出端口,又可以作为控制/状态信息端口。PC口在“方式控制字”的控制下可分为两个4位端口(高4位PC4~PC7,低4位PC0~PC3),分别与A口和B口配合使用,作为控制信号输出和状态信息输入端口。
(2)两个工作方式控制电路工作方式控制电路有两个,一个是A组控制电路,一个是B组控制电路。A组控制PA口和PC口的上半部(PC4~PC7);B组控制PB口和PC口的下半部(PC0~PC3),并可使用“命令字”来对端口PC的每一位实现按位置“1”或清“0”。这两组控制电路具有一个控制命令寄存器,用来接收单片机发来的控制字,以决定两组端口的工作方式,也可根据控制字的要求对PC口进行位操作。
6869
(3)8位数据总线缓冲器数据总线缓冲器是一个三态双向8位缓冲器,作为82C55
与系统总线之间的接口,用于传送数据、指令、控制命令以及外部状态信息。
(4)读/写控制逻辑电路
读/写控制逻辑电路接收MCS-51单片机发来的控制信号RD*、WR*、RESET、地址信号A1,A0。A1和A0有4种组合,分别为00,01,10,11,用于选择PA、PB、PC及控制寄存器的端口地址。
根据控制信号的不同组合,端口数据被MCS-51单片机读出,或者将单片机送来的数据写入端口。
各端口的工作状态与地址信号A1和A0及控制信号的关系见表7-2。69707071
工作方式选择控制字82C55在使用前要写入一个方式控制字,选择PA、PB、PC三个端口各自的工作方式,共有三种。
(1)方式0——基本输入/输出,无条件传送。方式0下,3个端口都可设置为输入或输出,不需应答联络信号。PA口、PB口和PC口均可设定为方式0,并可根据需要,向控制端写入工作方式控制字,规定各端口为输入或输出方式。
(2)方式1——应答联络的输入/输出工作方式(PA、PB)。方式1下,PA和PB口常用于I/0数据的传送,PC口用作PA口和PB口的应答联络信号线,以实现中断方式来传送I/0数据
(3)方式2——双向传送(仅PA口有此工作方式)。PA7~PA0为双向I/O总线。717282C55芯片的3种工作模式(方式0、方式1、方式2)通过向控制寄存器写入特定的方式控制字进行配置,具体格式如图7-24所示。
图7-2482C55芯片的方式控制字格式73
该控制字最高有效位D7固定为1,作为方式控制字的标识位,此标志位用于与PC口置位/复位控制字(D7=0)进行区分。
3个端口中PC口被分为两个部分,上半部分随PA口称为A组,下半部分随PB口称为B组。其中PA口可工作于方式0、方式1和方式2,而PB口只能工作在方式0和方式1。
端口PC按位置位/复位控制字
82C55芯片的另一个控制字,即PC口8位中任一位,可用一个写入82C55控制口的置位/复位控制字对PC口按位置“1”或清“0”。该功能主要用于位控。PC口按位置位/复位控制字,如图7-25所示。74图7-25
PC口按位置位/复位控制字7582C55初始化编程即使配置好控制端口写入控制字即可,其中PA口、PB口只需要将工作方式控制字写入控制端口即可,PC口置位/复位控制字的写入只对PC口指定位输出状态起作用,对PA口和PB口的工作方式没有影响,因此当需要指定PC口某一位的输出电平时,只需在初始化时写入PC口的置位/复位控制字。
接下来我们直接从接线图中读取82C55地址。有接线图如图7-26所示。
图7-26是MCS-51单片机拓展1片82C55的电路图。74ALS573是地址锁存器,P0.6、P0.7经74ALS573与82C55的地址线A0、A1连接;P0.5经74ALS573与8255片选/CS端相连,其他地址线悬空。
7576图7-26
MCS-51单片机拓展82C55电路图77MCS-51中P2口全部悬空,地址高八位为FF。51中P0口接入锁存器,控制地址第八位,锁存器Q1~Q5悬空全部为1,决定地址的只有Q6~Q8。分别对应82C55芯片A0、A1、CS口,CS*选通,因此全取0,接下来A1,A0对照工作表,则可以列出地址如表7-3。
7778
在82C55与MCS-51硬件电路实现中,CPU与82C55的地址线有多种连接方式,因此82C55的寄存器端口地址也将有多种编码。在软件设计中,必须正确配置82C55的控制寄存器,才能合理使用82C55的各个端口。
用74系列芯片扩展并行I/O接口
在MCS-51单片机应用系统中,在采用TTL芯片实现MCS-51单片机I/O接口扩展时,通常采用单片机总线,配合地址译码实现输入和输出接口的扩展。作为输出的端口时,要求具有信号锁存功能,因此得选用具有锁存功能的芯片(如74ALS573/373);输入时,根据数据是常态还是暂态,要求接口芯片应能三态缓冲,或具有选通功能(如74ALS245)。电路连接如图7-27所示。。79图7-27
MCS-51单片机用74系列芯片扩展并行I/O接口电路图80假设单片机地址总线的高8位不用,且A6、A7为00,则输入、输出端口控制芯片选通的地址编码如表7-4所列。
8081
半导体存储器及MCS-51单片机的存储器扩展技术
(1)半导体存储器的性能指标
半导体存储器有多个性能指标,主要指标是存储容量、存取时间和存储周期。
①存储容量
存储容量是存储器能够存储的二进制信息的数量,它是表示存储器大小的指标。计算公式如下:
存储容量=字数×字长=2M×N其中M为芯片的地址线根数,N为芯片的数据线根数。82
②存取时间
存取时间也称为存储器访问时间,指的是从启动一次存储器操作到完成该操作所用的时间,其单位通常用ns表示,用TA表示。
②存取时间
存储周期也称为存取周期、访问周期、读/写周期。指的是连续两次启动同一存储器进行读/写操作(例如连续两次读操作)所需的最小时间间隔,用TM表示。
对任一种存储器,当进行一次访问后,存储介质和有关控制线路都需要恢复时间,若是破坏性读出,还需重写时间,因此通常TM>TA。
8283(2)半导体存储器的分类及其特点
①按存储器的读/写功能分类
按存储器的读/写功能,半导体存储器可分为读/写存储器(Read/WriteMemory,RWM)和只读存储器(ReadOnlyMemory,ROM)。
②按数据存取方式分类
按数据存取方式,半导体存储器可分为直接存取存储器(DirectAccessMemory,DAM)、顺序存取存储器(SequentialAccessMemory,SAM)和随机存取存储器(RandomAccessMemory,RAM)
③按器件原理分类
按器件原理,半导体存储器可分为:A.双极性TTL器件存储器(相对速度高,功耗大,集成度低);B.单极性MOS器件存储器(相对速度低,功耗小,集成度高)。
半导体存储器分类及其特点如图7-28所示。838484图7-28
半导体存储器分类及其特点85(3)半导体存储器容量的扩充
①按存储器的读/写功能分类
按存储器的读/写功能,半导体存储器可分为读/写存储器(Read/WriteMemory,RWM)和只读存储器(ReadOnlyMemory,ROM)。
②按数据存取方式分类
按数据存取方式,半导体存储器可分为直接存取存储器(DirectAccessMemory,DAM)、顺序存取存储器(SequentialAccessMemory,SAM)和随机存取存储器(RandomAccessMemory,RAM)
③按器件原理分类
按器件原理,半导体存储器可分为:A.双极性TTL器件存储器(相对速度高,功耗大,集成度低);B.单极性MOS器件存储器(相对速度低,功耗小,集成度高)。
半导体存储器分类及其特点如图7-28所示。8586(2)半导体存储器的分类及其特点
①存储器位数的扩展
位扩展指只在位数方向扩展(加大字长),而芯片的字数和存储器的字数是一致的。位扩展的连接方式是将各存储芯片的地址线、片选线和读/写线相应地并联起来,而将各芯片的数据线单独列出。
位扩展连接图如图7-29所示
访问该存储器时,单片机发出的地址和控制信号同时传给两个芯片(图中A0~A9为地址信号,A10为控制信号),选中每个芯片的同一单元,其单元的内容被同时读至数据总线的相应位,或将数据总线上的内容分别同时写入相应单元(D0~D7为写入内容)。868787图7-29
位扩展连接图88
②存储器存储单元的扩展
当存储器的位数满足要求,而需要扩展存储容量时,也需要用若干芯片来构成芯片组。仅在字数(单元数)方向扩展,而位数不变的扩展方法为字扩展。存储单元扩展的芯片片选控制通常有两种方法,即“线选法”和“译码法”,而译码法又可以分为“全译码”和“部分译码”。
线选法
用低位地址线来对每片内的存储单元进行寻址,所需地址线数由每片的单元数决定,如图7-30所示。888989图7-30
线选法的连接方式90(2)半导体存储器的分类及其特点
①存储器位数的扩展
位扩展指只在位数方向扩展(加大字长),而芯片的字数和存储器的字数是一致的。位扩展的连接方式是将各存储芯片的地址线、片选线和读/写线相应地并联起来,而将各芯片的数据线单独列出。
位扩展连接图如图7-29所示
访问该存储器时,单片机发出的地址和控制信号同时传给两个芯片(图中A0~A9为地址信号,A10为控制信号),选中每个芯片的同一单元,其单元的内容被同时读至数据总线的相应位,或将数据总线上的内容分别同时写入相应单元(D0~D7为写入内容)。9091其中A0~A11为数据地址总线,A12~A14为片选信号,D0~D7为读写数据。综合来看,上例中线选法地址编码如表7-5所示。线选法的优点是不需要地址译码器,线路简单,选择芯片不需外加逻辑电路。但从表7-5中可看出3个芯片的地址空间不连续,而且每个存储单元的地址不唯一(由于A15没有使用,在表中被设置为0,也可以设置为1,因此取值可以根据需求确定)。因此,线选法不能充分利用系统的存储器空间,且把地址空间分成了相互不连续的区域,给编程带来了一定的困难。它仅适用于连接存储芯片较少的场合。91929293
全译码法
将片内寻址外的全部高位地址线作为地址译码器的输入,把经译码器译码后的输出作为各芯片的片选信号,将它们分别接到存储芯片的片选端,以实现对存储芯片的选择,如图7-31所示。93图7-31
全译码法的连接方式9494
采用全译码时,每块芯片的地址范围是唯一的,不会出现片选混乱的情况,寻址范围得到充分利用。95
部分译码
若只将片内寻址之外的高位地址线的一部分接到译码器的变量输入端,用这样的译码器输出接到各个存储器的片选输入,就是用部分译码的方法来组成存储器芯片组,如图7-32所示。95图7-32
部分译码法的连接方式967.5串行口的应用举例7.5.1动态密码获取系统设计
动态密码获取系统是一种能够为用户提供临时、一次性密码的安全认证系统。
动态密码获取系统一般基于时间同步或事件同步机制来生成密码。
时间同步方式下,服务器和用户端设备(如手机令牌、硬件令牌)都有精确的时钟,根据预设的算法,在相同的时间点生成相同的动态密码。
事件同步是基于特定事件的发生,例如用户的特定操作触发服务器和客户端进行密码生成的同步。
动态密码获取系统广泛应用于网上银行、企业远程办公、云服务等场所。优点是安全性高、便捷性好。
缺点是依赖设备和网络、成本高。
单片机动态密码获取系统是一种基于单片机技术实现的动态密码生成和验证系统,一般由单片机、时钟模块、显示模块、输入模块、存储模块、通信模块组成。97
系统初始化时,单片机从存储模块中读取相关的配置信息和密钥等数据,并对各个模块进行初始化设置。
时钟模块开始计时,为系统提供时间基准。
当用户需要获取动态密码时,通过输入模块向单片机发送请求指令。
单片机根据当前的时间信息和预设的密码生成算法,利用密钥和时钟数据计算出动态密码。
计算出的动态密码通过显示模块展示给用户。
同时,如果系统具备通信功能,单片机可将动态密码相关信息发送给其他设备或服务器进行存储或进一步处理。
用户在进行身份验证等操作时,将看到的动态密码输入相应的验证系统中。
验证系统(可以是单片机本身,也可以是与之通信的外部服务器)
接收到用户输入的密码后,按照相同的算法和当前时间信息生成一个预期的动态密码,并与用户输入的密码进行比对。
如果两者一致,则验证通过,用户获得相应的访问权限或完成相关操作;如果不一致,则验证失败,系统可根据设定进行相应的提示或采取其他安全措施。98
下面以基于时间同步的动态密码获取系统为例来说明程序的编写。
图7-33所示为一种简易的单片机动态密码获取系统电路图。A.密码模式说明:1:时
分模式2:月
日模式3:日
分模式4:月
时模式B.测试密码输入:(上电默认为时分模式,默认密码1111),此时只有数字键撤销键和确认键可以用,4位密码,输入完成后,按下确认。99C.测试修改密码1:按下修改密码按键2:输入原密码3:输入新密码4.确认D.测试修改密码模式1.:按下修改密码模式按键2:输入密码3:设置模式(此时只有1234号键可以用)4:确认100
当电路正常运行时,D1闪烁。DS1302用于存储实时时间,作为动态密码的参考,单片机会周期性地读取
,DS1302的时间,再通过LCD屏显示出来。
报警系统通过NPN三极管控制蜂鸣器接到单片机的P1.7引脚上,当引脚为高电平时开启蜂鸣器,为低电平时关闭蜂鸣器。
用户界面为按键矩阵,用于密码输入、密码修改和密码模式的修改,以数字作为密码组成部分。继电器电路控制门的开关,当D2
灯亮时表示开锁,D2灯灭时表示关锁。101
在输入密码模式下,默认原始密码为1111,动态密码为原始密码+动态显示的时和分,当密码输入正确时开门;修改密码需要先输入正确密码,再设定新的原始密码;密码模式主要分为
4种:时和分、月和日、日和分、月和时,分别对应1、2、3、4,按下修改密码模式按键后,输入正确密码后按下密码模式相对应的数字即可修改,单片机复位后默认密码模式为时和分。
修改密码模式:按下修改随机密码的模式,如输入1,表示时分模式,则动态密码为原密码位数加上时间的时和分数值,例如,当前时间为20:16,原始密码为1111,则在20:16这个时间内输入动态码为3127。,则可以解锁,输入其他密码则解锁失败。
图7-33所示为动态密码获取系统原理仿真电路图。102
102图7-33
动态密码获取系统原理仿真电路图103参考程序如下:#include<reg51.h>#include"ds1302.h"#include"lcd.h"#include"key16.h"sbitled=P0^0;//定义LEDsbitdoor=P0^5;//定义继电器控制接口sbitbuzzer=P1^7;//定义蜂鸣器ucharmiao_n=0,shi_n=0,fen_n=0,ri_n=0,yue_n=0,nian_n=0;//定义时间变量voiddelay_ms(uintT)//毫秒延时函数{uchari;for(T;T>0;T--)for(i=200;i>0;i--);}
voiddisplay_2Decimal(unsignedcharx,unsignedchary,unsignedintval)//显示两位十进制数
103104
{
unsignedcharbuff[16];unsignedchari=1;buff[0]=0;buff[1]=0;buff[2]=0;
while(val!=0){buff[i++]=val%10;val=val/10;}buff[0]=i-1;LCD_disp_char(x+1,y,buff[1]+'0');//在第y行第x+1处
显示buff[1]
LCD_disp_char(x,y,buff[2]+'0');}
104105
voiddisplay_3Decimal(unsignedcharx,unsignedchary,uintrdata){//显示三位十进制数
unsignedchari,j,k;i=rdata/100;j=(rdata%100)/10;
k=(rdata%10);
if(i!=0)
LCD_disp_char(x,y,(i+'0'));
if(j!=0||(j==0&&i!=0))
LCD_disp_char(x+1,y,(j+'0'));
LCD_disp_char(x+2,y,(k+'0')); }
voiddispaly_time(){//显示时间
display_2Decimal(0,1,nian_n);
display_2Decimal(3,1,yue_n);
display_2Decimal(6,1,ri_n);
display_2Decimal(0,2,shi_n);
105106
display_2Decimal(3,2,fen_n); display_2Decimal(6,2,miao_n);}
voidcalc_mm_now(uchar*mm,ucharfen_n,ucharshi_n,ucharri_n,ucharyue_n,ucharnian_n,ucharmode,uchar*mm_now){//计算当前时间对应的密码switch(mode){
case1://选择时
和
分
mm_now[0]=(shi_n/10+mm[0])%10;
mm_now[1]=(shi_n%10+mm[1])%10;
mm_now[2]=(fen_n/10+mm[2])%10;
mm_now[3]=(fen_n%10+mm[3])%10;
break;106107
case2://选择月
日
mm_now[0]=(yue_n/10+mm[0])%10;
mm_now[1]=(yue_n%10+mm[1])%10;
mm_now[2]=(ri_n/10+mm[2])%10;
mm_now[3]=(ri_n%10+mm[3])%10;
break;
case3://选择
日
分
mm_now[0]=(ri_n/10+mm[0])%10;
mm_now[1]=(ri_n%10+mm[1])%10;
mm_now[2]=(fen_n/10+mm[2])%10;
mm_now[3]=(fen_n%10+mm[3])%10;
break;
case4://选择
月
时
mm_now[0]=(yue_n/10+mm[0])%10;
mm_now[1]=(yue_n%10+mm[1])%10;
mm_now[2]=(shi_n/10+mm[2])%10;
mm_now[3]=(shi_n%10+mm[3])%10;107108
break;}}
ucharcheck_mm(uchar*mm_now,uchar*mm_input)
{//验证当前输入的密码
返回0表示正确
uchari=0;for(;i<4;i++){
if(mm_now[i]!=mm_input[i])break;}returni!=4;}
voidinit_timer()//初始化定时器{
TMOD=0x11;
TH0=0;
TL0=0;
108109
EA=1;
ET0=1;
TR0=1;}
unsignedcharis_up=0,is_input_fin=0,is_mode_fin=0,key_num=0;
charkey_ret='X';
unsignedcharmm[4]={1,1,1,1},cursor_idx=0x0c,input_num=0;
unsignedcharmm_input[4];
unsignedcharmm_now[4];
unsignedcharled_count=0;
unsignedcharmode_n=1;
unsignedcharerro_times=0,is_erro=0;
unsignedinterro_time_conut=0;
voidinput(char*arg){//密码输入函数
LCD_disp_str(11,1,arg);
cursor_idx=0x0c;
109110LCD_write_command(0xc0+cursor_idx);//定位光标位置
LCD_write_command(0x0f);//开启光标闪烁
input_num=0;
while(!is_input_fin)
{//判断输入完成标志,完成退出whilekey_ret=KeyPro();
if(key_ret=='E')
{//密码输入完成
is_input_fin=1;
}
elseif(input_num<4&&key_ret!='X')
{//4位密码
未输入完成,且当前按键有效
if(key_ret>='0'&&key_ret<='9')
{//判断密码是否为数字
LCD_disp_char(cursor_idx,2,key_ret); delay_ms(500);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 客户投诉处理与解决机制
- 锦州滨海新区龙栖湾基础设施项目-常山路(龙栖湾大道-海棠街)道路工程水土保持方案报告表
- 快消品行业运营策略及面试技巧
- 集团年会策划与执行流程
- 零售门店设施维护维修调度员培训
- 旅游企业总裁助理面试全攻略
- 护理安全中的泌尿系统安全管理
- 2025年无人机管制数据挖掘与应用
- 2025年氢能公路运输车辆调度系统
- 临床研究协调员的沟通技巧与能力提升
- 2026年考试题库北汽集团高管知识水平测试
- 核电防异物管理指南(核心版)
- 人工智能在高职机械专业教学中的应用研究
- 高标准农田建设项目操作方案指南
- 2026年上饶职业技术学院单招职业技能考试必刷测试卷附答案
- 野战生存课件军用
- 环卫车辆安全行驶培训课件
- T-BWEA 4-2025 大中型泵站设备养护维修规程
- 酒店员工财务知识培训课件
- 吉尔吉斯斯坦比什凯克市大学汉字教学:现状、问题与对策探究
- 中医基础理论试题及答案3
评论
0/150
提交评论