使用51單片機作為控制系統,內含源代碼和protues仿真,實現交通信號燈的模擬
51hei.png (42.2 KB, 下載次數: 78)
下載附件
2021-6-11 17:25 上傳
單片機源程序如下:
- /*****功能:以南北方向為主干道,東西方向為次干道。
- 1 實現主干道通行15秒,轉通行注意狀態,黃燈亮三秒。這段時間內次干道保持紅燈常亮(數碼管顯示時間)
- 2 次干道通行10秒轉通行注意狀態,黃燈亮兩秒。這段時間內主干道保持紅燈常亮 (數碼管顯示時間)
- 3 緊急按鍵按下,所有路口紅燈
- ******/
- /*******************************************調用頭文件宏定義******************************************/
- #include <reg51.h>
- #define D P1
- #define uchar unsigned char
- #define uint unsigned int
- /*******************************************函數聲明*****************************************/
- void z1(void);//南北通
- void z2(void);//南北注意
- void z3(void);//東西通
- void z4(void);//東西注意
- void gb(void); //全關
- void jinji(void);//緊急狀態,紅燈全亮
- void sm(void); //鍵盤掃描
- void plus(); //加一掃描
- void minus(); //見一掃描
- void plus2();
- void minus2();
- void timer(void);//定時器T1初始化
- void time1(void);//定義定時器T1中斷服務程序
- void display(void);//顯示函數
- void delay(uint a);//10ms延時函數
- /*************************************定義數組,全局變量***************************************/
- uint duan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9段碼數組
- uint y,gw,sw,gw2,sw2; //全局變量
- int time,s,times,time2,times2,time3;
- /*********************************定義12個小燈,數碼管,按鍵*********************************/
- /*************12個小燈*******************/ //數碼管// // 按鍵 //
- sbit d1=P2^0; sbit d2 =P2^1; sbit d3=P2^2; sbit w1=P0^0; sbit H1=P3^6; sbit H2=P3^7;
- sbit d4=P2^3; sbit d5 =P2^4; sbit d6=P2^5; sbit w2=P0^1; sbit key1=P0^5;
- sbit d7=P2^6; sbit d8 =P2^7; sbit d9=P3^2; sbit w3=P0^2; sbit key2=P0^6;
- sbit d10=P3^3; sbit d11=P3^4; sbit d12=P3^5; sbit w4=P0^3; sbit key3=P0^7;
- /*********************************************主函數**********************************************/
- void main(void)
- {
- times=18;
- time=15;
- time2=10;
- times2=12;
- y=0,s=0; //定時器溢出計數初始化
- //P1M1=0X00;
- //P1M0=0XFF;
- timer(); //啟動定時器T1
- while(1)
- {
- z1(); //主干道通行,綠燈15秒
- z2(); //主干道注意,黃燈3秒
- z3(); //次干道通行,綠燈10秒
- z4(); //次干道注意,黃燈2秒
- }
- }
- /******************不同狀態函數,定時器初始化,定時器中斷***********************/
- void z1(void)//南北通行,東西禁止
- {
- while(s<time)
- {
- sm();
- plus();
- minus();
- if(TR1==1)
- {
- //綠 /黃 /紅
- d4 =0;d5 =1;d6 =1;//北
- d10=0;d11=1;d12=1;//南
- d7 =1;d8 =1;d9 =0;//東
- d1 =1;d2 =1;d3 =0;//西
- }
- sw2=(time-s)/10; //數碼管十位(南北主干道)
- gw2=(time-s)%10; //數碼管個位
- sw=(times-s)/10;
- gw=(times-s)%10;
- display(); //顯示
- gb(); //關閉
- } s=0;//清零重置
- }
- void z2(void)//南北注意,東西禁止
- {
- time3=3;
- while(s<time3)
- {
- sm();
- if(TR1==1)
- {
- //綠 /黃 /紅
- d4 =1;d5 =0;d6 =1;//北
- d10=1;d11=0;d12=1;//南
- d7 =1;d8 =1;d9 =0;//東
- d1 =1;d2 =1;d3 =0;//西
- }
- sw2=(time3-s)/10; //數碼管十位(南北主干道)
- gw2=(time3-s)%10; //數碼管個位
- sw=sw2; //東西次干道
- gw=gw2;
- display(); //顯示
- gb(); //關閉
- } s=0;
- }
- void z3(void)//東西通行南北禁止
- {
- while(s<time2)
- {
- sm();
- plus2();
- minus2();
- //綠 /黃 /紅
- d4 =1;d5 =1;d6 =0;//北
- d10=1;d11=1;d12=0;//南
- d7 =0;d8 =1;d9 =1;//東
- d1 =0;d2 =1;d3 =1;//西
- sw2=(times2-s)/10;; //南北主干道
- gw2=(times2-s)%10;
- sw=(time2-s)/10; //數碼管十位(東西次干道)
- gw=(time2-s)%10; //數碼管個位
- display(); //顯示
- gb(); //關閉
- } s=0;
- }
- void z4(void)//東西注意南北禁止
- {
- time3=2;
- while(s<time3)
- {
- sm();
- //綠 /黃 /紅
- d4 =1;d5 =1;d6 =0;//北
- d10=1;d11=1;d12=0;//南
- d7 =1;d8 =0;d9 =1;//東
- d1 =1;d2 =0;d3 =1;//西
- sw=(time3-s)/10; //數碼管十位,(東西次干道)
- gw=(time3-s)%10; //數碼管個位
- sw2=sw; //南北主干道
- gw2=gw;
- display(); //顯示
- gb(); //關閉
- } s=0;
- }
- void jinji(void)//紅燈全亮,其他全滅,緊急狀態
- {
- //綠 /黃 /紅
- d4 =1;d5 =1;d6 =0;//北
- d10=1;d11=1;d12=0;//南
- d7 =1;d8 =1;d9 =0;//東
- d1 =1;d2 =1;d3 =0;//西
- }
- void gb(void)//全部關閉
- {
- //綠 /黃 /紅
- d4 =1;d5 =1;d6 =1;//北
- d10=1;d11=1;d12=1;//南
- d7 =1;d8 =1;d9 =1;//東
- d1 =1;d2 =1;d3 =1;//西
- }
- void delay(uint a) //@11.0592MHz 10ms延時(使用燒錄軟件產生的延時代碼)
- {
- for(a;a>0;a--)
- {
- unsigned char i, j;
- i = 18;
- j = 235;
- do
- {
- while (--j);
- } while (--i);
- }
- }
- void display() //數碼管顯示
- {
- w1=0; //十位
- D=duan[sw];
- delay(1);
- w1=1;
- D=0X00;
- w2=0; //個位
- D=duan[gw];
- delay(1);
- w2=1;
- D=0x00;
- w3=0; //十位
- D=duan[sw2];
- delay(1);
- w3=1;
- D=0X00;
- w4=0; //個位
- D=duan[gw2];
- delay(1);
- w4=1;
- D=0x00;
- }
- void timer(void)
- {
- TMOD=0X10;
- TH1=(65536-50000)/256; //50ms定時
- TL1=(65536-50000)%256;
- EA=1;
- ET1=1;
- TR1=1;
- }
- void time1(void) interrupt 3 //定時器T1中斷服務程序
- {
- TH1=(65536-50000)/256; //50ms定時
- TL1=(65536-50000)%256;
- y++;
- if(y==20)
- {s++; y=0;}
- }
- void sm(void)//緊急狀態掃描函數
- {
- H1=0; //按鍵另一端置零,當按鍵按下時接地
- if(key1==0) //判斷按鍵是否按下
- {
- delay(2); //消抖
- while(!key1) //松手檢測
- TR1=!TR1; //關閉定時器
- while(key1==1) //四個方向全為紅燈,進入緊急狀態
- {
- gb();
- jinji(); //打開緊急狀態
- gw=gw2=sw=sw2=8;
- display();
- }
- while(key1==0) //松手檢測
- display();
- TR1=1; //打開定時器跳出
- }
- }
- void plus()
- {
- H1=0; //按鍵另一端置
- if(key2==0) //判斷按鍵是否按下
- delay(2); //消抖
- if(key2==0)
- {
- time+=1;
- times+=1;}
- while(!key2); //松手檢測
- }
- void minus()
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
51hei.png (5.49 KB, 下載次數: 74)
下載附件
2021-6-11 17:25 上傳
所有資料51hei提供下載:
交通信號燈.rar
(79.79 KB, 下載次數: 43)
2021-6-11 09:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|