設計為交通燈仿真實驗,有AD電路圖。網上下載的資源,進行了修改,道路分為主道路和次干道,主干道作為主要交通線,通行時間比次干道多5秒左右。可以從程序進行修改
模擬真實生活中的交通燈情況,配有三個按鈕,用來控制燈的狀態。暫停/驅動,時間增加,時間減少。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (98.47 KB, 下載次數: 46)
下載附件
2023-4-1 04:18 上傳
屏幕截圖 2023-03-31 220057.png (95.16 KB, 下載次數: 51)
下載附件
2023-3-31 22:03 上傳
電路原理圖如下:
屏幕截圖 2023-03-31 220201.png (152.25 KB, 下載次數: 53)
下載附件
原理圖
2023-3-31 22:03 上傳
單片機源程序如下:
- #include<stc10.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(); //通行時間加1掃描
- void minus(); //通行時間減1掃描
- 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;
- /*********************************定義交通燈、數碼管的位選、按鍵對應的引腳*********************************/
- 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
- {
- 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黑下載附件…………
復制代碼 Keil代碼與Proteus仿真下載:
仿真和代碼.7z
(244.62 KB, 下載次數: 55)
2023-4-1 04:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|