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

发布者:数字探险家最新更新时间:2022-06-24 来源: eefocus关键字:C51  编程  中断  串行通讯 手机看文章 扫描二维码
随时随地手机看文章

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.c

Author:  adam

Date:  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后,会默认再发送换行符。

关键字:C51  编程  中断  串行通讯 引用地址:C51编程19-中断篇(串行通讯3)

上一篇:C51编程18-中断篇(串行通讯2)
下一篇:C51编程20-应用篇(LCD1602显示-1)

推荐阅读最新更新时间:2024-11-17 03:26

STM32基于标准外设库的外部中断配置
本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断 2 STM32的外部中断 下图来自《STM32参考手册》,从整个架构图可以知道,外部中断的功能可以配置六个寄存器; 中断屏蔽寄存器(EXTI_IMR) 事件屏蔽寄存器(EXTI_EMR) 上升沿触发选择寄存器(EXTI_RTSR) 下降沿触发选择寄存器(EXTI_FTSR) 软件中断事件寄存器(EXTI_SWIER) 挂起寄存器(EXTI_PR) EXTI支持配置20个中断和事件屏蔽位; GPIO端口以下图的方式连接到16个外部中断/事件线上;EXTI_Line0 — EXTI_Line15; EXTI_Line16 连接到PVD
[单片机]
STM32基于标准外设库的外部<font color='red'>中断</font>配置
avr单片机LED灯循环位移汇编程
本程序中使用的avr单片机是m16芯片,可以让8个led实现循环移位的效果/* * loopLEDLight.asm * * Created: 2014/3/14 9:47:20 * Author: Wujie */ .include m16def.inc .def temp1=r20 .def count=r17 .org $0000 rjmp main .org $002A main: ldi r16,high(RAMEND) out sph,r16 ldi r16,low(RAMEND) out spl,r16 ser temp1 out ddrc,temp1 out portc,temp1 ldi c
[单片机]
STM32中断数据回调函数接收处理
1.定义一个空的指针函数 指针函数的参数是uint8_t 类型ch typedef void (* usart_recv_callback)(uint8_t ch); 2.声明这个类型 usart_recv_callback usart1_recv_cb; 3.串口配置时,一个形参为串口中断接收回调 void Usart_Config(USART_TypeDef* USARTx, uint32_t baudRate, usart_recv_callback cb) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_Ini
[单片机]
如何使用USB端口对STM32F103C8板进行编程
搭载STM32F103C8微控制器的STM32开发板采用ARM Cortex M3架构,具有高运行速度和更多外设选项,因此越来越受欢迎。此外,由于该板可以使用Arduino IDE轻松编程,因此它已成为许多业余爱好者和工程师快速原型设计的首选。 为了对电路板进行编程,我们使用了FTDI编程器模块,并且在上传和测试代码时还必须在引导0跳线和1位置之间切换,这肯定是一项艰巨的任务。此外,开发板上的迷你USB端口完全未使用。这样做的原因是,购买STM32开发板时,它没有附带Arduino就绪引导加载程序,因此当通过USB连接时,您的计算机不会发现该板。 希望存在一个由LeafLabs为Maple迷你板开发的实验性引导加载程序。这个
[单片机]
如何使用USB端口对STM32F103C8板进行<font color='red'>编程</font>
AVR(ATMEGA128\16)AD功能(扫描,中断,差分扫描,差分中断)
下面是AD差分扫描 /********************************AD头文件**********************************/ #ifndef __ad_chafenscan_H__ #define __ad_chafenscan_H__ uint mega128_ad_chafen01(void);//01通道差分,1为参考 uint mega128_ad_chafen32(void);//23通道差分,2为参考 #endif /********************************ADC文件************************************/
[单片机]
AVR(ATMEGA128\16)AD功能(扫描,<font color='red'>中断</font>,差分扫描,差分<font color='red'>中断</font>)
MSP430单片机硬件知识-中断
中断是MSP430微处理器的一大特色,有效地利用中断可以简化程序和提高执行效率。MSP430的几乎每个外围模块都能够产生中断,为MSP430针对事件(即外围模块产生的中断)进行的编程打下基础。MSP430在没有事件发生时进入低功耗模式,事件发生时,通过中断唤醒CPU,事件处理完毕后,CPU再次进入低功耗状态。由于CPU的运算速度和退出低功耗的速度很快,所以在应用中,CPU大部分时间都处于低功耗状态。 MSP430的中断分为3种:系统复位、不可屏蔽中断、可屏蔽中断。 (1)系统复位的中断向量为0xFFFE。 (2)不可屏蔽中断的中断向量为0xFFFC。响应不可屏蔽中断时,硬件自动将OFIE、NMIE、ACCVIE复位。软
[单片机]
STM8S 115200bps 串口中断连续接收出错问题
内部16M晶振误差太大,导致波特率不准,9600bps可以。要想使用115200,就用外部晶振吧。 还有数据寄存器DR中的数据如果没有及时取走(也可能因为波特率不准)导致数据溢出,出现反复中断现像,如在调试时如果暂停时串口上还有数据,再次运行时DR中的数据将一直是某个数据,正常情况下是不会出现的,解决办法就是进中断的时候清OV标志(不能解决根本问题)。
[单片机]
FPGA与DS18B20型温度传感器通信的实现
DS18B20是DALLAS公司生产的一线式数字温度传感器,采用3引脚TO-92型小体积封装;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出。 一线式(1-WIRE)串行总线是利用1条信号线就可以与总线上若干器件进行通信。具体应用中可以利用微处理器的I/O端口对DS18B20直接进行通信,也可以通过现场可编程门阵列(FPGA)等可编程逻辑器件(PLD)实现对1-WIRE器件的通信。 本文介绍利用ACTEL公司的ProASICplus系列FPGA实现与DS18B20的通信功能。FPGA可以将读出DS18B20的48位ID号和12位温度
[应用]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved