51单片机之寄存器-3.4单片机串口中断
例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单片机寄存器串口中 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)