|
#include <reg51.h>
// 定義端口
sbit SNG = P2^0; // 南北綠燈
sbit SNY = P2^1; // 南北黃燈
sbit SNR = P2^2; // 南北紅燈
sbit EWG = P2^3; // 東西綠燈
sbit EWY = P2^4; // 東西黃燈
sbit EWR = P2^5; // 東西紅燈
// 數碼管顯示相關
uchar code SEG[4] = {0x01, 0x02, 0x04, 0x08}; // 數碼管位選
uchar code distab[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; // 數碼管顯示0~9
uint timeG, timeY, timeR; // 各燈顯示時間
uint state; // 狀態標志
// 延時函數
void delay_ms(uint q)
{
uint i, j;
for (i = 0; i < q; i++)
for (j = 0; j < 110; j++);
}
// 定時器0初始化
void Timer0Init(void)
{
TMOD |= 0X01; // 定時器0模式1,16位定時器
TH0 = 0XFC; // 定時1ms
TL0 = 0X18;
EA = 1; // 開總中斷
ET0 = 1; // 開定時器0中斷
TR0 = 1; // 啟動定時器0
}
// 定時器0中斷服務程序
void Timer0() interrupt 1
{
static uint count = 0; // 計數器,用于控制狀態轉換
TH0 = 0XFC; // 重裝初值
TL0 = 0X18;
count++;
if (count >= 1000) // 每秒更新一次狀態
{
count = 0;
switch (state)
{
case 0: // 南北綠燈,東西紅燈
timeG--;
if (timeG == 0)
{
state = 1;
timeY = 3;
}
break;
case 1: // 南北黃燈閃爍,東西紅燈
if (timeY > 0)
timeY--;
else
{
state = 2;
timeR = 90;
}
break;
case 2: // 南北紅燈,東西綠燈
timeR--;
if (timeR == 0)
{
state = 3;
timeY = 3;
}
break;
case 3: // 南北紅燈,東西黃燈閃爍
if (timeY > 0)
timeY--;
else
{
state = 0;
timeG = 20;
}
break;
}
}
// 數碼管顯示倒計時
uchar displayDigit[4] = {0xFF, 0xFF, 0xFF, 0xFF}; // 初始化為全滅
switch (state)
{
case 0:
displayDigit[0] = distab[timeG / 10];
displayDigit[1] = distab[timeG % 10];
break;
case 1:
displayDigit[0] = distab[timeY / 10];
displayDigit[1] = distab[timeY % 10];
break;
case 2:
displayDigit[0] = distab[timeR / 10];
displayDigit[1] = distab[timeR % 10];
break;
case 3:
displayDigit[0] = distab[timeR / 10];
displayDigit[1] = distab[timeR % 10];
break;
}
for (uchar i = 0; i < 4; i++)
{
P1 = SEG[i];
P0 = displayDigit[i];
delay_ms(1);
}
}
// 主函數
void main()
{
Timer0Init(); // 定時器初始化
timeG = 20; // 初始時間設置
state = 0; // 初始狀態
while (1)
{
// 主循環可以為空,因為所有操作都在中斷中完成
}
}
顯示4.c(9): error C129: missing ';' before 'code'。
我搜到是沒有定義就在開頭加了
#define uchar unsigned char;
#define uint unsigned int;
結果顯示4.c(109): error C202: 'P0': undefined identifier
|
|