这个程序符合你的要求,实现三十秒倒计时,并有数码管显示。proteus文件你得留个邮箱,我给你发过去,贴到这上面你应该看不清。qq邮箱就行!
//名称代号:交通灯.C
//创建日期:2011.12.31
//创 建 人:郭晨阳
//模块功能:实现30S倒计时交通灯
//版本:
//参考文档:
//其他:
//修*改*历*史*
//**************************************
#include
#define Uchar unsigned char
#define Char char
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
Uchar t,flag=4;
Char sec=29;
Uchar code Table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//************************************
//函数名称:Delay
//创建日期:2011.12.31
//创 建 人:郭晨阳
//函数功能:延时
//输入参数:void
//输出参数:void
//返回值:void
//说明:
//修*改*历*史*
//************************************
void Delay(void)
{
Uchar i,j;
for(i=0;i<121;i++)
{
for(j=0;j<10;j++);
}
}
//************************************
//函数名称:Change
//创建日期:2011.12.31
//创 建 人:郭晨阳
//函数功能:实现红绿黄灯之间的切换
//输入参数:void
//输出参数:void
//返回值:void
//说明:
//修*改*历*史*
//***********************************
void Change(void)
{
if((sec>=5)&&(sec<30)&&(flag==4))//南北红灯,东西绿灯
{
P2_0=0;
P2_1=1;
P2_2=1;
flag=3;
}
if((sec>=0)&&(sec<5)&&(flag==3)) //东西南北均是黄灯
{
P2_1=0;
P2_0=1;
P2_2=1;
flag=2;
}
if((sec>=5)&&(sec<30)&&(flag==2))//南北绿灯,东西红灯
{
P2_2=0;
P2_0=1;
P2_1=1;
flag=1;
}
if((sec>=0)&&(sec<5)&&(flag==1)) //东西南北均是黄灯
{
P2_1=0;
P2_0=1;
P2_2=1;
flag=4;
}
}
//*************************************
//函数名称:main
//创建日期:2011.12.31
//创 建 人:郭晨阳
//函数功能:主函数,程序的入口
//输入参数:void
//输出参数:void
//返回值:void
//说明:
//修*改*历*史*
//*************************************
void main(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
P0=Table[sec/10];
P2_3=1;
Delay();
P2_3=0;
P0=Table[sec%10];
P2_4=1;
Delay();
P2_4=0;
}
}
//*************************************
//函数名称:timer0_intp
//创建日期:2011.12.31
//创 建 人:郭晨阳
//函数功能:中断服务
//输入参数:void
//输出参数:void
//返回值:void
//说明:
//修*改*历*史*
//*************************************
void timer0_inpt(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==20)
{
t=0;
sec--;
if(sec<0)
{
sec=29;
}
}
Change();
}