利用51單片機控制各個路口紅綠燈及時間顯示
1 系統設計
1.1 設計要求
1.1.1 設計任務
利用51單片機控制各個路口紅綠燈及時間顯示。
1.1.2 性能指標要求
1、各方向的紅、綠色信號燈能按照設定規則運行;
2、綠燈亮之前,黃燈閃爍5次;
3、紅燈和綠燈倒計時間能夠正確顯示;
4、兩干道的車輛不會會車沖突。
5、可以擴展其他功能(如按鍵設置時間,按鍵模擬警車)
1.2 設計思路及設計框圖
1.2.1設計思路
1、各個路口紅綠燈亮滅的規則,暫不考慮左轉方向;
2、倒計時的實現,利用單片機的定時器進行計數得到秒信號;
3、時間顯示:東西南北四個方向的時間一致,當東西方向為60秒綠燈通行時間,同時南北方向為60秒紅燈禁止時間,因此硬件連接時可考慮東西南北方向可采用同一接法;最后相當于2個數碼管動態顯示,具體見參考電路框圖。
4、按鍵設置(擴展要求):設置鍵按一次,設置主干道通信時間(即次干道禁止時間),按第二次,設置主干道禁止時間(即次干道通信時間),按第三次,可作為緊急通信鍵。設置時間需要確定,可通過確定鍵實現,也可通過延時確定,如10秒。當然也可根據需要增加相應的按鍵。
1.2.2總體設計框圖
2 各個模塊程序的設計
芯片模塊:
按鍵模塊:
12M晶振電路模塊:
復位端模塊:
交通燈功能模塊:
數碼管顯示模塊:
3 調試過程
(1)將下載線連接下載口,即供電的時候,板子在沒有任何程序進入的情況下,裝上芯片后各個方向的紅黃綠燈都是亮的,但數碼管沒有任何顯示。
(2)然后將程序下載到單片機內,各個方向的燈開始按照程序所設置的進行亮滅,數碼管進入倒計時狀態。證明硬件沒問題。
(3)通過硬件驗證軟件,基本的交通燈功能實現。
4 功能測試
4.1 測試儀器與設備
萬用表一個、計算機一臺、USB下載線一根
4.2 性能指標測試
1、各方向的紅、綠色信號燈能按照設定規則運行;
2、綠燈亮之前,黃燈閃爍5次;
3、紅燈和綠燈倒計時間能夠正確顯示;
4、兩干道的車輛不會會車沖突。
5 實訓心得體會
單片機實訓功能要求真是說的容易做的難,以為一步一步畫出原理圖操作后面就很快能完成。等到實訓真正開始的時候發現自己突然之間不知道該干嘛,原理圖感覺是沒問題了,程序自己不會編,單片機的知識自己又相當薄弱。關于實訓器件芯片,數碼管,下載口等等的管腳分布,都需要學會自行查找資料。然后這次實訓焊板的過程相比之前簡單,首次用到了萬能板,要點對點的連接,看著原理圖里線的走向來接跳線,即使電路短接,拆線也方便。其次就是程序編寫階段了,在翻閱單片機書,老師指導和同學的幫助下,漸漸有了思路,但是一次次的調試失敗,關于中斷,關于延時等的知識運用相當薄弱,驗收的時候就很難受,還有數碼管的段暄位選,實現的原理,沒有做好提前準備,回答的時候不會。將自己寫好的程序燒錄到板子時,看著自己的實驗板實現基本功能真心感到開心,即使按鍵功能做不出來,結束后我也會從新看看,爭取搞懂。這次實訓讓我認識自己的單片機知識有多缺乏,暴露出一些在學習上的問題,要好好的記住他的原理。希望自己能夠更多的學習專業知識,能夠把課本的知識運用到實際生活中。
7 附錄
附錄1:電路原理圖
附錄2:程序清單
#include <reg52.h>
#include<stdio.h>
#include<absacc.h>
#define uint unsigned int
#define uchar unsigned char
char code dx516[3] _at_ 0x003b;
uchar data timelist=60;
uchar count=0;
uchar yelltime=0;
uchar intswitch;
uchar data time[4]={60,5,60,5};
uchar data disbuf[4]={0};
uchar n=0;
uchar yellow=0xff;
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
uchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void timer0(void)interrupt 1
{
TH0=-50000/256;
TL0=-50000%256;
count++;
yelltime++;
if(yelltime==10)
{
yelltime=0;
yellow=yellow^0x12;
}
if(count==20)
{
count=0;
timelist--;
if(timelist==0)
{
n++;
if(n==4)
n=0;
timelist=time[n];
}
}
}
void dlms(uint x)
{
uint i=x,j;
while(i--)
{
j=100;
while(j--);
}
}
void int0(void)interrupt 0
{
dlms(5);
if(!P3_2)
{
while(!P3_2)
{
dlms(1);
}
dlms(5);
if(P3_2)
{
TR0=!TR0;
if(TR0==1)
{ count=0;
n=0;
timelist=time[n];
}
}
}
}
void int1(void)interrupt 2
{
dlms(5);
if(!P3_3)
{
while(!P3_3)
{
dlms(1);
}
dlms(5);
if(P3_3)
{
if(TR0==1)
{
count=0;
n=0;
timelist=time[n];
}
if(TR0==0)
{
time[0]=time[0]+1;
}
if(time[0]>90)
{
time[0]=10;
}
}
}
}
void time1(void)interrupt 3
{
TH1=0xff;
TL1=0xff;
dlms(5);
if(!P3_4)
{
while(!P3_4)
{ dlms(1);
}
dlms(5);
if(P3_4)
{
if(TR0==1)
{
count=0;
n=2;
timelist=time[n];
}
if(TR0==0)
{
time[2]=time[2]+1;
}
if(time[2]>90)
{
time[2]=10;
}
}
}
}
void disp(void)
{
uchar i,j;
uchar sel;
if(TR0==0)
{
disbuf[0]=time[2]%10;
disbuf[1]=time[2]/10;
disbuf[2]=time[0]%10;
disbuf[3]=time[0]/10;
P2=~0xff;
sel=0x01;
for(i=0;i<4;i++)
{
j=disbuf;
P2=(sel^0xff);
P0=table[j];
dlms(2);
P2=~0xff;
sel=sel<<1;
P1=0x36;
}
}
if(TR0==1)
{
disbuf[0]=timelist%10;
disbuf[1]=timelist/10;
disbuf[2]=timelist%10;
disbuf[3]=timelist/10;
P2=~0xff;
sel=0x01;
for(i=0;i<4;i++)
{
j=disbuf;
P2=(sel^0xff);
P0=table[j];
dlms(2);
P2=~0xff;
sel=sel<<1;
if(n==0)
{
P1=0x33;
}
if(n==1||n==3)
{
P1=yellow;
}
if(n==2)
{
P1=0x1e;
}
}
}
}
main()
{
TCON=0x05;
TMOD=0x51;
TH0=-50000/256;
TL0=-50000%256;
TH1=0xff;
TL1=0xff;
EA=1;
ET0=1;
EX0=1;
ET1=1;
EX1=1;
TR1=1;
TR0=1;
while(1)
{
disp();
}
}
|