#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); // 主循環
}
|