新闻中心

EEPW首页>嵌入式系统>设计应用> 51单片机之寄存器-3.4单片机串口中断

51单片机之寄存器-3.4单片机串口中断

作者: 时间:2016-11-21 来源:网络 收藏
现在我们来看看如何操作串口通信中断。回顾一下前面讲的定时器中断。当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。

本文引用地址://m.amcfsurvey.com/article/201611/319549.htm

根据前面讲过的中断分析步骤,

(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);

}

}



评论


技术专区

关闭