#include "reg51.h"
sbit smg1=P1^6; //数码管十位的位选端
sbit smg0=P1^7; //数码管个位的位选端
sbit EW_R_Lamp=P1^5;
sbit EW_Y_Lamp=P1^4;
sbit EW_G_Lamp=P1^3;
sbit SN_R_Lamp=P1^2;
sbit SN_Y_Lamp=P1^1;
sbit SN_G_Lamp=P1^0;
#define uchar unsigned char
#define uint unsigned int
#define EW_R_Lamp_ON EW_R_Lamp=1 //东西红灯亮
#define EW_R_Lamp_OFF EW_R_Lamp=0
#define EW_Y_Lamp_ON EW_Y_Lamp=1 //东西黄灯亮
#define EW_Y_Lamp_OFF EW_Y_Lamp=0
#define EW_G_Lamp_ON EW_G_Lamp=1 //东西绿灯亮
#define EW_G_Lamp_OFF EW_G_Lamp=0
#define SN_R_Lamp_ON SN_R_Lamp=1
#define SN_R_Lamp_OFF SN_R_Lamp=0
#define SN_Y_Lamp_ON SN_Y_Lamp=1
#define SN_Y_Lamp_OFF SN_Y_Lamp=0
#define SN_G_Lamp_ON SN_G_Lamp=1
#define SN_G_Lamp_OFF SN_G_Lamp=0
uchar smg_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段选
uchar kk,aa;
void smg_display(uchar n) //数码管显示程序
{
uchar i,j;
i=n/10; //显示数字的十位
j=n%10; //显示数字的个位
smg1=1;
P0=smg_duan[i];
smg0=1;
P1=smg_duan[j];
}
void delay_50us(uint t) //延时50us
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void EW_G_Lamp_SS() //东西绿灯闪烁
{
EW_G_Lamp_ON;
delay_50us(200);
EW_G_Lamp_OFF;
delay_50us(200);
}
void SN_G_Lamp_SS()
{
SN_G_Lamp_ON;
delay_50us(200);
SN_G_Lamp_OFF;
delay_50us(200);
}
void init() //初始化
{
EA=1; //开总中断开关
EX0=1; //打开外部中断0中断允许开关
IT0=0; //设置外部中断0的触发方式为低电平触发
TMOD=0x01; //设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //赋初值
ET0=1; //打开定时器中断0
TR0=0; //先不启动定时器
}
void main()
{
init();
EW_R_Lamp_OFF;
EW_Y_Lamp_OFF;
EW_G_Lamp_OFF;
SN_R_Lamp_OFF;
SN_Y_Lamp_OFF;
SN_G_Lamp_OFF;
while(1); //等待外部中断触发
}
void int0() interrupt 0
{
/*进入中断,开始计时*/
TR0=1;
/*南北红灯维持25S,在南北红灯亮的同时东西绿灯也亮,并维
持20S,到20S时,东西绿灯闪烁,闪烁3S后熄灭。在东西绿灯熄灭
时,东西黄灯亮,并维持2S。2S到后,东西黄灯熄,东西红灯亮。
同时,南北红灯熄灭,南北绿灯亮。*/
if(aa<25)
{
smg_display(aa);
SN_R_Lamp_ON;
if(aa<20)
EW_G_Lamp_ON;
else if(aa<23)
EW_G_Lamp_SS();
else
{
EW_G_Lamp_OFF;
EW_Y_Lamp_ON;
}
}
/*3)东西红灯维持30S,南北绿灯维持25S,然后闪烁3S,熄灭,同时
南北黄灯亮,维持2S后熄灭,这时南北红灯亮,东西绿灯亮。*/
else if(aa<55)
{
smg_display(aa-25);
EW_Y_Lamp_OFF;
EW_R_Lamp_ON;
SN_R_Lamp_OFF;
if(aa<50)
SN_G_Lamp_ON;
else if(aa<53)
SN_G_Lamp_SS();
else
{
SN_G_Lamp_OFF;
SN_Y_Lamp_ON;
}
}
else
aa=0;//当aa大于或等于55时,清零
}
void
timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //赋初值
kk++;
if(kk>=20)//kk每50ms加一,则aa每1S加一
{
kk=0;
aa++;
}
}
-
第二你的问题太模糊了!是让网友帮你全看一遍吗?
一周热门 更多>