智能交通燈,顯示時間可以通過矩陣開關輸入調節
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1.png (54.96 KB, 下載次數: 25)
下載附件
2022-12-30 21:35 上傳
單片機源程序如下:
- #include<reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit dula=P2^5;
- sbit w1=P2^0;
- sbit w2=P2^1;
- sbit k1=P2^2;
- sbit k2=P2^3;
- sbit k3=P2^4;
- sbit red1=P1^0;
- sbit yellow1=P1^1;
- sbit green1=P1^2;
- sbit red2=P1^3;
- sbit yellow2=P1^4;
- sbit green2=P1^5;
- uchar N=23; //定義時間為20s,可自由更改為0-99;
- uchar miao;
- bit flag=0;
- bit flag1=0;
- unsigned int pp;
- uchar j,k;
- uchar a=0,b=0;
- uchar nn=0;
- uchar q=0;
- unsigned char keyvalue=0,m=0;
- unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
- 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
- void delay(unsigned char i)
- {
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
- void display(uchar n)
- {
- uchar c,d;
- c=n/10;
- d=n%10;
- P0=0x00;
- dula=0;
- P0=table[c];
- dula=1;
- w1=0,w2=1;
- delay(5);
- P0=0x00;
- dula=0;
- P0=table[d];
- dula=1;
- w2=0,w1=1;
- delay(5);
- }
- void scankeys()
- {
- if(k1==0) //
- {
- delay(5);
- if(k1==0)
- {
- TR0=1;
- pp=0;
- miao=N;
- }
- while(!k1);
- }
- if(k2==0) //
- {
- delay(5);
- if(k2==0)
- {
- TR0=0;
- pp=0;
- miao=N;
- }
- while(!k2);
- }
- if(k3==0) //
- {
- delay(5);
- if(k3==0)
- {
- flag1=!flag1;
- }
- while(!k3);
- if(flag1==0)
- {
- TR0=1;
- pp=0;
- miao=N;
- }
- if(flag1==1)
- {
- a=b=N=0;
- }
- }
- }
- void KeyScan() //帶返回值的子函數
- {
-
- P3 = 0xf0;
- if( P3 != 0xf0)//判斷是否有按鍵按下
- {
- delay(5);//軟件消抖
- if( P3!= 0xf0)//判斷是否有按鍵按下
- { switch(P3)
- { case 0xe0:keyvalue=0,flag=1;break;
- case 0xd0:keyvalue=1,flag=1;break;
- case 0xb0:keyvalue=2,flag=1;break;
- case 0x70:keyvalue=3,flag=1;break;
- }
- P3=0x0f;
- switch(P3)
- { case 0x0e:keyvalue=keyvalue+0,flag=1;break;
- case 0x0d:keyvalue=keyvalue+4,flag=1;break;
- case 0x0b:keyvalue=keyvalue+8,flag=1;break;
- case 0x07:keyvalue=keyvalue+12,flag=1;break;
- }
-
- while(P3!=0x0f);
- q++;
- }
- }
- }
- void change() //按鍵解碼
- {
- switch(keyvalue)
- {
- case 0:m=1;break;
- case 1:m=2;break;
- case 2:m=3;break;
-
- case 4:m=4;break;
- case 5:m=5;break;
- case 6:m=6;break;
- case 8:m=7;break;
- case 9:m=8;break;
- case 10:m=9;break;
- case 13:m=0;break;
-
- }
- }
- void main()
- {
- TMOD=0x01;
- TH0=(65536-46080)/256;// 由于晶振為11.0592,故所記次數應為46080,計時器每隔50000微秒發起一次中斷。
- TL0=(65536-46080)%256;//46080的來歷,為50000*11.0592/12
- ET0=1; // 開定時器0中斷
- TR0=0;
- EA=1;
- miao=N;
- while(1)
- {
- if(flag1==0)
- {
- if(miao>3)
- {
- if(flag==0)
- {
- red1=1,yellow1=1,green1=0;
- red2=0,yellow2=1,green2=1;
-
- }
- if(flag==1)
- {
- red1=0,yellow1=1,green1=1;
- red2=1,yellow2=1,green2=0;
-
- }
-
- }
- else {
- if(flag==0)
- {
- if(pp==10)
- yellow1=0,green1=1;
-
- }
- if(flag==1)
- {
- if(pp==10)
- yellow2=0,green2=1;
-
- }
-
- }
- display(miao);
-
- }
- else
- {
- red1=1,yellow1=1,green1=1;
- red2=1,yellow2=1,green2=1;
- KeyScan();
- change();
- if(q==1)
- a=m;
- if(q==2)
- b=m,q=0;
- N=a*10+b;
- display(N);
- }
- scankeys();
-
- }
- }
- void time0() interrupt 1
- { TH0=(65536-46080)/256;// 由于晶振為11.0592,故所記次數應為46080,計時器每隔50000微秒發起一次中斷。
- TL0=(65536-46080)%256;//46080的來歷,為50000*11.0592/12
- pp++;
- if(pp==20)
- {
- pp=0;
- if(miao>0)
- miao--;
- else
- {
- miao=N;
- flag=!flag;
-
- }
- }
- }
復制代碼
Keil代碼與Proteus仿真下載:
交通燈矩陣按鍵共陰數碼管.zip
(107.86 KB, 下載次數: 24)
2022-12-30 20:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|