1、二方式 1: 8 位数据异步通讯方式1. 设定为 10 位异步通信方式:1 个起始位(“0” ),8 位数据位,1 个停止位(“1 ”)。 2. RXD:接收数据端。TXD:发送数据端。 【注意和方式 0 不一样,恢复正常】3.波特率:用 T1 作为波特率发生器213SMODBT溢 出 率4.发送:在 TI0 时,当把 数据写入 SBUF 后,即可启动发送 ,串行口内自动把发送缓冲器中的数据送入发送移位寄存器。发送移位寄存器先发一位起始位,接着按先低位后高位,再发停止位,从而完成一帧的发送。串行数据均由 TXT 端输出, TI 在发送停止位时,由硬件置 TI=1。接收:在 RI0 和 REN1
2、 的条件下。在接收到第 9 数据位(即停止位)时,接收电路必须满足以下两个条件:RI0 且 SM20;接收到的停止位为“1”时,才能把接收到的 8 位字符存入“SBUF(接收) ”中,把停止位送入 RB8 中,使 RI 1 并发出串行口中断请求(若中断开放) 。若上述条件不满足,则这次收到的数据就被舍去,不装入“SBUF(接收) ”中,这是不能允许的,因为这意味着丢失了一组接收数据。在方式 1 下,发送时钟、接收时钟和通信波特率都由定时器溢出率脉冲经过 32 分频得到,并可由 SMOD1 倍频。因此,方式 1 的波特率是可变的。其实,SM2 是用于方式 2 和方式 3 的。在方式 1 下,SM
3、2 应设为“0” 。方式 1 时序图:三方式 2 和方式 3方式 2 和方式 3 都是 11 为异步收发。两者的差异仅在于通信波特率有所不同:方式 2 的波特率由 fosc 经过 32 或 64 分频后提供;方式 3 的波特率由定时器 T1(或 T2)的溢出率经 32 分频后提供。方式 2 和方式 3 的发送过程类似于方式 1,所不同的是方式 2 和方式 3 有9 位有效数据位。发送时,CPU 除要把发送字符装入“SBUF(发送) ”外,还要把第 9 位数据位预先装入 SCON 的 TB8 中。第 9 数据位可由用户安排,可以是奇偶校验位,也可以是其它控制位。第 9 数据位的值装入 TB8 后
4、,便可用一条以 SBUF 为目的的传送指令把发送数据装入 SBUF 来启动发送过程。一帧数据发送完后,TI1,CPU 便可通过查询 TI 来以同样方法发送下一个字符帧。方式 2 和方式 3 的接收过程也和方式 1 类似。所不同的是:方式 1 时 RB8中存放的是停止位,方式 2 和方式 3 时 RB8 中存放的是第 9 数据位。因此,方式 2 和方式 3 时必须满足接收有效字符的条件变为:RI0 且 SM20 或收到的第 9 数据位为“1” ,只有上述两个条件同时满足,接收到的字符才能送入SBUF,第 9 数据位才能装入 RB8 中,并使 RI1;否则,这次收到的数据无效,RI 也不置位。其实
5、,上述第一个条件(RI0)是要求 SBUF 空,即用户应预先读走SBUF 中的信息,以便让接收电路确认它已空。第二个条件(SM20)是提供了利用 SM2 和第 9 数据位共同对接收加以控制:如果第 9 数据位是奇偶校验位,则可令 SM20,以保证串口能可靠接收;如果要求利用第 9 数据位参与接收控制,则可令 SM21,然后依靠第 9 数据位的状态来决定接收是否有效。方式 2、3 时序图:7.3.4 串行口的编程及应用一串行口的初始化编程1串行口控制寄存器 SCON 位的确定根据工作方式确定 SM0、SM1 位;对于方式 2 和方式 3 还要确定 SM2 位;如果是接收端,则置允许接收位 REN
6、 为 1;如果方式 2 和方式 3 发送数据,则应将发送数据的第 9 位写入 TB8 中。2设置波特率串行通信,收、发双方发送或接收的波特率必须一致。方式 0 和方式 2 的波特率是固定的;方式 1 和方式 3 的波特率是可变的,由 T1 溢出率确定。定时器的不同工作方式,得到的波特率的范围不一样,这是由 T1 在不同工作方式下计数位数的不同所决定。(1)方式 0 时,波特率固定为晶体振荡频率 fosc 的 1/12(fosc /12 ) ,不受SMOD 位值的影响。若 fosc = 12 MHz,波特率为 1Mbit/s。(2)方式 2 时,波特率仅与 SMOD 位的值有关。方式 2 波特率
7、 = 64SMODSCf如果 SMOD 0,则所选波特率为 fosc /64;如果 SMOD1,则所选波特率为 fosc /32。若 fosc = 12 MHz: SMOD = 0,波特率 = 187.5 kbit/s;SMOD = 1,波特率为 375 kbit/s。(3)方式 1 或方式 3,常用 T1 作为波特率发生器,其关系式为 :(7-1)SMODT12波 特 率 定 时 器 的 溢 出 率由式(7-1 )见,T1 溢出率和 SMOD 的值共同决定方式 1 或方式 3 的波特率。【注:定时器 T1 的溢出率定义为定时时间的倒数定时时间可参见 CAP5T1 的定时时间计数值机器周期N2
8、12初 值晶 体 振 荡 频 率T1 的溢出率1/定时时间 t= N(2晶 体 振 荡 频 率初 值 )所以: 波特率 = (2 SMOD/32)fosc/12 (2n-初值 )SMODN1()2SCf波 特 率 3初 值NOSf初 值 2 波 特 率其中:N 为定时器 T1 的位数,它和定时器 T1 的设定方式有关。即如果定时器 T1 为方式 0,则 N13;如果定时器 T1 为方式 1,则 N16;如果定时器 T1 为方式 2,则 N8。在实际设定波特率时,T1 常设置为方式 2 定时(自动装初值) ,即 TL1作为 8 位计数器,TH1 存放定时初值。这种方式操作方便,也避免因软件重装初
9、值带来的定时误差。实际使用时,经常根据已知波特率和时钟频率 fosc 来计算 T1 的初值 X。为避免繁杂的初值计算,常用的波特率和初值 X 间的关系常列成下表的形式,以供查用。下表列出了常用波特率与定时器 T1 的初值关系表定时器 T1波特率 fosc(MHz) SMOD /CT所选方式 相应初值9.6K 12 0 0 2 FD4.8K 12 0 0 2 FB2.4K 12 0 0 2 F31.2K 12 0 0 2 E6模式 1、30.6K 12 0 0 2 CCB9600 ,初值252.74=253=FDB4800 ,初值249.48=250=FBB=2400,初值 242.97243=
10、128+64+32+16+2+1=F3B=1200,初值 229.95=23012864324211100110E6B600 ,初值203.92=20412864+8+4=CC4 种方式比较:方式 波特率 传送位数 发送端 接收端 用途0 1/12 Fosc(固定不变) 8(数据) RXD RXD 接移位寄存器,扩充并口1 2SMOD/32T1 溢出率10(起始位、8 位数据位、停止位)TXD RXD 单机通信2 2SMOD/64T1fosc 11(第 9 位为 1:地址;为 0:数据) TXD RXD 多机通信3 2SMOD/32T1 溢出率 11 位(同方式 2) TXD RXD 多机通信
11、二串行口的应用通常用于三种情况:利用方式 0 扩展并行 I/O 口;利用方式 1 实现点对点的双机通信;利用方式 2 或方式 3 实现多机通信。1利用方式 0 扩展并行 I/O 口MCS-51 单片机的串行口在方式 0 时,当外接一个串入并出的移位寄存器,就可以扩展并行输出口,当外接一个并入串出的移位寄存器时,就可以扩展并行输入口。AT89S51 的串口的方式 0 是同步串行通信接口。方式 0 的典型应用是外扩串行输入并行输出的同步移位寄存器 74LS164,实现并行 I/O 的扩展。【例 14-5】图 14-2 是利用串行口方式 0 通过 74LS164 外接 8 个 LED 发光二极管的接
12、口电路,编写程序使发光二极管轮流显示。图中 CLK 端为同步脉冲输入端。STB 为控制端,当 STB=0 时,则 8 位并行输出端关闭,但是允许串行数据从 A 和 B 端输入。当 STB=1 时,A 和 B 输入端关闭,但允许 8 位并行数据输出。H = HIGH(高)电平h = 先于低-至- 高时钟跃变一个建立时间 (set-up time) 的 HIGH(高)电平L = LOW(低)电平l = 先于低 -至-高时钟跃变一个建立时间 (set-up time) 的 LOW(低)电平q = 小写字母代表先于低-至-高时钟跃变一个建立时间的参考输入 (referenced input) 的状态
13、= 低-至-高时钟跃变当 8 位串行数据发送完毕后,引起中断,在中服务程序中,串行发出下一个 8 位数据。参考程序如下。图 14-2 串行口方式 0 外接 8 个 LED 发光二极管的接口电路【已调试,cap72、CAP72LED 、CAP72LED2】#include #includesbit P10 = P10;unsigned char nIndex;void Delay(unsigned int count);main() SCON = 0x00; /* 串行口初始化为方式 0*/ES=1;EA=1; /* 全局中断允许 */nIndex=1;SBUF=nIndex;P10=0; /
14、MR 为复位端while(1);void Serial_Port() interrupt 4 using 0if(TI= =1)TI 0; / 清除串行发送中断请求P10=1; / Delay( 500);nIndexsbit P10=P10;unsigned char nIndex;void delay(unsigned int count);void main(void)SCON=0x00;ES=1;EA=1;nIndex=1;SBUF=nIndex;P10=0;while(1);void serial_port() interrupt 4 using 0if(TI=1)TI=0;P10=
15、1;delay(1000);nIndexsbit P10=P10;unsigned char nIndex;unsigned char zixing10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;void delay(unsigned int count);void main(void)SCON=0x00;P10=0;P10=1;SBUF=0x92; / LED 上显示数字 “5”,只发送一次,没有用中断while(1);#include sbit P10=P10;unsigned char zixing10=0xc0,0xf9,0xa
16、4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;void delay(unsigned int count);void main(void)SCON=0x00;ES=1;EA=1;SBUF=zixing0;P10=0;while(1);void serial_port() interrupt 4 using 0if(TI= =1) TI=0;P10=1;delay(1000);SBUF=zixingnIndex;void delay(unsigned int count)unsigned char j;unsigned int i;for(i=0;isbit SPL
17、= P25;void delay(unsigned int count)unsigned char k;while(count-)for(k=0;kunsigned char data10,chksum;void init(void) / 甲机串口初始化程序TMOD=0x20; / 0010 0000, 定时器 T1,定时方式 2(自动重载方式) ,Gate(T1)=0TH1=0xFD; / 设定波特率 9600TL1=0xFD; /PCON=0x00; / 设为 0,可以省略SCON=0x50; / 0101 0000,串口工作在方式 1,允许接收 REN=1TR1=1; / 启动定时器 T
18、1void send(void) /甲机发送子程序unsigned char k;do / 循环与乙机联络,等待乙机的回答信号 “0XBB”SBUF=0xAA; / 向乙机发送联络信号“0XAA”while(TI= =0); / 等待发送“0XAA”结束TI=0; / 清除 TI 标志while(RI= =00); / 等待乙机发送响应信号RI=0; while(SBUF!=0xBB); / 判定回答信号是否是“0XBB” ,如果不是,继续联络do / 接收到乙机的 0XBB 联络信号后,开始发送 data10数组中的数据 / 或者接收到乙机发来的不是 0X00,继续 do 循环chksum=0;for(k=0;k /包含特殊功能寄存器库sbit P10=P10;void main( )unsigned char i,j;SCON=0x00; /M1M000,方式 0;j=0x01;/P10=0;/for (; ;)While(1)P10=0; /STB=0,打开串行输入控制门SBUF=j;while (!TI);/等待发送完,发送完后 TI1P10=1; /STB=1,打开并行输出控制门TI=0;for (i=0; i=254; i+) ;j=j*2;if (j= =0x00) j=0x01;