|
#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
|
|