|
交通燈,僅供參考!
交通燈仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (16.02 KB, 下載次數(shù): 34)
下載附件
2017-11-9 03:35 上傳
0.png (7.68 KB, 下載次數(shù): 66)
下載附件
2017-11-9 03:35 上傳
0.png (45.13 KB, 下載次數(shù): 41)
下載附件
2017-11-9 03:35 上傳
單片機(jī)源程序如下:
- #include <reg52.h>
- bit red,green,yellow,turnred; //定義紅、黃、綠及轉(zhuǎn)紅標(biāo)志
- code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f}; //共陰極數(shù)碼管碼表
- #define LIGHT P0
- #define SEG P1
- #define BITR P2
- unsigned char Dis_Shiwei;//定義十位
- unsigned char Dis_Gewei; //定義個(gè)位
- unsigned char second,count=0; //初值60
- #define uchar unsigned char
- #define uint unsigned int
- sbit add=P3^3; //定義東西綠燈時(shí)間加按鍵
- sbit sub=P3^4; //定義東西綠燈時(shí)間減按鍵
- sbit K1=P3^1; //定義設(shè)定時(shí)間按鍵
- sbit add2=P3^5; //定義調(diào)南北綠燈時(shí)間加按鍵
- sbit sub2=P3^6; //定義調(diào)南北綠燈時(shí)間減按鍵
- unsigned char timeDX=13,timeNB=15; //定義東西和南北綠燈亮?xí)r可調(diào)變量并賦予初值2S
- void delay(unsigned int cnt) //用于動(dòng)態(tài)掃描數(shù)碼管的延時(shí)程序
- {
- while(--cnt);
- }
- /*********************************延時(shí)子程序*************************************/
- void DelayMS(unsigned int x) //延時(shí)ms
- {
- unsigned char t;
- while(x--)
- {
- for(t=120;t>0;t--);
- }
- }
- void key_scan( )
- {
- uchar s1num=0; //s1num記錄光標(biāo)的位置的編號(hào)
-
- if(K1==0)
- {
- DelayMS(5);
- if(K1==0)
- {
- while(!K1); //menum測(cè)試到由0到1的變化,也就是按下松開(kāi)的變化,s1num加1
- s1num++;
- while(1)
- {
- if(K1==0)
- {
- DelayMS(5);
- if(K1==0)
- {
- while(!K1);
- s1num++; //menum測(cè)試到由0到1的變化,也就是按下松開(kāi)的變化,s1num再加1
- }
- }
-
-
- if(s1num==1)
- {
-
-
- while(add==0) //如果第一個(gè)按鍵按下東西方向綠燈延續(xù)時(shí)間加1秒
- {
- DelayMS(10);
- while(add==0);
- timeDX++;
- if(timeDX>60) //當(dāng)時(shí)間超過(guò)60秒將時(shí)間置為60秒
- {timeDX=0;}
- Dis_Shiwei=tab[timeDX/10];//十位顯示值處理
- Dis_Gewei=tab[timeDX%10]; //個(gè)位顯示處理
- }
- while(sub==0) //如果第二個(gè)按鍵按下東西方向綠燈延續(xù)時(shí)間減1秒
- {
- DelayMS(10);
- while(sub==0);
- timeDX--;
- if(timeDX<=0) //當(dāng)時(shí)間減到小于或等于0時(shí)將時(shí)間置為1秒
- {timeDX=60;}
- Dis_Shiwei=tab[timeDX/10];//十位顯示值處理
- Dis_Gewei=tab[timeDX%10]; //個(gè)位顯示處理
- }
- while(add2==0) //如果第三個(gè)按鍵按下南北方向綠燈延續(xù)時(shí)間加1秒
- {
- DelayMS(10);
- while(add2==0);
- timeNB++;
- if(timeNB>60) //當(dāng)時(shí)間超過(guò)60秒將時(shí)間置為60秒
- {timeNB=0;}
- Dis_Shiwei=tab[timeNB/10];//十位顯示值處理
- Dis_Gewei=tab[timeNB%10]; //個(gè)位顯示處理
- }
- while(sub2==0) //如果第四個(gè)按鍵按下南北方向綠燈延續(xù)時(shí)間減1秒
- {
- DelayMS(10);
- while(sub2==0);
- timeNB--;
- if(timeNB<=0) //當(dāng)時(shí)間減到小于或等于0時(shí)將時(shí)間置為1秒
- {timeNB=60;}
- Dis_Shiwei=tab[timeNB/10];//十位顯示值處理
- Dis_Gewei=tab[timeNB%10]; //個(gè)位顯示處理
- }
- }
- if(s1num==2)
- {
- s1num=0;//s1num清零//
- break;
- }
- }
- }
- }
- }
- void LINGHTLED( )
- {
- if (count==100)
- {
- count=0;
- second--;//秒減1
- if(second==0)
- { //這里添加定時(shí)到0的代碼 ,可以是燈電路,繼電器吸合等,或者執(zhí)行一個(gè)程序
- if(red) //紅滅,先轉(zhuǎn)黃
- {
- red=0;
- yellow=1;
- second=4;
- LIGHT=0xdd;//黃燈亮4秒,黃燈為過(guò)渡燈,再根據(jù)情況轉(zhuǎn)綠或轉(zhuǎn)紅
- while(K1==0);
- }
- else if(yellow && !turnred)
- {
- yellow=0;
- green=1;
- second=timeDX;
- LIGHT=0xf3;//綠燈亮25秒,
- while(K1==0);
- }
- else if(green)
- {
- yellow=1;
- green=0;
- second=4;
- LIGHT=0xeb;//黃燈亮4秒
- while(K1==0);
- turnred=1;
- }
- else if(yellow && turnred) //綠燈滅,轉(zhuǎn)黃燈,后紅燈,turnred=1時(shí)
- {
- red=1;
- yellow=0;
- LIGHT=0xde;//紅燈亮60秒
- while(K1==0);
- second=timeNB;
- turnred=0; //接下來(lái)是轉(zhuǎn)黃,綠。
- }
- }
- }
- Dis_Shiwei=tab[second/10];//十位顯示值處理
- Dis_Gewei=tab[second%10]; //個(gè)位顯示處理
- }
- void inti( )
- {
- TMOD |=0x11;//定時(shí)器設(shè)置 10ms in 12M crystal定時(shí)器0,工作方式1,16位定時(shí)器
- TH0=0xd8; //65535-10000=55535=D8F0(十六進(jìn)制)
- TL0=0xf0;
- IE= 0x8A; //中斷控制,EA=1開(kāi)總中斷,ET0=1:定時(shí)器0中斷允許
- IP=0x02;
- TR0=1; //開(kāi)定時(shí)器0中斷
- TR1=1; //開(kāi)定時(shí)器0中斷
- }
- void main()
- {
-
- inti( );
- LIGHT=0xde;//紅燈亮,根據(jù)紅黃綠接燈的順序。
- red =1;
- second=timeDX;
- while(1)
- {
- key_scan();//鍵盤(pán)掃描程序
-
- LINGHTLED( );
- }
- }
- /********************************/
- /* 定時(shí)中斷 */
- /********************************/
- void tim(void) interrupt 1
- {
- TH0=(65536-10000)/256;//重新賦值,10毫秒定時(shí)
- TL0=(65536-10000)%256;;
- count++;
- }
- /********************************/
- /* 定時(shí)中斷 */
- /********************************/
- void tim2(void) interrupt 3
- {
- TR1=0;
- TH1=(65536-5000)/256;//重新賦值,5毫秒定時(shí)
- TL1=(65536-5000)%256;;
-
- BITR=0xfE;
- SEG=Dis_Shiwei;//顯示十位,這里實(shí)現(xiàn)用8位數(shù)碼管,即左1位
- delay(30);//短暫延時(shí)
- BITR=0XfD;
- SEG=Dis_Gewei; //顯示個(gè)位,左數(shù),2位
- delay(30);
- TR1=1;
- …………
- …………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
交通燈.rar
(53.16 KB, 下載次數(shù): 49)
2017-11-8 19:03 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|