#include<reg52.h> #define uchar unsigned char uchar count,ge,shi,tt,time,color,flag; uchar table[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0, 0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E}; void yellow() { time=10; P1=0x08; if(flag==1) color=3; if(flag==0) color=2; } void red() { time=20; P1=0x10; flag=1; color=1; } void green() { time=20; P1=0x04; flag=0; color=1; } void light() { switch(color){ case 1: yellow();break; case 2: red();break; case 3: green();break; } } void main(){ color=2; flag=0; count=3; time=10; tt=0; TMOD=0x01; TL0=0xB7; TH0=0x3C; EA=1; ET0=1; TR0=1; while(1){ if(tt==20){ if(count<=0){ light(); count=time; } tt=0; TR0=0; count--; TR0=1; } } } void time_0() interrupt 1{ TL0=0xB7; TH0=0x3C; tt++; }添加注释
时间: 2023-10-22 09:06:41 浏览: 151
// 头文件
#include<reg52.h>
// 定义无符号字符型变量
#define uchar unsigned char
// 定义全局变量
uchar count,ge,shi,tt,time,color,flag;
// 定义数码管显示表
uchar table[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E};
// 黄灯控制函数
void yellow() {
time=10; // 时间设为10
P1=0x08; // P1口输出控制信号
if(flag==1) // 如果标志位为1,表示上一次状态为红灯
color=3; // 则将状态设为绿灯
if(flag==0) // 如果标志位为0,表示上一次状态为绿灯
color=2; // 则将状态设为黄灯
}
// 红灯控制函数
void red() {
time=20; // 时间设为20
P1=0x10; // P1口输出控制信号
flag=1; // 标志位设为1,表示当前状态为红灯
color=1; // 状态设为红灯
}
// 绿灯控制函数
void green() {
time=20; // 时间设为20
P1=0x04; // P1口输出控制信号
flag=0; // 标志位设为0,表示当前状态为绿灯
color=1; // 状态设为绿灯
}
// 灯光控制函数
void light() {
switch(color){ // 根据状态控制灯光
case 1: yellow();break; // 状态为1,控制为黄灯
case 2: red();break; // 状态为2,控制为红灯
case 3: green();break; // 状态为3,控制为绿灯
}
}
// 主函数
void main(){
color=2; // 初始状态为红灯
flag=0; // 标志位为0,表示上一次状态为绿灯
count=3; // 初始计数器为3
time=10; // 初始时间为10
tt=0; // 初始定时器计数器为0
TMOD=0x01; // 定时器0工作方式为16位自动重装
TL0=0xB7; // 定时器0初值
TH0=0x3C; // 定时器0初值
EA=1; // 开启总中断
ET0=1; // 开启定时器0中断
TR0=1; // 启动定时器0
while(1){ // 循环执行
if(tt==20){ // 定时器计数器为20,即计时1秒
if(count<=0){ // 计数器为0,需要控制灯光
light(); // 调用灯光控制函数
count=time; // 重置计数器为初始值
}
tt=0; // 重置定时器计数器
TR0=0; // 停止定时器0
count--; // 计数器减1
TR0=1; // 启动定时器0
}
}
}
// 定时器0中断函数
void time_0() interrupt 1{
TL0=0xB7; // 重置定时器0初值
TH0=0x3C; // 重置定时器0初值
tt++; // 定时器计数器加1
}
阅读全文