发送数据时: 发送数据-等待中断-然后在中断中发送数据
具体步骤如下:
确定T1的工作模式(对TMOD寄存器进行编程);计算T1的初始值,加载TH1和TL1;启动T1(对TCON中的TR1位进行编程);确定串口控制(对SCON寄存器进行编程);串口处于中断模式工作时,必须进行中断设置(编程IE和IP寄存器)。注:SCON 是一个特殊功能寄存器,用于设置串口的工作模式、接收/发送控制以及设置状态标志:
有关波特率的计算方法:
在串行通信中,发送方和接收方必须就发送或接收数据的速率达成一致。单片机的串口可通过软件编程为四种工作模式。模式0和模式2的波特率是固定的,而模式1和模式3的波特率是可变的。由定时器T1的溢出决定。率来决定。
串口的四种工作模式对应三种波特率。由于输入移位时钟的来源不同,各种方法的波特率计算公式也不同。
模式0 的波特率=fosc/12 模式2 的波特率=(2SMOD/64) · fosc 模式1 的波特率=(2SMOD/32) · (T1 溢出率) 模式3 的波特率=( 2SMOD/32)·(T1溢出率) 当T1用作波特率发生器时,最典型的用法是使T1工作在自动重载的8位定时器模式(即模式2,且TCON的TR1=1) ,启动计时器)。此时,溢出率取决于TH1中的计数值。
T1 溢出率=fosc /{12[256 - (TH1)]} 注:PCON 中只有一个与串口操作相关的SMOD,即SMOD (PCON.7) 波特率乘法位。串口模式1、模式2、模式3下,波特率与SMOD有关。当SMOD=1时,波特率加倍。复位时,SMOD=0。
在单片机的应用中,常用的晶振频率有:12MHz和11.0592MHz。因此,选择的波特率是相对固定的。常用的串口波特率及各参数之间的关系如表所示。
80C51串行口的工作方式1:
模式1是10位数据的异步通信端口。 TXD为数据发送引脚,RXD为数据接收引脚。传输一帧数据的格式如图所示。其中,有1位起始位、8位数据位、1位停止位。
(1) 模式1 输出(2) 模式1 输入当软件将REN 设置为1 时,接收器以所选波特率的16 倍采样RXD 引脚电平,并检测RXD 引脚输入电平的负跳变。当它发生变化时,表示起始位有效,将其移入输入移位寄存器,并开始接收本帧信息的剩余位。在接收过程中,数据从输入移位寄存器的右侧移入。当起始位移至输入移位寄存器的最左侧时,控制电路执行最后一次移位。当RI=0且SM2=0(或接收到的停止位为1)时,接收到的9位数据的前8位装入接收SBUF,第9位(停止位)进入RB8并置位RI=1,向CPU请求中断。
定时/计数器的结构与原理
定时器/计数器的本质是一个加1计数器(16位),由两个寄存器组成:高8位和低8位。 TMOD是定时器/计数器的工作模式寄存器,决定了工作模式和功能; TCON是控制寄存器,控制T0和T1的启动和停止,并设置溢出标志。
输入到加1计数器的计数脉冲有两个来源。一是系统时钟振荡器的输出脉冲除以12;另一种是由T0或T1引脚输入的外部脉冲源。每来一个脉冲,计数器加1。当计数器全为1时,输入另一个脉冲使计数器归零,计数器溢出导致TCON中的TF0或TF1被置1,并发出中断请求(定时器/计数器中断)发给CPU。当允许时)。如果定时器/计数器工作在计时模式,则表示计时时间已到;如果工作在计数模式,则表示计数值已满。
可见,加1计数器的计数值是溢出时计数器的值减去初始计数值得到的。
设置为定时器模式时,加1计数器对内部机器周期进行计数(1个机器周期等于12个振荡周期,振荡周期也称为时钟周期,时钟周期是晶振发出的脉冲数)单位时间内,比如12MHZ=1210的6次方,即每秒发出12,000,000个脉冲信号,那么发出一个脉冲所需要的时间就是时钟周期,即1/12微秒;例如11.0592MHZ=11.059210的6次方,即每秒发出11059200个脉冲信号,那么发送一个脉冲所花费的时间就是时钟周期,即1/11.0592微秒)。计数值N乘以机器周期Tcy即为计时时间t。
定时/计数器的控制
80C51单片机定时器/计数器的工作由两个特殊功能寄存器控制。 TMOD用于设置其工作模式; TCON用于控制其启动和中断应用程序。
工作模式寄存器TMOD 工作模式寄存器TMOD 用于设置定时器/计数器的工作模式。低四位用于T0,高四位用于T1。其格式如下:
M1M0:工作模式设置位。定时器/计数器有四种工作模式,由M1M0设置:
控制寄存器TCON
TCON 的高4 位用于控制定时器/计数器的启动和中断应用。其格式如下:
TF1(TCON.7):T1 溢出中断请求标志位。当T1计数溢出时,TF1由硬件自动置1。 CPU响应中断后,TF1自动被硬件清0。当T1工作时,CPU可以随时查询TF1的状态。因此,TF1可以作为查询测试的标志。 TF1也可以通过软件置1或清0,与硬件置1或清1效果相同。 TR1(TCON.6):T1操作控制位。当TR1设置为1时,T1开始工作;当TR1设置为0时,T1停止工作。 TR1 由软件置位或清零。因此,可以用软件来控制定时器/计数器的启动和停止。 TF0(TCON.5):T0溢出中断请求标志,其功能与TF1类似。 TR0(TCON.4):T0操作控制位,其功能与TR1类似。
定时器1的工作方式2
模式2为自动重装初值的8位计数模式。
计数次数与计数初值的关系为:X=2^8 - N
其中:X为要设置的初始值,N为要计时/计数的次数。
注:工作模式2特别适合用作更精确的脉冲信号发生器。因此,在进行串行通信时,一般选择定时器1工作在模式2的经典模式下。
程序:
/*51单片机采用中断方式的串行通信程序分析:
接收数据时等待中断——然后在中断中接收数据
发送数据时发送数据——等待中断——然后在中断中发送数据
具体步骤如下:
确定T1如何工作(编程TMOD寄存器);
计算T1的初始值并加载TH1和TL1;
启动T1(编程TCON中的TR1位);
确定串口控制(编程SCON寄存器);
当串口工作在中断模式时,必须进行中断设置(编程IE和IP寄存器)。
*/
#include#define uchar 无符号字符
uchar 温度、RIflag、TIflag;
//串口初始化函数
无效串行端口初始化(){
TMOD=0x20;//设置定时器1为工作模式2 8位自动重载生成波特率
TH1=0xfd;//设置波特率位为9600bps
TL1=0xfd;
TR1=1;//启动定时器1
//设置串口工作在模式1
//模式1:8位异步收发,可变波特率(由定时器控制),一帧发送和接收10位数据,1个起始位(0),8个数据位,1个停止位(1)
//先发送或接收最低位
SCON=0x50;//相当于SM0=0; SM1=1; REN=1;
//SM0=0;
//SM1=1;
//REN=1;//允许串口接收位允许串口接收数据
PCON=0x00;//SMOD=0波特率不翻倍
EA=1;//使能总中断
ES=1;//打开串口中断。注意:如果使用查询模式进行串口通信,必须关闭串口中断ES。
}
//定义数据发送函数
无效发送温度(){
SBUF=Temp;//将Temp接收到的数据发送到发送缓冲区SBUF
//注:51单片机内部有两个物理上独立的接收和发送缓冲区SBUF(属于特殊功能寄存器)。两个缓冲区共享一个特殊功能寄存器字节地址(99H?
while(!TI);//等待从机完成向主机发送数据
TI=0;//如果发送完成,则通过软件将发送中断标志位清0,因为TI必须由软件清零。
}
无效主(){
串行端口初始化();
而(1){
如果(RIflag==1){
ES=0;//关闭串口中断
RIflag=0;//接收标志清为0
sentTemp();//调用数据发送函数
ES=1;//打开串口中断
}
}
}
//串口中断服务函数
voidserialportint()interrupt4 { //串口中断函数
如果(RI){
RI=0;//接收中断标志位RI必须由软件清0
Temp=SBUF;//将接收缓冲区中接收到的数据分配给LED
P1=Temp;//监控主机发送的数据是否通过开发板接收
RIflag=1;//接收标志位置1表示从机已完成接收收据
}
【基于中断技术的51单片机串口通信实现方法】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
哇,单片机还能这样用!中断通信听起来很专业的样子。
有13位网友表示赞同!
51单片机比较常见吧,这样学习一下中断就很有帮助了。
有6位网友表示赞同!
我之前没听说过中断串口通信的,感觉要好好研究一下了。
有17位网友表示赞同!
这个文章内容应该挺有深度,能让我更理解单片机的调试方法吗?
有9位网友表示赞同!
51单片机串口通信本来就很常用,现在可以用中断来加速传输呢!
有20位网友表示赞同!
我觉得中断可以提高程序的效率,学习一下不错。
有10位网友表示赞同!
这样看下来,学习单片机的编程语言也是很重要的吧?
有14位网友表示赞同!
这个文章内容够详细吗?感觉有些概念需要基础知识铺垫。
有10位网友表示赞同!
中断技术挺复杂的,希望这篇文章能解释得通俗易懂。
有14位网友表示赞同!
51单片机真是万能啊!什么应用都有相关资料可以参考+
有20位网友表示赞同!
想学习一下用中断实现串口通信的例子,看看具体代码。
有19位网友表示赞同!
原来串口通信还可以这样高效的改进,受益匪浅啊。
有14位网友表示赞同!
学习单片机真是需要不断积累经验和知识。
有7位网友表示赞同!
期待这篇文章能带我解锁更多单片机编程技巧!
有14位网友表示赞同!
我之前没接触过51单片机的中断,这个文章看起来很不错。
有12位网友表示赞同!
学习一下中断串口通信,以后做项目可以用到!
有7位网友表示赞同!
感觉这篇文章应该能帮我更深入理解单片机的功能?
有20位网友表示赞同!
单片机真是太好玩了,学习起来也越来越有趣。
有10位网友表示赞同!
这个技术应用很广泛吧,很有学习价值!
有11位网友表示赞同!
希望这篇文章能提供一些具体的代码例子,方便理解和实践!
有10位网友表示赞同!