|
設(shè)計(jì)為交通燈仿真實(shí)驗(yàn),有AD電路圖。網(wǎng)上下載的資源,進(jìn)行了修改,道路分為主道路和次干道,主干道作為主要交通線(xiàn),通行時(shí)間比次干道多5秒左右�?梢詮某绦蜻M(jìn)行修改
模擬真實(shí)生活中的交通燈情況,配有三個(gè)按鈕,用來(lái)控制燈的狀態(tài)。暫停/驅(qū)動(dòng),時(shí)間增加,時(shí)間減少。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (98.47 KB, 下載次數(shù): 46)
下載附件
2023-4-1 04:18 上傳
屏幕截圖 2023-03-31 220057.png (95.16 KB, 下載次數(shù): 51)
下載附件
2023-3-31 22:03 上傳
電路原理圖如下:
屏幕截圖 2023-03-31 220201.png (152.25 KB, 下載次數(shù): 53)
下載附件
原理圖
2023-3-31 22:03 上傳
單片機(jī)源程序如下:
- #include<stc10.h>
- #define D P1
- #define uchar unsigned char
- #define uint unsigned int
- /*******************************************函數(shù)聲明*****************************************/
- void z1(void);//南北通行
- void z2(void);//南北注意
- void z3(void);//東西通行
- void z4(void);//東西注意
- void gb(void); //關(guān)閉所有
- void jinji(void);//緊急狀態(tài),紅燈全亮
- void sm(void); //掃描鍵盤(pán)
- void plus(); //通行時(shí)間加1掃描
- void minus(); //通行時(shí)間減1掃描
- void plus2();
- void minus2();
- void timer(void);//定時(shí)器T1初始化
- void time1(void);//定時(shí)器T1中斷服務(wù)程序
- void display(void);//顯示函數(shù)
- void delay(uint a);//10ms延時(shí)
- /*************************************數(shù)組及全局變量的定義***************************************/
- 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;
- /*********************************定義交通燈、數(shù)碼管的位選、按鍵對(duì)應(yīng)的引腳*********************************/
- 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;
- /*********************************************主函數(shù)***********************************************/
- void main(void)
- {
- times=18;
- time=15;
- time2=10;
- times2=12;
- y=0,s=0; //定時(shí)器溢出計(jì)數(shù)初始化
- P1M1=0X00; //設(shè)置推挽輸出,增加數(shù)碼管亮度
- P1M0=0XFF;
- timer(); //啟動(dòng)定時(shí)器T1
- while(1)
- {
- z1(); //主干道通行,綠燈15秒
- z2(); //主干道注意,黃燈3秒
- z3(); //次干道通行,綠燈10秒
- z4(); //次干道注意。黃燈2秒
- }
- }
- /******************不同狀態(tài)函數(shù)、定時(shí)器初始化、定時(shí)器中斷服務(wù)函數(shù)************************/
- 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; //數(shù)碼管十位(南北主干道)
- gw2=(time-s)%10; //數(shù)碼管個(gè)位
- sw=(times-s)/10;
- gw=(times-s)%10;
- display(); //數(shù)碼管顯示
- gb(); //全關(guān)
- } s=0;//置零定時(shí)時(shí)間標(biāo)志位
- }
- 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)//紅燈全亮,其余全滅,表示進(jìn)入緊急狀態(tài)
- {
- //綠 /黃 /紅
- 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)//全部關(guān)閉
- {
- //綠 /黃 /紅
- 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延時(shí)
- {
- for(a;a>0;a--)
- {
- unsigned char i, j;
- i = 18;
- j = 235;
- do
- {
- while (--j);
- } while (--i);
- }
- }
- void display() //數(shù)碼管顯示
- {
- w1=0; //十位
- D=duan[sw];
- delay(1);
- w1=1;
- D=0X00;
- w2=0; //個(gè)位
- D=duan[gw];
- delay(1);
- w2=1;
- D=0x00;
- w3=0; //十位
- D=duan[sw2];
- delay(1);
- w3=1;
- D=0X00;
- w4=0; //個(gè)位
- D=duan[gw2];
- delay(1);
- w4=1;
- D=0x00;
- }
- void timer(void)
- {
- TMOD=0X10;
- TH1=(65536-50000)/256; //50ms延時(shí)
- TL1=(65536-50000)%256;
- EA=1;
- ET1=1;
- TR1=1;
- }
- void time1(void) interrupt 3
- {
- TH1=(65536-50000)/256; //50ms延時(shí)
- TL1=(65536-50000)%256;
- y++;
- if(y==20)
- {s++; y=0;}
- }
- void sm(void)//緊急狀態(tài)掃描函數(shù)
- {
- H1=0; //按鍵另一端置零,當(dāng)按鍵按下相當(dāng)于接地,沒(méi)有按下,經(jīng)上拉電阻拉高了
- if(key1==0) //是否按下
- {
- delay(2); //消抖
- while(!key1) //松手檢測(cè)
- TR1=!TR1; //關(guān)閉定時(shí)器
- while(key1==1) //進(jìn)入緊急狀態(tài)
- {
- gb();
- jinji();
- gw=gw2=sw=sw2=8;
- display();
- }
- while(key1==0) //松手檢測(cè)
- display();
- TR1=1; //打開(kāi)定時(shí)器,跳出
- }
- }
- void plus()
- {
- H1=0; //按鍵另一端置零,當(dāng)按鍵按下相當(dāng)于接地,沒(méi)有按下,經(jīng)上拉電阻拉高了
- if(key2==0) //是否按下
- delay(2); //消抖
- if(key2==0)
- {
- time+=1;
- times+=1;}
- while(!key2); //松手檢測(cè)
- }
- void minus()
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼 Keil代碼與Proteus仿真下載:
仿真和代碼.7z
(244.62 KB, 下載次數(shù): 55)
2023-4-1 04:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|