欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
注釋很詳細的單片機交通燈程序Proteus仿真原理圖 可修改通行時間功能很多
[打印本頁]
作者:
123yqs
時間:
2023-6-8 10:07
標題:
注釋很詳細的單片機交通燈程序Proteus仿真原理圖 可修改通行時間功能很多
基本要求
(1)控制器:推薦51系列單片機;
(2)仿真軟件:Proteus 7.7;
(3)路口為十字路口,需要加入行人的通行時間,橙色燈的3秒等待功能必須添加;
(4)可以在允許期間隨時修改各個路口的通行時間;
(5)通行策略如下:每個路口的車輛依次通行,即通行完A路口后,在進行B路口的車輛通行,在某個路口通行時,其他路口的車輛均處于等待狀態,在沒有車輛進入的路口(除車輛右轉外),可進行人行通道是否通行的設置。
系統組成要求
輸入部分:
允許控制:按鈕(1),切換信息顯示的路口;
參數設置:按鈕(5),功能切換(修改、退出)、(修改項)移動、減少(1秒)、增加(1秒);
(修改項為每個路口的車輛(直行、左轉)通行時間,人行時間根據其他路口時間的設置自動獲取)
(按鍵也可采用KEYPAD-PHONE模塊進行整合,利用文字功能進行在相關數字下進行標注)
顯示部分:
采用LCD1602進行相關信息的顯示,信息顯示項為:路口、直行時間(秒)、左轉時間(秒)、人行通道時間(秒);均采用倒計時方式,正值表示允許通行,負值表示等待。
采用TRAFFIC LIGHTS模塊進行三色交通燈的模擬,LED燈進行人行通道的模擬。
數據連接部分(推薦,非硬性要求)
由于輸出數據線較多,可以采用74HC595等并串轉換期間進行信息的顯示。
運行流程(功能要求)
(1)系統開始運行時可立即進入工作狀態;
(2)按下切換按鈕,可以在LCD上觀測到各個路口的相關時間數據;
(3)按下修改按鈕,工作狀態被打斷,此時可以進行各個路口車輛運行時間的修改。
工作量要求
根據技術指標或功能要求合理設計整個課題的實現邏輯,完成總體設計;
利用Proteus仿真軟件搭建完整的控制系統,對于不能直接仿真的模塊尋找合理的替代方式;
設計合理的系統控制流程;
利用(Keil C)μVision軟件編寫C語言控制程序,并完成系統功能的調試;
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif
(150.86 KB, 下載次數: 30)
下載附件
2023-6-8 17:17 上傳
單片機源程序如下(注釋非常詳細):
#include "Common.h"
#include "lcd1602.h"
#include "stdio.h"
//引腳定義
sbit KeyChangeDisp = P2^3; //切換顯示按鍵
sbit KeySet = P2^4; //設置模式按鍵
sbit KeyMove = P2^5; //移動按鍵
sbit KeyAdd = P2^6; //加按鍵
sbit KeySub = P2^7; //減按鍵
/* 直行交通燈定義 */
sbit LedRedNS = P1^2; // 南北直行方向紅燈
sbit LedGreenNS = P1^0; // 南北直行方向綠燈
sbit LedYellowNS = P1^1;// 南北直行方向黃燈
sbit LedRedEW = P1^5; // 東西直行方向紅燈
sbit LedGreenEW = P1^3; // 東西直行方向綠燈
sbit LedYellowEW = P1^4;// 東西直行方向黃燈
/* 左轉交通燈定義 */
sbit LedLeftRedNS = P3^2; // 南北左轉方向紅燈
sbit LedLeftGreenNS = P3^0; // 南北左轉方向綠燈
sbit LedLeftYellowNS = P3^1;// 南北左轉方向黃燈
sbit LedLeftRedEW = P3^5; // 東西左轉方向紅燈
sbit LedLeftGreenEW = P3^3; // 東西左轉方向綠燈
sbit LedLeftYellowEW = P3^4;// 東西左轉方向黃燈
/* 人行道交通燈定義 */
sbit LedPeopleRedNS = P1^6; // 南北人行紅燈
sbit LedPeopleGreenNS = P1^7; // 南北人行綠燈
sbit LedPeopleRedEW = P3^6; // 東西人行紅燈
sbit LedPeopleGreenEW = P3^7; // 東西人行綠燈
/* 定義變量保存各方向的剩余時間,正數為剩余通行時間,負數為剩余等待時間 */
char RnTime_NS = 0; //南北方向直行剩余時間
char RnTime_EW = 0; //東西方向直行剩余時間
char RnLeftTime_NS = 0; //南北方向左轉剩余時間
char RnLeftTime_EW = 0; //東西方向左轉剩余時間
char RnPeopleTime_NS = 0; //南北方向人行剩余時間
char RnPeopleTime_EW = 0; //東西方向人行剩余時間
//相關變量定義
Uint8 TimeGreen_NS=5; //南北方向運行時間
Uint8 TimeGreen_EW=5; //東西方向運行時間
Uint8 TimeLeftGreen_NS=5; //南北左轉方向運行時間
Uint8 TimeLeftGreen_EW=5; //東西左轉方向運行時間
Uint8 TimeYellow = 3; //黃燈時間
Uint8 index=0;
Uint8 flag_1S; //1s時間基準標志
Uint8 IntTimes=0; //記錄定時器中斷次數
Uint8 Time_NS,Time_WE; //南北方向、東西方向換燈前剩余時間
Uint8 code StrNS1[] = "NS: SF TL XING";
Uint8 code StrEW1[] = "EW: SF TL XING";
Uint8 StrNum[] = " ";
Uint8 code Str[] = "NS NSL EW EWL";
Uint8 DispState = 0; // 顯示的狀態,0為顯示南北方向信息,1為顯示東西方向信息
Uint8 CopyLightP1; //備份交通燈狀態
Uint8 CopyLightP3; //備份交通燈狀態
Uint8 State = 0; //系統運行狀態標志位,0:正常運行;1:設置南北直行方向通行時間;2設置南北左轉通行時間
//3:設置東西直行通行時間;4設置東西左轉通行時間
//函數聲明
void KeyScan(); //按鍵掃描
void Display(); //數碼管動態顯示
void InitTimer0(); //定時器0初始化,提供時間基準
void FlashLED(); //控制交通燈的變化
void ProcTime(); // 處理各個方向剩余時間和等待時間
//主函數
void main()
{
InitTimer0(); //定時器0初始化
Init1602(); //初始化LCD1602
while (1)
{
KeyScan(); //按鍵掃描
FlashLED(); //led指示燈掃描
if(flag_1S==1) //定時器計時達到1秒
{
flag_1S=0; //滿1秒標志清零
Time_NS--; //南北東西通行時間各減1
Time_WE--;
ProcTime(); // 處理各個方向剩余時間和等待時間
}
}
}
void Timer0() interrupt 1 //定時器0中斷
{
TH0=(65536-20000)/256; //50ms一次中斷
TL0=(65536-20000)%256;
IntTimes++; //中斷次數計算器加一
if(IntTimes>=50) //進中斷50次,即為1秒
{
IntTimes=0; //中斷次數計算器清0
if(State == 0) //正常運行模式下倒計時減一
flag_1S=1; //1秒標志位置一
}
}
void InitTimer0() //定時器0初始化,提供時間基準
{
TMOD=0X01; //定時器0方式設置1
TH0=(65536-20000)/256; //初值設置 20ms
TL0=(65536-20000)%256; //初值設置
ET0=1; //使能定時器0中斷
TR0=1; //開定時器0
EA=1; //開總中斷
}
void ProcTime() // 處理各個方向剩余時間和等待時間
{
/* 大于0代表剩余為通行時間,每秒減一;小于0代表為等待時間(負數),每秒加一 */
if (RnTime_NS > 0)
{
RnTime_NS--;
}
else if(RnTime_NS < 0)
{
RnTime_NS++;
}
if (RnTime_EW > 0)
{
RnTime_EW--;
}
else if(RnTime_EW < 0)
{
RnTime_EW++;
}
if (RnLeftTime_NS > 0)
{
RnLeftTime_NS--;
}
else if(RnLeftTime_NS < 0)
{
RnLeftTime_NS++;
}
if (RnLeftTime_EW > 0)
{
RnLeftTime_EW--;
}
else if(RnLeftTime_EW < 0)
{
RnLeftTime_EW++;
}
if (RnPeopleTime_NS > 0)
{
RnPeopleTime_NS--;
}
else if(RnPeopleTime_NS < 0)
{
RnPeopleTime_NS++;
}
if (RnPeopleTime_EW > 0)
{
RnPeopleTime_EW--;
}
else if(RnPeopleTime_EW < 0)
{
RnPeopleTime_EW++;
}
}
void Display() //lcd顯示顯示
{
/* 顯示南北方向信息 */
if (DispState == 0)
{
Write1602_Str(0, 1, StrNS1, 16);// 屏幕第一行
sprintf(StrNum," %4.2d%4.2d%4.2d",(int)RnTime_NS,(int)RnLeftTime_NS,(int)RnPeopleTime_NS);
Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
}
else if (DispState == 1)
{
Write1602_Str(0, 1, StrEW1, 16);//寫字符串
sprintf(StrNum," %4.2d%4.2d%4.2d",(int)RnTime_EW,(int)RnLeftTime_EW,(int)RnPeopleTime_EW);
Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
}
}
void FlashLED() //交通燈的變化
{
if(State == 0) //正常運行模式
{
if(Time_NS==0 || Time_WE==0) //南北或東西方向有時間為0
{
switch(index) //改變紅綠燈的狀態,狀態機
{
case 0: /* 南北方向直行綠燈、南北人行綠燈,南北左轉紅燈、東西直行紅燈、東西左轉紅燈 */
{
index=1; //下次進入時切換方向
Time_NS = TimeGreen_NS; // 南北直行方向綠燈剩余時間
Time_WE=TimeGreen_NS + TimeLeftGreen_NS + TimeYellow * 2; //東西直行方向的等待時間
/* 計算各個方向的剩余時間和等待時間 */
RnTime_NS = Time_NS;
RnTime_EW = -(TimeGreen_NS + TimeLeftGreen_NS + TimeYellow * 2);
RnLeftTime_NS = -TimeYellow - RnTime_NS;
RnLeftTime_EW = -(TimeGreen_EW + TimeYellow) + RnTime_EW;
RnPeopleTime_NS = RnTime_NS; // 人行時間為對應方向的直行時間
RnPeopleTime_EW = RnTime_EW;
/* 南北方向直行綠燈、南北人行綠燈,南北左轉紅燈、東西直行紅燈、東西左轉紅燈 */
/* 直行交通燈 */
LedRedNS = 0; // 南北直行方向紅燈
LedGreenNS = 1; // 南北直行方向綠燈
LedYellowNS = 0; // 南北直行方向黃燈
LedRedEW = 1; // 東西直行方向紅燈
LedGreenEW = 0; // 東西直行方向綠燈
LedYellowEW = 0; // 東西直行方向黃燈
/* 直行交通燈 */
LedLeftRedNS = 1; // 南北左轉方向紅燈
LedLeftGreenNS = 0; // 南北左轉方向綠燈
LedLeftYellowNS = 0;// 南北左轉方向黃燈
LedLeftRedEW = 1; // 東西左轉方向紅燈
LedLeftGreenEW = 0; // 東西左轉方向綠燈
LedLeftYellowEW = 0;// 東西左轉方向黃燈
/* 人行道交通燈 */
LedPeopleRedNS = 0; // 南北人行紅燈
LedPeopleGreenNS = 1; // 南北人行綠燈
LedPeopleRedEW = 1; // 東西人行紅燈
LedPeopleGreenEW = 0; // 東西人行綠燈
}break;
case 1: /* 南北方向直行黃燈、南北人行紅燈,南北左轉紅燈、東西直行紅燈、東西人行紅燈 */
{
index=2; //下次進入時切換方向
Time_NS = TimeYellow; // 南北直行方向黃燈剩余時間
/* 計算各個方向的剩余時間和等待時間 */
RnTime_NS -= (TimeLeftGreen_NS + TimeGreen_EW + TimeLeftGreen_EW + TimeYellow * 4);
RnPeopleTime_NS = RnTime_NS; // 人行時間為對應方向的直行時間
/* 南北方向直行黃燈、南北人行紅燈,南北左轉紅燈、東西直行紅燈、東西人行紅燈 */
/* 直行交通燈 */
LedRedNS = 0; // 南北直行方向紅燈
LedGreenNS = 0; // 南北直行方向綠燈
LedYellowNS = 1; // 南北直行方向黃燈
LedRedEW = 1; // 東西直行方向紅燈
LedGreenEW = 0; // 東西直行方向綠燈
LedYellowEW = 0; // 東西直行方向黃燈
/* 直行交通燈 */
LedLeftRedNS = 1; // 南北左轉方向紅燈
LedLeftGreenNS = 0; // 南北左轉方向綠燈
LedLeftYellowNS = 0;// 南北左轉方向黃燈
LedLeftRedEW = 1; // 東西左轉方向紅燈
LedLeftGreenEW = 0; // 東西左轉方向綠燈
LedLeftYellowEW = 0;// 東西左轉方向黃燈
/* 人行道交通燈 */
LedPeopleRedNS = 1; // 南北人行紅燈
LedPeopleGreenNS = 0; // 南北人行綠燈
LedPeopleRedEW = 1; // 東西人行紅燈
LedPeopleGreenEW = 0; // 東西人行綠燈
}break;
case 2: /* 南北方向直行紅燈、南北人行紅燈,南北左轉綠燈、東西直行紅燈、東西左轉紅燈,東西人行紅燈 */
{
index=3; //下次進入時切換方向
Time_NS = TimeLeftGreen_NS; // 南北左轉方向綠燈剩余時間
/* 計算各個方向的剩余時間和等待時間 */
RnLeftTime_NS += TimeLeftGreen_NS;
/* 南北方向直行紅燈、南北人行紅燈,南北左轉綠燈、東西直行紅燈、東西左轉紅燈,東西人行紅燈 */
/* 直行交通燈 */
LedRedNS = 1; // 南北直行方向紅燈
LedGreenNS = 0; // 南北直行方向綠燈
LedYellowNS = 0; // 南北直行方向黃燈
LedRedEW = 1; // 東西直行方向紅燈
LedGreenEW = 0; // 東西直行方向綠燈
LedYellowEW = 0; // 東西直行方向黃燈
/* 左轉交通燈 */
LedLeftRedNS = 0; // 南北左轉方向紅燈
LedLeftGreenNS = 1; // 南北左轉方向綠燈
LedLeftYellowNS = 0;// 南北左轉方向黃燈
LedLeftRedEW = 1; // 東西左轉方向紅燈
LedLeftGreenEW = 0; // 東西左轉方向綠燈
LedLeftYellowEW = 0;// 東西左轉方向黃燈
/* 人行道交通燈 */
LedPeopleRedNS = 1; // 南北人行紅燈
LedPeopleGreenNS = 0; // 南北人行綠燈
LedPeopleRedEW = 1; // 東西人行紅燈
LedPeopleGreenEW = 0; // 東西人行綠燈
}break;
case 3: /* 南北方向直行紅燈、南北人行紅燈,南北左轉黃燈、東西直行紅燈、東西左轉紅燈,東西人行紅燈 */
{
index=4; //下次進入時切換方向
Time_NS = TimeYellow; // 南北左轉方向黃燈剩余時間
/* 計算各個方向的剩余時間和等待時間 */
RnLeftTime_NS -= (TimeGreen_EW + TimeLeftGreen_EW + TimeGreen_NS + TimeYellow * 4);
/* 南北方向直行紅燈、南北人行紅燈,南北左轉黃燈、東西直行紅燈、東西左轉紅燈,東西人行紅燈 */
/* 直行交通燈 */
LedRedNS = 1; // 南北直行方向紅燈
LedGreenNS = 0; // 南北直行方向綠燈
LedYellowNS = 0; // 南北直行方向黃燈
LedRedEW = 1; // 東西直行方向紅燈
LedGreenEW = 0; // 東西直行方向綠燈
LedYellowEW = 0; // 東西直行方向黃燈
/* 左轉交通燈 */
LedLeftRedNS = 0; // 南北左轉方向紅燈
LedLeftGreenNS = 0; // 南北左轉方向綠燈
LedLeftYellowNS = 1;// 南北左轉方向黃燈
LedLeftRedEW = 1; // 東西左轉方向紅燈
LedLeftGreenEW = 0; // 東西左轉方向綠燈
LedLeftYellowEW = 0;// 東西左轉方向黃燈
/* 人行道交通燈 */
LedPeopleRedNS = 1; // 南北人行紅燈
LedPeopleGreenNS = 0; // 南北人行綠燈
LedPeopleRedEW = 1; // 東西人行紅燈
LedPeopleGreenEW = 0; // 東西人行綠燈
}break;
case 4: /* 南北方向直行紅燈、南北人行紅燈,南北左轉紅燈、東西直行綠燈、東西左轉紅燈,東西人行綠燈 */
{
index=5; //下次進入時切換方向
Time_NS = TimeGreen_EW + TimeLeftGreen_EW + TimeYellow * 2; // 南北方向直行的等待時間
Time_WE = TimeGreen_EW; //東西直行方向綠燈的剩余時間
/* 計算各個方向的剩余時間和等待時間 */
RnTime_EW += TimeGreen_EW;
RnPeopleTime_EW = RnTime_EW;
/* 南北方向直行紅燈、南北人行紅燈,南北左轉紅燈、東西直行綠燈、東西左轉紅燈,東西人行綠燈 */
/* 直行交通燈 */
LedRedNS = 1; // 南北直行方向紅燈
LedGreenNS = 0; // 南北直行方向綠燈
LedYellowNS = 0; // 南北直行方向黃燈
LedRedEW = 0; // 東西直行方向紅燈
LedGreenEW = 1; // 東西直行方向綠燈
LedYellowEW = 0; // 東西直行方向黃燈
/* 直行交通燈 */
LedLeftRedNS = 1; // 南北左轉方向紅燈
LedLeftGreenNS = 0; // 南北左轉方向綠燈
LedLeftYellowNS = 0;// 南北左轉方向黃燈
LedLeftRedEW = 1; // 東西左轉方向紅燈
LedLeftGreenEW = 0; // 東西左轉方向綠燈
LedLeftYellowEW = 0;// 東西左轉方向黃燈
/* 人行道交通燈 */
LedPeopleRedNS = 1; // 南北人行紅燈
LedPeopleGreenNS = 0; // 南北人行綠燈
LedPeopleRedEW = 0; // 東西人行紅燈
LedPeopleGreenEW = 1; // 東西人行綠燈
}break;
case 5: /* 南北方向直行紅燈、南北人行紅燈,南北左轉紅燈、東西直行黃燈、東西左轉紅燈,東西人行紅燈 */
{
index=6; //下次進入時切換方向
Time_WE = TimeYellow; //東西直行方向黃燈的剩余時間
/* 計算各個方向的剩余時間和等待時間 */
RnTime_EW -= (TimeLeftGreen_EW + TimeGreen_NS + TimeLeftGreen_NS + TimeYellow * 4);
RnPeopleTime_EW = RnTime_EW; // 人行時間為對應方向的直行時間
/* 南北方向直行紅燈、南北人行紅燈,南北左轉紅燈、東西直行綠燈、東西左轉紅燈,東西左轉紅燈 */
/* 直行交通燈 */
LedRedNS = 1; // 南北直行方向紅燈
LedGreenNS = 0; // 南北直行方向綠燈
LedYellowNS = 0; // 南北直行方向黃燈
LedRedEW = 0; // 東西直行方向紅燈
LedGreenEW = 0; // 東西直行方向綠燈
LedYellowEW = 1; // 東西直行方向黃燈
/* 直行交通燈 */
LedLeftRedNS = 1; // 南北左轉方向紅燈
LedLeftGreenNS = 0; // 南北左轉方向綠燈
LedLeftYellowNS = 0;// 南北左轉方向黃燈
LedLeftRedEW = 1; // 東西左轉方向紅燈
LedLeftGreenEW = 0; // 東西左轉方向綠燈
LedLeftYellowEW = 0;// 東西左轉方向黃燈
/* 人行道交通燈 */
LedPeopleRedNS = 1; // 南北人行紅燈
LedPeopleGreenNS = 0; // 南北人行綠燈
LedPeopleRedEW = 1; // 東西人行紅燈
LedPeopleGreenEW = 0; // 東西人行綠燈
}break;
case 6: /* 南北方向直行紅燈、南北人行紅燈,南北左轉紅燈、東西直行紅燈、東西左轉綠燈,東西人行紅燈 */
{
index=7; //下次進入時切換方向
Time_WE = TimeLeftGreen_EW; //東西直行方向黃燈的剩余時間
/* 計算各個方向的剩余時間和等待時間 */
RnLeftTime_EW += TimeLeftGreen_EW;
/* 南北方向直行紅燈、南北人行紅燈,南北左轉紅燈、東西直行紅燈、東西左轉綠燈,東西人行紅燈 */
/* 直行交通燈 */
LedRedNS = 1; // 南北直行方向紅燈
LedGreenNS = 0; // 南北直行方向綠燈
LedYellowNS = 0; // 南北直行方向黃燈
LedRedEW = 1; // 東西直行方向紅燈
LedGreenEW = 0; // 東西直行方向綠燈
LedYellowEW = 0; // 東西直行方向黃燈
/* 直行交通燈 */
LedLeftRedNS = 1; // 南北左轉方向紅燈
LedLeftGreenNS = 0; // 南北左轉方向綠燈
LedLeftYellowNS = 0;// 南北左轉方向黃燈
LedLeftRedEW = 0; // 東西左轉方向紅燈
LedLeftGreenEW = 1; // 東西左轉方向綠燈
LedLeftYellowEW = 0;// 東西左轉方向黃燈
/* 人行道交通燈 */
LedPeopleRedNS = 1; // 南北人行紅燈
LedPeopleGreenNS = 0; // 南北人行綠燈
LedPeopleRedEW = 1; // 東西人行紅燈
LedPeopleGreenEW = 0; // 東西人行綠燈
}break;
case 7: /* 南北方向直行紅燈、南北人行紅燈,南北左轉紅燈、東西直行紅燈、東西左轉黃燈,東西人行紅燈 */
{
index=0; //下次進入時切換方向
Time_WE = TimeYellow; //東西直行方向黃燈的剩余時間
/* 計算各個方向的剩余時間和等待時間 */
RnLeftTime_EW -= (TimeGreen_NS + TimeLeftGreen_NS + TimeGreen_EW + TimeYellow * 4);
/* 南北方向直行紅燈、南北人行紅燈,南北左轉紅燈、東西直行紅燈、東西左轉黃燈,東西人行紅燈 */
/* 直行交通燈 */
LedRedNS = 1; // 南北直行方向紅燈
LedGreenNS = 0; // 南北直行方向綠燈
LedYellowNS = 0; // 南北直行方向黃燈
LedRedEW = 1; // 東西直行方向紅燈
LedGreenEW = 0; // 東西直行方向綠燈
LedYellowEW = 0; // 東西直行方向黃燈
/* 直行交通燈 */
LedLeftRedNS = 1; // 南北左轉方向紅燈
LedLeftGreenNS = 0; // 南北左轉方向綠燈
LedLeftYellowNS = 0;// 南北左轉方向黃燈
LedLeftRedEW = 0; // 東西左轉方向紅燈
LedLeftGreenEW = 0; // 東西左轉方向綠燈
LedLeftYellowEW = 1;// 東西左轉方向黃燈
/* 人行道交通燈 */
LedPeopleRedNS = 1; // 南北人行紅燈
LedPeopleGreenNS = 0; // 南北人行綠燈
LedPeopleRedEW = 1; // 東西人行紅燈
LedPeopleGreenEW = 0; // 東西人行綠燈
}break;
default:break;
}
}
Display(); //數碼管顯示剩余時間
/* index==2或者index==4或者index==6或者index==0時處于黃燈狀態,黃燈閃爍 */
if (index == 2)
{
/* IntTimes=50時為1秒,25為0.5秒,此處用于交通燈閃爍 */
if(IntTimes < 25)
{
LedYellowNS = 0; // 南北直行方向黃燈
}
else
{
LedYellowNS = 1; // 南北直行方向黃燈
}
}
else if (index == 4)
{
/* IntTimes=50時為1秒,25為0.5秒,此處用于交通燈閃爍 */
if(IntTimes < 25)
{
LedLeftYellowNS = 0;// 南北左轉方向黃燈
}
else
{
LedLeftYellowNS = 1;// 南北左轉方向黃燈
}
}
else if (index == 6)
{
/* IntTimes=50時為1秒,25為0.5秒,此處用于交通燈閃爍 */
if(IntTimes < 25)
{
LedYellowEW = 0; // 東西直行方向黃燈
}
else
{
LedYellowEW = 1; // 東西直行方向黃燈
}
}
else if (index == 0)
{
/* IntTimes=50時為1秒,25為0.5秒,此處用于交通燈閃爍 */
if(IntTimes < 25)
{
LedLeftYellowEW = 0;// 東西左轉方向黃燈
}
else
{
LedLeftYellowEW = 1;// 東西左轉方向黃燈
}
}
}
else if(State == 1) //設置南北直行時間
{
sprintf(StrNum,"%2.2d ",(int)TimeGreen_NS);
Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
}
else if(State == 2) //設置南北左轉時間
{
sprintf(StrNum," %2.2d ",(int)TimeGreen_EW);
Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
}
else if(State == 3) //設置東西直行時間
{
sprintf(StrNum," %2.2d ",(int)TimeLeftGreen_NS);
Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
}
else if(State == 4) //設置東西左轉時間
{
sprintf(StrNum," %2.2d",(int)TimeLeftGreen_EW);
Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
}
}
void SetModel() //紅綠燈設置模式
{
if(State == 0) //當前為正常運行模式
{
State=1; //狀態切換為設置南北通行時間
Write1602_Str(0, 1, Str, 16);// 屏幕第一行
// CopyLightP1=P1; //備份指示燈狀態
// CopyLightP3=P3; //備份指示燈狀態
}
else //當前為設置東西通行時間
{
State=0; //狀態切換為設置正常運行模式
// P1=CopyLight; //還原交通燈狀態
index=0; //交通燈重新啟動
Time_NS=0;
Time_WE=0;
RnTime_NS = 0;
RnTime_EW = 0;
RnLeftTime_NS = 0;
RnLeftTime_EW = 0;
RnPeopleTime_NS = 0;
RnPeopleTime_EW = 0;
}
}
void ADDTime() //紅綠燈時間加
{
if(State==1) //當前為設置南北通行時間
{
if(TimeGreen_NS < 99)
TimeGreen_NS++; //南北通行時間加一
}
else if(State==2) //當前為設置東西通行時間
{
if(TimeGreen_EW < 99)
TimeGreen_EW++; //東西通行時間加一
}
else if(State==3) //當前為設置東西通行時間
{
if(TimeLeftGreen_NS < 99)
TimeLeftGreen_NS++; //東西通行時間加一
}
else if(State==4) //當前為設置東西通行時間
{
if(TimeLeftGreen_EW < 99)
TimeLeftGreen_EW++; //東西通行時間加一
}
}
void SUBTime() //紅綠燈時間減
{
if(State==1) //當前為設置南北通行時間
{
if(TimeGreen_NS>1)
TimeGreen_NS--; //南北通行時間加一
}
else if(State==2) //當前為設置東西通行時間
{
if(TimeGreen_EW>1)
TimeGreen_EW--; //東西通行時間加一
}
else if(State==3) //當前為設置東西通行時間
{
if(TimeLeftGreen_NS>1)
TimeLeftGreen_NS--; //東西通行時間加一
}
else if(State==4) //當前為設置東西通行時間
{
if(TimeLeftGreen_EW>1)
TimeLeftGreen_EW--; //東西通行時間加一
}
}
void MoveModel() // 移動
{
if (State > 0)
{
State++;
if(State > 4)
{
State = 1;
}
}
}
void ChangeDisp() //切換顯示
{
if(State==0) //當前為正常運行模式
{
if (DispState == 0)
{
DispState = 1;
}
else if (DispState == 1)
{
DispState = 0;
}
}
}
void KeyScan() //按鍵掃描
{
if(KeyChangeDisp == 0) //設置按鍵按下
{
DelayMs(10); //延時消抖
if(KeyChangeDisp == 0) //確認按鍵按下
{
ChangeDisp(); //切換顯示
while(KeyChangeDisp == 0); //等待按鍵彈起
}
}
if(KeySet == 0) //設置按鍵按下
{
DelayMs(10); //延時消抖
if(KeySet == 0) //確認按鍵按下
{
SetModel(); //切換顯示
while(KeySet == 0); //等待按鍵彈起
}
}
if(KeyMove == 0) //設置按鍵按下
{
DelayMs(10); //延時消抖
if(KeyMove == 0) //確認按鍵按下
{
MoveModel(); //移動設置位置
while(KeyMove == 0); //等待按鍵彈起
}
}
if(KeyAdd == 0) //設置按鍵按下
{
DelayMs(10); //延時消抖
if(KeyAdd == 0) //確認按鍵按下
{
ADDTime(); //紅綠燈時間加
while(KeyAdd == 0); //等待按鍵彈起
}
}
if(KeySub == 0) //設置按鍵按下
{
DelayMs(10); //延時消抖
if(KeySub == 0) //確認按鍵按下
{
SUBTime(); //紅綠燈時間減
while(KeySub == 0); //等待按鍵彈起
}
}
}
復制代碼
Keil5代碼與Proteus7與8.13仿真下載:
交通燈.rar
(93.07 KB, 下載次數: 35)
2023-6-8 10:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1