|
一、题目要求:
AT89S51 单片机引脚接有若干按键,另外还接有 12 个 LED 发光二极管和一个电磁式无源蜂鸣器, 8 个动态显示的数码管。8 个数码管 2 个一组共分 4 组,分别用于显示南北和东西方向的通行时间,12 个 LED 发光二极管为分 4 组,每组红绿黄 3 个 LED 灯,分别代表南北和东西方向的交通指示灯。
绘制仿真电路并编程实现以下功能:
⑴南北方向(主干道)车道和东西方向(支干道)车道两条交叉道路上的车辆交替通行,主干道每次通行时间都设为 90 秒、支干道每次通行间为 60 秒,时间可通过设置键来进行修改,每个路口灯亮的时间都用数码管进行显示(采用倒计时的方法);
⑵在绿灯转为红灯时,要求黄灯先亮 5 秒钟,才能变换运行车道。
⑶通过按键可以调整南北和东西路口的通过时间。
⑷有紧急车辆要求通过时,按下紧急通告按键,能禁止普通车辆通行,所有道路均为红灯,通行时间为 30 秒,同时蜂鸣器鸣响,让救护车/警车等紧急车辆通过。
二、实验仿真图:
三、程序源代码及仿真图
/*部分代码具体请查看附件信息*/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar data DirectVal[4]; //秒显示的变量
uchar data DefaultVal_DX=60; //东西数默认
uchar data DefaultVal_NB=90; //南北默认值
uchar data setTime_DX=60; //设置东西方向的时间
uchar data setTime_NB=90; //设置南北方向的时间
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; //南北红灯标志
sbit YELLOW_NB=P2^5; //南北黄灯标志
sbit GREEN_NB=P2^4; //南北绿灯标志
sbit RED_DX=P2^3; //东西红灯标志
sbit YELLOW_DX=P2^2; //东西黄灯标志
sbit GREEN_DX=P2^1; //东西绿灯标志
bit set=0; //调时方向切换键标志 =1时,南北,=0时,东西
bit dx_nb=0; //东西南北控制位
bit Shanshuo=0; //闪烁标志位
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; // 默认东西绿灯,南北红灯灯
DefaultVal_NB=DefaultVal_DX+5; //设置南北通行时间比东西多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)//设置键按下
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 ;//设置的数值赋给东西南北
DefaultVal_DX=setTime_DX;
do {
SegmentDisplay();
}while(k1!=1);//松手检测
}
}
if(k2!=1) { //当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, 下载次数: 115)
仿真图
-
-
交通灯.rar
71.93 KB, 下载次数: 119, 下载积分: 黑币 -5
程序源代码及仿真图
|