C51编程19-中断篇(串行通讯3)

MCS-51单片机提供了4种串口的方式,但是我们只有方式1最常用(可变的10位串行通讯方式),下面就方式1的使用进行讲解。

    在开始之前先明确一个概念,中断会产生中断标志位,而CPU检测到中断标志位后,如果没有其他更高的中断在执行,CPU会响应该中断,并进入中断服务函数。串行通讯属于中断方式的一种,它服从这个概念。此外串行通讯并不是需要进入串行通讯的时候,会产生中断标志位;而是发送或者接收成功后,会产生中断标志位。

    通过中断向量,可以知道串行通讯只有一个中断号4,也就是说当进入无论是发送或者接收成功,都会触发中断服务函数,因此如果需要区分发送与接收需要在中断服务函数中实现区分,可以通过判断中断标志位(TI == 1或者RI == 1)进行区分。

 

    

    在实际应用中,发送数据成功就成功,一般不会在发送成功后再进入中断服务函数;在处理接串行通信数据的时候,中断服务函数是非常必要,当接收到外面的数据成功时RI =1,触发中断通知CPU,CPU进入中断服务函数,对接收到的数据进行处理。

 

   串行通讯方式1,需要满足以下条件

    1)中断总允许打开 EA = 1;

    2)中断源允许打开 ES = 1;

    3)设置SCON=0x50(SM0 =0;SM1 =1;REN = 1,开启接收),由于SCON可以位寻址,可以位设置SM0 =0;SM1 =1;REN = 1;

    4)设置SMOD,由于SMOD在PCON寄存器中,不能位寻址。如果需要SMOD=1,设置PCON=0x80;如果需要SMOD = 0,则不需要设置PCON,因为PCON复位值为0,上电后默认SMOD = 0;

    5)设置TMOD与预装值(TH1与TL1),定时器T1设置(定时器工作方式,不是计数模式),一般设置工作在方式2(8位自动重装);

    6)开启定时器 TR1 = 1;

    7)中断服务函数。

 

注:使用串行通讯方式1时,SMOD的值、TH1与TL1可以通过计算公式计算的得到。

     波特率 = ( fosc*2SMOD)/(32*12*(256-X))

    在51单片机中的波特率有,4800、9600、19200。除了公式计算得到,也可以通过开发小工具得到。

    链接:https://pan.baidu.com/s/1xJNgKILVPiACX-fEpwWihg

    提取码:ibe7

 

 

   

    串行通讯在工作方式1,波特率19200的接收程序,代码实现。

/****************************************Header:File Name: main.cAuthor:  adamDate:  2020年9月19日******************************************/#include "reg52.h"#include "stdio.h"void main(){       //波特率为19200bps,如果需要9600,将SMOD =0即可;      EA = 1;      //总中断允许   ES = 1;     //串行源中断允许   PCON = 0x80; //SMOD =1,   SCON = 0x50; //SM0 =0;SM1 =1;REN = 1;      TMOD = 0x20; //设置T1为模式2,定时器模式:C/T=0;不启动外部,INT0控制开始定时:GATE=0;   TH1 = 0xFD;   //预装值        TL1 = 0xFD;   //自动重装值   TR1 =1;   //启动定时器T1      while(1);}void uart(void) interrupt  4{    //判断串行中断是否属于接收    if(RI==1){                P2 = SBUF;        RI=0;    }            }

 

 

 

    代码实现后,可以使用串口调试助手,通过电脑发送数据到单片机。需要注意的是,该串口调试助手,发送设置的hex方式,没有实现,只能用ASCII码的方式发送数据,也就是说当发送框中,写入“1”,将会发送16进制的数据位ASCII码,单片机接收到的数值为0x31,0x31将会中断服务函数中,赋值为P2,如果P2口有接LED,对应的LED将会被点亮。

    

   工具链接地址:

    链接:https://pan.baidu.com/s/1aGfcqwGE0E9R1FyeNO8FTg

    提取码:jpv7

 

 

    注:此外如果不是使用上面的串口调试助手,如果发现数值不对,除了检查数据以外,还需要注意工具是不是发送数据时,有默认添加换行符。

    下面是笔者在用以下的串口调试助手测试时,发送数1时。P2的LED会闪以下,然后保持数据在0x0A,0x0A在ASCII编码中为换行,也就是说软件在发送的时候,发送数据1后,会默认再发送换行符。

 

 


 

 

---------------------------------------------------------

如果觉得文章还不错,那就扫码关注吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颖川初尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值