```#include"reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit k3=P3^2;
sbit k4=P3^3;
sbit LSA=P2^2//定义位选;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit red1=P2^0;//东西红
sbit green1=P2^1;//东西绿
sbit red2=P2^5;//南北红
sbit green2=P2^6;//南北绿
sbit yellow=P2^7;//黄灯
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管显示
u8 ssec=0,sec=0;
u8 DisplayData[2];
u8 ssec007=0,sec007=0;
void delay(u16 i)//延时函数
{
while(i--);
}
void delay1s()//延时1s函数
{
unsigned char a,b,c;
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=70;a>0;a--);
}
void DigDisplay()//数码管动态显示
{
u8 i;
for(i=0;i<2;i++)
{
switch(i)
{
case(0):LSA=0;LSB=0;LSC=0;break;//第八位
case(1):LSA=1;LSB=0;LSC=0;break;//第七位
}
P0=DisplayData[i];//显示
delay(100);//延时
P0=0x00;//消隐
}
}
void Timer0Init()//初始化
{
TMOD|=0x01;//定时器
TH0=0xd8;//赋初值
TL0=0xf0; //d8f0是55536
ET0=1;//打开定时器
TR0=1;//允许工作
EA=1;//总中断
}
void Timer()interrupt 1//定时器
{
TH0=0xd8;
TL0=0xf0;//55536
ssec++;
if(ssec>=100)//一秒
{
ssec=0;
sec++;
if(sec>=0&&sec<=20)
{
red1=0;
green1=1;
red2=1;
green2=0;
yellow=1;//状态1
}
if(sec>=21&&sec<=24)
{
red1=0;
green1=1;
red2=1;
green2=1;
yellow=0;//状态2
}
if(sec>=25&&sec<=45)
{
red1=1;green1=0;
red2=0;green2=1;
yellow=1;//状态3
}
if(sec>=46&&sec<=49)
{
red1=1;
green1=1;
red2=0;
green2=1;
yellow=0;//状态4
}
if(sec>49)
{
sec=0;//大于49重新开始
}
}
}
void datapros()//数码管显示
{
if(sec>=0&&sec<=20)//状态1数码管显示
{
DisplayData[0]=smgduan[(20-sec)%10];
DisplayData[1]=smgduan[(20-sec)/10];
}
if(sec>=21&&sec<=24)//状态2数码管显示
{
DisplayData[0]=smgduan[(24-sec)%10];
DisplayData[1]=smgduan[(24-sec)/10];
}
if(sec>=25&&sec<=45)//状态3 数码管显示
{
DisplayData[0]=smgduan[(45-sec)%10];
DisplayData[1]=smgduan[(45-sec)/10];
}
if(sec>=46&&sec<=49)//状态4数码管显示
{
DisplayData[0]=smgduan[(49-sec)%10];
DisplayData[1]=smgduan[(49-sec)/10];
}
}
void Int0Init()
{
IT0=1;//中断触发方式下降沿
EX0=1;//打开中断
EA=1; //打开总中断
}
void main()
{
Timer0Init();//调用初始化函数
while(1)
{
datapros(); //数码管显示
DigDisplay();//显示为
Int0Init(); //打开中断
}
}
void Int0() interrupt 0 //中断函数
{
u16 da,h=0,xiao;
u16 sec007=0;
Int0Init();
delay(100);
for (da=0;da<60;da++)//通过延时的循环和语句的循环达到接近60秒的时间
{
red1=0;
red2=1;
yellow=1;
green1=1;
green2=0;
delay(800);
if(sec007>=0&&sec007<=60)//数码管显示
{
DisplayData[0]=smgduan[(60-sec007)%10];
DisplayData[1]=smgduan[(60-sec007)/10];
}
sec007++;
ssec007++;
delay(750);
for(h=0;h<250;h++)
{
for(xiao=0;xiao<2;xiao++)
{
switch(xiao)
{
case(0):LSA=0;LSB=0;LSC=0;break;
case(1):LSA=1;LSB=0;LSC=0;break;
}
P0=DisplayData[xiao];
delay(250);
P0=0x00;
}
}
}
IT0=0;//关闭中断
EX0=0;//关闭总中断
}
普中A2开发版:最开始出现好多错误,最先自己发现数码管和LED灯不能同时使用,经过多方求证和探索,确实LED灯和数码管显示的位选不能同时使用,虽然单片机具有分时复用的特性,但是数码管显示和LED灯是同时工作,因为你红绿灯的工作的同时数码管还需要计时,黄灯是一个
普中A2开发板红绿灯实验
猜你喜欢
转载自blog.csdn.net/weixin_45367509/article/details/103481113
今日推荐
周排行