交通信號燈仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (30.87 KB, 下載次數: 28)
下載附件
2018-10-17 21:11 上傳
單片機源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit P1_0=P1^0;
- sbit P1_2=P1^2;
- sbit P1_3=P1^3;
- sbit P1_5=P1^5;
- sbit P3_0=P3^0;
- sbit P3_1=P3^1;
- sbit P3_4=P3^4;
- sbit P3_5=P3^5;
- sbit P3_6=P3^6;
- sbit P3_7=P3^7;
- uchar n=90,f0=0,f1=0,a=0;
- uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//1-9
- void init() //初始化函數
- {
- IT1=1; //外部中斷1采用跳沿觸發(fā)方式
- IT0=1; //外部中斷0采用跳沿觸發(fā)方式
- TMOD=0x11; //T1,T0都采用方式1工作
- TH0=(65536-50000)/256;//定時初值50毫秒
- TL0=(65536-50000)%256;
- TR0=1; //啟動定時器/計數器0
- IP=0X01; //外部中斷0為高優(yōu)先級
- IE=0X87;
- }
- void delay1()
- {
- uchar i,j;
- for(i=0;i<10;i++)
- for(j=0;j<33;j++)
- ;
- }
- void delayn(uint n)
- {
- uint i;
- for(i=0;i<n;i++)
- delay1();
- }
- void timer0() interrupt 1//定時器T0中斷,實現倒計時
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- a++;
- if(a==20) //沒記一次為0.05秒,一共計20次為1秒,然后a重新歸零計數,總時間n減1
- {
- a=0;
- n--;
- }
- if(f1==0)
- {
- P1=0XF3;//南北方向綠燈亮,東西方向紅燈亮
- if(n<=6) //綠燈閃爍倒計時計數
- {
- if(a==10)
- {
- P1_2=!P1_2; //綠燈閃爍
- }
- }
- if(n==0) //黃燈倒計時
- {
- delayn(500);
- P1=0XF5;
- delayn(500);
- }
- }
- if(f0==0)
- {
- if(n==0)
- {
- n=50;
- f1=1;
- }
- }
- if(f1==1)
- {
- P1=0XDE; //東西方向綠燈亮
- if(n<=6) //當時間剩6秒時綠燈閃爍
- {
- if(a==10)
- {
- P1_5=!P1_5;
- }
- }
- if(n==0) //黃燈
- {
- delayn(500);
- P1=0XEE;
- delayn(500);
- }
- f0=1;
- if(n==0)
- {
- n=90;
- f1=0;
- f0=0;
- }
- }
- }
- void display() //倒計時計數,讓數碼管顯示相應的數字
- {
- while(1)
- {
- if(P1_0==0)
- {
- P0=seg[n%10];
- P3_5=1;
- delayn(5);
- P3_5=0;
- delayn(10);
- P0=seg[n/10];
- P3_4=1;
- delayn(5);
- P3_4=0;
- }
- if(P1_3==0)
- {
- P2=seg[n%10];
- P3_7=1;
- delayn(5);
- P3_7=0;
- P2=seg[n/10];
- P3_6=1;
- delayn(5);
- P3_6=0;
- delayn(10);
- }
- }
- }
- void int0() interrupt 0 //緊急情況1:四個方向都亮紅燈
- {
- int n2;
- P3_4=P3_5=P3_6=P3_7=0;
- for(n2=0;n2<40;n2++)
- {
- delayn(1000);
- P1=0XF6;
- }
-
- }
- void int1() interrupt 2
- {
- int n2,n3;
- P3_4=P3_5=P3_6=P3_7=0;
- if(P3_1==0) //緊急情況2:東西方向同行,南北方向禁止通行
- {
- P3_0=1;
- P1=0xDE;
- for(n2=0;n2<30;n2++) //執(zhí)行30秒恢復正常
- {
- delayn(1000);
- P1=0XDE;
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
新建文件夾 (4).rar
(292.04 KB, 下載次數: 13)
2018-10-17 19:20 上傳
點擊文件名下載附件
單片機 下載積分: 黑幣 -5
|