×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-08-31 发布时间:
|
现在我们来看看如何操作串口通信中断。回顾一下前面讲的定时器中断。当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单片机中断源的扩展方法