历史上的今天
返回首页

历史上的今天

今天是:2024年12月27日(星期五)

正在发生

2021年12月27日 | 项目实战:51单片机控制交通信号灯

2021-12-27 来源:eefocus

51单片机控制交通信号灯
说明:最近接了一个小项目,要在一个十字路口用单片机实现交通信号灯的控制

我试着用仿真软件做了一下,效果还可以,希望和大家一起学习

总体设计仿真图在这里插入图片描述
单片机仿真设计部分
在这里插入图片描述
公路信号灯显示仿真部分
在这里插入图片描述
四个方向仿真设计部分
在这里插入图片描述
启动仿真后开始计时
在这里插入图片描述

C语言参考源代码:


/*****************************************************

十字路口交通灯控制 C 程序


******************************************************/


#define uchar unsigned char

#define uint unsigned int

#include

/定义控制位*****************/

sbit Time_Show_LED2=P2^5;//Time_Show_LED2控制位

sbit Time_Show_LED1=P2^4;//Time_Show_LED1控制位

sbit EW_LED2=P2^3; //EW_LED2控制位

sbit EW_LED1=P2^2; //EW_LED1控制位

sbit SN_LED2=P2^1; //SN_LED2控制位

sbit SN_LED1=P2^0; //SN_LED1控制位

sbit SN_Yellow=P1^6;//SN黄灯

sbit EW_Yellow=P1^2;//EW黄灯

sbit EW_Red=P1^3;//EW红灯

sbit SN_Red=P1^7;//SN红灯

sbit EW_ManGreen=P3^0;//EW人行道绿灯

sbit SN_ManGreen=P3^1;//SN人行道绿灯

sbit Special_LED=P2^6;//交通正常指示灯

sbit Busy_LED=P2^7;//交通繁忙指示灯

sbit Nomor_Button=P3^5;//交通正常按键

sbit Busy_Btton=P3^6;//交通繁忙按键

sbit Special_Btton=P3^7;//交通特殊按键

sbit Add_Button=P3^3;//时间加

sbit Reduces_Button=P3^4;//时间减

bit Flag_SN_Yellow; //SN黄灯标志位

bit Flag_EW_Yellow;//EW黄灯标志位

char Time_EW;//东西方向倒计时单元

char Time_SN;//南北方向倒计时单元

uchar EW=60,SN=40,EWL=19,SNL=19; //程序初始化赋值,正常模式

uchar EW1=60,SN1=40,EWL1=19,SNL1=19;//用于存放修改值的变量

uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//1~~~~9段选码

uchar code S[8]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84};//交通信号灯控制代码

/延时子程序**/

void Delay(uchar a)

{

uchar i;

i=a;

while(i–){;}

}

/显示子函数*********/

void Display(void)

{

char h,l;

h=Time_EW/10;

l=Time_EW%10;

P0=table[l];

EW_LED2=1;

Delay(2);

EW_LED2=0;

P0=table[h];

EW_LED1=1;

Delay(2);

EW_LED1=0;


h=Time_SN/10;

l=Time_SN%10;

P0=table[l];

SN_LED2=1;

Delay(2);

SN_LED2=0;

P0=table[h];

SN_LED1=1;

Delay(2);

SN_LED1=0;


h= EW1/10;

l= EW1%10;

P0=table[l];

Time_Show_LED1=1;

Delay(2);

Time_Show_LED1=0;

P0=table[h];

Time_Show_LED2=1;

Delay(2);

Time_Show_LED2=0;

}

/外部0中断服务程序**/


void EXINT0(void)interrupt 0 using 1

{

EX0=0; //关中断


if(Add_Button0) //时间加

{

EW1+=5;

SN1+=5;

if(EW1>=100)

{

EW1=99;

SN1=79;

}

}

if(Reduces_Button0) //时间减

{

EW1-=5;

SN1-=5;

if(EW1<=40)

{

EW1=40;

SN1=20;

}


    } 

1

if(Nomor_Button0)//测试按键是否按下,按下为正常状态

{

EW1=60;

SN1=40;

EWL1=19;

SNL1=19;

Busy_LED=0;//关繁忙信号灯

Special_LED =0;//关特殊信号灯

}

if(Busy_Btton0) //测试按键是否按下,按下为繁忙状态

{

EW1=45;

SN1=30;

EWL1=14;

SNL1=14;

Special_LED=0;//关特殊信号灯

Busy_LED=1;//开繁忙信号灯


}

if(Special_Btton==0)//测试按键是否按下,按下为特殊状态

{

EW1=75;

SN1=55;

EWL1=19;

SNL1=19;

Busy_LED=0;//关繁忙信号灯

Special_LED =1;//开特殊信号灯


}

EX0=1;//开中断

}

/***T0中断服务程序/

void timer0(void)interrupt 1 using 1

{

static uchar count;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

count++;


if(count==10)

{

1

2

if(Flag_SN_Yellow1) //测试南北黄灯标志位

{SN_Yellow=~SN_Yellow;}

if(Flag_EW_Yellow1) //测试东西黄灯标志位

{EW_Yellow=~EW_Yellow;}

}

if(count20)

{

Time_EW–;

Time_SN–;

if(Flag_SN_Yellow1)//测试南北黄灯标志位

{SN_Yellow=~SN_Yellow;}

if(Flag_EW_Yellow==1)//测试东西黄灯标志位

{EW_Yellow=~EW_Yellow;}

count=0;

}


}

/主程序开始*/

void main(void)


{

Busy_LED=0;

Special_LED=0;

IT0=1; //INT0负跳变触发

TMOD=0x01;//定时器工作于方式1

TH0=(65536-50000)/256;//定时器赋初值

TL0=(65536-50000)%256;

EA=1; //CPU开中断总允许

ET0=1;//开定时中断

EX0=1;//开外部INTO中断

TR0=1;//启动定时


while(1)


{ /S0状态***/

EW_ManGreen=0; //EW人行道禁止

SN_ManGreen=1;//SN人行道通行

Flag_EW_Yellow=0; //EW关黄灯显示信号

Time_EW=EW;

Time_SN=SN;

while(Time_SN>=5)

{P1=S[0]; //SN通行,EW红灯

Display();}

/S1状态***/

P1=0x00;

while(Time_SN>=0)

{Flag_SN_Yellow=1; //SN开黄灯信号位

EW_Red=1; //SN黄灯亮,等待左拐信号,EW红灯


Display();

}

/S2状态***/

Flag_SN_Yellow=0; //SN关黄灯显示信号

Time_SN=SNL;

while(Time_SN>=5)

{P1=S[2];//SN左拐绿灯亮,EW红灯

Display();}


/S3状态***/

P1=0x00;

while(Time_SN>=0)

{Flag_SN_Yellow=1; //SN开黄灯信号位

EW_Red=1; //SN黄灯亮,等待停止信号,EW红灯


Display();}


/*赋值/

EW=EW1;

SN=SN1;

EWL=EWL1;

SNL=SNL1;


/S4状态***/

EW_ManGreen=~EW_ManGreen;//EW人行道通行

SN_ManGreen=~SN_ManGreen;//SN人行道禁止

Flag_SN_Yellow=0; //SN关黄灯显示信号

Time_EW=SN;

Time_SN=EW;

while(Time_EW>=5)

{P1=S[4]; //EW通行,SN红灯

Display();}

/S5状态***/

P1=0X00;

while(Time_EW>=0)

{Flag_EW_Yellow=1;//EW开黄灯信号位

SN_Red=1;//EW黄灯亮,等待左拐信号,SN红灯

Display();}

/S6状态***/

Flag_EW_Yellow=0; //EW关黄灯显示信号

Time_EW=EWL;

while(Time_EW>=5)

{P1=S[6];//EW左拐绿灯亮,SN红灯

Display();}


/S7状态***/

P1=0X00;

while(Time_EW>=0)

{Flag_EW_Yellow=1; //EN开黄灯信号位

SN_Red=1;//EW黄灯亮,等待停止信号,SN红灯

Display();}


/*赋值/

EW=EW1;

SN=SN1;

EWL=EWL1;

SNL=SNL1;

}

推荐阅读

史海拾趣

Chenmoun Enterprise Ltd公司的发展小趣事

随着公司业务的不断扩张,Chenmoun Enterprise Ltd开始实施全球化战略布局。公司在全球范围内设立了研发中心和生产基地,充分利用各地的资源优势和人才优势,提升产品的竞争力。同时,公司积极开拓国际市场,与多家国际知名企业建立了紧密的合作关系,实现了业务的快速增长。

ETA-USA公司的发展小趣事

ETA-USA公司起源于XXXX年,当时由几位电子工程领域的先驱者在美国密歇根州的Troy市创立了这家专注于电子技术和解决方案的公司。初创时期,ETA-USA面临着技术挑战、资金短缺和市场竞争激烈等多重困难。然而,通过不断创新和提供高质量的工程服务,公司逐渐在电子行业崭露头角,赢得了客户的信任。

EMC Component Group公司的发展小趣事

ETA-USA公司起源于XXXX年,当时由几位电子工程领域的先驱者在美国密歇根州的Troy市创立了这家专注于电子技术和解决方案的公司。初创时期,ETA-USA面临着技术挑战、资金短缺和市场竞争激烈等多重困难。然而,通过不断创新和提供高质量的工程服务,公司逐渐在电子行业崭露头角,赢得了客户的信任。

Avasem公司的发展小趣事

Avasem公司深知人才是企业发展的核心驱动力。因此,公司一直致力于构建良好的人才培养机制和企业文化。Avasem公司注重员工的个人成长和职业发展,提供丰富的培训和学习机会,鼓励员工不断学习和创新。同时,公司还倡导开放、包容和协作的企业文化,为员工创造一个积极、健康的工作环境。这种以人为本的管理理念不仅吸引了大量优秀人才加入公司,还激发了员工的创新精神和团队凝聚力,为公司的持续发展提供了有力保障。

Greenliant公司的发展小趣事

在光伏产业快速发展的背景下,GPS于2020年进军光伏逆变器市场。公司凭借其深厚的技术积累和创新能力,开发出了一系列高效、可靠的光伏逆变器产品。这些产品不仅转换效率高,而且具备智能监控和远程控制功能,大大提升了光伏电站的运行效率和安全性。GPS的光伏逆变器产品迅速获得市场认可,成为众多光伏项目的首选设备。

Antenna Factor公司的发展小趣事

随着无线通信技术的快速发展,Antenna Factor公司始终保持敏锐的洞察力,不断推出创新产品。他们研发的智能天线系统,能够根据信号环境的变化自动调整参数,显著提高通信质量和稳定性。这一技术创新在市场上引起了广泛的关注,使得Antenna Factor公司在行业中树立了技术领先的形象。

问答坊 | AI 解惑

arm入门与提高

轻松入门开发ARM 程序 (为初学者写的入门手册) [ 本帖最后由 zozo 于 2008-10-30 21:07 编辑 ]…

查看全部问答>

为PCB布线规范

为PCB布线规范,只用于学习,请勿用于商业利益。…

查看全部问答>

谈谈太阳能LED路灯工作原理与设计

replyreload += \',\' + 371465;浅析太阳能LED路灯工作原理与设计(组图) 前言:随着世界能源危机的加剧,各国都在寻求解决能源危机的办法,一条道路是寻求新能源和可再生能源的利用;另一条是寻求新的节能技术,降低能源的消耗,提高能源的利用 ...…

查看全部问答>

LED的发展

LED的兴起,是照明路上的又一次革命,从艾迪生发明的第一只灯泡到现在仅不到二百年,照明在一直使用白炽灯泡做为照明用,后来发明了日光灯,一直 延用至今,20世纪都研究出来了各种灯具,多数是用在工厂,道路和特殊用途的灯具,节能灯和日光灯是 ...…

查看全部问答>

TI汽车资讯娱乐系统设计

$(\'swf_Ieg\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XMzA3OTYwMTQw/v.sw ...…

查看全部问答>

血氧饱和度测量中的直流成分应该如何测量

如题,血氧饱和度的经验公式中有一个直流成分与交流成分的比值这一项,其中的直流成分应当怎样确定呢?大神求解释~…

查看全部问答>

求高手指教关于Quartus ii中testbench的问题

测试程序设置完成后 运行不出仿真图形 却出来这个错误 求高人指点啊。。。谢谢啦。。。…

查看全部问答>

瑞萨RL78_G14 Demo资料

本帖最后由 paulhyde 于 2014-9-15 03:28 编辑 瑞萨大学计划RL78_G14 Demo资料    …

查看全部问答>