第8章AT89S51单片机的串行口

上传人:仙*** 文档编号:152614119 上传时间:2022-09-16 格式:PPT 页数:89 大小:1.06MB
收藏 版权申诉 举报 下载
第8章AT89S51单片机的串行口_第1页
第1页 / 共89页
第8章AT89S51单片机的串行口_第2页
第2页 / 共89页
第8章AT89S51单片机的串行口_第3页
第3页 / 共89页
资源描述:

《第8章AT89S51单片机的串行口》由会员分享,可在线阅读,更多相关《第8章AT89S51单片机的串行口(89页珍藏版)》请在装配图网上搜索。

1、第8章 AT89S51单片机的 串行口12全双工异步串行口全双工异步串行口并行通信并行通信U 并行通信和串行通信并行通信和串行通信串行通信串行通信数据的各位数据的各位同同时时传送(接收)传送(接收)数据的逐位数据的逐位分时分时传送(接收)传送(接收)U 异步通信和同步通信异步通信和同步通信异步通信(异步通信(Asynchronous Communication):):同步通信同步通信(Synchronous Communication):):同步通信是指通信时要建立发送方时钟对接收方时同步通信是指通信时要建立发送方时钟对接收方时钟的直接控制,使收发双方达到完全同步的一种通钟的直接控制,使收发双

2、方达到完全同步的一种通信方式。信方式。异步通信是指发送端和接收端使用各自的时钟来控制异步通信是指发送端和接收端使用各自的时钟来控制数据的发送和接收的一种通信方式。这两个时钟源彼数据的发送和接收的一种通信方式。这两个时钟源彼此独立,无需严格同步。此独立,无需严格同步。4 串行通信的串行通信的3 3种制式种制式:单工(单工(simplexsimplex)半双工(半双工(half duplexhalf duplex)全双工全双工 (duplexduplex)概述:概述:可编程的全双工异步串行口可编程的全双工异步串行口 管脚:管脚:TXD(P3.1)、RXD(P3.0)可同时发送、接收数据可同时发送、

3、接收数据 四种工作方式,帧格式有四种工作方式,帧格式有8位、位、10位、位、11位位 波特率(波特率(Baud rate)可设置)可设置 波特率波特率(比特率比特率):每秒钟传送二进制数的位每秒钟传送二进制数的位 数,单位数,单位b/s。8.1 8.1 串行口的结构串行口的结构6图图8-1 8-1 内部结构内部结构PCONSCON7SBUFSBUF_ _串行口数据串行口数据缓冲器缓冲器两个物理上独立两个物理上独立的的接收、发送缓冲器接收、发送缓冲器发送缓冲器发送缓冲器只写不能读。只写不能读。接收缓冲器接收缓冲器只读不能写。只读不能写。两个缓冲器两个缓冲器共用一个字节地址共用一个字节地址(99H

4、99H)。)。SCON SCON _串行口控制串行口控制寄存器(寄存器(98H98H),可位寻址可位寻址 PCON _PCON _电源电源控制控制寄存器(寄存器(87H87H),不可位寻址不可位寻址8.1.1 串行口控制寄存器串行口控制寄存器SCON接收中断标志接收中断标志发送中断标志发送中断标志发送中断标志发送中断标志接收的第接收的第9 9位数据位数据发送的第发送的第9 9位数据位数据允许串行接收位允许串行接收位多机通信控制位多机通信控制位允许串行接收位允许串行接收位工作方式选择位工作方式选择位9SM0SM1工作工作方式方式功功 能能波波 特特 率率0008位同步移位寄存器(扩展位同步移位寄

5、存器(扩展IO口)口)fosc/1201110位异步收发(位异步收发(8位数据)位数据)可变,由定时器可变,由定时器1溢溢出率控制出率控制10211位异步收发(位异步收发(9位数据)位数据)fosc/64或或fosc/3211311位异步收发(位异步收发(9位数据)位数据)可变,由定时器可变,由定时器1溢溢出率控制出率控制表表8-18-1串行口的工作方式串行口的工作方式8.1.2 8.1.2 电源控制及波特率选择寄存器电源控制及波特率选择寄存器PCONPCON10当SMOD=1SMOD=1时,要比SMOD=0SMOD=0时波特率加倍,所以也称SMOD位为波特率倍增位波特率倍增位。例如例如,方式

6、,方式1 1的波特率计算公式:的波特率计算公式:方式方式1 1波特率波特率=定时器定时器T1T1的溢出率的溢出率SMOD2328.2 8.2 串行口的串行口的4 4种工作方式种工作方式8.2.1 8.2.1 方式方式0 0同步移位寄存器输入同步移位寄存器输入/输出方式输出方式。该方式并。该方式并不用于两个不用于两个AT89S51AT89S51单片机之间的异步串行通信单片机之间的异步串行通信,而是,而是用于串行口外接用于串行口外接移位寄存器移位寄存器,扩展并行,扩展并行I/OI/O口。口。8 8位数据为一帧,位数据为一帧,无无起始位起始位和和停止位停止位,先发送或接收最低,先发送或接收最低位。波

7、特率为位。波特率为f foscosc/12/12。帧格式如。帧格式如图图8-48-4。图图8-4 8-4 方式方式0 0的帧格式的帧格式111 1方式方式0 0输出输出(1 1)方式)方式0 0输出的工作原理输出的工作原理当执行一条将数据当执行一条将数据写入发送缓冲器写入发送缓冲器SBUFSBUF指令指令时,时,产生一个产生一个正脉冲正脉冲,串行口开始把,串行口开始把SBUFSBUF中的中的8 8位数据以位数据以f foscosc/12/12的的固定波固定波特率特率从从RXDRXD引脚串行输出,低位在先,引脚串行输出,低位在先,TXDTXD引脚输出同步移位引脚输出同步移位脉冲,脉冲,发送完发送

8、完8 8位数据,中断标志位位数据,中断标志位TITI置置“1 1”。发送时序发送时序如如图图8-58-5。12图图7-5 方式方式0发送时序发送时序13(2 2)方式)方式0 0输出的应用输出的应用 典型应用是外扩串行输入典型应用是外扩串行输入/并行输出的同步移位寄存器并行输出的同步移位寄存器74LS16474LS164,实现并行输出端口的扩展。,实现并行输出端口的扩展。图图8-68-6为串行口工作在方式为串行口工作在方式0 0,通过,通过74LS16474LS164的输出来控的输出来控制制8 8个外接个外接LEDLED发光二极管亮灭的接口电路。当串行口被设置发光二极管亮灭的接口电路。当串行口

9、被设置在方式在方式0 0输出时,串行数据由输出时,串行数据由RXDRXD端(端(P3.0P3.0)送出,移位脉冲)送出,移位脉冲由由TXDTXD端(端(P3.1P3.1)送出。在移位脉冲的作用下,串行口发送)送出。在移位脉冲的作用下,串行口发送缓冲器的数据逐位地从缓冲器的数据逐位地从RXDRXD端串行地移入端串行地移入74LS16474LS164中。中。1415图图8-6 8-6 串行口的方式串行口的方式0 0 外接外接8 8个个LEDLED发光二极管的接口电路发光二极管的接口电路 【例例8-18-1】如如图图8-68-6所示,编写程序控制所示,编写程序控制8 8个发个发光二极管轮流点亮。光二

10、极管轮流点亮。图中图中74LS16474LS164的的CLKCLK端为同步脉冲输入端,端为同步脉冲输入端,CLRCLR为控制端,当为控制端,当CLR=0CLR=0时,允许串行数据从时,允许串行数据从A A和和B B端输端输入但是入但是8 8位并行输出端关闭;当位并行输出端关闭;当CLR=1CLR=1时,时,A A和和B B输入输入端关闭,但是允许端关闭,但是允许74LS16474LS164中的中的8 8位数据并行输出。位数据并行输出。当当8 8位串行数据发送完毕后,引起中断,在中断服务位串行数据发送完毕后,引起中断,在中断服务程序中,单片机通过串行口输出下一个程序中,单片机通过串行口输出下一个

11、8 8位数据。位数据。采用中断方式的参考程序如下。采用中断方式的参考程序如下。16n#include n#include nsbit P1_0=0 x90;nunsigned char nSendByte;nvoid delay(unsigned int i)nn int j;n for(;i0;i-)n for(j=0;j125;j+);nnmain()n nSCON=0 x00;/*设置串行口为方式设置串行口为方式0*/nEA=1;/*全局中断允许全局中断允许*/nES=1;/*允许串行口中断允许串行口中断*/nnSendByte=1;nSBUF=nSendByte;/启动串口发送启动串口

12、发送nP1_0=0;/允许串口向允许串口向164串行发送数据串行发送数据nwhile(1);n 17nvoid Serial_Port()interrupt 4 using 0nn TI=0;n P1_0=1;n nSendByte=1;n if(nSendByte=0)nSendByte=1;n SBUF=nSendByte;n delay(500);n P1_0=0;n 182 2方式方式0 0输入输入(1 1)方式)方式0 0输入工作原理输入工作原理方式方式0 0接收,接收,RENREN为为允许接收控制位允许接收控制位,REN=0REN=0,禁止接收;,禁止接收;RENREN=1 1,允

13、许接收。,允许接收。当向当向SCONSCON寄存器寄存器写入控制字写入控制字(设置为方式(设置为方式0 0,并使,并使RENREN位置位置“1 1”,同时,同时RIRI=0 0)时,)时,产生一个正脉冲,串行口开始接收产生一个正脉冲,串行口开始接收数据。数据。引脚引脚RXDRXD为数据输入端,为数据输入端,TXDTXD为移位脉冲信号输出端,接收为移位脉冲信号输出端,接收器以器以f foscosc/12/12的固定波特率的固定波特率采样采样RXDRXD引脚的数据信息,当引脚的数据信息,当接收完接收完8 8位位数据时,中断标志数据时,中断标志RIRI置置“1 1”,表示一帧数据接收完毕,表示一帧数

14、据接收完毕,通知通知CPUCPU读取该数据,并执行读取该数据,并执行RI=0RI=0指令,准备接收下一帧数据,指令,准备接收下一帧数据,时序如时序如图图8-78-7。19图图7-7 方式方式0接收时序接收时序2021(2 2)方式)方式0 0输入应用举例输入应用举例 【例例8-28-2】图图8-88-8为串口外接一片为串口外接一片8 8位并行输入、串行输出位并行输入、串行输出的同步移位寄存器的同步移位寄存器74LS16574LS165,扩展一个,扩展一个8 8位并行输入口的电路,位并行输入口的电路,可将接在可将接在74LS16574LS165的的8 8个开关的状态通过串口方式个开关的状态通过串

15、口方式0 0读入到单片读入到单片机内。机内。74LS16574LS165的的SH/LDSH/LD端为控制端。若端为控制端。若SH/LD=0SH/LD=0,则,则74LS16574LS165可可并行输入数据,且串行输出端关闭;并行输入数据,且串行输出端关闭;SH/LD=1SH/LD=1,则并行输入关,则并行输入关断,可以串行输出。断,可以串行输出。22图图8-8 外接并行输入串行输出的同步移位寄存器外接并行输入串行输出的同步移位寄存器n#include nsbit P1_1=0 x91;nvoid delay(unsigned int i)nn int j;n for(;i0;i-)for(j=

16、0;j125;j+);nnvoid main()n nSCON=0 x10;/*串行口初始化为方式串行口初始化为方式0*/nwhile(1)nnP1_1=0;nP1_1=1;nwhile(RI=0);n RI=0;n P2=SBUF;/*读入读入SBUF 中的数据中的数据*/n delay(10);n n23参考程序如下:参考程序如下:查询方式读入开关状态查询方式读入开关状态作业:中断方式读入开关状态作业:中断方式读入开关状态8.2.2 8.2.2 方式方式1 1方式方式1 1为双机串行通信方式,如为双机串行通信方式,如图图8-98-9所示。所示。当当SM0SM0、SM1=01SM1=01时,

17、串行口设为方式时,串行口设为方式1 1的双机串行通信。的双机串行通信。TXDTXD脚和脚和RXDRXD脚分别用于发送和接收数据。脚分别用于发送和接收数据。图图8-98-9 方式方式1 1双机串行通信的连接电路双机串行通信的连接电路2424方式方式1 1一帧数据为一帧数据为1010位位,1 1个起始位(个起始位(0 0),),8 8个数据位,个数据位,1 1个个停止位(停止位(1 1),),先发送或接收最低位。帧格式如先发送或接收最低位。帧格式如图图8-108-10。图图8-108-10 方式方式1 1的帧格式的帧格式方式方式1 1为为波特率可变波特率可变的的8 8位异步通信接口。波特率由下式确

18、位异步通信接口。波特率由下式确定:定:方式方式1 1波特率波特率=定时器定时器T1T1的溢出率的溢出率SMODSMOD为为PCONPCON寄存器的最高位的值(寄存器的最高位的值(0 0或或1 1)。)。25SMOD2321 1方式方式1 1发送发送方式方式1 1输出时,数据位由输出时,数据位由TXDTXD端端输出,当输出,当CPUCPU执行一条数据执行一条数据写写SBUFSBUF的指令,就的指令,就启动发送启动发送。发送时序见。发送时序见图图8-118-11。图图8-118-11中中TXTX时钟时钟的频率就是发送的波特率。的频率就是发送的波特率。26内部发送内部发送控制信号控制信号图图8-11

19、 8-11 方式方式1 1发送时序发送时序中断标志位中断标志位TI置置“1发送移位发送移位时钟信号时钟信号空闲为空闲为12 2方式方式1 1接收接收方式方式1 1接收时(接收时(RENREN=1 1),数据从),数据从RXDRXD(P3.1P3.1)引脚输入。当)引脚输入。当检测到起始位的检测到起始位的负跳变负跳变,则,则开始接收开始接收。接收时序见。接收时序见图图8-128-12。27 图图8-128-12 方式方式1 1接收时序接收时序接收移位接收移位时钟信号时钟信号空闲为空闲为1D7接收数据有效(能装入接收数据有效(能装入SBUFSBUF且能被且能被CPUCPU读出的)的读出的)的条件:

20、条件:(1 1)RI=0RI=0 ;SM2=0SM2=0(方式(方式1 1时,时,SM2SM2设为设为0 0)。)。(2 2)RI=0RI=0 ;RB8RB8 =1 1(控制激活控制激活RIRI的功能的功能),SM2=1SM2=1(只有接收到有效的停止位,(只有接收到有效的停止位,RIRI才被才被置置“1”1”。若不满足任何一个条件,收的数据不能被若不满足任何一个条件,收的数据不能被CPUCPU读,读,该帧数据将丢弃。该帧数据将丢弃。288.2.3 8.2.3 方式方式2 2 方式方式2 2和方式和方式3 3,9 9位异步通信接口。位异步通信接口。每帧数据为每帧数据为1111位位,1 1位起始

21、位位起始位0 0,8 8位数据位(先低位),位数据位(先低位),1 1位可程控为位可程控为1 1或或0 0的第的第9 9位数据和位数据和1 1位停止位位停止位。方式。方式2 2、方式、方式3 3帧格式如帧格式如图图8-138-13。图图8-138-13 方式方式2 2、方式、方式3 3的帧格式的帧格式方式方式2 2波特率波特率=f foscosc29SMOD2641 1方式方式2 2发送发送 发送前,发送前,先根据协议由软件设置先根据协议由软件设置TB8TB8(如奇偶校验位或(如奇偶校验位或多机通信的地址多机通信的地址/数据标志位),然后将要发送的数据写入数据标志位),然后将要发送的数据写入S

22、BUFSBUF,即启动发送。,即启动发送。TB8TB8自动装入自动装入第第9 9位数据位,逐一发送。位数据位,逐一发送。发送完毕,使发送完毕,使TITI位置位置“1 1”。图图8-148-14 方式方式2 2和方式和方式3 3发送时序发送时序302 2方式方式2 2接收接收 SM0 SM0、SM1=10SM1=10,且,且REN=1REN=1时。数据由时。数据由RXDRXD端端输入,当位检输入,当位检测逻辑采样到测逻辑采样到RXDRXD的的负跳变负跳变,判断起始位有效,便开始接收,判断起始位有效,便开始接收一帧信息。在接收完第一帧信息。在接收完第9 9位数据后,位数据后,需满足以下两个条件,需

23、满足以下两个条件,才能将接收到的数据送入接收缓冲器才能将接收到的数据送入接收缓冲器SBUFSBUF。(1 1)RI=0RI=0,意味着接收缓冲器为空。,意味着接收缓冲器为空。(2 2)SM2=0SM2=0或接收到的第或接收到的第9 9位数据位位数据位RB8=1RB8=1。当当满足上述两个条件满足上述两个条件时,时,收到的数据送收到的数据送SBUFSBUF(接收缓冲(接收缓冲器),第器),第9 9位数据送入位数据送入RB8RB8,且,且RIRI置置“1 1”。若不满足这两个若不满足这两个条件条件,接收的信息将被丢弃。,接收的信息将被丢弃。31串行口方式串行口方式2 2和方式和方式3 3接收时序接

24、收时序如如图图8-158-15。图图8-158-15 方式方式2 2和方式和方式3 3接收时序接收时序328.2.4 8.2.4 方式方式3 3 SM0 SM0、SM1=11SM1=11时,方式时,方式3 3。为波。为波特率可变的特率可变的9 9位异步通信位异步通信方式,方式,除了波特率外,方式除了波特率外,方式3 3和方式和方式2 2相同相同。方式。方式3 3发送和接发送和接收时序收时序如如图图8-148-14和和图图8-158-15所示。所示。方式方式3 3波特率波特率=定时器定时器T1T1的溢出率的溢出率33SMOD2328.4 8.4 波特率的制定波特率的制定 串行通信,收、发双方发送

25、或接收的串行通信,收、发双方发送或接收的波特率必须一致。波特率必须一致。8.4.1 8.4.1 波特率的定义波特率的定义 波特率的定义:波特率的定义:串行口串行口每秒钟发送(或接收)的位数每秒钟发送(或接收)的位数。348.4.2 8.4.2 定时器定时器T1T1产生波特率的计算产生波特率的计算(1 1)方式方式0 0时,波特率时,波特率固定为时钟频率固定为时钟频率f foscosc的的1/121/12,不受,不受SMODSMOD位位值的影响。若值的影响。若f foscosc=12 MHz12 MHz,波特率,波特率1Mbit/s1Mbit/s。(2 2)方式方式2 2时,波特率仅与时,波特率

26、仅与SMODSMOD位的值有关。位的值有关。方式方式2 2波特率波特率=f foscosc 若若f foscosc=12 MHz12 MHz:SMODSMOD=0 0,波特率,波特率=187.5 kbit/s187.5 kbit/s;SMODSMOD=1 1,波特率,波特率=375 kbit/s375 kbit/s。SMOD264波特率波特率=定时器定时器T1T1的溢出率的溢出率 (8-18-1)波特率由波特率由T1T1溢出率溢出率和和SMODSMOD的值的值共同决定共同决定。实际设定波特率时实际设定波特率时,T1T1常设置为方式常设置为方式2 2定时(自动装初值),定时(自动装初值),即即T

27、L1TL1作为作为8 8位计数器,位计数器,TH1TH1存放备用初值。存放备用初值。定时器定时器T1T1的溢出率的溢出率=(8-28-2)35SM OD232osc/12256256计计数数速速率率fXX(3 3)方式)方式1 1或方式或方式3 3时,用时,用T1T1作为波特率发生器作为波特率发生器SMODosc23212(256)fX波特率波特率=(8-38-3)结论:波特率结论:波特率随随f foscosc、SMODSMOD和定时器和定时器 TL0TL0初值初值X X而变化。而变化。定时器定时器TL1在方在方式式2的初值为的初值为X 实际使用时,经常根据实际使用时,经常根据已知波特率和时钟

28、频率已知波特率和时钟频率f foscosc来来计算计算TL1TL1的初值的初值X X。为避免繁杂的初值计算,。为避免繁杂的初值计算,常用的波特率和初值常用的波特率和初值X X间的关系常列成间的关系常列成表表8-28-2形式形式,供查用。供查用。36表8-2 用定时器T1产生的常用波特率37波 特 率foscSMOD位方式初值X62.5kbit/s12 MHz11、3FFH19.2kbit/s11.0592 MHz11、3FDH9.6kbit/s11.0592 MHz01、3FDH4.8kbit/s11.0592 MHz01、3FAH2.4kbit/s11.0592 MHz01、3F4H1.2k

29、bit/s11.0592 MHz01、3E8H表表8-28-2有两点需要注意:有两点需要注意:(1 1)在使用的时钟振荡频率)在使用的时钟振荡频率f foscosc为为12MHz12MHz或或6MHz6MHz时,将初时,将初值值X X和和f foscosc带入式(带入式(8-38-3)中计算出的波特率)中计算出的波特率有一定误差有一定误差。消。消除误差可采用除误差可采用时钟频率时钟频率11.0592MHz11.0592MHz。(2 2)如果选用)如果选用很低的波特率很低的波特率,如选为,如选为5555,可将定时器,可将定时器T1T1设为方式设为方式1 1定时。但这种情况,定时。但这种情况,T1

30、T1溢出时,需在中断服务程溢出时,需在中断服务程序中重新装入初值。中断响应时间和执行指令时间会使波特序中重新装入初值。中断响应时间和执行指令时间会使波特率产生一定的误差,可用改变初值的方法加以调整。率产生一定的误差,可用改变初值的方法加以调整。38【例例8-38-3】若时钟频率为若时钟频率为11.0592MHz11.0592MHz,选用选用T1T1的的方式方式2 2定时定时作为波特率发生器,作为波特率发生器,波特率为波特率为2 2.4kbit/s.4kbit/s,求初值。,求初值。设设T1T1为方式为方式2 2定时,选定时,选SMODSMOD=0 0。将已知条件带入式(将已知条件带入式(7-3

31、7-3)中)中波特率波特率=2400b/s2400b/s从中解得:从中解得:X X=244244=F4HF4H。只要把只要把F4HF4H装入装入TH1TH1和和TL1TL1,即得波特率,即得波特率2 400bit/s2 400bit/s。也。也可直接从表可直接从表7-27-2中查到。中查到。这里时钟振荡频率选为这里时钟振荡频率选为11.0592MHz11.0592MHz,就可使就可使初值为整数初值为整数,从而产生精确的波特率。从而产生精确的波特率。39SMODosc23212(256)fX8.5 8.5 串行通信的应用设计串行通信的应用设计 串行通信接口设计时,需考虑如下问题。串行通信接口设计

32、时,需考虑如下问题。(1 1)首先确定串行通信双方的数传速率和通信距离;)首先确定串行通信双方的数传速率和通信距离;(2 2)由串行通信的数传速率和通信距离确定采用的串)由串行通信的数传速率和通信距离确定采用的串行通信接口标准;行通信接口标准;(3 3)注意串行通信的通信线选择,一般选用双绞线较)注意串行通信的通信线选择,一般选用双绞线较好,并根据传输的距离选择纤芯的直径。如空间干扰较好,并根据传输的距离选择纤芯的直径。如空间干扰较多,还要选择带有屏蔽层的双绞线。多,还要选择带有屏蔽层的双绞线。8.5.1 8.5.1 各种串行通信接口标准各种串行通信接口标准 AT89S51 AT89S51单串

33、口的输入、输出均为单串口的输入、输出均为TTLTTL电平。以电平。以TTLTTL电平串行传输数据的方式,抗干扰性差,传输距电平串行传输数据的方式,抗干扰性差,传输距离短,速率低。为了提高串行通信可靠性,增大串离短,速率低。为了提高串行通信可靠性,增大串行通信的距离和提高传输速率,一般都采用标准串行通信的距离和提高传输速率,一般都采用标准串行接口,如行接口,如RS-232RS-232、RS-422ARS-422A、RS-485RS-485等。等。418.5.2 方式方式1的应用设计的应用设计 【例例8-4】如如图图甲、乙双机串行通信,双机的甲、乙双机串行通信,双机的RXD和和TXD相互交叉相连,

34、甲机的相互交叉相连,甲机的P1口接口接8个开关,乙机的个开关,乙机的P1口接口接8个发光二极管。甲机设置为只发不收的单工个发光二极管。甲机设置为只发不收的单工方式。要求甲机读入方式。要求甲机读入P1口的口的8个开关的状态后,通过个开关的状态后,通过串行口发送到乙机,乙机将接收到的甲机的串行口发送到乙机,乙机将接收到的甲机的8个开关个开关的状态数据送入的状态数据送入P1口,由口,由P1口的口的8个发光二极管来显个发光二极管来显示示8个开关的状态。双方晶振均采用个开关的状态。双方晶振均采用11.0592MHz。参考程序如下。参考程序如下。n#include#include nvoid delay(

35、unsigned int i)void delay(unsigned int i)n int j;int j;n for(;i0;i-)for(;i0;i-)n for(j=0;j125;j+);for(j=0;j125;j+);nvoid main()void main()n n TMOD=0 x20;TMOD=0 x20;/*设置定时器设置定时器T1T1为方式为方式2 2*/n TH1=0 xfd;TH1=0 xfd;/*波特率波特率96009600*/n TL1=0 xfd;TL1=0 xfd;n SCON=0 x40;SCON=0 x40;/*方式方式1 1只发送,不接收只发送,不接收

36、*/n PCON=0 x00;PCON=0 x00;/*串行口初始化为方式串行口初始化为方式0 0*/n TR1=1;TR1=1;/*启动启动T1T1*/n P1=0 xff;P1=0 xff;/*P1 P1口为输入口为输入*/n SBUF=P1;SBUF=P1;n while(1)while(1)n n if(TI=1);if(TI=1);/*如果如果TI=1TI=1,发送完数据,发送完数据*/n n SBUF=P1;SBUF=P1;/*读入读入P1P1口开关的状态数据并送串行口发送口开关的状态数据并送串行口发送*/n delay(100);delay(100);n TI=0;TI=0;/*

37、已发送完,再把已发送完,再把TITI清清0 0*/n n n 44P218页书中的程序页书中的程序是否工作正常,如是否工作正常,如不 能 找 出 原 因不 能 找 出 原 因/*甲机串行发送甲机串行发送*/n#include#include nvoid delay(unsigned int i)void delay(unsigned int i)n n int j;int j;n for(;i0;i-)for(;i0;i-)n for(j=0;j125;j+);for(j=0;j125;j+);n nvoid main()void main()n nTMOD=0 x20;TMOD=0 x20;

38、/*设置定时器设置定时器T1T1为方式为方式2 2*/nTH1=0 xfd;TH1=0 xfd;/*波特率波特率96009600*/nTL1=0 xfd;TL1=0 xfd;nSCON=0 x50;SCON=0 x50;/*设置串口为方式设置串口为方式1 1接收,接收,REN=1REN=1*/nPCON=0 x00;PCON=0 x00;/*SMOD=0SMOD=0*/nTR1=1;TR1=1;/*启动启动T1T1*/nwhile(1)while(1)n n if(RI=1);if(RI=1);/*若若RIRI为为1 1,接收到数据,接收到数据*/n n P1=SBUF;P1=SBUF;/*接

39、收的数据送接收的数据送P1P1口控制口控制8 8个个LEDLED的亮与灭的亮与灭*/n delay(100);delay(100);n RI=0;RI=0;/*接收到数据,则把接收到数据,则把RIRI清清0 0*/n n n 45/*乙机串行接收乙机串行接收*/8 8.5.3 方式方式2和方式和方式3的应用的应用 方式方式2和方式和方式1两点不同两点不同:A 方式方式2收收/发发11位信息,第位信息,第0位为起始位,第位为起始位,第18位为数据位,第位为数据位,第9位是程控位,可由用户置位是程控位,可由用户置TB8决定,决定,第第10位是停止位位是停止位1。A方式方式2波特率波特率=振荡器频率

40、振荡器频率/n。当当SMODSMOD=0 0时,时,n n=6464。当当SMODSMOD=1 1时,时,n n=3232。除波特率的差别外,方式除波特率的差别外,方式2 2的使用和方式的使用和方式3 3是一样的,是一样的,所以下面介绍的方式所以下面介绍的方式3 3应用编程,也适用于方式应用编程,也适用于方式2 2。【例例8-68-6】甲乙两个单片机进行方式甲乙两个单片机进行方式3 3(或方式(或方式2 2)串行通讯。甲机将串行通讯。甲机将8 8个流水灯控制数据发送给乙机,个流水灯控制数据发送给乙机,乙机再利用该数据点亮其乙机再利用该数据点亮其P1P1口的口的8 8个个LEDLED。方式。方式

41、3 3比比方式方式1 1多了一个可编程位多了一个可编程位TB8TB8,该位一般作奇偶校验,该位一般作奇偶校验位。乙机接收到的位。乙机接收到的8 8位二进制数据有可能出错,需进位二进制数据有可能出错,需进行奇偶校验,其方法是将乙机的行奇偶校验,其方法是将乙机的RB8RB8和和PSWPSW的奇偶校的奇偶校验位验位P P进行比较,如相同,接收数据;否则拒绝接收进行比较,如相同,接收数据;否则拒绝接收。参考程序如下。参考程序如下。4749甲机发送程序如下:甲机发送程序如下:#include unsigned char code Tab=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 x

42、df,0 xbf,0 x7f;void Send(unsigned char dat)/*发送一个字节数据的函数发送一个字节数据的函数*/SBUF=dat;/*将待发送的数据写入发送缓冲器将待发送的数据写入发送缓冲器*/TB8=P;/*将奇偶校验位写入将奇偶校验位写入TB8*/while(TI=0);/*检测发送标志位检测发送标志位TI,TI=0,未发送完,未发送完*/;/*空操作空操作*/TI=0;/*一个字节发送完,一个字节发送完,TI清清0*/void Delay(void)/*延时大约延时大约200ms函数函数*/unsigned char m,n;for(m=0;m250;m+);f

43、or(n=0;n250;n+);void main(void)/*主函数主函数*/unsigned char i;TMOD=0 x20;/*设置定时器设置定时器T1为方式为方式2*/SCON=0 xc0;/*设置串口为方式设置串口为方式3*/PCON=0 x00;/*SMOD=0*/TH1=0 xfd;/*给定时器给定时器T1赋初值,波特率设置为赋初值,波特率设置为9600*/TL1=0 xfd;TR1=1;/*启动定时器启动定时器T1*/while(1)for(i=0;i8;i+)Send(Tabi);Delay();/*大约大约200ms发送一次数据发送一次数据*/51乙机接收程序如下:乙

44、机接收程序如下:#include unsigned char Receive(void)/*接收一个字节数据的函数接收一个字节数据的函数*/unsigned char dat;while(RI=0);/*检测接收中断标志检测接收中断标志RI,RI=0,未接收完,则循环等待,未接收完,则循环等待*/;RI=0;/*已接收一帧数据,将已接收一帧数据,将RI清清0*/ACC=SBUF;/*将接收缓冲器的数据存于将接收缓冲器的数据存于ACC*/if(RB8=P)/*只有奇偶校验成功才接收数据只有奇偶校验成功才接收数据*/dat=ACC;/*将接收缓冲器的数据,存于将接收缓冲器的数据,存于dat*/re

45、turn dat;/*将接收的数据返回将接收的数据返回*/void main(void)/*主函数主函数*/TMOD=0 x20;/*设置定时器设置定时器T1为方式为方式2*/SCON=0 xd0;/*设置串口为方式设置串口为方式3,允许接收,允许接收REN=1*/PCON=0 x00;/*SMOD=0*/TH1=0 xfd;/*给定时器给定时器T1赋初值,波特率为赋初值,波特率为9600*/TL1=0 xfd;TR1=1;/*启动定时器启动定时器T1*/while(1)P1=Receive();/*将接收到的数据送将接收到的数据送P1口显示口显示*/多个单片机利用串口进行多机通信,常采用多个

46、单片机利用串口进行多机通信,常采用图图8-168-16的的主主从式结构从式结构。系统中。系统中1 1个主机(单片机或其他有串行接口的微个主机(单片机或其他有串行接口的微机)和多个单片机组成的从机系统。机)和多个单片机组成的从机系统。主机的主机的RXDRXD与所有从机与所有从机的的TXDTXD端相连端相连,TXDTXD与所有从机的与所有从机的RXDRXD端相连端相连。从机地址从机地址分别分别为为01H01H、02H02H和和03H03H。图图8-168-16 多机通信系统示意图多机通信系统示意图538.3 8.3 多机通信多机通信 主从式主从式只有一个主机,其余全是从机。只有一个主机,其余全是从

47、机。l 主机主机SM2=0SM2=0;从机;从机SM2=1SM2=1,从机只能接收地址。,从机只能接收地址。l 主机发送带主机发送带TB8=1TB8=1的地址帧,以选择要通信的从机。的地址帧,以选择要通信的从机。l 各从机接收到主机发送的地址,与本机地址比较。相同时各从机接收到主机发送的地址,与本机地址比较。相同时向主机发回本机地址,并置向主机发回本机地址,并置SM2=0,SM2=0,准备接收主机发送给本机准备接收主机发送给本机的数据,其他从机的数据,其他从机SM2=1;SM2=1;l 主机收到从机回应地址后,开始发送带主机收到从机回应地址后,开始发送带TB8=0TB8=0的命令或数的命令或数

48、据,按照约定进行通信。据,按照约定进行通信。l 通信结束后,从机通信结束后,从机SM2=1SM2=1;主从式主从式只有一个主机,其余全是从机。只有一个主机,其余全是从机。主机主机发送的信息发送的信息可以可以被所有从机接收被所有从机接收,任何一个从机发送的信息,只能由任何一个从机发送的信息,只能由主主机机接收。从机和从机之间接收。从机和从机之间不能进行直接通信,不能进行直接通信,只能经主机只能经主机才才能实现。能实现。多机通信的工作原理:多机通信的工作原理:55要保证要保证主机主机与与所选择的从机所选择的从机通信,须保证通信,须保证串口有识别功能串口有识别功能。SCON中的中的SM2位位就是为满

49、足这一条件设置的就是为满足这一条件设置的多机通信控制多机通信控制位位。其工作原理是在串行口以方式。其工作原理是在串行口以方式2(或方式(或方式3)接收时,)接收时,若若SM2=1,则表示进行多机通信,有以下,则表示进行多机通信,有以下两种情况两种情况:(1 1)从机接收到主机发来的)从机接收到主机发来的第第9 9位数据位数据RB8=1RB8=1时,时,前前8 8位位数据才装入数据才装入SBUFSBUF,并,并置中断标志置中断标志RIRI=1 1,向,向CPUCPU发出中断请求。发出中断请求。在中断服务程序中,从机把接收到的在中断服务程序中,从机把接收到的SBUFSBUF中的数据存入中的数据存入

50、数据缓冲区中。数据缓冲区中。(2 2)如果从机接收到的第)如果从机接收到的第9 9位数据位数据RB8=0RB8=0时,则时,则不产生不产生中断标志中断标志RI=1RI=1,不引起中断不引起中断,从机,从机不接收主机发来的数据不接收主机发来的数据。若若SM2SM2=0 0,则接收的第,则接收的第9 9位数据不论是位数据不论是0 0还是还是1 1,从机都,从机都将产生将产生RIRI=1 1中断标志,接收到的数据装入中断标志,接收到的数据装入SBUFSBUF中。中。56多机通信的工作过程:多机通信的工作过程:(1 1)各各从机从机初始化程序初始化程序允许从机串口中断,将串允许从机串口中断,将串口编程

51、为方式口编程为方式2 2或方式或方式3 3接收,即接收,即9 9位异步通信方式,位异步通信方式,且且SM2SM2和和RENREN位位置置“1 1”,使从机处于多机通信且使从机处于多机通信且只只接收地址帧接收地址帧的状态。的状态。(2 2)在在主机和某从机通信之前主机和某从机通信之前,先将从机地址先将从机地址(即准备接收数据的从机)发送给各个从机(即准备接收数据的从机)发送给各个从机,接着,接着才传送数据(或命令),主机发出的才传送数据(或命令),主机发出的地址帧信息的地址帧信息的第第9 9位为位为1 1,数据(或命令)帧的第数据(或命令)帧的第9 9位为位为0 0。当主机。当主机向各从机发送地

52、址帧时,各从机的串行口接收到的向各从机发送地址帧时,各从机的串行口接收到的第第9 9位信息位信息RB8RB8为为1 1,且由于,且由于各从机的各从机的SM2=1SM2=1,57则则RIRI置置“1 1”,各从机各从机响应中断响应中断,在中断服务子程序中,在中断服务子程序中,判判断主机送来的地址是否和本机地址相符合,若为本机地址,断主机送来的地址是否和本机地址相符合,若为本机地址,则该从机则该从机SM2SM2位清位清“0 0”,准备接收主机的数据或命令;若准备接收主机的数据或命令;若地地址不相符址不相符,则,则保持保持SM2SM2=1 1。(3 3)接着主机发送数据(或命令)帧,数据帧的第接着主

53、机发送数据(或命令)帧,数据帧的第9 9位为位为0 0。此时各从机接收到的。此时各从机接收到的RB8=0RB8=0。只有与前面只有与前面地址相符合地址相符合的从机(即的从机(即SM2SM2位已清位已清“0 0”的从机)的从机)才能才能激活中断标志位激活中断标志位RIRI,从而进入中断服务程序,接收主机,从而进入中断服务程序,接收主机发来的数据(或命令);发来的数据(或命令);与主机发来的与主机发来的地址不相符地址不相符的从机,由于的从机,由于SM2SM2保持为保持为1 1,又,又RB8RB8=0 0,因此,因此不能激活中断标志不能激活中断标志RIRI,就不能接受主机,就不能接受主机58发来的数

54、据帧。从而保证发来的数据帧。从而保证主机与从机间通信的正确性主机与从机间通信的正确性。此时主机与建立联系的从机已经设置为单机通信模式,此时主机与建立联系的从机已经设置为单机通信模式,即在整个通信中,通信的双方都要保持发送数据的第即在整个通信中,通信的双方都要保持发送数据的第9 9位位(即(即TB8TB8位)为位)为0 0,防止其他从机误接收数据。,防止其他从机误接收数据。(4 4)结束数据通信并为下一次的多机通信做好准备。)结束数据通信并为下一次的多机通信做好准备。在在多机系统,多机系统,每个从机都被赋予唯一的地址。每个从机都被赋予唯一的地址。例如,例如,图图8-168-16三三个从机的地址可

55、设为:个从机的地址可设为:01H01H、02H02H、03H03H。还要还要预留预留1212个个“广播地址广播地址”,它是所有从机共有的地它是所有从机共有的地址,例如将址,例如将“广播地址广播地址”设为设为00H00H。当主机与从机的数据当主机与从机的数据通通信结束后信结束后,一定要将从机,一定要将从机再设置为多机通信模式再设置为多机通信模式,以便进行以便进行下一次的多机通信。下一次的多机通信。59这时要求与主机正在进行数据传输的从机须随时这时要求与主机正在进行数据传输的从机须随时注意,注意,一旦接收的数据第一旦接收的数据第9 9位(位(RB8RB8)为)为“1 1”,说,说明主机传送的不再是

56、数据,而是地址,这个地址就明主机传送的不再是数据,而是地址,这个地址就有有可能是可能是“广播地址广播地址”。当当收到收到“广播地址广播地址”后后,便将从机的通信模式再,便将从机的通信模式再设置成多机模式,为下一次多机通信做好准备。设置成多机模式,为下一次多机通信做好准备。608.5.4 8.5.4 主从式多机通信的应用主从式多机通信的应用介绍主从式多机通信的应用编程。介绍主从式多机通信的应用编程。【例例8-78-7】如如图图所示,主机分别与三个从机进行通信,这所示,主机分别与三个从机进行通信,这里仅以地址为里仅以地址为01H01H的的1#1#从机为例,实现主从机的通信,其他从从机为例,实现主从

57、机的通信,其他从机的程序与机的程序与1#1#从机相同,只是定义的地址不同。约定如下。从机相同,只是定义的地址不同。约定如下。(1 1)3 3台从机的地址为台从机的地址为00H02H00H02H。(2 2)主机发出的地址)主机发出的地址FFHFFH为一条控制指令,使所有从机都处于为一条控制指令,使所有从机都处于SM2=1SM2=1的状态。的状态。(3 3)其余的控制指令:)其余的控制指令:00H00H接收指令,接收指令,01H01H发送指令。这发送指令。这两条指令是作为数据发送的。两条指令是作为数据发送的。(4 4)从机的状态字如)从机的状态字如图图8-218-21所示。所示。6162图图8-2

58、1 从机状态字的格式约定从机状态字的格式约定其中:ERR(位D7)=1,表示收到非法命令。TRDY(位D1)=1,表示发送准备完毕。RRDY(位D0)=1,表示接收准备完毕。通信时,主机采用查询方式,从机采用中断方式。主机串行口设为方式3,允许接收,并置TB8为1,因为只有一个主机,所以主机的SCON控制寄存器中的SM2不要置1,故控制字为11011000,即D8H。/*主机程序*/#include#define uchar unsigned char#define Bytenum 16/*传送一次的字节数*/uchar master(uchar addrs,uchar comnd)uchar

59、 slave=0 x00;/*从机地址*/uchar idata rdata16;uchar idata tdata16=“abcdefghijklmnop”;void main(void)uchar i;for(i=0;i10;i+);/*延时参数可根据需要调整*/TMOD=0 x20;/*设置T1为定时器方式2*/TH1=0 xfa;/*波特率4800*/TL1=0 xfa;63PCON=0 x00;SCON=0 xd0;/*方式3,允许接收,SM2=1*/TR1=1;/*启动T1*/SCON=0 xd0;/*方式3允许接收*/master(slave,0 x01);master(slav

60、e,0 x02);slave+void error(void)SBUF=0 xff;/*发给从机数据出错标志*/while(TI!=1);/*等待发送完*/TI=0;64uchar master(uchar addrs,uchar comnd)uchar a,i,p;while(1)SBUF=slave/*发呼叫地址*/while(TI!=1);/*等待发送完*/TI=0;while(RI!=1);/*等待从机应答*/RI=0;if(SBUF!=addrs)error()/*若地址出错,发出错标志,从机复位*/elseTB8=0;/*清地址标志位,准备接收数据*/SBUF=comnd;/*发命

61、令帧*/65while(TI!=1);TI=0;while(RI!=1);RI=0;a=SBUF;/*接收从机返回的地址帧*/if(a&0 x80)=80)TB8=1;error();/*若主机命令非法,发复位信号给从机*/elseif(comnd=0 x01);/*主机发送的命令是请求从机接收数据*/if(a&0 x01)=0 x01);/*从机准备接收就绪*/do p=0;/*清校验和*/for(i=0;iBytenum;i+);SBUF=tdatai;/*发送数据*/p=p+tdata;/*计算校验和*/while(TI!=1);TI=0;SBUF=p;/*发送校验和给从机*/66whi

62、le(TI!=1);TI=0;while(RI!=1);RI=0;while(SBUF!=0);/*从机接收不正确,主机重新发送*/TB8=1;return(0);elseif(comnd=0 x02);/*主机发送的是接收命令,从机发送数据*/if(a&0 x02)=0 x02);/*从机准备接收就绪*/while(1);p=0;/*清校验和*/for(i=0;iBytenum;i+);while(RI!=1);RI=0;rdatai=SBUF;/*主机接收数据*/p+=rdata i;67while(RI!=0);RI=0;if(SBUF=p);SBUF=0 x00;/*校验和相同,发送0

63、 x00给从机*/while(TI!=1);TI=0;else SBUF=0 x0f;/*校验和不同,发送0 x0f给从机*/while(TI!=1);TI=0;TB8=1;/*重置地址标志位*/return(0);68/*从机程序*/#include#define uchar unsigned char /*传送一次的字节数*/#define slave 0 x00#define Bytenum 16uchar idata tdata 16;uchar idata rdata 16;bit trdy;bit rrdy;69void main(void)TMOD=0 x20;/*设置T1为定时

64、器方式2*/TL1=0 xfa;/*波特率4800*/TH1=0 xfa;PCON=0 x00;TR1=1;SCON=0 xf0;/*方式3,允许接收,SM2=1*/ES=1;EA=1;/*允许串口中断*/while(1)trdy=1;rrdy=1;/*准备好发送和接收*/void slave(void)interrupt 4 using 1 void str(void);void sre(void);uchar a;RI=0;ES=0;/*关串口中断*/70if(SBUF!=slave)ES=1;goto reti;/*非本机地址,继续监听*/SM2=0;/*取消监听状态*/SBUF=sla

65、ve;/*发回从机地址*/while(TI!=1);TI=0;while(RI!=1);RI=0;if(RB8=1)SM2=1;ES=1;goto reti;/*确认地址不符,从机复位*/a=SBUF;if(a=0 x01)/*从机接收主机的数据*/if(rrdy=1)SBUF=0 x01;/*接收准备好,发回0 x01*/elseSBUF=0 x00;while(TI!=1);TI=0;while(RI!=1);RI=0;if(RB8=1)SM2=1;ES=1;goto reti;/*确认地址不符,从机复位*/sre();/*接收数据*/71else if(a=0 x02)/*从机向主机发送

66、数据*/if(trdy=1)SBUF=0 x02;/*发送准备好*/elseSBUF=0 x00;while(TI!=1);TI=0;while(RI!=1);RI=0;if(RB8=1)SM2=1;ES=1;goto reti;str();/*发送数据*/else SBUF=0 x80;/*命令非法*/while(TI!=1);TI=0;SM2=1;ES=1;/*恢复监听*/72reti:;void str(void)/*发送数据函数*/uchar p,i;trdy=0;dop=0;for(i=0;i Bytenum;i+);SBUF=tdatai;/*发送数据*/p+=tdatai;while(TI!=1);TI=0;SBUF=p;/*发送校验和*/while(TI!=1);TI=0;while(RI!=1);RI=0;while(SBUF!=0);/*主机接收不正确,重新发送*/SM2=1;ES=1;73void sre(void)/*接收数据函数*/uchar p,i;rrdy=0;while(1);p=0;/*初始化校验和为0*/for(i=0;i Bytenum;i+);w

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!