用c51写一个pc输出字符,单片机led数码管显示相应8421bcd码的程序
时间: 2023-06-18 13:08:03 浏览: 207
以下是使用C51单片机控制PC输出字符和驱动LED数码管显示相应8421BCD码的程序:
```
#include <reg52.h>
// 定义串口通信参数
#define BAUDRATE 9600
#define FOSC 11059200L
#define TIMER1_RELOAD (65536L - (FOSC / 12L / BAUDRATE))
// 定义IO口及数码管对应的BCD码
sbit LED_D1 = P1^0;
sbit LED_D2 = P1^1;
sbit LED_D3 = P1^2;
sbit LED_D4 = P1^3;
unsigned char code LED_TBL[] = {
0x3f, 0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x00
};
// 初始化函数
void Init() {
// 设置串口参数
SCON = 0x50; // 8位数据,可变波特率
TMOD &= 0x0f; // 确定计数模式
TMOD |= 0x20; // 设置定时器1为8位自动重装模式
TH1 = TL1 = TIMER1_RELOAD; // 初始化定时器1计数值
TR1 = 1; // 启动定时器1
ES = 1; // 允许串口中断
EA = 1; // 允许总中断
}
// 串口中断服务函数
void Serial_ISR() interrupt 4 {
if (RI) {
RI = 0; // 清除接收标志位
// 接收到字符后,驱动LED数码管显示相应的BCD码
switch(SBUF) {
case '0':
LED_D1 = LED_D2 = LED_D3 = 1;
LED_D4 = 0;
break;
case '1':
LED_D1 = 0;
LED_D2 = LED_D3 = LED_D4 = 1;
break;
case '2':
LED_D1 = LED_D2 = 1;
LED_D3 = LED_D4 = 0;
break;
case '3':
LED_D1 = LED_D2 = LED_D3 = 1;
LED_D4 = 0;
break;
case '4':
LED_D1 = 0;
LED_D2 = LED_D3 = 1;
LED_D4 = 0;
break;
case '5':
LED_D1 = LED_D3 = 1;
LED_D2 = LED_D4 = 0;
break;
case '6':
LED_D1 = LED_D3 = 1;
LED_D2 = LED_D4 = 0;
break;
case '7':
LED_D1 = LED_D2 = LED_D3 = 0;
LED_D4 = 1;
break;
case '8':
LED_D1 = LED_D2 = LED_D3 = LED_D4 = 0;
break;
case '9':
LED_D1 = LED_D2 = LED_D3 = 1;
LED_D4 = 0;
break;
default:
break;
}
}
}
// 主函数
void main() {
Init(); // 初始化
while (1);
}
```
需要注意的是,此程序中使用了定时器1来实现串口通信的波特率控制,因此需要在程序中使用定时器1的中断服务函数来处理串口接收事件。同时,程序中使用了一个LED_TBL数组来存储每个数字对应的BCD码值,以便驱动LED数码管进行显示。
阅读全文