|
51單片機(jī)左的交通燈控制系統(tǒng) 原理圖,PCB,程序都有.
交通燈的原理圖(ad畫的 需要用ad打開,里面也有pdf版本)
交通燈的pcb圖(有2個(gè)版本):
交通燈的單片機(jī)源程序:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit dongxi_red=P1^3; //東西方向紅燈定義
- sbit dongxi_yellow=P3^6; //東西方向黃燈定義
- sbit dongxi_green=P3^7; //東西方向綠燈定義
- sbit nanbei_red=P1^2; //南北方向紅燈定義
- sbit nanbei_yellow=P1^1; //南北方向黃燈定義
- sbit nanbei_green=P1^0; //南北方向綠燈定義
- uchar tab[]={0xbf,0x7f,0xef,0xdf}; //數(shù)碼管位選
- uchar IRtime; //紅外解碼時(shí)間次數(shù)
- uchar IRbyte[4]; //紅外一字節(jié)
- uchar IRdate[33]; //紅外數(shù)據(jù)碼,用戶碼,停止碼共33位
- uchar IRbyte_ok,IRdate_ok; //接收一字節(jié)完成標(biāo)志位,解碼完成標(biāo)志位
- bit flag=0;
- uchar num=45,num1=40,shi,ge,shi1,ge1,i;
- uchar table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共陰數(shù)碼管段選
- void delay(uchar z) //延時(shí)
- {
- uchar k,l;
- for(k=0;k<110;k++)
- for(l=0;l<z;l++);
- }
- void dongxi__red() //東西方向紅燈亮,黃綠燈都滅,南北方向綠燈亮,紅黃燈滅
- {
- dongxi_red=0;
- dongxi_yellow=1;
- dongxi_green=1;
- nanbei_red=1;
- nanbei_yellow=1;
- nanbei_green=0;
- }
- void nanbei__yellow() //東西方向紅燈亮,黃綠燈都滅,南北方向黃燈亮,紅綠燈滅
- {
- dongxi_red=0;
- dongxi_yellow=1;
- dongxi_green=1;
- nanbei_red=1;
- nanbei_yellow=0;
- nanbei_green=1;
- }
- void nanbei__red() //南北方向紅燈亮,黃綠燈都滅,東西方向綠燈亮,紅黃燈滅
- {
- dongxi_red=1;
- dongxi_yellow=1;
- dongxi_green=0;
- nanbei_red=0;
- nanbei_yellow=1;
- nanbei_green=1;
- }
- void dongxi__yellow() //南北方向紅燈亮,黃綠燈都滅,東西方向黃燈亮,紅綠燈滅
- {
- dongxi_red=1;
- dongxi_yellow=0;
- dongxi_green=1;
- nanbei_red=0;
- nanbei_yellow=1;
- nanbei_green=1;
- }
- void number(uchar num,num1) //兩個(gè)數(shù)碼管分別求個(gè)位和十位
- {
- shi=num/10;
- ge=num%10;
- shi1=num1/10;
- ge1=num1%10;
- }
- void display(uchar shi,ge) //數(shù)碼管顯示
- {
- P2=tab[1];
- P0=0x00;
- P0=table[shi];
- delay(5);
- P2=tab[0];
- P0=0x00;
- P0=table[ge];
- delay(5);
- }
- void display1(uchar shi1,ge1) //數(shù)碼管顯示
- {
- P2=tab[3];
- P0=0x00;
- P0=table[shi1];
- delay(5);
- P2=tab[2];
- P0=0x00;
- P0=table[ge1];
- delay(5);
- }
- void start() //定時(shí)器0、1,外中斷0初始化
- {
- EA=1;
- EX0=1;
- EX1=1;
- IT0=1;
- IT1=1;
- ET0=ET1=1;
- TMOD=0X21;
- TH1=0X00;
- TL1=0X00;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TR0=TR1=1;
- }
- void first() //一開始東西方向亮紅燈45秒,南北綠燈40秒
- {
- if(num>5)
- {
- dongxi__red();
- number(num,num1);
- display(shi,ge);
- display1(shi1,ge1);
- }
- if(num<=5) //南北綠燈亮完了亮黃燈5秒
- {
- nanbei__yellow();
- number(num,num1);
- display(shi,ge);
- display1(shi1,ge1);
- if(num==0){num=45;num1=40;flag=1;}
- }
- }
- void second() //南北紅燈45秒,東西綠燈40秒
- {
- if(num>5)
- {
- nanbei__red();
- number(num1,num);
- display(shi,ge);
- display1(shi1,ge1);
- }
- if(num<=5) //東西綠燈結(jié)束,亮黃燈5秒
- {
- dongxi__yellow();
- number(num1,num);
- display(shi,ge);
- display1(shi1,ge1);
- if(num==0){num=45;num1=40;flag=0;}
- }
- }
- void all_red() //雙向禁行,亮紅燈,數(shù)碼管關(guān)閉
- {
- dongxi_red=0;
- dongxi_yellow=1;
- dongxi_green=1;
- nanbei_red=0;
- nanbei_yellow=1;
- nanbei_green=1;
- P2=0x00;
- P0=0x00;
- }
- void nanbei_all_red() //南北方向禁行,亮紅燈數(shù)碼管關(guān)閉,東西方向正常工作
- {
- for(num=45;num>0;)
- {
- dongxi_red=0;
- dongxi_yellow=1;
- dongxi_green=1;
- nanbei_red=0;
- nanbei_yellow=1;
- nanbei_green=1;
- number(num,num1);
- display(shi,ge);
- }
- for(num=40;num>0;)
- {
- nanbei__red();
- number(num,num1);
- display(shi,ge);
- }
- for(num=5;num>0;)
- {
- dongxi__yellow();
- number(num,num1);
- display(shi,ge);
- }
-
- }
- void dongxi_all_red() //東西方向禁行,亮紅燈數(shù)碼管關(guān)閉,南北方向正常工作
- {
- for(num=45;num>0;)
- {
- dongxi_red=0;
- dongxi_yellow=1;
- dongxi_green=1;
- nanbei_red=0;
- nanbei_yellow=1;
- nanbei_green=1;
- number(num,num1);
- display1(shi,ge);
- }
- for(num=40;num>0;)
- {
- dongxi__red();
- number(num,num1);
- display1(shi,ge);
- }
- for(num=5;num>0;)
- {
- nanbei__yellow();
- number(num,num1);
- display1(shi,ge);
- }
-
- }
-
- void jiema() //紅外解碼
- {
- uchar i,j,k=1;
- for(i=0;i<4;i++)
- {
- for(j=0;j<8;j++)
- {
- if(IRdate[k]>5)
- IRbyte[i] |=0x80;
- if(j<7)
- IRbyte[i]>>=1;
- k++;
- }
- }
- IRbyte_ok=1;
- }
- void display2() //比對(duì)收到的信號(hào)
- {
- switch(IRbyte[2])
- {
- case 0x45 :while(1) all_red(); //按下該鍵兩個(gè)方向都持續(xù)亮紅燈
- case 0x46 :while(1) dongxi_all_red(); //按下該鍵東西方向持續(xù)亮紅燈
- case 0x47 :while(1) nanbei_all_red(); //按下該鍵南北方向持續(xù)亮紅燈
- }
- }
- void main()
- {
- start(); //初始化
- while(1)
- {
- if(!flag)
- first();
- if(flag)
- second();
- if(IRdate_ok) //紅外接收完成
- {
- jiema(); //解碼
- IRdate_ok=0; //標(biāo)志位清零
- if(IRbyte_ok) //如果解碼完成,做相關(guān)指令
- {
- display2();
- IRbyte_ok=0; //解碼完成標(biāo)志清零
- }
- }
- }
- }
- void ex0() interrupt 0 //外中斷0用來接收紅外脈沖
- {
- static uchar i; //靜態(tài)變量i
- static bit flag;
- if(flag) //如果flag為1執(zhí)行一下操作
- {
- if((IRtime<53)&&(IRtime>=32)) //IRtime在此范圍內(nèi)說明接收到紅外起始信號(hào)
- i=0;
- IRdate[i]=IRtime; //將IRtime的值保存到數(shù)組中
- IRtime=0;
- i++;
- if(i==33) //如果i=33接收到停止位
- {
- i=0;
- IRdate_ok=1;
- }
- }
- else //flag不為1時(shí)執(zhí)行
- {
- IRtime=0; //IRtime數(shù)值清零
- flag=1; //flag置1
- }
- }
- void et0() interrupt 1 //定時(shí)器0用來控制交通燈的時(shí)間
- {
- TH0=(65536-50000)/256; //重裝初值
- TL0=(65536-50000)%256;
- i++;
- if(i==20)
- {
- i=0;
- num--;
- num1--;
- if(num1==0)
- num1=5;
- }
- }
- void time0() interrupt 3 //定時(shí)器1用來計(jì)算收到的紅外脈寬
- …………余下代碼請(qǐng)下載附件…………
復(fù)制代碼
交通燈源碼和pcb原理圖資料下載:http://www.torrancerestoration.com/bbs/dpj-54314-1.html
|
|