第10章串行口的应用10.1串行口扩展显示器10.2串行口扩展的键盘10.3双机通信练习10.4用电流环实现的远距离串行通信10.5计算机与单片机的通信练习10.6多机通信练习(下载源码就到源码网:)1.实训目的掌握串行口的基本应用方法掌握串行口相关寄存器的设定方法掌握串行口扩展显示器的电路设计原理和编程方法2.功能设计应用单片机串行口方式0扩展8个共阴极LED,从显示缓冲区取8个数据进行显示。10.1串行口扩展显示器3.背景知识与串行口相关的特殊功能寄存器有SCON、PCON、SBUF,详见4.2节。执行指令MOVSBUF,X,可完成写串行口缓冲器,启动串行发送功能。执行指令MOVY,SBUF,可完成读串行口缓冲器,把接受到的8位串行数据读入功能。X可以是累加器A、寄存器Rn、间接寻址寄存器@Ri、直接地址direct或立即数#data。Y可以是累加器A、寄存器Rn、间接寻址寄存器@Ri或直接地址direct。(1)串行口控制寄存器SCON的设置设串行口为方式0。(2)方式0不需要设置PCON。(3)串行口方式0为移位寄存器方式,RXD(P3.0)端移位输出显示器段码(SBUF),低位在前;TXD(P3.1)端输出同步移位脉冲。SCONSM0SM1SM2RENTB8RB8TIRI98H000000004.硬件原理与资源分配本电路用串行口扩展8个共阴极数码管(LED0~LED7),显示8位数据。应用8051的串行口方式0输出方式,在串行口外接移位寄存器74LS164,构成显示器接口,其硬件接口电路如图10-1所示。一片74LS164能扩展一个数码管。74LS08为4×2输入与门。图10-1串行口扩展显示器图10-1中8个74LS164作为8位七段数码显示管输出口,8051的P3.3作为同步脉冲输出控制线,P3.4作为74LS164的清零控制端。显示方式采用静态显示,静态显示方式的特点是亮度大,数码显示不闪烁,且CPU不必频繁地为显示服务,软件设计比较简单,从而使单片机有更多的时间处理其他事务。74LS164为串入并出移位寄存器,其各管脚功能如下:引脚3~6,10~13(Q0~Q7)并行输出端。引脚1和2串行输入端。引脚8(CP)时钟信号输入端,CP脉冲的上升沿实现移位。在CP=0、Cr=1时,74LS164保持原来的数据状态。引脚9(Cr)清除端,零电平时,使164输出清零。内部RAM7F~78H单元为显示缓冲区。5.参考程序ORG0000HAJMPMAINORG0050HMAIN:…MOVSCON,#00H;设置串行口工作方式0,发送MOVR7,#08H;显示数据的个数MOVR0,#7FH;显示缓冲区首地址LCALLDISP;调显示子程序…DISP:CLRP3.4;清显示SETBP3.3;开显示移位脉冲输入SETBP3.4;开显示DL0:MOVA,@R0;取出要显示的数MOVDPTR,#STAB;段码表表头地址MOVCA,@A+DPTR;查表取出字形码MOVSBUF,A;送出数据显示DL1:JNBTI,DL1;判断输出是否完毕CLRTI;发送完毕,清中断DECR0;下一个数据DJNZR7,DL0CLRP3.3;关显示移位脉冲输入RET;返回STAB:DB3FH,06H,5BH,4FH,;0,1,2,3DB66H,6DH,7DH,07H,;4,5,6,7DB7FH,6FH77H,7CH,;8,9,A,BDB39H,5EH,79H,71H;C,D,E,F5.总结与提高串行口扩展数码显示器能够节约硬件资源,并且它采用静态显示方式,使显示亮度高。在使用串行口扩展显示器时应注意以下几个方面:(1)串行口扩展LED的个数比较多时,数据传输时间长,因此显示有可能出现闪烁。(2)编写应用程序时应注意以下3点:①串行口的初始化,主要是设定SCON。②显示字形编码与所用数码管的类型有关(如共阴、共阳等),在编写程序时要注意这个问题。③采用上述电路进行显示器的扩展所用扩展芯片较多,电路复杂,耗电较大,因此可采用串行口接MC14499进行显示译码和驱动,一片MC14499可驱动4个数码管。1.实训目的掌握串行口的基本应用方法掌握串行口相关寄存器的设定方法掌握串行口扩展键盘的电路设计原理和编程方法2.功能设计应用单片机串行口的工作方式0扩展2×8的矩阵式键盘。根据输入键号实现16分支散转。10.2串行口扩展的键盘3.背景知识关于散转程序的设计详见6.3.2节。串行口相关知识详见4.2节。4.硬件原理与资源分配本电路用串行口扩展2×8矩阵键盘。应用8051的串行口方式0输入方式,在串行口外接移位寄存器74LS164构成键盘接口,其硬件接口电路如图10-2所示。一片74LS164可以扩展8列按键。图10-2中的74LS164作为2×8键盘扫描输出口,8051的P3.4、P3.5作为键盘输入线,TXD端输出移位脉冲,RXD端输出列扫描信号。图10-2串行口扩展键盘硬件资源分配:R2存键号(0~F)R3存列号(0~7)R4行值0或8R6列扫描信号(0FH~7FH)R7总列数(8)5.参考程序ORG0000HAJMPMAINORG0050HMAIN:…MOVSCON,#00H;设置串行口工作方式0LCALLKEY1;调键盘扫描子程序MOVDPTR,#KEY;散转入口地址表首址送DPTRMOVR2,A;键号乘3,散转地址表中使用LJMP为3BADDA,R2ADDA,R2JMP@A+DPTR…KEY1:MOVA,#00HMOVSBUF,A;送全扫描字,看有无键按下KL0:JNBTI,KL0;判断输出完否CLRTI;如果输出完,则清中断标志KL1:JNBP3.4,PK1;如果第一排中有键按下,则转PK1JBP3.5,KL1;如果第二排中无键按下,则转KL1PK1:ACALLTIME10;延时JNBP3.4,PK2;如果不是颤抖引起的,则转PK2JBP3.5,KL1;如果是颤抖引起的,则转KL1PK2:MOVR7,#08H;查键号初始化,总列数送R7MOVR6,#0FEH;首列扫描字送R6MOVR3,#00H;首列偏移量送R3MOVA,R6;首列扫描字送AKL5:MOVSBUF,A;发送列选信号KL2:JNBTI,KL2;等待串行口发送完毕CLRTIJNBP3.4,PKONE;如果第一排此列有键按下,则转PKONEJBP3.5,NEXT;如果第二排此列无键按下,则转NEXTMOVR4,#08H;第二排此列有键按下AJMPPK3PKONE:MOVR4,#00HPK3:MOVSBUF,#00H;等待键释放KL3:JNBTI,KL3CLRTIKL4:JNBP3.4,KL4;键未释放,等待JNBP3.5,KL4;键未释放,等待MOVA,R4;取得键号ADDA,R3;键号=首列值+列偏移量RETNEXT:MOVA,R6;判断下一列是否有键按下RLA;列扫描字左移MOVR6,AINCR3;列偏移量加1DJNZR7,KL5;8列未查完,返回再查AJMPKEY1;8列查完,开始下一扫描周期TIME10:PUSH06H;R6、R7进栈保护PUSH07HTIME:MOVR7,#0AH;延时10msLOP:MOVR6,#0FFHSTP:DJNZR6,STPDJNZR7,LOPPOP07H;R6、R7出栈POP06HRETKEY+00H:LJMPPROG0;0号键入口地址KEY+03H:LJMPPROG1;1号键入口地址…KEY+2DH:LJMPPROG15;F号键入口地址…PROG0:……PROG1:……PROGF:……6.总结与提高利用串行口方式0可以同时扩展矩阵键盘和数码管显示器,并节约硬件资源。在使用串行口扩展键盘时应注意以下几个方面:(1)串行口扩展键盘的个数比较多时,所用74LS164芯片增多,功耗增加,所占用的口线也会增加。(2)编写应用程序时应注意以下几点:①串行口的初始化,包括设定SCON,设置中断系统。②键盘散转入口地址的分配要注意键盘服务功能程序调用或跳转使用的指令的字节数(AJMP为2字节,LJMP为3字节)。③程序中没有给出键盘功能程序,读者可根据实际情况自己编写。1.实训目的掌握串行口相关寄存器的设定方法和波特率的设定掌握MCS-51单片机串行口双机通信的编程方法10.3双机通信练习2.功能设计两个单片机系统之间进行串行数据通信,#1机发送数据,#2机接收数据。两机的晶振频率为12MHz,波特率设置为2400b/s,串行口工作为方式1。#1机将内部RAM以30H为首地址的20个数据发送出去,#2机将接收到的20个数据放入内部RAM以30H为首地址的单元中。采用累加和校验。双方通信约定如下:①#1机开始发送时,先发一个“CC”信号,#2机收到后回答一个“DD”,表示同意接收。②#1机收到“DD”后,开始发送数据,每发送一次则求一次“校验和”。每发送一个字节数据均累加到R4中,累加过程中会发生多次向高位进位,将进位丢失,最后在累加单元中所形成的结果即为“校验和”。数据块发完后再发送“校验和”。③#2机接收数据并将其转存到数据缓冲区,起始地址也为30H,每接收一次同样计算一次“校验和”。当接收完数据块后,再接收从#1机发来的“校验和”,并将它与#2机求出的“校验和”进行比较。若两者相等,说明接收正确,#2机回答一个“00”;若两者不等,说明接收不正确,#2机回答一个“FF”,请求重发。④#1机收到“00”的回答后,结束发送。若收到的答复不是“00”,则将数据重发一次。3.背景知识有关串行口的基本知识和工作方式见4.1和4.2节内容,在此仅说明串行口工作方式1的波特率的设置。串行口方式1和串行口方式3的波特率是可变的,其波特率可由以下公式计算:定时器T1的溢出率计算公式为:溢出率定时器波特率=1T322SMOD)-(溢出率=定时器X2112fT1KOSC式中,X为定时器初值,fosc为晶振频率,K为定时器T1的位数,它和定时器T1的设定方式有关。本设计采用的定时器T1为方式2,则K=8。设SMOD=0,则由解出X=243=F3H。)X21(1210123222400860由于定时器T1在方式2下工作,TH1和TL1分别设定为两个8位重装计数器(当TL1从全“1”变为全“0”时,TH1重装TL1)。因此,这种方式不仅操作方便,而且可避免因重装初值(时间常数初值)带来的定时误差。在此应注意定时器T1的工作方式与串口工作方式的区别。4.硬件原理与资源分配电路中的8051串行口工作在方式1,其硬件接口电路如图10-3所示。两个系统的串行口接地线连接在一起,发送端、接收端相互交叉连接。图10-3双机通信电路原理图5.参考程序#1机发送程序如下:ORG0000HAJMPMAINORG0050HMAIN:…LCALLFS;调发送子程序…FS:MOVTMOD,#20H;设置T1为定时方式2MOVTH1,#0F3H;设置波特率为2400b/sMOVTL1,#0F3HMOVSCON,#50H;设置串行口工作方式1,允许接收MOVPCON,#00H;SMOD=0SETBTR1;启动定时器T1LL:MOVSBUF,#0CCH;发送联络信号L1:JNBTI,$;等待发送完毕CLRTI;清除中断标志JNBRI,$;等待#2机应答CLRRI;清除中断标志MOVA,SBUF;接受应答信号XRLA,#0DDH;判断应答信号是否为0DDHJNZLL;#2机未准备好,继续联络L2:MOVR0,#30H;发送缓冲区首地址MOVR3,#20;数据长度送R3MOVR4,#00H;清校验和L3:MOVSBUF,@R0;发送一个字节数据MOVA,R4;求校验和ADDA,@R0MOVR4,A;校验和保存在R4INCR0;数据指针加1JNBTI,$;发送完否CLRTIDJNZR3,L3;未发送完,继续发送下一字节MOVSBUF,R4;发送校验和JNBTI,$;发送完否CLRTIJNBRI,$;等待#2机应答CLRRIMOVA,SBUFJNZL2;发送出错,重发RET#