串口通信控制AT89C52单片机数码管代码
时间: 2024-02-12 19:03:49 浏览: 90
好的,以下是一个简单的串口通信控制AT89C52单片机数码管的代码示例:
```
#include <reg52.h>
#include <intrins.h>
#define FOSC 11059200L
#define BAUD 9600
#define TIMER_1 (65536 - FOSC / 12 / BAUD)
sbit LATCH1 = P1^0; // 数码管锁存信号
sbit LATCH2 = P1^1;
sbit LATCH3 = P1^2;
sbit LATCH4 = P1^3;
unsigned char code LED_ANODE[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 }; // 数码管段码表,共阳极
unsigned char xdata LED_BUFF[4]; // 数码管缓存
void UartInit() // 串口初始化
{
TMOD |= 0x20; // 启用定时器1,模式2
TH1 = TIMER_1 / 256; // 计算波特率重载值
TL1 = TIMER_1 % 256;
TR1 = 1; // 启动定时器1
SCON = 0x50; // 启用串口,方式1,允许接收
ES = 1; // 使能串口中断
EA = 1; // 使能全局中断
}
void UartSend(unsigned char dat) // 发送一个字节
{
SBUF = dat;
while(!TI); // 等待发送完成
TI = 0;
}
void UartSendString(unsigned char *s) // 发送一个字符串
{
while(*s)
{
UartSend(*s++);
}
}
void Delay10ms() // 延时10毫秒
{
unsigned char i, j;
i = 10;
j = 145;
do
{
while (--j);
} while (--i);
}
void Display(unsigned char *buff) // 数码管显示函数
{
LATCH1 = 0;
P0 = LED_ANODE[buff[0]];
LATCH1 = 1;
LATCH2 = 0;
P0 = LED_ANODE[buff[1]];
LATCH2 = 1;
LATCH3 = 0;
P0 = LED_ANODE[buff[2]];
LATCH3 = 1;
LATCH4 = 0;
P0 = LED_ANODE[buff[3]];
LATCH4 = 1;
}
void main()
{
unsigned char i, ch;
UartInit();
for(i = 0; i < 4; i++)
{
LED_BUFF[i] = 0;
}
while(1)
{
if(RI) // 接收到数据
{
ch = SBUF;
RI = 0;
switch(ch)
{
case '0':
LED_BUFF[0] = 0;
break;
case '1':
LED_BUFF[0] = 1;
break;
case '2':
LED_BUFF[0] = 2;
break;
case '3':
LED_BUFF[0] = 3;
break;
case '4':
LED_BUFF[0] = 4;
break;
case '5':
LED_BUFF[0] = 5;
break;
case '6':
LED_BUFF[0] = 6;
break;
case '7':
LED_BUFF[0] = 7;
break;
case '8':
LED_BUFF[0] = 8;
break;
case '9':
LED_BUFF[0] = 9;
break;
default:
LED_BUFF[0] = 0;
break;
}
Display(LED_BUFF); // 显示数码管
}
Delay10ms();
}
}
void UartIsr() interrupt 4 using 1 // 串口中断服务函数
{
if(RI) // 接收到数据
{
RI = 0;
}
}
```
以上代码中,通过串口接收数据,根据数据的不同来控制数码管的显示。其中,使用了定时器1和中断来实现串口通信。在串口中断服务函数中,通过判断RI寄存器的值来确定是否接收到了数据。
阅读全文