您的位置 首页 知识

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

现在我们来看看如何操作串口通信中断。回顾一下前面讲的定时器中断。当TH0和TL0计数溢出时,硬件自动将TF0溢出标志位置1,通知CPU请求中断

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

}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/263502.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部