51单片机交通灯(加急救车)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机控制交通灯
一、实现功能:
1、先南北红灯亮,东西绿灯亮。南北红灯亮维持25秒,在南北红灯亮的同时东西绿灯也亮,并维持20秒;到20秒时,东西绿灯闪亮,闪亮3秒后熄灭。在东西绿灯熄灭时,东西黄灯亮,并维持2秒。到2秒时,东西黄灯熄灭,东西红灯亮,同时,南北红灯熄灭,绿灯亮,东西红灯亮维持30秒。南北绿灯亮维持25秒,然后闪亮3秒后熄灭。同时南北黄灯亮,维持2秒后熄灭,这时南北红灯亮,东西绿灯亮。周而复始。
2、用一个按键模拟急救车到达。急救车到达路口时,四个方向的红灯全亮,10秒钟后恢复正常显示。
3、一辆急救车正在过路口时(即四个方向全红灯10秒倒计时未结束),又来了一辆急救车,重新从10秒开始倒计时。
4、急救车过去之后(即10秒倒计时结束),路灯状态要继续急救车到达之前的状态往下运行。
5、数码管显示绿灯变红灯、红灯变绿灯以及急救车10秒钟的倒计时。
6、急救车从路口过的时候,蜂鸣器响1s停1s的循环报警。
二、proteus仿真电路图
注:此图仅作为仿真使用。实际焊接电路时,由于单片机的驱动能力较弱,所以数码管的位选、LED的控制最好加上三极管进行电流放大,否则即使能实现功能,但是LED和数码管的发光的亮度也不强。
三、C语言程序程序
#include
#define uchar unsigned char
#define uint unsigned int
#define duan P0
#define wei P2
code uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; uchar buff[8] = {10,10,10,10,10,10,10,10};
uchar weizhi = 0;
uchar alarm = 0;
uchar bk_TH1 = 0;
uchar bk_TL1 = 0;
uchar bk_cnt = 0;
uchar bk_cnt_time = 0;
uchar cnt_time = 0;
uchar cnt = 0;
uchar cnt_flash = 0;
bit cnt_finish = 0;
bit LED = 0;
bit beef_flag = 1;
sbit Er = P1^0; //东西—红灯
sbit Eg = P1^1; //东西—绿灯
sbit Ey = P1^2; //东西—黄灯
sbit Sr = P1^3; //南北—红灯
sbit Sg = P1^4; //南北—绿灯
sbit Sy = P1^5; //南北—黄灯
sbit beef = P1^6; //蜂鸣器
void display(void);
void main(void)
{
uchar time = 0;
TMOD |= 0x11;
TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256;
TH1 = (65536-50000)/256;
TL1 = (65536-50000)%256;
ET1 = 1;
ET0 = 1;
INT0 = 1;
EX0 = 1;
IP |= 0x02;
EA = 1;
TR0 = 1;
TR1 = 1;
Sr = 0;
Sg = 0;
Sy = 0;
Er = 0;
Eg = 0;
Ey = 0;
beef = 0;
buff[0] = 11;
buff[1] = 11;
buff[2] = 11;
buff[3] = 11;
buff[4] = 11;
buff[5] = 11;
buff[6] = 10;
buff[7] = 10;
while(1)
{
while((cnt<20)&&(alarm == 0))
{
Sr = 1;
Sg = 0;
Sy = 0;
Er = 0;
Eg = 1;
Ey = 0;
time = (25-cnt);
buff[7] = time%10;
buff[6] = time/10;
}
while((cnt<23)&&(alarm == 0))
{
Sr = 1;
Sg = 0;
Sy = 0;
Er = 0;
Eg = LED;
Ey = 0;
time = (25-cnt);
buff[7] = time%10;
buff[6] = time/10;
}
while((cnt<25)&&(alarm == 0)) {
Sr = 1;
Sg = 0;
Sy = 0;
Er = 0;
Eg = 0;
Ey = 1;
time = (25-cnt);
buff[7] = time%10;
buff[6] = time/10;
}
while((cnt<50)&&(alarm == 0)) {
Sr = 0;
Sg = 1;
Sy = 0;
Er = 1;
Eg = 0;
Ey = 0;
time = (55-cnt);
buff[7] = time%10;
buff[6] = time/10;
}
while((cnt<53)&&(alarm == 0)) {
Sr = 0;
Sg = LED;
Sy = 0;
Er = 1;
Eg = 0;
Ey = 0;
time = (55-cnt);
buff[7] = time%10;
buff[6] = time/10;
}