欢迎来真孝善网,为您提供真孝善正能量书籍故事!

基于中断技术的51单片机串口通信实现方法

时间:11-03 现代故事 提交错误

发送数据时: 发送数据-等待中断-然后在中断中发送数据

具体步骤如下:

确定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表示从机已完成接收收据

}

用户评论

一生只盼一人

哇,单片机还能这样用!中断通信听起来很专业的样子。

    有13位网友表示赞同!

落花忆梦

51单片机比较常见吧,这样学习一下中断就很有帮助了。

    有6位网友表示赞同!

一生荒唐

我之前没听说过中断串口通信的,感觉要好好研究一下了。

    有17位网友表示赞同!

雨后彩虹

这个文章内容应该挺有深度,能让我更理解单片机的调试方法吗?

    有9位网友表示赞同!

心安i

51单片机串口通信本来就很常用,现在可以用中断来加速传输呢!

    有20位网友表示赞同!

良人凉人

我觉得中断可以提高程序的效率,学习一下不错。

    有10位网友表示赞同!

病房

这样看下来,学习单片机的编程语言也是很重要的吧?

    有14位网友表示赞同!

铁树不曾开花

这个文章内容够详细吗?感觉有些概念需要基础知识铺垫。

    有10位网友表示赞同!

身影

中断技术挺复杂的,希望这篇文章能解释得通俗易懂。

    有14位网友表示赞同!

猫腻

51单片机真是万能啊!什么应用都有相关资料可以参考+

    有20位网友表示赞同!

把孤独喂饱

想学习一下用中断实现串口通信的例子,看看具体代码。

    有19位网友表示赞同!

等量代换

原来串口通信还可以这样高效的改进,受益匪浅啊。

    有14位网友表示赞同!

熏染

学习单片机真是需要不断积累经验和知识。

    有7位网友表示赞同!

坏小子不坏

期待这篇文章能带我解锁更多单片机编程技巧!

    有14位网友表示赞同!

浮光浅夏ζ

我之前没接触过51单片机的中断,这个文章看起来很不错。

    有12位网友表示赞同!

无寒

学习一下中断串口通信,以后做项目可以用到!

    有7位网友表示赞同!

孤独症

感觉这篇文章应该能帮我更深入理解单片机的功能?

    有20位网友表示赞同!

あ浅浅の嘚僾

单片机真是太好玩了,学习起来也越来越有趣。

    有10位网友表示赞同!

Hello爱情风

这个技术应用很广泛吧,很有学习价值!

    有11位网友表示赞同!

蹂躏少女

希望这篇文章能提供一些具体的代码例子,方便理解和实践!

    有10位网友表示赞同!

【基于中断技术的51单片机串口通信实现方法】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活