现在我们来看看如何操作串口通信中断。回顾一下前面讲的定时器中断。当TH0和TL0计数溢出时,硬件自动将TF0溢出标志位置1,通知CPU请求中断。串口通信很类似,假设CPU正在进行串口数据发送工作,当一帧发送完成时,硬件自动将TI置1,通知CPU一帧数据发送完毕等待CPU的指令,也就是串口中断服务程序。同样的道理,对于串口数据接收中断,当一帧接收完毕,硬件自动将RI置1,通知CPU一帧数据接收完毕了,是否有其它指示。前面讲过,对于中断,无论是串口数据发送中断,还是串口接收中断,都有两个开关控制,一个总开关EA,一个分开关ES(对于串口中断)。因此在使用串口中断之前要将两个开关打开EA=1,ES=1. 下面对于串口发送和接收中断我们各举一个例子来说明。
例3-3-4 研究uart发送中断。单片机控制LED0亮灭,每当串口发送一帧数据时,进入中断服务程序,在中断程序中亮灭另外一个LED。
根据前面讲过的中断分析步骤,
(1) CPU正在忙什么
(2) 发生了什么比较急的事情
(3) 如何通知CPU
(4) CPU如何处理
参考代码如下:
#include "reg52.h"
typedef unsigned char uchar;
sbit LED0=P1^3;
sbit LED1=P1^5;
void delayUs(uchar t);
void delayMs(uchar t);
void main(void)
{
SM0=0;
SM1=1;//uart工作方式
TMOD=0X20;
TH1=TL1=253;//Baud=9600
TR1=1;//定时器开始运行
EA=1;
ES=1;
while(1)
{
LED0=~LED0;
SBUF=0x38;
delayMs(255);
}
}
void uart_txd_interrupt(void) interrupt 4
{
TI=0;
LED1=~LED1;
delayMs(255);
delayMs(255);
}
void delayUs(uchar t)
{
while(--t);
}
void delayMs(uchar t)
{
while(--t)
{
delayUs(245);
delayUs(245);
}
}
例3-3-4-1 研究uart发送中断。单片机控制LED0亮灭,每当串口接收一帧数据时,进入中断服务程序,在中断程序中亮灭另外一个LED。
同样的道理,很容易写出代码,参考如下
#include "reg52.h"
typedef unsigned char uchar;
sbit LED0=P1^6;
sbit LED1=P1^7;
void delayUs(uchar t);
void delayMs(uchar t);
void main(void)
{
uchar Uart_RXD_data;
SM0=0;
SM1=1;
TMOD=0X20;
TH1=TL1=253;
TR1=1;
REN=1;
EA=1;
ES=1;
while(1)
{
LED0=~LED0;
Uart_RXD_data=SBUF;
delayMs(245);
delayMs(245);
}
}
void uart_rxd_interrupt(void) interrupt 4
{
RI=0;
LED1=~LED1;
}
void delayUs(uchar t)
{
while(--t);
}
void delayMs(uchar t)
{
while(--t)
{
delayUs(245);
delayUs(245);
}
}
关键字:51单片机 寄存器 串口中断
引用地址:
51单片机之寄存器-3.4单片机串口中断
推荐阅读最新更新时间:2024-03-16 14:48
基于51单片机的锅炉水位温度压力检测系统仿真设计
仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0056 1.主要功能: 基于51单片机AT89C51/52(与AT89S51/52、AT89C51/52、STC89C51/52等51内核单片机通用) 1.系统实时通过LCD1602显示水位检测值,锅炉炉膛温度值,锅炉内部压力值。 2、可对锅炉的水位上下限、炉膛温度上下限、压力上下限进行设置,第一行显示上限值,第二行显示下限值。 3、如果水位、温度、压力过限则蜂鸣器报警,通过LED指示报警类型。 4、默认水位下限值10cm,上限值40cm,压力下限值30kPa,压力上限值50kPa,温度下限值5℃,温度上限值105℃。 5、温
[单片机]
ADC0804 模数转换51单片机程序+电路图
51单片机驱动 adc0804模数转换 ,下面是电路图 #include reg51.h #include "lcd.h" #include intrins.h #define uint unsigned int #define uchar unsigned char uchar lcd ="0123456789"; sbit rd=P3^6; //IO口定义 sbit wr=P3^5; sbit cs=P3^7; read_adc0804()//控制并读取adc0804转换好的数据 { uchar a; //写入控制命令,启动转换 cs=1; wr=1; cs=0; wr=0; _nop_(); wr=1;
[单片机]
51单片机环境的搭建-1.3指令下载/烧写软件
第一章 51单片机环境的搭建-1.3指令下载/烧写软件 1.3 指令下载/烧写程序下载STC-ISP:http://pan.baidu.com/s/1kU3oXD1 将STC-ISP-v4.80.rar文件解压,即可使用
[单片机]
TI 54xxDSP与51单片机的接口技术
摘要:TI的54xxDSP是一种定点DSP系列芯片,产生应用于各种信号处理系统,特别是语音信号处理系统。在这些系统中,通常由两部分组成。一部分为DSP子系统,这是整个系统的核心,主要完成采样、数字信号处理以及输出等功能;另一部分为单片机子系统,进行交互界面的控制,如键盘和显示。两个子系统不是各自孤立的,需要进行必要的数据交换。本文主要讨论DSP和51单片机之间通过HPI接口进行连接的设计方法,给出硬件连接以及软件编程方法。
关键词:DSP HPI 单片机
TMS320C54xx是TI公司针对音频信号处理领域推出的一种定点DSP系列芯片,已经在很多语音信号处理系统中得到了广泛的应用。在这些系统中,通常包含DSP和单片机两个子系
[应用]
S3C2440的中断寄存器的分类及中断的过程分析
S3C2440一共有60个中断源,其中有15个子中断源,它们与SUBSRCPND寄存器中的每一位相对应,其他45个中断源与SRCPND中的每一位相对应。要注意的是EINT4~7对应的是同一位SRCPND,而EINT8~23对应的也是SRCPND一位。 1 S3C2440的中断寄存器 中断分两大类:外部中断和内部中断。 1.1 外部中断寄存器 24个外部中断占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。用这些脚做中断输入,则必须配置引脚为中断,并且不要上拉。具体可参考datesheet数据手册。 寄存器: EXTINT0-EXTINT2:分别设置EINT0—EINT7、E
[单片机]
51单片机超声波测距C程序
超声波检测原理 超声波测距的程序流程图 程序如下: //超声波模块程序 //超声波模块程序 //Trig = P2^0 //Echo = P3^2 #include reg52.h #define uchar unsigned char #define uint unsigned int // void delay(uint z) { uint x,y; for(x=z;x 0;x--) for(y=110;y 0;y--); } // void delay_20us() { uchar a ; for(a=0;a 100;a++); } //
[单片机]
51单片机-前期准备
1.学习前提 单片机是需要与程序打交道的,这个需要您先掌握很基础的C语言知识,即便我们讲解程序的执行过程尽量详细,但对于没有任何C语言知识基础的同学来说这将是举步维艰的。 所以您必须掌握以下最基本的知识 1.数据类型 2.十六进制,十进制,二进制之间的转换 3.程序的运行顺序 4.if,else,while,for,switch等语句 2.硬件 如果您对模电数电知识没有相关概念,以及对电子元器件尚不知晓,这些都不是学习单片机的困难,我们都会在教程里简单介绍硬件基础,您也可以参考学习宋老师的《手把手教你学51单片机》的前三章,这些只要您对中学物理电路和电路基础知识有一定的了解都可以看得懂。我们也鼓励大家学会在网上查找相关
[单片机]
MCX314As型四轴运动控制器的原理及应用
1 引言 MCX系列运动控制器是日本NOVA公司设计的专用电路,其中MCX314As是NOVA公司最新的推出的4轴运动控制器,是对MCX314功能的改进和增强。 MCX314As以单个电路同时控制4个伺服系统或步进电机系统,可进行各轴独立的定位控制、速度控制,亦可在任意2轴或3轴中进行圆弧、直线、位模式插补。MCX314As能与8/16位数据总线接口,通过命令、数据和状态等寄存器实现4轴3联动的位置、速度、加速度等的运动控制和实时监控、实现圆弧、直线、位模式3种模式的轨迹插补,输出脉冲频率达到4MHz,每轴都有伺服反馈输入端、4个输入点和8个输出点,能独立地设置为恒速、线性、非对称S曲线加/减控制、非对称梯形加/减速控制方式
[应用]