交通燈控制電路仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- //功能:交通燈控制程序
- #include <reg52.h> //包含頭文件reg51.h,定義了51單片機的專用寄存器
- unsigned char t0,t1; //定義全局變量,用來保存延時時間循環(huán)次數(shù)
- unsigned count=0;
- unsigned char time=60;
- sbit wei1=P3^6;
- sbit wei2=P3^7;
- unsigned char code sum[]={0x3f,0x06,0x5b,
- 0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
- 0x77,0x7c,0x39,0x5e,0x79,0x71};
- void delayms(unsigned int ms) //@12.000MHz
- {
- unsigned char i, j;
- while(ms--)
- {
- i = 2;
- j = 239;
- do
- {
- while (--j);
- } while (--i);
- }
- }
- void display()
- {
- P2=0x00;
- wei1=0;
- P2=sum[time/10];
- delayms(5);
- wei1=1;
- P2=0x00;
- wei2=0;
- P2=sum[time%10];
- delayms(5);
- wei2=1;
- }
- void int_3() interrupt 3
- {
- TH1=(65536-50000)/256; //設置定時器初值
- TL1=(65536-50000)%256;
- count++;
- if(count==20)
- {
- count=0;
- time--;
- if(time==0)
- {
- time=60;
- }
- }
- display();
-
- }
- void delay0_5s1()
- {
- for(t0=0;t0<10;t0++) //采用全局變量t0作為循環(huán)控制變量
- {
- TH0=(65536-50000)/256; //設置定時器初值
- TL0=(65536-50000)%256;
- TR0=1; //啟動T1
- while(!TF0); //查詢計數(shù)是否溢出,即50ms定時時間到,TF1=1
- TF0=0; //50ms定時時間到,將定時器溢出標志位TF1清零
- }
- }
- //函數(shù)名:delay_t1
- //函數(shù)功能:實現(xiàn)0.5~128s延時
- //形式參數(shù):unsigned char t;
- // 延時時間為0.5s×t
- //返回值:無
- void delay_t1(unsigned char t)
- {
- for(t1=0;t1<t;t1++) //采用全局變量t1作為循環(huán)控制變量
- delay0_5s1();
- }
- //函數(shù)名:int_0
- //函數(shù)功能:外部中斷0中斷函數(shù),緊急情況處理,當CPU響應外部中斷0的中斷請求時,
- // 自動執(zhí)行該函數(shù),實現(xiàn)兩個方向紅燈同時亮10 s
- //形式參數(shù):無
- //返回值:無
- void int_0() interrupt 0 //緊急情況中斷
- {
- unsigned char i,j,k,l,m,n,o;
- i=P1; //保護現(xiàn)場,暫存P1口、t0、t1、TH1、TL1
- j=t0;
- k=t1;
- l=TH1;
- m=TL1;
- n=TH0;
- o=TL0;
- P1=0xdb; //兩個方向都是紅燈
- delay_t1(20); //延時10 s
- P1=i; //恢復現(xiàn)場,恢復進入中斷前P1口、t0、t1、TH1、TL1
- t0=j;
- t1=k;
- TH1=l;
- TL1=m;
- TH0=n;
- TL0=o;
- }
- //函數(shù)名:int_1
- //函數(shù)功能:外部中斷1中斷函數(shù),特殊情況處理,當CPU響應外部中斷1的中斷請求時,
- // 自動執(zhí)行該函數(shù),實現(xiàn)A道放行5 s
- //形式參數(shù):無
- //返回值:無
- void int_1() interrupt 2 //特殊情況中斷
- {
- unsigned char i,j,k,l,m,n,o;
- EA=0; //關中斷
- i=P1; //保護現(xiàn)場,暫存P1口、t0、t1、TH1、TL1
- j=t0;
- k=t1;
- l=TH1;
- m=TL1;
- n=TH0;
- o=TL0;
- EA=1; //開中斷
- P1=0xf3; //A道放行
- delay_t1(10); //延時5 s
- EA=0; //關中斷
- P1=i; //恢復現(xiàn)場,恢復進入中斷前P1口、t0、t1、TH1、TL1
- t0=j;
- t1=k;
- TH1=l;
- TL1=m;
- TH0=n;
- TL0=o;
- EA=1; //開中斷
- }
- void main() //主函數(shù)
- {
- unsigned char k;
- TMOD=0x11; //T1設置為工作方式1
- TH1=(65536-50000)/256; //設置定時器初值
- TL1=(65536-50000)%256;
- EA=1; //開總中斷允許位
- ET1=1;
- TR1=1;
- EX0=1; //開外部中斷0中斷允許位
- IT0=1; //設置外部中斷0為下降沿觸發(fā)
- EX1=1; //開外部中斷1中斷允許位
- IT1=1; //設置外部中斷1為下降沿觸發(fā)
- while(1)
- {
-
- P1=0xf3; //A綠燈,B紅燈,延時55 s
- delay_t1(110);
- for(k=0;k<3;k++) //A綠燈閃爍3次
- {P1=0xf3;
- delay0_5s1(); //延時0.5 s
- P1=0xfb;
- delay0_5s1(); //延時0.5 s
- }
- P1=0xeb; //A黃燈,B紅燈,延時2 s
- delay_t1(4);
- P1=0xde; //A紅燈,B綠燈,延時55 s
- delay_t1(110);
- for(k=0;k<3;k++) //B綠燈閃爍3次
- {P1=0xde;
- delay0_5s1(); //延時0.5 s
- P1=0xdf;
- delay0_5s1(); //延時0.5 s
- }
- P1=0xdd; //A紅燈,B黃燈,延時2 s
- delay_t1(4);
- }
- }
復制代碼
所有資料51hei提供下載:
交通燈控制電路仿真 程序.zip
(39.2 KB, 下載次數(shù): 119)
2017-12-23 19:35 上傳
點擊文件名下載附件
|