|
利用51單片機(jī)控制各個(gè)路口紅綠燈及時(shí)間顯示
1 系統(tǒng)設(shè)計(jì)
1.1 設(shè)計(jì)要求
1.1.1 設(shè)計(jì)任務(wù)
利用51單片機(jī)控制各個(gè)路口紅綠燈及時(shí)間顯示。
1.1.2 性能指標(biāo)要求
1、各方向的紅、綠色信號(hào)燈能按照設(shè)定規(guī)則運(yùn)行;
2、綠燈亮之前,黃燈閃爍5次;
3、紅燈和綠燈倒計(jì)時(shí)間能夠正確顯示;
4、兩干道的車輛不會(huì)會(huì)車沖突。
5、可以擴(kuò)展其他功能(如按鍵設(shè)置時(shí)間,按鍵模擬警車)
1.2 設(shè)計(jì)思路及設(shè)計(jì)框圖
1.2.1設(shè)計(jì)思路
1、各個(gè)路口紅綠燈亮滅的規(guī)則,暫不考慮左轉(zhuǎn)方向;
2、倒計(jì)時(shí)的實(shí)現(xiàn),利用單片機(jī)的定時(shí)器進(jìn)行計(jì)數(shù)得到秒信號(hào);
3、時(shí)間顯示:東西南北四個(gè)方向的時(shí)間一致,當(dāng)東西方向?yàn)?0秒綠燈通行時(shí)間,同時(shí)南北方向?yàn)?0秒紅燈禁止時(shí)間,因此硬件連接時(shí)可考慮東西南北方向可采用同一接法;最后相當(dāng)于2個(gè)數(shù)碼管動(dòng)態(tài)顯示,具體見參考電路框圖。
4、按鍵設(shè)置(擴(kuò)展要求):設(shè)置鍵按一次,設(shè)置主干道通信時(shí)間(即次干道禁止時(shí)間),按第二次,設(shè)置主干道禁止時(shí)間(即次干道通信時(shí)間),按第三次,可作為緊急通信鍵。設(shè)置時(shí)間需要確定,可通過確定鍵實(shí)現(xiàn),也可通過延時(shí)確定,如10秒。當(dāng)然也可根據(jù)需要增加相應(yīng)的按鍵。
1.2.2總體設(shè)計(jì)框圖
2 各個(gè)模塊程序的設(shè)計(jì)
芯片模塊:
按鍵模塊:
12M晶振電路模塊:
復(fù)位端模塊:
交通燈功能模塊:
數(shù)碼管顯示模塊:
3 調(diào)試過程
(1)將下載線連接下載口,即供電的時(shí)候,板子在沒有任何程序進(jìn)入的情況下,裝上芯片后各個(gè)方向的紅黃綠燈都是亮的,但數(shù)碼管沒有任何顯示。
(2)然后將程序下載到單片機(jī)內(nèi),各個(gè)方向的燈開始按照程序所設(shè)置的進(jìn)行亮滅,數(shù)碼管進(jìn)入倒計(jì)時(shí)狀態(tài)。證明硬件沒問題。
(3)通過硬件驗(yàn)證軟件,基本的交通燈功能實(shí)現(xiàn)。
4 功能測(cè)試
4.1 測(cè)試儀器與設(shè)備
萬用表一個(gè)、計(jì)算機(jī)一臺(tái)、USB下載線一根
4.2 性能指標(biāo)測(cè)試
1、各方向的紅、綠色信號(hào)燈能按照設(shè)定規(guī)則運(yùn)行;
2、綠燈亮之前,黃燈閃爍5次;
3、紅燈和綠燈倒計(jì)時(shí)間能夠正確顯示;
4、兩干道的車輛不會(huì)會(huì)車沖突。
5 實(shí)訓(xùn)心得體會(huì)
單片機(jī)實(shí)訓(xùn)功能要求真是說的容易做的難,以為一步一步畫出原理圖操作后面就很快能完成。等到實(shí)訓(xùn)真正開始的時(shí)候發(fā)現(xiàn)自己突然之間不知道該干嘛,原理圖感覺是沒問題了,程序自己不會(huì)編,單片機(jī)的知識(shí)自己又相當(dāng)薄弱。關(guān)于實(shí)訓(xùn)器件芯片,數(shù)碼管,下載口等等的管腳分布,都需要學(xué)會(huì)自行查找資料。然后這次實(shí)訓(xùn)焊板的過程相比之前簡單,首次用到了萬能板,要點(diǎn)對(duì)點(diǎn)的連接,看著原理圖里線的走向來接跳線,即使電路短接,拆線也方便。其次就是程序編寫階段了,在翻閱單片機(jī)書,老師指導(dǎo)和同學(xué)的幫助下,漸漸有了思路,但是一次次的調(diào)試失敗,關(guān)于中斷,關(guān)于延時(shí)等的知識(shí)運(yùn)用相當(dāng)薄弱,驗(yàn)收的時(shí)候就很難受,還有數(shù)碼管的段暄位選,實(shí)現(xiàn)的原理,沒有做好提前準(zhǔn)備,回答的時(shí)候不會(huì)。將自己寫好的程序燒錄到板子時(shí),看著自己的實(shí)驗(yàn)板實(shí)現(xiàn)基本功能真心感到開心,即使按鍵功能做不出來,結(jié)束后我也會(huì)從新看看,爭取搞懂。這次實(shí)訓(xùn)讓我認(rèn)識(shí)自己的單片機(jī)知識(shí)有多缺乏,暴露出一些在學(xué)習(xí)上的問題,要好好的記住他的原理。希望自己能夠更多的學(xué)習(xí)專業(yè)知識(shí),能夠把課本的知識(shí)運(yùn)用到實(shí)際生活中。
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();
}
}
|
|