仿真圖proteus 7.8
程序編譯器:keil 4/keil 5
編程語言:C語言
設計編號:J000
功能說明:
采用51單片機以及單片機最小系統(tǒng)和三極管驅動電路以及外圍的按鍵和數(shù)碼管顯示等部件,設計一個基于單片機的交通燈設計。
1.四路交通燈,帶有紅綠燈倒計時,綠燈倒計時結束后轉黃燈5秒,再轉紅燈。
2.緊急情況下按鍵緊急按鈕,四路黃燈快閃。
3.可以動態(tài)設置紅綠燈時間。
涉及知識點:按鍵掃描,定時器,數(shù)碼管驅動。
??開題報告
內(nèi)容要求:
一、 任務
近年來隨著科技的飛速發(fā)展,單片機的應用正在不斷深入,同時帶動傳統(tǒng)控制檢測技術日益更新。在實時檢測和自動控制的單片機應用系統(tǒng)中,單片機往往作為一個核心部件來使用,僅單片機方面知識是不夠的,還應根據(jù)具體硬件結構軟硬件結合,加以完善。
十字路口車輛穿梭,行人熙攘,車行車道,人行人道,有條不紊。那么靠什么來實現(xiàn)這井然秩序呢?靠的就是交通信號燈的自動指揮系統(tǒng)。交通信號燈控制方式很多。本系統(tǒng)采用STC89C52單片機以及單片機最小系統(tǒng)和三極管驅動電路以及外圍的按鍵和數(shù)碼管顯示等部件,設計一個基于單片機的交通燈設計。設計通過兩位一體共陰極數(shù)碼管顯示,并能通過按鍵對定時進行設置。本系統(tǒng)實用性強、操作簡單、擴展功能強。設計通過STC89C52單片機以及單片機最小系統(tǒng)和三極管驅動數(shù)碼管(數(shù)碼管更亮,白天看的很清楚)以及外圍的按鍵和數(shù)碼管顯示等部件,數(shù)碼管倒計時顯示時間。
??仿真圖(提供源文件):
??系統(tǒng)硬件設計
根據(jù)上面的功能要求,硬件系統(tǒng)主要有單片機模塊、指示燈模塊和倒計時顯示模塊。各模塊選擇如下
??主控制器選擇
單片機(Microcontrollers)是一種集成電路芯片,是采用超大規(guī)模集成電路技術把具有數(shù)據(jù)處理能力的中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統(tǒng)、定時器/計數(shù)器等功能(可能還包括顯示驅動電路、脈寬調制電路、模擬多路轉換器、A/D轉換器等電路)集成到一塊硅片上構成的一個小而完善的微型計算機系統(tǒng),在工業(yè)控制領域廣泛應用。從上世紀80年代,由當時的4位、8位單片機,發(fā)展到現(xiàn)在的300M的高速單片機。本文的單片機特指51單片機,具體芯片型號是STC89C52RC。需注意STC89C51,STC89C52,AT89C51,AT89C52都是51單片機的一種具體芯片型號。
AT89C51是AT89C5X系列單片機的典型產(chǎn)品,它采用ATMEL的高密非易失存儲技術制造并和工業(yè)標準MCS—51指令集和引腳結構兼容。通過在單塊芯片上組合通用的CPL1和快閃存儲器,ATMEL公司生產(chǎn)的AT89C52是一強勁的微型計算機,它對許多嵌入式控制的應用,提供了一種高度靈活和成本低的解決辦法。芯片AT89C52是ATMEL公司生產(chǎn)的帶2K字節(jié)快閃存儲器的8位單片機。
? 該單片機還具有體積小,價格低等特點。AT89C51單片機包含中央處理器、程序存儲器(ROM)、數(shù)據(jù)存儲器(RAM)、定時/計數(shù)器、并行接口、串行接口和中斷系統(tǒng)等幾大單元及數(shù)據(jù)總線、地址總線和控制總線等三大總線。
??系統(tǒng)硬件結構圖
中央處理器(CPU)是整個單片機的核心部件,是8位數(shù)據(jù)寬度的處理器,能處理8位二進制數(shù)據(jù)或代碼,CPU負責控制、指揮和調度整個單元系統(tǒng)協(xié)調的工作,完成運算和控制輸入輸出功能等操作。
AT89C51內(nèi)部有128個8位用戶數(shù)據(jù)存儲單元和128個專用寄存器單元,它們是統(tǒng)一編址的,專用寄存器只能用于存放控制指令數(shù)據(jù),用戶只能訪問,而不能用于存放用戶數(shù)據(jù),所以,用戶能使用的RAM只有128個,可存放讀寫的數(shù)據(jù),運算的中間結果或用戶定義的字型表。
AT89C51共有4096個8位掩膜ROM,用于存放用戶程序,原始數(shù)據(jù)或表格。 AT89C51有兩個16位的可編程定時/計數(shù)器,以實現(xiàn)定時或計數(shù)產(chǎn)生中斷用于控制程序轉向。
AT89C51共有4組8位I/O口(P0、P1、P2或P3),用于對外部數(shù)據(jù)的傳輸。 AT89C51內(nèi)置一個全雙工串行通信口,用于與其它設備間的串行數(shù)據(jù)傳送,該串行口既可以用作異步通信收發(fā)器,也可以當同步移位器使用。
AT89C51具備較完善的中斷功能,有兩個外中斷、兩個定時/計數(shù)器中斷和一個串行中斷,可滿足不同的控制要求,并具有2級的優(yōu)先級別選擇。
??時鐘及復位電路
AT89C51內(nèi)置最高頻率達12MHz的時鐘電路,用于產(chǎn)生整個單片機運行的脈沖時序,但AT89C51單片機需外置振蕩電容。
本設計中,使單片機運行在最小系統(tǒng)。
時鐘電路由兩個20nF的微調電容和一個晶振組成。AT89C51內(nèi)部有一個用于構成振蕩器的高增益反相放大器,它的輸入端為芯片引腳XTAL1,輸出端為引腳XTAL2。這兩個引腳接石英晶體振蕩器和微調電容,構成一個穩(wěn)定的自激振蕩器。本系統(tǒng)采用12Hz的振蕩器,機器周期為1us。復位操作有上電自動復位、按鍵電平復位和外部脈沖復位三種方式。
??指示燈及倒計時模塊
(1)指示燈模塊:
設計電路中每個路口的控制信號燈應有三個,即紅燈、黃燈、綠燈各一個。因此,本電路的設計中應用到紅燈、黃燈、綠燈個四個。同一方向的兩個路口的同一顏色指示燈是同時亮滅,為簡化電路,可讓這兩個燈接同一引腳。這樣可用P1口控制所有的指示燈。
按照設計,指示燈采用紅/綠/黃三種發(fā)光二極管。該組件及其與單片機引腳的接法如下:
??倒計時模塊:
利用兩個74HC573鎖存器驅動四個兩位數(shù)碼管,因為南北方向和東北方向的倒計時時間是一樣的,所以倒計時實際上只有兩個顯示。
??程序
??軟件主流程框架
? 開機上電便處于正常運行狀態(tài),南北方向通行30秒后變?yōu)闁|西方向通行30秒,如此60秒循環(huán)一次,使得東西方向和南北方向交替通行。
? 顯示系統(tǒng)則顯示到下一次改變通行方向所剩的時間,利于司機調整車輛狀況。每到通行方向轉換時,正在通行的方向綠燈熄滅,變?yōu)辄S燈閃爍,提醒司機注意通行方向的改變,避免不必要的危險。
? 本設計支持動態(tài)修改東西南北方向的紅綠燈時間。短按設置/退出設計進入修改模式。先修改南北方向綠燈時間,再短按修改東西方向紅燈時間,按第四個按鍵保存設置的時間。
? 緊急情況下,可以通過按鍵設置四方向黃燈。
? 延時方法可以有兩種,一種是利用MCS-51內(nèi)部定時器才生溢出中斷來確定1秒的時間,另一種是采用軟延時的方法。本程序的倒計時采用軟件延時。
??main函數(shù)
以下是主函數(shù)
#define _MAIN_C
#include "use.h"
#include "main.h"
#include "time.h"
#include "key.h"
bit flag1s;
uchar count1s,NS_time,WE_time;
uchar GreenTime=30,RedTime=35;//綠燈時間和紅燈時間,紅燈要比綠燈時間長
uchar index=0;
enum eStaSysterm StaSysterm=NormalRun;
void main()
{
EA=1; //開總中斷
InintTimer0(); //初始化定時器0
while(1)
{
LEDScan(); //數(shù)碼管即LED掃描
KeyDriver(); //鍵盤驅動掃描
if(flag1s)
{
flag1s=0;
NS_time--; //紅綠燈倒計時時間減
WE_time--;
}
}
}
void InintTimer0()
{
TMOD=0X01;
TH0=0X4C;
TL0=0X00;
ET0=1;
TR0=1;
}
void Timer0() interrupt 1
{
TH0=0XBB;
TL0=0X00;
KeyScan();
if(++count1s<50) return;
count1s=0;
if(StaSysterm==NormalRun) flag1s=1; //非正常運行時,不紅綠燈數(shù)值不減一
}
void LEDScan()
{
if(StaSysterm==NormalRun) //正常運行
{
if(NS_time==0 || WE_time==0)//當東西或者南北方向通行時間倒數(shù)到0,切換狀態(tài)
{
switch(index) //改變紅綠燈的狀態(tài),狀態(tài)機
{
case 0:
{
index=1;
NS_time=GreenTime;//南北方向綠燈通行時間
WE_time=RedTime;//東西綠燈方向通行時間
P2=0X09; //需要亮的燈轉換為二進制位0000 1001,對應P2口的P2^0和P2^3,
//對應仿真圖的綠燈L0和紅燈L3亮。
}break;
case 1:
{
index=2;
NS_time=RedTime-GreenTime;
P2=0X0A;
}break;
case 2:
{
index=3;
NS_time=RedTime;
WE_time=GreenTime;
P2=0X24;
}break;
case 3:
{
index=0;
WE_time=RedTime-GreenTime;
P2=0X14;
}break;
default:break;
}
}
Seg_Display(NS_time/10,0);
Seg_Display(NS_time%10,1);
Seg_Display(WE_time/10,2);
Seg_Display(WE_time%10,3);
}
else if(StaSysterm==UrgentRun)
{ //緊急情況運行
P2=0x12;
Delayms(200);
P2=0x00;
Delayms(200);
}
else //設置調整紅綠燈時間
{
index=0;
NS_time=0;
WE_time=0; //重新初始化紅綠燈并運行
UrgentScan();
}
}