51单片机串口发送和中断接收程序
#include
void delayms(unsigned int k); // 延时 n ms
void USART_SEND(unsigned char dat); // 串口发送子程序
unsigned char data ledxs[8]={16,16,16,16,16,0,0,18}; // 数码管显示缓冲区
unsigned char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,0xff,0x76};
//共阴极代码 0-F , 全灭 , 全亮 , H
void main()
{
unsigned char dat=0,i;
delayms(200);
TMOD=0x20; // 定时器1模式2 , 8位自动重装
TL1=0xe6;
TH1=0xe6; // 波特率1200
TR1=1;
SCON=0x50; // 串口方式1 , 接收允许 , 8位数据 , 无校验 , 1位起始位 , 1位结束位
EA=1; // 开串口中断
ES=1; // 开总中断
while(1)
{
for(i=0;i<60;i++)
leddisplay(); // 循环显示60次 , 延时480ms
USART_SEND(dat); // 串口发送数据(0-255)
dat++;
if(dat==256) dat=0;
}
}
void USART_SEND(unsigned char dat) // 串口发送子程序
{
SBUF=dat; // 发送数据
while(TI==0); // 等待发送完成
TI=0;
}
void USART_RCV_INT(void) interrupt 4 using 1 // 串口接收中断服务程序
{
unsigned char dat;
if(RI==1) // 判断是否是接收中断
{
RI=0;
dat=SBUF; // 接收数据
ledxs[5]=dat/16;
ledxs[6]=dat%16; // 接收数据转换成16进制显示
ledxs[7]=18;
}
}
void leddisplay() // LED显示子程序
{
P2=0xdf;
P0=tab[ledxs[0]];
delayms(1);
P0=0x00;
【51单片机串口发送和中断接收程序】 P2=0x5f;
P0=tab[ledxs[1]];
delayms(1);
P0=0x00;
P2=0x9f;
P0=tab[ledxs[2]];
delayms(1);
P0=0x00;
P2=0x1f;
P0=tab[ledxs[3]];
delayms(1);
P0=0x00;
P2=0xff;
P0=tab[ledxs[4]];
delayms(1);
P0=0x00;
P2=0x7f;
P0=tab[ledxs[5]];
delayms(1);
P0=0x00;
P2=0xbf;
P0=tab[ledxs[6]];
delayms(1);
P0=0x00;
P2=0x3f;
P0=tab[ledxs[7]];
delayms(1);
P0=0x00;
}
void delayms(unsigned int k) //延时 n ms
{
while(k)
{
int i;
i=110;
while(i--);
k=k-1;
}
}
推荐阅读
- AVR单片机GCC编程:外部中断基本操作
- MCS-51单片机地址指针详细剖析
- HT1621LCD驱动 PIC单片机
- AVR单片机控制的开关电源
- PIC单片机12F629烧录器电路设计与制作
- 51单片机 数码管的显示与译码器
- 单片机的电平匹配问题
- 运用模块方式写单片机程序
- 单片机轻松入门之二:流水灯
- 51单片机常见的六个问题