51單片機之寄存器-3.4單片機串口中斷
例3-3-4研究uart發(fā)送中斷。單片機控制LED0亮滅,每當(dāng)串口發(fā)送一幀數(shù)據(jù)時,進入中斷服務(wù)程序,在中斷程序中亮滅另外一個LED。
本文引用地址:http://m.butianyuan.cn/article/201611/319549.htm根據(jù)前面講過的中斷分析步驟,
(1) CPU正在忙什么
(2) 發(fā)生了什么比較急的事情
(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發(fā)送中斷。單片機控制LED0亮滅,每當(dāng)串口接收一幀數(shù)據(jù)時,進入中斷服務(wù)程序,在中斷程序中亮滅另外一個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);
}
}
評論