嵌入式学习笔记11——51单片机之中断串口通信
2. 异步通信
本文引用地址:https://www.eepw.com.cn/article/201611/318670.htm- 异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传送的。
- 异步通信的数据格式:
格式中的校验位通常有3种方式获得:(1)奇偶校验:奇校验——数据中的“1”的个数与校验位“1”的个数之和应为奇数;偶校验——数据中的“1”的个数与校验位“1”的个数之和应为偶数。(2)代码和校验:发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据同时对数据块(校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较。(3)循环冗余校验。
3. 串行通信的传输方向
(1)单工是指数据传输仅能沿一个方向,不能实现反向传输。(如遥控器)(2)半双工是指数据传输可以沿两个方向,但需要分时进行。(如对讲机) (3)全双工是指数据可以同时进行双向传输。
4. 比特率是每秒钟传输二进制代码的位数,单位是位/秒(bps)。传输速率越大,传输距离越小。
5. 串行通信接口标准
(1)RS-232C(25针,比较老了;或者9针)
我们通常用到的是TXD、RXD和SGND。RS-232C的缺点是传输速率最高为20Kbps,传输距离不超过15米;要求收发双方共地,通信距离较大时,收发双方的地电位差别较大,在信号地上将有比较大的地电流并产生压降;抗干扰能力差。
(2)针对RS232C的缺点,提出了RS422A接口。其传输速率90Kbps时,传输距离可达1200米,抗干扰能力强。—
(3)RS-485是RS422A的变型:RS-422A用于全双工,而RS-485用于半双工。传输距离可达1200米,传输速率可达1Mbps。一般是一点对多点的通信接口。普通的PC机一般不带RS485接口,因策要使用RS-232C/RS-485转换器。
6. 51单片机的串行口
6. 串行口的控制寄存器
SCON是一个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志。
(1)SM0和SM1为工作方式选择位,可选择4种工作方式:
图中,fosc为晶振频率。 常用的是方式1。
(2)SM2,多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时,可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF中读走)。当SM2=0时,不论收到的RB8为0还是1,均可以使收到的数据进入SBUF,并激活RI。在方式0时,SM2必须是0。在方式1时,如果SM2=1,则只有接收到有效停止位时,RI才置1;若SM2=0,则RB8是接收到的停止位。
(3)REN,允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
(4)TB8,在方式2或方式3中,是发送数据的第九位,可用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式0和方式1中,该位未用。
(5)RB8,在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。
(6)TI,发送中断标志位。串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将TI清0,取消此中断申请。
(7)RI,接收中断标志位。串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。在中断服务程序中,必须用软件将RI清0,取消此中断申请。
7. PCON中有一位SMOD(PCON.7,波特率倍增位)与串行口工作有关。在串行口方式1~3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。
8. 方式1输出的时序图:
9.方式1输入的时序图:
10. 波特率的计算
在串行通信中,收发双方对发送或接收数据的速率要有约定,否则就会出现乱码。其中方式0和方式2的波特率固定,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。
11. 串口的使用
(1)确定T1的工作方式(编程TMOD寄存器)
(2)计算T1的初始值,装载TH1、TL1
(3)启动T1(编程TCON中的TR1位)
(4)确定串行口控制(编程SCON寄存器、还有PCON中的SMOD位)
(5)设置IE寄存器,打开EA和ES位。
(6)写中断服务程序,记住软件清零RI、TI。
12. 示例程序
unsigned char a,flag;
void main()
{
while(1)
{
if(flag)
{
ES=0;
flag=0;
SBUF=a;
while(!TI);//等待数据发送完,发完时硬件自动将TI置1
TI=0;
ES=1;
}
}
}
void serial() interrupt 4
{
a=SBUF;
P1=a;
RI=0;
flag=1;
}
评论