现在咱们来看看怎么操作串口通讯中止。回忆一下前面讲的定时器中止。当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);
}
}