```#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開發板紅綠燈實驗
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.