|
交通燈設(shè)計(jì)仿真文件:
034235nhlunkgpzhl8lglt.png (29.53 KB, 下載次數(shù): 121)
下載附件
2017-10-26 17:42 上傳
0.png (53.06 KB, 下載次數(shù): 97)
下載附件
2017-10-27 00:43 上傳
單片機(jī)源程序如下:
- #include<reg51.h> // 對(duì)單片機(jī)的口進(jìn)行了定義
- #define uint unsigned int
- #define uchar unsigned char
- uchar code a[10]={0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f /*0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10*/};//段碼組合,共陽極
- uchar code b[4]={0x01,0x02,0x04,0x08}; //位碼組合
- uchar code c[4]={0xcc,0xd4,0x78,0xb8};//P1 綠紅、黃紅、紅綠、紅黃
- uchar NB=25,DX=30,NBG=25,DXG=15,H=5; //數(shù)碼管顯示值設(shè)置
- uchar i,k=0,cnt=0,j=0;
- sbit K0=P3^4; //南北路道通行
- sbit K1=P3^5; //東西路道通行
- sbit K4=P3^6; //返回
- sbit K3=P3^2; //設(shè)置時(shí)間
- sbit K2=P3^3; //緊急剎車
- void delay(uchar t); //定義延時(shí)程序
- void key(); //定義鍵盤程序
- void display(); //定義顯示程序
- void settime(); //定義時(shí)間設(shè)置顯示程序
- //*************************程序初始*********************************************
- void init()
- {
- TMOD=0x01; //使用定時(shí)器0模式一
- TH0=(65536-5000)/256;
- TL0=(65536-5000)%256;
- IT0=1; //開中斷
- ET0=1; //定時(shí)器T1中斷允許
- TR0=1; //啟動(dòng)定時(shí)器0
- EA=1; //開總中斷
- EX0=1;
- EX1=1;
- P1=c[k]; //開啟交通燈
- }
- //*************************中斷0處理程序***************************************
- void int0(void) interrupt 0 //通行時(shí)間設(shè)置
- {
- EA=0; //關(guān)中斷
- P1=0xd8; //紅燈全亮
- for(;;)
- {
- settime();
- if(K1==0) //設(shè)置東西路通行時(shí)間
- {
- delay(10); //按鍵消抖,按鍵是否按下
- if(K1==0)
- {
- while(!K1) //按鍵是否松開
- {
- settime();
- }
- DXG++; //東西路通行時(shí)間加1
- if(DXG==99)
- DXG=0;
- }
- }
-
- if(K0==0) //設(shè)置南北路通行時(shí)間
- {
- delay(10);
- if(K0==0)
- {
- while(!K0)
- {
- settime();
- }
- NBG++; //南北路通行時(shí)間加1
- if(NBG==99)
- NBG=0;
- }
- }
-
- if(K4==0) //返回
- {
- delay(10);
- if(K4==0)
- {
- while(!K4)
- {
- settime();
- }
- k=0;
- P1=c[k];
- NB=NBG,DX=NBG+H;
- display();
- EA=1;
- break;
- }
- }
- }
- }
-
- //***********************************中斷1處理程序********************
- void int1(void) interrupt 2 //緊急情況
- {
- /*東西南北紅燈亮*/
- EA=0;
- TR0=!TR0; /*停止計(jì)數(shù)*/
- for(;;) /*主支干道顯示全為0*/
- {
- P1=0xd8;
- P0=a[0];
- P2=b[0];
- delay(10);
-
- P2=b[1];
- delay(10);
- P2=b[2];
- delay(10);
- P2=b[3];
- delay(10);
- if(K4==0) /*返回*/
- {
- delay(10);
- EA=1;
- P1=c[k]; /*返回緊急前狀態(tài)開始計(jì)數(shù)*/
- TR0=!TR0; /*重啟計(jì)數(shù)*/
- break;
- }
- }
- }
- void time1(void) interrupt 1 /*交通燈控制程序*/
- {
- TH0=(65536-5000)/256; /*定時(shí)50ms*/
- TL0=(65536-5000)%256;
- cnt++;
- if(cnt>=20) /*每20*50ms=1s自減一*/
- {
- NB--;
- DX--;
- cnt=0;
- if(NB==0||DX==0)
- {
- k++;
- if(k>3) /*k取0,1,2,3*/
- k=0;
- switch(k)
- {
- case 0:NB=NBG,DX=NBG+H;j=0;P1=c[k];break; /*主干道通行顯示綠紅*/
- case 1:NB=H;j=1;P1=c[k];break; /*主干道黃燈閃爍*/
- case 2:NB=DXG+H,DX=DXG;j=0;P1=c[k];break; /*支干道通行顯示紅綠*/
- case 3:DX=H;j=2;P1=c[k];break; /*支干道黃燈閃爍*/
- }
- }
- }
- }
- /***************************延時(shí)程序延時(shí)1ms *****************************/
- /*void delay(uchar t)
- {
- uchar i,j;
- for(i=0;i<t;i++)
- for(j=0;j<120;j++);
-
- }*/
- void delay(uchar t) //延時(shí)程序延時(shí)0.1*nms
- {
- uchar i;
- do
- {
- for(i=0;i<20;i++)
- ;;;
- } while(t--);
- }
- /*************************時(shí)間設(shè)定函數(shù)**********************/
- void settime()
- {
- P2=b[0],P0=a[(NBG+H)%10]; /*顯示主干道通行時(shí)間 */
- delay(10);
-
- P2=b[1],P0=a[(NBG+H)/10];
- delay(10);
-
- P2=b[2],P0=a[(DXG+H)%10]; /*顯示支干道通行時(shí)間*/
- delay(10);
-
- P2=b[3],P0=a[(DXG+H)/10];
- delay(10);
- }
- /*******************鍵盤程序用KO K1模擬一道有車一道無車 *****************/
- void key()
- {
- if(K1==0) //南北通行,東西禁止
- {
- delay(10);
- if(K1==0)
- {
- while(!K1)
- {
- display();
- }
- k=0,P1=c[k];cnt=0;
- NB=NBG, DX=NBG+H;
- display();
- }
- }
- if(K0==0) //東西通行,南北禁止
- {
- delay(10);
- if(K0==0)
- {
- while(!K0)
- {
- display();
- }
- k=2,P1=c[k];cnt=0;
- NB=DXG+H,DX=DXG;
- display();
- }
- }
- }
- /*******************************數(shù)碼管顯示程序 ***********************/
- void display()
- {
-
- P2=b[0],P0=a[NB%10]; //由k的不同值進(jìn)入確定顯示數(shù)值
- delay(10);
- P2=b[1],P0=a[NB/10];
- delay(10);
- P2=b[2],P0=a[DX%10];
- delay(10);
- P2=b[3],P0=a[DX/10];
- delay(10);
- }
- /************************************主程序函數(shù)*********************/
- void main(void)
- { //主程序
- init();
- for(;;)
- {
- display();
- key();
- //黃燈閃爍程序
- while(j==1) //主干道黃燈閃爍
- {
- P1=0xdc; //給黃燈一高電平黃燈滅
- for(i=83;i>0;i--)
- {display();} //執(zhí)行for循環(huán)延時(shí)
- P1=c[k]; //再給黃燈一低電平黃燈亮
- for(i=83;i>0;i--)
- {display();}
- }
- while(j==2)
- { //支干道黃燈閃爍
- P1=0xf8;
- for(i=83;i>0;i--){display();}
- P1=c[k];
- for(i=83;i>0;i--){display();}
- }
-
-
-
- }
- }
復(fù)制代碼
管理提醒:作者發(fā)布的源文件由于 多人回帖說有問題 已經(jīng)被刪除,大家可以參考:http://www.zg4o1577.cn/bbs/dpj-118303-1.html
|
|