本节我们来回忆串口有关的内容,串口在我们51单片机上虽然用的不算多,主要是用来下载,但是以后假如玩儿其他板卡的时候使用的就特别频繁了,所以对于串口的通信原理的了解还是特别有必要的,而且还有各种关于串口的协议,这些协议都是从最基础的串口的协议进行封装而成的,而我们在51单片机上只需要了解最基本的串口中断的内容就好了。
1. 关于串口
首先要了解的就是什么是串口通信,要了解串口通信就要先了解串行通信和并行通信,并行通信就是说我们的数据字节用多条数据线同时开始发送,这种传输方式只适合短距离传输,这种传输方式使用较少,而且长距离传输成本高,所以只需要简单了解即可。而串行方式是将数据字节一位一位的形式在一条传输线上逐个的传输,只需要一条数据线就可以了。发送是,要把并行数据变成串行数据发送到线路上,接收时,再把串行数据变为并行数据。
而关于串行数据传输也分为了两种方式,异步串行通信和同步串行通信,一般同步串行方式使用较少,一般不会使用,不了解也没关系。而一定要了解的是异步串行通信方式。
异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程,为使双方收发协调, 要求发送和接收的设备的时钟尽可能一致。异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,当每个字符的各位是以固定的时间传送的,即字符之间不一定有“位间隔”的整数倍关系,但同一字符内的各位之间的距离均为”位间隔”的整数倍。异步通信的一帧字符信息由4部分组成,如上图所示:起始位,数据位,校验位还有就是停止位,由上图所示,一般我们也不需要使用校验位,所以校验位没有标出来。
但是串行通信偶尔也会使用校验位,校验位由名字就可以知道,就是说看你这帧数据有没有错误,我们的校验一般分为奇偶校验,代码和校验和循环冗余校验,而在我们的串行通信中一般使用奇偶校验,数据位尾随的1位为奇偶校验位。奇校验时,数据中1的个数与校验位的和是奇数就为奇校验,反之就是偶校验,接收字符时,我们通过对1的个数的校验,若发现1的个数不一致,那么就说明数据传输过程中出现了错误。而我们串行通信还有一种分法就是单工,半双工和全双工。单工就是说数据传输只能沿一个方向,不能实现反向传输。半双工是指数据传输可以沿两个方向,但是不能同时进行,而全双工是指数据可以同时进行双向传输。
2 硬件
关于波特率,单片机或计算机在串口通信时的速率用波特率表示,它定义为每秒传输二进制代码的个数,即1波特=1位/秒,单位是bps.关于波特率的计算,在串行通信中,收发双方对发送或接收数据的速率要有约定。我们的电脑可以使用串口调试工具来设置我们电脑得参数,而我们的51单片机就只能通过编程来设置了。通过编程可对单片机串行口设置为4种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3波特率是可变的,由定时器T1的溢出率来决定。
方式0的波特率:
方式1的波特率:X(T1溢出率)
方式2的波特率:X()
方式3的波特率:X(T1溢出率)
式中,为系统晶振频率,通常为12Mhz或11.0592Hz;SMOD是PCON寄存器的最高位;而T1溢出率就是T1溢出的频率。只要每次算出T1定时器每溢出一次的时间T,那么T的倒数就是它的溢出率,就比如T1中50ms溢出一次,那么它的溢出率就是20Hz,那么为什么经常51单片机选择11.0592MHZ的晶振呢,其实主要是常用波特率都能算的比较准确。
串口通信常用寄存器:
电源管理寄存器PCON(不能位寻址)
跟我们串口有关的只有SMOD这一位,是在我们算波特率的时候。
串行口的控制寄存器SCON(可位寻址)
SM0,SMI-工作方式选择位
SM2-多机通信控制位,用于多个单片机通信,
主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。在方式0时,SM2必须是0。在方式1时,如果SM2=1,则只有接收到有效停止位时,RI才置1。
REN-允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
TB8-在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式0和方式1中,该位未用。
RB8-在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。
TI-发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。
RI-接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。
3. 软件
我的单片机的系统晶振频率为12Mhz,发送多次之后可能会有乱码现象,这也是正常现象,我使用的是方式1编程:
#include "reg52.h"
int flag = 0;
char a = 0;
void uart_init(){
PCON |= (1 << 7);
TMOD |= 0x02 << 4;
TH1 = 0xf3;
TL1 = 0xf3;
SM0 = 0;
SM1 = 1;
REN = 1;
EA = 1;
TR1 = 1;
ES = 1;
}
void main(){
uart_init();
while(1){
if(flag == 1){
flag = 0;
ES = 0;
SBUF = a;
while(!TI);
T1 = 0;
ES = 1;
}
}
}
void uart_interrupt() interrupt 4{
RI = 0;
a = SBUF;
flag = 1;
}
今天的文章(九)串口中断_串口接收中断触发原理分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/77380.html