该程序是基于使用STC89C52芯片下的51开发板
首先确认两种工作状态:
①南北方向红灯60s;东西方向绿灯57s,然后黄灯三秒。
②南北方向绿灯57秒,然后黄灯3秒;东西方向红灯60s。
这两种工作状态交替进行。
该程序是主要使用定时器中断来完成的,学好定时器中断就能轻松写出这个程序
给程序标了一些简单注释,有看不懂的地方可以评论区留言。
#include
#define uint unsigned int
#define uchar unsigned char
***it du=P2^6;
***it we=P2^7;
***it NS_r=P1^0;
***it NS_y=P1^1;
***it NS_g=P1^2;
***it EW_r=P1^4;
***it EW_y=P1^5;
***it EW_g=P1^6;
uint i=60,j=57;
uchar k;
uchar code SMGdu[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
uchar code SMGwe[]={0xfe,0xfd,0xef,0xdf};
void time0() //定时计数器0初始化
{
EA=1;
ET0=1; //配置定时器0中断
TR0=1;
TMOD=0x01;
TH0=0xed; //定时5ms
TL0=0xff;
}
void display() //扫描数码管
{
uint n1,n2,e1,e2;//NS,EW方向数码管
n1=i/10;
n2=i%10;
e1=j/10;
e2=j%10;
we = 1;//打开位选锁存器
P0 = SMGwe[k%4];
we = 0;//锁存位选数据
switch(k%4)
{
case 0:du=1;P0=SMGdu[e1];du=0;break;
case 1:du=1;P0=SMGdu[e2];du=0;break;
case 2:du=1;P0=SMGdu[n1];du=0;break;
case 3:du=1;P0=SMGdu[n2];du=0;break;
}
}
void main()
{
time0();
NS_r=0; //初始化南北方向红灯,东西方向绿灯
EW_g=0;
while(1)//两个阶段 1.南北方向红60s;东西方向绿57s,黄3s
{ //2.东西方向红60s;南北方向绿57s,黄3s
if(j==0&&i==3)
{
EW_g=1;
EW_y=0;
j=3;
}
if(i==0&&EW_y==0)
{
NS_r=1;
NS_g=0;
EW_y=1;
EW_r=0;
i=57;
j=60;
}
if(i==0&&j==3)
{
NS_g=1;
NS_y=0;
i=3;
}
if(i==0&&NS_y==0)
{
NS_y=1;
NS_r=0;
EW_r=1;
EW_g=0;
i=60;
j=57;
}
}
{
TH0=0xed; //定时5ms
TL0=0xff;
k++;
if(k==200)
{
i–;
j–;
k=0;
}
display();
}
该程序是基于使用STC89C52芯片下的51开发板
首先确认两种工作状态:
①南北方向红灯60s;东西方向绿灯57s,然后黄灯三秒。
②南北方向绿灯57秒,然后黄灯3秒;东西方向红灯60s。
这两种工作状态交替进行。
该程序是主要使用定时器中断来完成的,学好定时器中断就能轻松写出这个程序
给程序标了一些简单注释,有看不懂的地方可以评论区留言。
#include
#define uint unsigned int
#define uchar unsigned char
***it du=P2^6;
***it we=P2^7;
***it NS_r=P1^0;
***it NS_y=P1^1;
***it NS_g=P1^2;
***it EW_r=P1^4;
***it EW_y=P1^5;
***it EW_g=P1^6;
uint i=60,j=57;
uchar k;
uchar code SMGdu[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
uchar code SMGwe[]={0xfe,0xfd,0xef,0xdf};
void time0() //定时计数器0初始化
{
EA=1;
ET0=1; //配置定时器0中断
TR0=1;
TMOD=0x01;
TH0=0xed; //定时5ms
TL0=0xff;
}
void display() //扫描数码管
{
uint n1,n2,e1,e2;//NS,EW方向数码管
n1=i/10;
n2=i%10;
e1=j/10;
e2=j%10;
we = 1;//打开位选锁存器
P0 = SMGwe[k%4];
we = 0;//锁存位选数据
switch(k%4)
{
case 0:du=1;P0=SMGdu[e1];du=0;break;
case 1:du=1;P0=SMGdu[e2];du=0;break;
case 2:du=1;P0=SMGdu[n1];du=0;break;
case 3:du=1;P0=SMGdu[n2];du=0;break;
}
}
void main()
{
time0();
NS_r=0; //初始化南北方向红灯,东西方向绿灯
EW_g=0;
while(1)//两个阶段 1.南北方向红60s;东西方向绿57s,黄3s
{ //2.东西方向红60s;南北方向绿57s,黄3s
if(j==0&&i==3)
{
EW_g=1;
EW_y=0;
j=3;
}
if(i==0&&EW_y==0)
{
NS_r=1;
NS_g=0;
EW_y=1;
EW_r=0;
i=57;
j=60;
}
if(i==0&&j==3)
{
NS_g=1;
NS_y=0;
i=3;
}
if(i==0&&NS_y==0)
{
NS_y=1;
NS_r=0;
EW_r=1;
EW_g=0;
i=60;
j=57;
}
}
{
TH0=0xed; //定时5ms
TL0=0xff;
k++;
if(k==200)
{
i–;
j–;
k=0;
}
display();
}
举报