基于89c51的交通燈
0.png (11.31 KB, 下載次數: 40)
下載附件
2018-6-21 05:42 上傳
單片機源程序如下:
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define ON 0
- #define OFF 1
-
- sbit g1=P1^0;
- sbit y1=P1^1;
- sbit l1=P1^2;
- sbit g2=P1^3;
- sbit y2=P1^4;
- sbit l2=P1^5;
- uchar num,num1,key,a,b,c,d;
- uint t0,t1; /*t0,t1,要大于255!!*/
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71,0};
- void init(); //初值函數
- void display(uchar a,uchar b,uchar c,uchar d); //顯示程序
- void Keyscan(); // 按鍵
- void delay (uint z) //延時函數
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void main()//主函數
- {
-
- init();
- while(1)
- {
- display(a,b,c,d);
- Keyscan();
- if(key) //如果有按鍵按下,
- {
- TR0=0;
- TR1=0; //不計時
- P0=table[9]; //顯示99
- P2=0; //全部顯示
- if(key==1) //東西方向
- {
- P1=0xde; //LED狀態
- }
- if(key==2) //南北方向
- {
- P1=0xf3; //LED狀態
- }
-
-
- }
- while(key)
- {
- Keyscan(); //等待按下正常
- }
-
-
- TR0=1;
- TR1=1;
- }
- }
- void Keyscan()
- {
- uchar temp;
- temp=P3;
- while(temp!=0xff)
- {
- delay(5); //延時,消抖
- temp=P3; //再次確認是否有健按下
- temp=temp&0xff;
- while(temp!=0xff)
- {
- temp=P3;
- switch(temp)
- {
- case 0xfe:key=1; //
- break;
- case 0xfd:key=2;
- break;
- case 0xfb:key=0;
- break;
- }
- while(temp!=0xff) //松手檢測
- {
- temp=P3;
- temp=temp&0xff;
- }
- }
- }
- }
- void init() //改初值函數
- {
- g1=ON;
- y1=OFF;
- l1=OFF;
- g2=OFF;
- y2=OFF;
- l2=ON;
- num=20;
- num1=23;
- a=num/10;
- b=num%10;
- c=num1/10;
- d=num1%10;
- TMOD=0x11;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- EA=1;
- ET0=1;
- ET1=1;
- TR0=1;
- TR1=1;
- }
- void timer0() interrupt 1 //定時器0中斷 控制東西時間
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- t0++;
- if(t0%20==0) //每一秒進入 一次
- {
- if(t0<=400) //綠燈 時間
- {
- num--;
- if(num==0) //綠燈結束,開黃燈
- {
- num=3;
- g1=OFF;
- y1=ON;
- l1=OFF;
- }
- }
- if(t0>400&&t0<=460) //黃燈時間
- {
- num--;
- if(num==0) //黃燈結束,開紅燈
- {
- num=23;
- g1=OFF;
- y1=OFF;
- l1=ON;
- }
- }
- if(t0>460&&t0<=920) //紅燈時間
- {
- num--;
- if(num==0) //紅燈結束,開綠燈
- {
- num=20;
- g1=ON;
- y1=OFF;
- l1=OFF;
- }
- if(t0==920)
- t0=0;
- }
- a=num/10;
- b=num%10;
- }
- }
- void timer1() interrupt 3 //定時器1中斷 控制南北時間
- {
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- t1++;
- if(t1%20==0)
- {
- if(t1<=460)
- {
- num1--;
- if(num1==0)
- {
- num1=20;
- g2=ON;
- y2=OFF;
- l2=OFF;
- }
- }
- if(t1>460&&t1<=860)
- {
- num1--;
- if(num1==0)
- {
- num1=3;
- g2=OFF;
- y2=ON;
- l2=OFF;
- }
- }
- if(t1>860&&t1<=920)
- {
- num1--;
- if(num1==0)
- {
- num1=23;
- g2=OFF;
- y2=OFF;
- l2=ON;
- }
- if(t1==920)
- t1=0;
- }
- c=num1/10;
- d=num1%10;
- }
- }
- /*void display(uchar a,uchar b,uchar c,uchar d) //顯示程序
- {
-
- P0=table[a];
- P2=1;
- delay(1);
- P2=255;
- P0=table[b];
- P2=2;
- delay(1);
- P2=255;
- P0=table[c];
- P2=4;
- delay(1);
- P2=255;
- P0=table[d];
- P2=8;
- delay(1);
- P2=255;
- }
- */
- void display(uchar a,uchar b,uchar c,uchar d) //顯示程序
- {
-
- P0=table[a];
- P2=0xfe;
- delay(1);
- P2=0xff;
- P0=table[b];
- P2=0xfd;
- delay(1);
- P2=0xff;
- P0=table[c];
- P2=0xfb;
- delay(1);
- P2=0xff;
- P0=table[d];
- P2=0xf7;
- delay(1);
- P2=0xff;
- }
復制代碼
所有資料51hei提供下載:
王建寶.zip
(62.96 KB, 下載次數: 23)
2018-6-21 00:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|