一、说明
同步通信是指在约定的通信速率下,发送端和接收端的时钟信号频率和相位始终保持一致(同步),这就保证了通信双方在发送和接收数据时具有完全一致的定时关系。串行通信是指计算机主机与外设之间以及主机系统与主机系统之间数据的串行传送。使用串口通信时,发送和接收到的每一个字符实际上都是一次一位的传送的,每一位为1或者为0。串行通信可以分为同步通信和异步通信两类。
异步串行通信是指通信双方以一个字符(包括特定附加位)作为数据传输单位且发送方传送字符的间隔时间不一定,具有不规则数据段传送特性的串行数据传输。
它—般由起始位、数据位、奇偶校验位和停止位四部分组成。它用一个起始位表示字符的开始,用停止位表示字符的结束,构成一帧,即在异步通信中,发送的每一个数据字符均带有起始位、停止位和可选择的奇偶位。数据字符之间没有特殊关系,也没有发送接收时钟。
异步通信数据帧的第一位是开始位,在通信线上没有数据传送时处于逻辑’1’状态。当发送设备要发送一个字符数据时,首先发出一个逻辑“0”信号,这个逻辑低电平就是起始位。起始位通过通信线传向接收设备,当接收设备检测到这个逻辑低电平后,就开始准备接收数据位信号。因此,起始位所起的作用就是表示字符传送开始。
当接收设备收到起始位后,紧接着就会收到数据位。数据位的个数可以是5,6,7或8位的数据。在字符数据传送过程中,数据位从最低位开始传输。数据发送完之后,可以发送奇偶校验位。奇偶校验位用于有限差错检测,通信双方在通信时需约定一致的奇偶校验方式。就数据传送而言,奇偶校验位是冗余位,但它表示数据的一种性质,这种性质用于检错,虽有限但很容易实现。在奇偶位或数据位之后发送的是停止位,可以是1位、1.5位或2位,停止位一直为逻辑’1’状态。停止位是一个字符数据的结束标志。
在异步通信中,字符数据一个一个地传送。在发送间隙,即空闲时,通信线路总是处于逻辑“1”状态,每个字符数据的传送均以逻辑“0”开始。
用Proteus仿真编程实现以下功能:
- 2个同种单片机之间的异步串行通信
二、重点
- 单片机异步串行通信的工作方式及其控制方法
- 单片机异步串行通信的实际应用
三、实现
//从机1串行通信程序 #include <reg52.h> sbit led=P2^0; //定义P2.0连接的黄色LED bit rrdy=0; //接收准备标志位rrdy=0,表示未做好接收准备 bit trdy=0; //发送准备标志位trdy=0,表示未做好发送准备 bit err=0; void delay_ms(unsigned int i) //延时函数 { unsigned char j; for(;i>0;i--) for(j=0;j<125;j++) ; } void main() //从机1主函数 { EA=1; //总中断打开 TMOD=0x20; //T1方式2自动装载,用于设置波特率 TL1=0xfd;TH1=0xfd; PCON=0x00; //波特率设为9600 SCON=0xd0; //SM2设为0,TB8设为0 TR1=1; //启动定时器T1 P1=0xff; //向P1写入全1,8个绿色LED全灭 ES=1; //允许串口中断 while(RI==0); //接收控制指令0xff if(SBUF==0xff) err=0; //如果接收到的数据为0xff,err=0,表示通信正常 else err=1; //err=1,表示接收出错 RI=0; //接收中断标志清0 SM2=1; // SM2置1,为多机通讯做好准备。 while(1); } void int1() interrupt 4 //串行口中断函数 { if(RI) { if(RB8) //如果RB8=1,表示接收的为地址帧 { RB8=0; if(SBUF==0x02) //如接收的数据为地址帧0x01,是本从机的地址 //2#机本句改为:if(SBUF==0x02) { SM2=0; //则SM2清0,准备接收数据帧 led=0; //点亮本从机黄色发光二极管 } } else //如果接收的不是本从机的地址 { rrdy=1; //准备好接收标志置1 P1=SBUF; //串口接收的数据送P1,LED显示 SM2=1; // SM2仍为1 led=1; // 熄灭本从机黄色发光二极管 } RI=0; } delay_ms(500); P1=0xff; //熄灭本从机8个绿色发光二极管 } …………
四、下载