|
一、題目要求:
AT89S51 單片機(jī)引腳接有若干按鍵,另外還接有 12 個 LED 發(fā)光二極管和一個電磁式無源蜂鳴器, 8 個動態(tài)顯示的數(shù)碼管。8 個數(shù)碼管 2 個一組共分 4 組,分別用于顯示南北和東西方向的通行時間,12 個 LED 發(fā)光二極管為分 4 組,每組紅綠黃 3 個 LED 燈,分別代表南北和東西方向的交通指示燈。
繪制仿真電路并編程實現(xiàn)以下功能:
⑴南北方向(主干道)車道和東西方向(支干道)車道兩條交叉道路上的車輛交替通行,主干道每次通行時間都設(shè)為 90 秒、支干道每次通行間為 60 秒,時間可通過設(shè)置鍵來進(jìn)行修改,每個路口燈亮的時間都用數(shù)碼管進(jìn)行顯示(采用倒計時的方法);
⑵在綠燈轉(zhuǎn)為紅燈時,要求黃燈先亮 5 秒鐘,才能變換運(yùn)行車道。
⑶通過按鍵可以調(diào)整南北和東西路口的通過時間。
⑷有緊急車輛要求通過時,按下緊急通告按鍵,能禁止普通車輛通行,所有道路均為紅燈,通行時間為 30 秒,同時蜂鳴器鳴響,讓救護(hù)車/警車等緊急車輛通過。
二、實驗仿真圖:
三、程序源代碼及仿真圖
/*部分代碼具體請查看附件信息*/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar data DirectVal[4]; //秒顯示的變量
uchar data DefaultVal_DX=60; //東西數(shù)默認(rèn)
uchar data DefaultVal_NB=90; //南北默認(rèn)值
uchar data setTime_DX=60; //設(shè)置東西方向的時間
uchar data setTime_NB=90; //設(shè)置南北方向的時間
int n;
uchar data Count,Count1;
sbit k4=P3^1; //禁止
sbit k1=P3^5; //時間加
sbit k2=P3^6; //時間減
sbit k3=P3^7; //切換方向
sbit SPEAKER = P3^2;
sbit RED_NB=P2^6; //南北紅燈標(biāo)志
sbit YELLOW_NB=P2^5; //南北黃燈標(biāo)志
sbit GREEN_NB=P2^4; //南北綠燈標(biāo)志
sbit RED_DX=P2^3; //東西紅燈標(biāo)志
sbit YELLOW_DX=P2^2; //東西黃燈標(biāo)志
sbit GREEN_DX=P2^1; //東西綠燈標(biāo)志
bit set=0; //調(diào)時方向切換鍵標(biāo)志 =1時,南北,=0時,東西
bit dx_nb=0; //東西南北控制位
bit Shanshuo=0; //閃爍標(biāo)志位
uchar code TABLE[11]={ //共陰極字型碼
0x3f, //--0
0x06, //--1
0x5b, //--2
0x4f, //--3
0x66, //--4
0x6d, //--5
0x7d, //--6
0x07, //--7
0x7f, //--8
0x6f, //--9
0x00 //--NULL
};
void key(); //按鍵掃描子程序
void SegmentDisplay(); //顯示子程序
void Buzzer();
void delaylms(int ms) //延時子程序
{
uint j,k;
for(j=0;j<ms;j++) //延時ms
for(k=0;k<124;k++); //大約1毫秒的延時
}
/*定時器0初始化*/
void Timer0Init(){
TMOD |= 0X01;
TH0 = 0X4B;
TL0 = 0XFC;
ET0 = 1;
EA = 1;
TR0 = 1;
}
/*定時器1初始化*/
void Timer1Init(){
TMOD |= 0X10;
TH1 = 0X4B;
TL1 = 0XFC;
ET1 = 1;
EA = 1;
TR1 = 1;
}
/*主程序*/
void main()
{
Timer0Init();
Timer1Init();
TR1 = 0;
P2=0Xc3; // 默認(rèn)東西綠燈,南北紅燈燈
DefaultVal_NB=DefaultVal_DX+5; //設(shè)置南北通行時間比東西多5秒
while(1)
{
key();
SegmentDisplay();
}
}
/*按鍵掃描子程序*/
void key(void){
if(k1!=1) {
delaylms(10);
if(k1!=1){
TR0=0;
Shanshuo=0;
P2=0x00;
TR1=0;
if(set==0)//設(shè)置鍵按下
setTime_DX++;//南北加1
else
setTime_NB++;//東西加1
if(setTime_NB==100)
setTime_NB=1;
if( setTime_DX==100)
setTime_DX=1;//加到100置1
DefaultVal_NB=setTime_NB ;//設(shè)置的數(shù)值賦給東西南北
DefaultVal_DX=setTime_DX;
do {
SegmentDisplay();
}while(k1!=1);//松手檢測
}
}
if(k2!=1) { //當(dāng)K2(時間減)按鍵按下時
delaylms(10);
if(k2!=1){
TR0=0;
Shanshuo=0;
P2=0x00;
TR1=0;
if(set==0)
setTime_DX--;
else
setTime_NB--;
if(setTime_NB==0)
setTime_NB=99;
if( setTime_DX==0 )
setTime_DX=99;
DefaultVal_NB=setTime_NB ;
DefaultVal_DX=setTime_DX;
do{
SegmentDisplay();
}
while(k2!=1);
}
}
if(k3!=1) {
delaylms(10);
if(k3!=1){
TR0=0;
set=!set;
TR1=0;
dx_nb=set;
do{
SegmentDisplay();
}
while(k3!=1);
}
}
if(k4!=1){
delaylms(10);
if(k4!=1){
TR0=0;
P2=0x00;
RED_DX=1;
RED_NB=1;
TR1=0;
DefaultVal_DX=30;
DefaultVal_NB=30;
TR0 = 1;
do{
SegmentDisplay();
SPEAKER = !SPEAKER;
if((DefaultVal_DX == 0)&&(DefaultVal_NB==0)){
SPEAKER = 1;
}
}
while(k4!=1);
}
}
}
|
-
1.png
(86.36 KB, 下載次數(shù): 115)
下載附件
2020-8-5 22:07 上傳
仿真圖
-
-
交通燈.rar
2020-8-5 22:08 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
71.93 KB, 下載次數(shù): 119, 下載積分: 黑幣 -5
程序源代碼及仿真圖
|