51单片机交通灯(加急救车)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

相关文档
最新文档