單片機代碼如下,按鍵1按下觸發中斷,相當于總開關,可以控制南北信號燈,此外可以用串口發送16進制數據,控制信號燈時間(只做了南北方向的,東西方向需要另做一個res接受位)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
protuse仿真
目錄
一、選題一理論部分 2
1.1 課題的要求與內容 2
1.1.1 課題內容: 十字路口交通燈系統設計 2
1.1.2 課題要求: 2
1.2 系統的方案設計 2
1.2.1 系統方案: 2
1.2.2系統的構成: 2
1.3系統的硬件設計 2
1.3.1 系統硬件的設計步驟 2
1.3.2 系統硬件電路連接效果 3
1.4 系統的軟件設計 4
1.4.1 系統的軟件設計步驟 4
二、選題一實踐部分 4
2.1 系統的硬件原理與說明 4
2.1.1 系統的硬件仿真效果圖 4
2.1.2 仿真圖說明: 5
2.2系統硬件調試的過程中出現的問題以及解決的措施 5
2.3系統軟件調試的過程中出現的問題以及解決的措施 6
一、(選題一)理論部分
1.1 課題的要求與內容
1.1.1 課題內容: 十字路口交通燈系統設計
為了減少交通事故,確保交通順暢,十字路口必須安置信號燈,以一定的時間間隔輪流點亮和熄滅。系統要求利用單片機的定時器定時功能,令十字路口的紅黃綠燈交替點亮和熄滅,并且用LED數碼管顯示時間。
1.1.2 課題要求:
(1)開機或復位后,信號燈全滅,南北和東西各有兩組信號燈,分別是直行和左轉彎,LED數碼管顯示2位:顯示秒。南北方向直行綠燈時間為20s,左轉綠燈時間為17s;東西方向直行綠燈時間為27s,左轉方向為22s。黃燈時間為3s。
(2)發揮部分
a.系統存儲兩套十字路口配時方案,可以通過按鍵來進行選擇;
b.利用串口調試助手或編寫上位機軟件,通過上位機來人工設定十字路口配時方案。
1.2 系統的方案設計
1.2.1 系統方案:
本次課程設計所采用的方案是用單片機控制十字路口交通燈。單片機具有結構簡單、編程方便、經濟、易于連接等優點,特別是其內部定時器、計數器、中斷系統資源豐富可對交通燈進行精確的控制,有應用價值,可擴展功能多,靈活性比較強。
1.2.2系統的構成:
整個系統的構成以80C51單片機為核心,由I/O口擴展,LED數碼管顯示,緊急情況中斷電路還有復位電路等組成。
單片機作為整個硬件系統的核心,它既是協調整個工作系統的控制器,又是數據處理器。它由單片機、時鐘電路、復位電路等組成。行車方向指示采用LED發光二極管,可有紅、綠兩種顏色指示放行與禁止,黃燈作為紅綠轉換的提示,形象直觀。
本系統為交通信號燈設計了兩種不同的配時方案,可以根據道路實時交通量的大小選擇最佳配時方案。同時本系統還配有串口調試助手,可以通過串口發送數據從而達到改變配時時間的效果。
1.3系統的硬件設計
本系統的硬件主要由以下幾部分組成:80C51單片機、電阻、LED數碼管、LED發光二極管、電容、電解電容、晶體振蕩器、開關、標準RS232端口。電路圖是在Proteus中來連接完成的。
1.3.1 系統硬件的設計步驟

圖1 系統硬件設計流程圖
1.3.2 系統硬件電路連接效果

圖2 硬件電路連接效果圖
1.4 系統的軟件設計
本系統的軟件設計部分全部在Keil uvision4中完成,采用的編程語言為Keil C51.
1.4.1 系統的軟件設計步驟

圖3 系統軟件設計流程圖
二、(選題一)實踐部分
2.1 系統的硬件原理與說明
2.1.1 系統的硬件仿真效果圖


圖4 硬件仿真效果圖
2.1.2 仿真圖說明:
當開關1按下時,交通信號燈首先執行第一套配時方案,首先,南北方向的直行是綠燈,東西方向的直行和左轉均為紅燈,待南北方向的直行時間變為0時,黃燈閃爍3秒,然后南北方向的左轉變為綠燈,東西方向的直行和左轉仍然全部為紅燈;待南北方向的左轉時間變為0時,黃燈仍然閃爍3秒,然后東西方向的直行變為綠燈,以此類推,信號燈亮的順序和南北方向一致。配時方案2中信號燈亮的順序和配時方案一的順序一致,只是亮的時間不同。
本系統在設計的過程中還使用了串口調試助手,修改的是南北方向直行的時間的個位上的數值。
2.2系統硬件調試的過程中出現的問題以及解決的措施
問題:
信號燈點亮的順序不對。
串口不能正常使用。
措施:
重新計算信號燈的字模。
重新連接串口。
2.3系統軟件調試的過程中出現的問題以及解決的措施
問題:
接收不到串口發來的數據。
措施:
給定義的變量賦初值。
三、(選題一)結束語
通過本次課程設計,使我得到了一次用專業知識、專業技能分析和解決問題全面系統的鍛煉。使我在51單片機的基本原理、單片機應用系統開發過程,以及在常用編程設計思路技巧(特別是C語言)的掌握方面都能向前邁了堅實的一步。
首先,我感觸最深的當屬查閱大量的設計資料了。為了讓自己的設計更加完善,查閱這方面的設計資料是十分必要的,在資料中查看與自己的設計相似的只是,在此基礎上完善直至符合設計要求。
其次,在這次課程設計中,我們運用到了以前所學的專業知識,如:C語言、proteus制圖。編寫的程序與仿真電路圖配合使用,發現問題,解決問題,在解決問題的過程中,我受益頗多。
最后,要做好一個課程設計,就必須要有一個清晰的思路和一個完整的的軟件流程圖;在設計程序時,一次性就將整個程序設計好的概率很小,反復修改、不斷改進是程序設計的必經之路,一個完美的代碼通常是要修改很多次的;要養成注釋程序的好習慣,一個程序的完美與否不僅僅是實現功能,而應該讓人一目了然地明白設計者的思路,這樣也為資料的保存和交流提供了方便;在設計過程中應該將每次遇到的問題記錄下來,并分析清楚,從中學到的知識也會讓我受益終身。
單片機源碼:
#include<reg51.h>
sbit LED1=P1^0;
sbit LED2=P1^1;
unsigned char code DIG_CODE[10]={0x6f/*9*/,0x7f/*8*/,0x07/*7*/,0x7d/*6*/,0x6d/*5*/,0x66/*4*/,0x4f/*3*/,0x5b/*2*/,0x06/*1*/,0x3f/*0*/};
unsigned int time;
unsigned int LedNumVal[2];
unsigned int button;
static unsigned char rec;
static unsigned char recs;
static unsigned char recg;
void Delay (unsigned int a )
{
unsigned char i=1;
unsigned int time=0;
if(time==a)
{i++;
}
}
void Display_show( int a , int b )
{
int i=1;
int j;
int k;
LedNumVal[0] = (9 - b) * 1000;
LedNumVal[1] = (9 - a) * 1000;
while(i==1)
{
LED2=0;
P0=DIG_CODE[LedNumVal[0] / 1000];
Delay(5);
if(LedNumVal[0] > 10000) //
{
LedNumVal[1] = LedNumVal[1] + 1000; //
LedNumVal[0] = 0; //b=9
}
j = 10;
while(j--);
P0 = 0x00;
LED2 = 1;
LED1=0;
P0=DIG_CODE[LedNumVal[1] / 1000];
Delay(5);
if(LedNumVal[1] == 9000) //
{
if(LedNumVal[0] > 9500) //
{
i++; //??b<0
}
}
k = 10; //
while(k--);
P0 = 0x00;//
LED1 = 1;
}
}
void main(void)
{
TMOD = 0x21; //
TH0 = 0xFE; //
TL0 = 0x0C ; //
TH1=TL1=0xf4; //
TR1=1; /
ES=1; //
PS=1; //
PT0=0; /
PCON=0; //
SCON=0x50;
IT0=1; //
EA = 1; //
ET0=1; //?
TR0= 1; /
EX0=1; /
EX1=1;
rec=0; //receive初值
while(1)
{
if(button==1)
{
if((button==1)&&(rec==0)) P2=0X7E; Display_show(1,2); //南北方向12s
if((button==1)&&(rec!=0)) P2=0x7e; Display_show(recs,recg);
P2=0X7D;
Display_show(0,3);
//??????3s
P2=0X7B;
Display_show(0,7);
//7s
P2=0X7D;
Display_show(0,3);
//3s
P2=0XE7;
Display_show(0,7);
//7s
P2=0XD7;
Display_show(0,3);
//3s
P2=0XB7;
Display_show(0,7);
//7s
P2=0XD7;;
Display_show(0,3);
//3s
}
if(button==2)
{
P2=0X7E;
Display_show(2,8);
//28s
P2=0X7D;
Display_show(0,3);
//3s
P2=0X7B;
Display_show(1,2);
//12s
P2=0X7D;
Display_show(0,3);
//3s
P2=0XE7;
Display_show(2,3);
//23s
P2=0XD7;
Display_show(0,3);
//3s
P2=0XB7;
Display_show(1,0);
//10s
P2=0XD7;;
Display_show(0,3);
//3s
}
}
}
void T0zd(void) interrupt 1 //T0 (1ms)
{
TH0 = 0xFE;
TL0 = 0x0C ;
LedNumVal[0]++;
time++;
}
void int0(void) interrupt 0 using 0
{
EX0=0;
button = 1;
EX0=1;
}
void int1(void) interrupt 2 using 0
{
EX1=0;
button = 2;
EX1=1;
}
void receiver() interrupt 4
{
if(RI==1)
{
RI=0;
rec=SBUF;
SBUF=rec;
while(TI==0);
TI=0;
recg=rec%16; //個位
recs=rec/16*10; //十位
}
}
全部資料51hei下載地址:
交通信號燈.zip
(8.04 MB, 下載次數: 113)
2019-1-15 13:16 上傳
點擊文件名下載附件
|