思路:
紅燈停,綠燈行,黃燈閃爍提示行人紅綠燈即將切換。四個方向各有壹個紅、黃、綠顯示和兩個數碼管。
東西道為人行道(20秒),南北道為車行道(60秒),黃燈延時最後三秒時,閃爍並切換。
三、硬件電路設計
此電中路設計采用AT89C51單片機,74LS47(數碼管驅動)74LS373(數碼管驅動輸出鎖存),8個數碼管顯示其延時值,四個紅、黃、綠指示燈。硬件設計關鍵在於,延時顯示時,要考慮到當個位數字顯示時,要確保十位數字顯示輸出的不變。因此,可加輸出鎖存器。在延時最後三秒時,要讓黃燈進行閃爍,並同時顯示數字(這壹步在軟件設計上很關鍵)。
四、軟件程序(C語言)
以下是整個設計的軟件程序,直接可以編譯成*。Hex代碼。通過以上電路,下載到單片機,可直接運行。
//*****************************//
//程序名:十字路口交通燈控制
//編寫人:黃庭劍
//初寫時間:2009年1月2日
//程序功能:南北為車行道,延時60秒;東西方向為人行道,延時20秒,且在最後3秒黃燈顯示2秒鐘再實現切換.
//CPU說明:AT89C51型單片機;?24MHZ晶體振蕩器
//完成時間:2009年1月6日
//*****************************//
#include<stdio.h>
#include<reg51.h>
#include<intrins.h>
sfr?p0=?0x80;
sfr?p1=?0x90;
sfr?p2=?0xA0;
sfr?p3=?0xb0;?//這部分內容其實在“#include<reg51.h>”裏已經有,但裏面定義的必須區分大小寫,在這裏,因為我程序采用的是小寫,reg51.h裏對各個端口與寄存器的定義都是大寫,所以在編譯連接時,會報錯,所以,在本設計程序裏,我只用到了端口,在這裏也就只定義了四個,而沒有去改reg51.h裏面的內容。其實兩者是壹樣的。
sbit?sw?=?p0^0;
sbitOE=P0^6;
sbitLE=P0^7;?//74LS373鎖存器控制端定義
char?display[]={?0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99?};?//p1口的數碼管時間顯示調用,利用74L74BCD碼,8位驅動輸出;
//函數聲明?begin
void?delay1(int?count);
void?delay_long(int?number1,int?number2);
voidpeople_car_drive();
//函數聲明end
//***********************//延時子程序
void?delay1(int?count)
{?int?i;for(i=count;i>0;i--)
{?;}?
}void?delay_long(int?number1,int?number2)
{int?a,b;
for(a=number1;a>0;a--){
for(b=number2;b>0;b--)
{?_nop_();?}}
}//**********************//延時子程序
voidpeople_car_drive() {intp_1=2,i,j=9,p_2=6;//****************//行人通行時,延時20秒
p2=0x09;?//南北紅燈亮p3=0x24;?//東西綠燈亮
while(p_1-->0) {?LE=1;OE=0;
if(p_1==0){OE=1;}//當十位數減到0時,只顯示個位數
p1=display[p_1];
delay1(1000);
LE=0;?
j=9;
for(i=10;i>0;i--){?
if(p_1==0&&j==3)break;?//減到3時退出循環,讓其黃燈閃爍顯示 p1=display[j--]; delay_long(16000,2); if(sw==1)return;}
}?//*******************************************************************************//
p2=0x12;?//南北黃燈閃爍三秒,以提醒行人註意 p3=0x12;? p1=display[3];? delay_long(8000,1); p2=0x00;? p3=0x00;? delay_long(14000,1); p2=0x12; p3=0x12; p1=display[2]; delay_long(8000,1); p2=0x00;? p3=0x00; delay_long(14000,1); p2=0x12; p3=0x12; p1=display[1]; delay_long(8000,1); p2=0x00;? p3=0x00; delay_long(14000,1);//*****************以下是車輛通行時延時60秒//
p2=0x24;?//南北綠燈亮
p3=0x09;?//東西紅燈亮
while(p_2-->0) {?LE=1;OE=0;
if(p_2==0){OE=1;}//當十位數減到0時,只顯示個位數
p1=display[p_2];
delay1(1000);
LE=0;
j=9;
for(i=10;i>0;i--){?
if(p_2==0&&j==3)break;?//減到2時退出循環 p1=display[j--]; delay_long(16000,2); if(sw==1)return;?}
} p2=0x12;//南北黃燈閃爍三秒,以提醒行人註意 p3=0x12;? p1=display[3];? delay_long(8000,1); p2=0x00;? p3=0x00;? delay_long(14000,1); p2=0x12; p3=0x12; p1=display[2]; delay_long(8000,1); p2=0x00;? p3=0x00; delay_long(14000,1); p2=0x12; p3=0x12; p1=display[1]; delay_long(8000,1); p2=0x00;? p3=0x00; delay_long(14000,1);//南北黃燈閃爍三秒完畢 } void?main()//主函數入口處{
p0=0x01;
p1=0x00;
p2=0x00;
p3=0x00;//初始化各端口
{?while(1)? { if(sw==0){?people_car_drive();}
else
{p2=0x00;
p3=0x00;//關閉所有交通燈
} } }}
詳情訪問:/hjiannew/