可以用变量计数的方式啊,我技术不咋地,但是我写过几个交通灯,给你一个switch流的程序做参考吧(用keil咯)
/*********************************************************
-------------------------------------------------------
** 编写人:Flynn 文件名:交通灯.c
** 描述:带倒计时的交通灯
******************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define w_xuan P2 //宏定义P2口为w_xuan,表示位选
sbit dx_red= P3^0; //定义交通指示灯P3.0-P3.5
sbit dx_yellow=P3^1;
sbit dx_green=P3^2;
sbit nb_red=P3^3;
sbit nb_yellow =P3^4;
sbit nb_green=P3^5;
sbit key1=P1^0; //定义按键,满足紧急情况的指挥
sbit key2=P1^1;
sbit key3=P1^2;
/***********************
延时程序:delay()
功能:用于延时
***********************/
void delay(uint dly)
{
uint i,j;
for(i=dly;i>0;i--)
for(j=250;j>0;j--);
}
uint b=28,c=25,ten1,one1,ten2,one2,temp1=0,temp2=0;
uchar code a[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uint deng,xianshi,jishu;
/***********************
显示函数:disp()
功能:用于显示倒计时
***********************/
void disp(uint shi1,uint ge1,uint shi2,uint ge2)
{
ten1=b/10;
one1=b%10;
ten2=c/10;
one2=c%10;
w_xuan=0xff;
P0=a[ge1];
w_xuan=0xfe;
delay(2);
w_xuan=0xff;
P0=a[shi1];
w_xuan=0xfd;
delay(2);
w_xuan=0xff;
P0=a[ge2];
w_xuan=0xef;
delay(2);
w_xuan=0xff;
P0=a[shi2];
w_xuan=0xdf;
delay(2);
}
/***********************
按键函数:anjian()
功能:用于紧急情况的处理
***********************/
void anjian(void)
{
if(!key1)
{
delay(10);
while(!key1)
{
EA=0;
nb_red=0;
dx_red=0;
nb_green=1;
dx_green=1;
nb_yellow=1;
dx_yellow=1;
}
}
if(!key2)
{
delay(10);
while(!key2)
{
EA=0;
nb_red=0;
dx_red=1;
nb_green=1;
dx_green=0;
nb_yellow=1;
dx_yellow=1;
}
}
if(!key3)
{
delay(10);
while(!key3)
{
EA=0;
nb_red=1;
dx_red=0;
nb_green=0;
dx_green=1;
nb_yellow=1;
dx_yellow=1;
}
}
EA=1;
}
/***********************
初值函数:shuma_dis(void)
功能:用于给数码管倒计时赋初值
***********************/
void shuma_dis(void)
{
if(xianshi>=200)
{
xianshi=0;
jishu++;
b--;
c--;
if(b==0)
{
temp1=temp1+1;
if(temp1==3)
temp1=0;
switch(temp1)
{
case 0:b=28;break;
case 1:b=25;break;
case 2:b=3;break;
}
}
if(c==0)
{ temp2=temp2+1;
if(temp2==3)
temp2=0;
switch(temp2)
{
case 0:c=25;break;
case 1:c=3;break;
case 2:c=28;break;
}
}
}
}
/***********************
交通灯指示函数:j_t_deng(void)
功能:用于处理交通灯的四种状态
***********************/
void j_t_deng(void)
{
switch(deng)
{
case 0: dx_red=0;
nb_green=0;
dx_green=1;
nb_red=1;
dx_yellow=1;
break;
case 1: dx_green=1;
nb_green=1;
nb_yellow=0;
nb_red=1;
dx_red=0;
break;
case 2: dx_red=1;
dx_green=0;
nb_yellow=1;
nb_red=0;
nb_green=1;
break;
case 3: nb_red=0;
dx_green=1;
dx_yellow=0;
nb_green=1;
dx_red=1;
break;
}
switch(jishu)
{
case 25:deng=1;break;
case 28:deng=2;break;
case 53:deng=3;break;
case 56:deng=0;jishu=0;break;
}
}
/***********************
初始化函数:ini()
功能:用于初始化定时器
***********************/
void ini(void)
{
TMOD=0X01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
EA=1;
ET0=1;
TR0=1;
}
/***********************
主函数
***********************/
main()
{
ini();//初始化函数
while(1)
{
anjian();
disp(ten1,one1,ten2,one2);
shuma_dis();
j_t_deng();
}
}
void shijian() interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
xianshi++;
}