写出下列代码每行的注释: #include<reg51.h> sbit SN_green=P0^3; sbit SN_yellow=P0^4; sbit SN_red=P0^5; sbit EW_green=P0^0; sbit EW_yellow=P0^1; sbit EW_red=P0^2; unsigned char data cnt_sn,cnt_ew; unsigned int data T1_cnt; unsigned char data state_val_sn,state_val_ew; char code led_seg_code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; char code init_sn[3]={24,4,29}; char code init_ew[3]={29,24,4}; void delay(unsigned int t) { while(--t); } void led_show(unsigned int u,unsigned int v) { unsigned char i; i=u%10; P1=led_seg_code[i]; P3=0xef; delay(50); P3=0xff; i=u%100/10; P1=led_seg_code[i]; P3=0xdf; delay(50); P3=0xff; i=v%10; P2=led_seg_code[i]; P3=0xbf; delay(50); P3=0xff; i=v%100/10; P2=led_seg_code[i]; P3=0x7f; delay(50); P3=0xff; } void timer1() interrupt 3 { T1_cnt++; if(T1_cnt>3999) { T1_cnt=0; if(cnt_sn!=0) { cnt_sn--; } else { state_val_sn++; if(state_val_sn>2)state_val_sn=0; cnt_sn=init_sn[state_val_sn]; if(state_val_sn==0) { SN_green=0; SN_yellow=1; SN_red=1; } else if(state_val_sn==1) { SN_green=1; SN_yellow=0; SN_red=1; } else if(state_val_sn==2) { SN_green=1; SN_yellow=1; SN_red=0; } } if(cnt_ew!=0) { cnt_ew--; } else { state_val_ew++; if(state_val_ew>2)state_val_ew=0; cnt_ew=init_ew[state_val_ew]; if(state_val_ew==0) { EW_green=1; EW_yellow=1; EW_red=0; } else if(state_val_ew==1) { EW_green=0; EW_yellow=1; EW_red=1; } else if(state_val_ew==2) { EW_green=1; EW_yellow=0; EW_red=1; } } } } void button1() interrupt 0 { cnt_sn=60; cnt_ew=60; SN_green=1; SN_yellow=1; SN_red=0; EW_green=1; EW_yellow=1; EW_red=0; } main() { cnt_sn=init_sn[0]; cnt_ew=init_ew[0]; T1_cnt=0; state_val_sn=0; state_val_ew=0; SN_green=0; SN_yellow=1; SN_red=1; EW_green=1; EW_yellow=1; EW_red=0; TMOD=0x20; TH1=0x19; TL1=0x19; EA=1; ET1=1;TR1=1; IT1=1;EX1=1; IT0=1;EX0=1; while(1) { delay(10); led_show(cnt_sn,cnt_ew); } }
时间: 2023-10-31 14:06:27 浏览: 148
#include<reg51.h> //包含头文件reg51.h
sbit SN_green=P0^3; //定义P0^3为SN_green
sbit SN_yellow=P0^4; //定义P0^4为SN_yellow
sbit SN_red=P0^5; //定义P0^5为SN_red
sbit EW_green=P0^0; //定义P0^0为EW_green
sbit EW_yellow=P0^1; //定义P0^1为EW_yellow
sbit EW_red=P0^2; //定义P0^2为EW_red
unsigned char data cnt_sn,cnt_ew; //定义cnt_sn和cnt_ew为无符号字符型变量
unsigned int data T1_cnt; //定义T1_cnt为无符号整型变量
unsigned char data state_val_sn,state_val_ew; //定义state_val_sn和state_val_ew为无符号字符型变量
char code led_seg_code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定义led_seg_code为字符型数组,初始化为0x3f、0x06、0x5b、0x4f、0x66、0x6d、0x7d、0x07、0x7f、0x6f
char code init_sn[3]={24,4,29}; //定义init_sn为字符型数组,初始化为24、4、29
char code init_ew[3]={29,24,4}; //定义init_ew为字符型数组,初始化为29、24、4
void delay(unsigned int t) //定义延时函数delay,参数为无符号整型变量t
{
while(--t); //循环t次(等待t个机器周期)
}
void led_show(unsigned int u,unsigned int v) //定义led_show函数,参数为无符号整型变量u和无符号整型变量v
{
unsigned char i; //定义i为无符号字符型变量
i=u%10; //i等于u除以10的余数
P1=led_seg_code[i]; //P1输出led_seg_code[i]
P3=0xef; //P3的最低位变为0,其余位不变
delay(50); //延时50个机器周期
P3=0xff; //P3全部位变为1
i=u%100/10; //i等于u除以10的结果的余数
P1=led_seg_code[i]; //P1输出led_seg_code[i]
P3=0xdf; //P3的第二位变为0,其余位不变
delay(50); //延时50个机器周期
P3=0xff; //P3全部位变为1
i=v%10; //i等于v除以10的余数
P2=led_seg_code[i]; //P2输出led_seg_code[i]
P3=0xbf; //P3的第三位变为0,其余位不变
delay(50); //延时50个机器周期
P3=0xff; //P3全部位变为1
i=v%100/10; //i等于v除以10的结果的余数
P2=led_seg_code[i]; //P2输出led_seg_code[i]
P3=0x7f; //P3的最高位变为0,其余位不变
delay(50); //延时50个机器周期
P3=0xff; //P3全部位变为1
}
void timer1() interrupt 3 //定时器1中断服务程序
{
T1_cnt++; //T1_cnt自加
if(T1_cnt>3999) //如果T1_cnt大于3999
{
T1_cnt=0; //T1_cnt清零
if(cnt_sn!=0) //如果cnt_sn不等于0
{
cnt_sn--; //cnt_sn自减
}
else //否则
{
state_val_sn++; //state_val_sn自加
if(state_val_sn>2)state_val_sn=0; //如果state_val_sn大于2,则state_val_sn等于0
cnt_sn=init_sn[state_val_sn]; //cnt_sn等于init_sn[state_val_sn]
if(state_val_sn==0) //如果state_val_sn等于0
{
SN_green=0; //SN_green等于0
SN_yellow=1; //SN_yellow等于1
SN_red=1; //SN_red等于1
}
else if(state_val_sn==1) //如果state_val_sn等于1
{
SN_green=1; //SN_green等于1
SN_yellow=0; //SN_yellow等于0
SN_red=1; //SN_red等于1
}
else if(state_val_sn==2) //如果state_val_sn等于2
{
SN_green=1; //SN_green等于1
SN_yellow=1; //SN_yellow等于1
SN_red=0; //SN_red等于0
}
}
if(cnt_ew!=0) //如果cnt_ew不等于0
{
cnt_ew--; //cnt_ew自减
}
else //否则
{
state_val_ew++; //state_val_ew自加
if(state_val_ew>2)state_val_ew=0; //如果state_val_ew大于2,则state_val_ew等于0
cnt_ew=init_ew[state_val_ew]; //cnt_ew等于init_ew[state_val_ew]
if(state_val_ew==0) //如果state_val_ew等于0
{
EW_green=1; //EW_green等于1
EW_yellow=1; //EW_yellow等于1
EW_red=0; //EW_red等于0
}
else if(state_val_ew==1) //如果state_val_ew等于1
{
EW_green=0; //EW_green等于0
EW_yellow=1; //EW_yellow等于1
EW_red=1; //EW_red等于1
}
else if(state_val_ew==2) //如果state_val_ew等于2
{
EW_green=1; //EW_green等于1
EW_yellow=0; //EW_yellow等于0
EW_red=1; //EW_red等于1
}
}
}
}
void button1() interrupt 0 //外部中断0服务程序
{
cnt_sn=60; //cnt_sn等于60
cnt_ew=60; //cnt_ew等于60
SN_green=1; //SN_green等于1
SN_yellow=1; //SN_yellow等于1
SN_red=0; //SN_red等于0
EW_green=1; //EW_green等于1
EW_yellow=1; //EW_yellow等于1
EW_red=0; //EW_red等于0
}
main() //主函数
{
cnt_sn=init_sn[0]; //cnt_sn等于init_sn[0]
cnt_ew=init_ew[0]; //cnt_ew等于init_ew[0]
T1_cnt=0; //T1_cnt清零
state_val_sn=0; //state_val_sn等于0
state_val_ew=0; //state_val_ew等于0
SN_green=0; //SN_green等于0
SN_yellow=1; //SN_yellow等于1
SN_red=1; //SN_red等于1
EW_green=1; //EW_green等于1
EW_yellow=1; //EW_yellow等于1
EW_red=0; //EW_red等于0
TMOD=0x20; //TMOD等于0x20
TH1=0x19; //TH1等于0x19
TL1=0x19; //TL1等于0x19
EA=1; //打开总中断
ET1=1; //打开定时器1中断
TR1=1; //启动定时器1
IT1=1; //设置外部中断1为下降沿触发
EX1=1; //打开外部中断1
IT0=1; //设置外部中断0为下降沿触发
EX0=1; //打开外部中断0
while(1) //无限循环
{
delay(10); //延时10个机器周期
led_show(cnt_sn,cnt_ew); //调用led_show函数,显示cnt_sn和cnt_ew
}
}
阅读全文