資源簡介
以單片機為核心,設計一個簡單交通燈控制系統,設A車道與B車道交叉組成十字路口,A是主道,B是支道。設計要求如下:
(1) 用發光二極管模擬交通信號燈、兩個方向分別設置紅、綠、黃3種通行指示燈,用按鍵開關模擬車輛檢測信號。
(2) 正常情況下,A、B兩車道輪流放行, A車道放行40秒,其中5秒用于警告,B車道放行25秒,其中5秒用于警告。有計時牌顯示路口通行轉換剩余時間。
(3) 在交通繁忙時,交通信號燈控制系統應有手控開關,可人為地改變信號燈的狀態,以緩解交通擁擠狀況。在B車道放行期間,若A車道有車而B車道無車,按下開關K1使A車道放行15秒;在A車道放行期間,若B車道有車而A車道無車,按下開關K2使B車道放行15秒。
(4) 有特種車輛如119、120通過路口時,系統可轉為特種車輛放行,其他車輛禁止通行的狀態,15s后系統恢復正常管理。
(5) 兩個方向放行的時間可以通過鍵盤設置。

代碼片段和文件信息
#include
#define?uint?unsigned?int
#define?uchar?unsigned?char
uchar?code?SEG7[10]={0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f}; //段碼組合共陰極
uchar?code?ACT[4]={0xfa0xf50xfa0xf5};?//位碼組合 ?低有效
//*************************************************************************************
uchar?sec=15cntflag=0mnstatus=0ijsign1sign2sign3ab=0;??//cnt記錄一次中斷;flag控制黃燈閃爍;sign作為按鍵按下標記;
char??c=15d=10;
//*************************************************************************************
sbit?EWGREEN=P2^0;??????//定義六盞交通燈的端口?????????
sbit?EWYELLOW=P2^1;
sbit?EWRED=P2^2;
sbit?SNGREEN=P2^4;
sbit?SNYELLOW=P2^5;
sbit?SNRED=P2^6;
sbit?k1=P3^0; ????//?定義按鍵接口
sbit?k2=P3^1; ?
sbit?k3=P3^2;
sbit?k4=P3^3;
sbit?k5=P3^4;
sbit?k6=P3^5;
sbit?k7=P3^6;
//************************調用函數定義**************************************************
void?LED_ORD(uchar);
void?LED_5S(uchar);
void?inter0(uchar);
void?display(uchar);
void?display1(uchar);
void?keys1();
void?keys2();
void?keys3();
//*************************中斷程序*************************************************
void?inrupt(void)
{
TMOD=0x01;
TH0?=?-(50000/256);
TL0 =?-(50000%256);
ET0=1;
TR0=1;
EA=1;
}
//**************************中斷處理程序***************************************************
void?timeout(void)?interrupt?1
{
TH0=-(50000/256);
TL0=-(50000%256);
cnt++;
//**********************************//
keys1();??//控制“東西”道路時間的按鍵(有20和30秒的選擇)
keys2();??//控制“南北”道路時間的按鍵
keys3();??//緊急停止通車按鍵
//****************************************//
switch(status)
{
case?0: m=1;n=1;i=0;j=1;?break; ?//status是0和1兩種狀態;控制是輪到“東西”顯示還是“南北”顯示;
case?1:?m=2;n=2;i=2;j=3;?break;
case?2:m=3;n=3;break;
}
if(flag==0){LED_ORD(m);}???//紅綠燈正常顯示
??????else
??????{
??? ?if(cnt<=10){LED_5S(n);} ?//黃燈閃
? ?else?{EWYELLOW=1;SNYELLOW=1;} ?// 黃燈滅
??????}
if(cnt>=20)
{
sec--;cnt=0;
//*****************************//
if(status==0)
{
if(k2==0)?{status=1;flag=0;sec=8;}
if(k3==0) {status=2;a=sec;flag=0;sec=4;b=0;}
}
if(status==1)
{
if(k1==0)?{status=0;flag=0;sec=6;}
if(k3==0) {status=2;a=sec;flag=0;sec=4;b=1;}
}
//*************************************//
if(sec<=5)
{
??flag=1;
?if(sec==0)
??{
if(status==0)???????//讓兩次交替循環下去
{
???flag=0;i=2;j=3; //status=0狀態結束,開始status=1狀態,重新賦值;?
???status=1;sec=d;
}
? ?//flag重置為0;flag用來提示到了5秒內閃黃燈;
else?if(status==1)
{
status=0;flag=0;i=0;j=1;sec=c;??//status=1狀態結束,開始status=0狀態,重新賦值;
}
??else?if(status==2&&b==0){sec=a;status=0;flag=0;}
??else?if(status==2&&b==1){sec=a;status=1;flag=0;}
//此處多添加了i和j重新復制;是因為:
??} ?//當一個狀態過后到了這里,但是i和j如果不重新賦值則還是等于上個狀態顯示的位碼;
????} //則接下去會在原來顯示的位碼處顯示一個中斷時間,又跳回新的顯示位碼;
}
}
void?LED_ORD(uchar?f)??//控制東西、南北紅綠燈
{
switch(f)
{
case?1:?P2=0xBE;?break;
case?2: P2=0xEB;?break;
case?3:?P2=0xbb;break;
}
}
void?LED_5S(
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2010-12-28?13:11??智能交通燈\
?????文件????????4736??2010-12-28?13:07??智能交通燈\jtd.c
?????文件????????6376??2005-03-22?15:22??智能交通燈\STARTUP.A51
?????文件???????14048??2010-12-28?13:07??智能交通燈\STARTUP.LST
?????文件?????????749??2010-12-28?13:07??智能交通燈\STARTUP.OBJ
?????文件??????109553??2010-12-28?13:07??智能交通燈\traffic_light.DSN
?????文件????????2184??2010-12-28?13:07??智能交通燈\交通燈.Uv2
?????文件???????20480??2010-12-28?13:11??智能交通燈\說明.doc
- 上一篇:webuploader分片上傳
- 下一篇:李愛華、程磊_面向對象程序設計課后答案
評論
共有 條評論