#include <reg51.h>
// 函数声明
void Timer0_Init(void);
void UART_Init(void);
void Send_Current_Number(void); // 专门用于发送当前数字的函数
// 数码管编码
unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char currentNum = 0;
unsigned char timer50ms = 0;
// 定时器初始化
void Timer0_Init() {
TMOD = 0x21; // 定时器0模式1,定时器1模式2
TH0 = 0x3C; // 50ms定时值(12MHz)
TL0 = 0xB0;
ET0 = 1; // 允许定时器0中断
EA = 1; // 总中断允许
TR0 = 1; // 启动定时器0
}
// 串口初始化
void UART_Init() {
SCON = 0x50; // 模式1,允许接收
TH1 = 0xFD; // 9600波特率(12MHz)
TL1 = 0xFD;
TR1 = 1; // 启动定时器1
}
// 专用数字发送函数
void Send_Current_Number(void) {
SBUF = currentNum + '0';
while(!TI); // 等待发送完成
TI = 0; // 清除发送标志
}
// 定时器中断
void Timer0_ISR() interrupt 1 {
TH0 = 0x3C; // 重装定时值
TL0 = 0xB0;
if(++timer50ms >= 10) { // 0.5秒到达
timer50ms = 0;
// 更新显示
P1 = LED7Code[currentNum];
// 发送当前数字
Send_Current_Number();
// 数字循环
currentNum++;
if(currentNum > 9) currentNum = 0;
}
}
void main() {
P1 = LED7Code[0]; // 初始显示0
currentNum = 0; // 显式初始化
UART_Init(); // 初始化串口
Timer0_Init(); // 初始化定时器
// 初始发送数字0
Send_Current_Number();
while(1); // 主循环
}
|