|
代码如下
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//数码管共阳极/*0,1,2,3,4,5,6,7,8,9,A,b,C,*/
uchar code SEG7[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//数码管位码
sbit q1=P3^0;
sbit q2=P3^1;
sbit q3=P3^4;
sbit q4=P3^5;
//红绿黄灯端口定义--------东西红灯
sbit hong=P2^0;
//红绿黄灯端口定义--------东西黄灯
sbit huang=P2^1;
//红绿黄灯端口定义--------东西绿灯
sbit lv=P2^2;
//红绿黄灯端口定义--------南北红灯
sbit hong1=P2^3;
//红绿黄灯端口定义--------南北黄灯
sbit huang1=P2^4;
//红绿黄灯端口定义--------南北绿灯
sbit lv1=P2^5;
//定义变量------倒计时变量
uint t1=15;
//定义变量------南北延时时间
uint time=15;
uint time1=15;
//定义变量------定时器计时变量
uint jishu1=0;
//定义变量------执行步骤标志位
uchar bz=0;
//定义变量------运行标志
uchar yunxing=1;
//定义变量------显示倒计时时间变量
uint jishu3=0;
//延时函数ms
void _delay_ms(uint i)
{
uchar j;
for(;i>0;i--)
{
for(j=0;j<120;j++);
}
}
//显示倒计时函数-----倒计时秒显示
void dispaly()
{
//显示倒计时十位--东西
P1=SEG7[t1%100/10];q1=1;_delay_ms(2);q1=0;
//显示倒计时个位--东西
P1=SEG7[t1%10];q2=1;_delay_ms(2);q2=0;
//显示倒计时十位--南北
P1=SEG7[t1%100/10];q3=1;_delay_ms(2);q3=0;
//显示倒计时个位--南北
P1=SEG7[t1%10];q4=1;_delay_ms(2);q4=0;
}
//主函数
void main()
{ //-------定时器0配置
TMOD=0x01; //方式1
//使能定时器0
ET0=1;
//定时器的初值
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
//停止开启定时器0
TR0=1;
//使能中断
EA=1;
while(1)
{
//显示交通灯运行
if(yunxing==1)
{
dispaly();
//东西红灭 黄灭 绿亮
//南北红亮 黄灭 绿灭
if(bz==0)
{
hong=1; huang=1; lv=0;
hong1=0;huang1=1;lv1=1;
if(t1==0){bz=1;t1=3;}
}
//东西红灭 黄闪 绿灭
//南北红亮 黄灭 绿灭
if(bz==1)
{
if(jishu1<10){hong=1; huang=0; lv=1;}
if(jishu1>10){hong=1; huang=1; lv=1;}
hong1=0; huang1=1;lv1=1;
if(t1==0){bz=2; t1=time1; }
}
//东西红亮 黄灭 绿灭
//南北红灭 黄灭 绿亮
if(bz==2)
{
hong=0; huang=1;lv=1;
hong1=1; huang1=1;lv1=0;
if(t1==3){bz=3;t1=3;}
}
//东西红亮 黄灭 绿灭
//南北红灭 黄闪 绿灭
if(bz==3)
{
hong=0;huang=1;lv=1;
if(jishu1<10){hong1=1; huang1=0;lv1=1;}
if(jishu1>10){hong1=1; huang1=1;lv1=1;}
if(t1==0){bz=0; t1=time1; }
}
}
}
}
//定时器0中断服务函数用于倒计时变量减去1--到达1s后倒计时减去1
void Time0() interrupt 1
{
//重装初值50ms;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
//时间缓冲+1;
jishu1=jishu1+1;
if(jishu1>19)
{jishu1=0;if(t1>0)t1=t1-1;}
}
|
|