给初学单片机朋友的干货,如何用单片机制作模拟交通灯?
在生活中十字路口经常会见到交通信号灯,很多朋友都习以为常,初学电子或单片机的小伙伴们想知道如何动手实现这样的电路吗?今天我利用单片机基础知识手把手教大家如何实现一个模拟交通灯的电路。而现实中的交通灯都是用大功率器件来驱动的,例如到功率三极管或晶闸管等。那其控制电路也必须要单片机芯片,我们讲的是比较典型的一种国产芯片,STC宏晶公司出产的,其改进信号的运行速度是普通C51的十多倍,如果想学高端的单片机芯片,比如STM32、ARM、甚至DSP等高端单片机芯片,我认为先学好C51在学高端的,这样学习循序渐进,不会打消自己的学习积极性,便于建立自己学好单片机的信心。好了。我们言归正传,下面我们说说设计要求,我们是用万能PCB板由C51单片机焊接组成单片机最小应用系统,控制南北和东西两条干线十字路口的交通信号灯量灭,同时用两位共阳极的数码管进行倒计时。使两条干线交替成为放行线和禁止线。刚上电的时候东西绿色灯亮40 秒,然后红色灯亮30秒,黄灯亮3秒;南北绿色灯亮30 秒,然后红色灯亮40秒,黄灯亮3秒。执行一周期然后如此循环。
设计步骤
制作步骤1:根据控制要求选择电子元器件并绘制电路原理图
用AD10绘制电路原理图
电子元器件明细表
单片机芯片STC89C52RC+ 1片
共阳数码管 2个
发光二极管 12个 (两红、两绿、亮黄)
排阻10K欧 1个
限流电阻220欧姆 12个
三极管PNP型9102 2个
晶振11.0592MHZ 1个
电解电容10uF 1个
瓷片电容30P 2个
电阻10K欧 1个
电阻100欧 1个
微动按键 1个
电阻330欧 2个
PCB万能电路板 1块
步骤2:根据电路原理图编写控制程序
我们写的程序由于是底层驱动程序,需要参考电路原理图,我们参考下面的原理图。因此要根据电路原理图来进行编写,程序不长,程序主要有主程序、亮灯转换程序、数码管扫描程序、定时中断程序四部分组成。如果不清楚的可以在讨论区留言,我们互相讨论。
便于读程序是参考原理图
参考程序如下:
#include<reg51.h>
#define seg_port0 P0//段码口
unsigned char code seg_code[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char timer=0;
bit flag1s=1;
sbit ew_red=P3^0;//东西方向红灯
sbit ew_green=P3^1;//东西方向绿灯
sbit ew_yellow=P3^2;//东西方向黄灯
sbit sn_red=P3^3;//南北方向红灯
sbit sn_green=P3^4;//南北方向绿灯
sbit sn_yellow=P3^5;//南北方向黄灯
sbit wela1=P1^1;//数码管位选信号
sbit wela2=P1^2;
sbit Latch=P1^0;
void traffic_light();//交通灯亮灯转换函数声明
void main(void)//主函数
{
EA=1;//打开总中断
Latch=1;
TH0=(65536-1000)/256;//设置定时初值
TL0=(65536-1000)%256;
ET0=1;//定时使能打开
TR0=1;//打开定时器
TMOD=0x01;//设置定时中断模式
while(1)
{
if(flag1s)//判断是否1秒到,位声明为flag1s
{
flag1s=0;
traffic_light();
}
}
}
void traffic_light( )//交通灯转换子程序
{
static unsigned char color=0;
static unsigned char timer=0;//因为在两个函数中都用到此变量所以要用设置为全局变量
if(timer==0)
{
switch(color)
{
case 0:sn_red=0;sn_green=1;sn_yellow=1;
ew_green=0;ew_red=1;ew_yellow=1;
timer=39;color=1;break;
case 1:sn_red=1;sn_green=0;sn_yellow=1;
ew_green=1;ew_red=0;ew_yellow=1;
timer=29;color=2;break;
case 2:sn_red=1;sn_green=1;sn_yellow=0;
ew_green=1;ew_red=1;ew_yellow=0;
timer=3;color=0;break;
default:break;
}
}
else
{
timer--;
seg_port0=seg_code[timer%10];
seg_port0=seg_code[timer/10%10];
}
}
void led_scan(void)//数码管扫描子程序
{
static unsigned char i=0;
switch(i)
{
case 0: wela1=0;wela2=1;i++;seg_port0=seg_code[timer%10];
break;
case 1:wela1=1;wela2=0;i=0;seg_port0=seg_code[timer/10%10];
break;
default:break;
}
}
void interrupttimer0() interrupt 1//定时中断子程序
{
static unsigned int tmr1s=0;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
led_scan();
tmr1s++;
if(tmr1s>=1000)
{
tmr1s=0;
flag1s=1;
}
}
步骤3:根据电路原理图和编写好的控制程序进行PROTEUS软件仿真
用PROTEUS软件仿真,主要是验证自己所写的程序是否正确,但能通过仿真并不一定能在电路板上把程序跑起来,需要后续的调试。这一环节可以根据自己的具体情况进行删减。由于仿真是在理想状态下进行的,由于运行准确度的考虑,我没加三极管驱动,主要为了验证程序的正确性。
仿真南北绿灯亮东西红灯亮进行中
南北红灯亮东西绿灯亮进行中
南北黄灯亮东西黄灯亮等待下一循环中
步骤4:根据电路原理图用PCB万能板焊接电路
焊接时要注意的有以下几点:
第一点是在焊接单片机芯片时最好先焊接DIP-40插座或者用自紧锁插座,焊接好插座后再把单片机芯片安装上,如果没有这些插座在焊接时一般要断电用电烙铁的余热进行焊接,因为单片机内部用了大量的COM管对静电防范要求很高,这样通过断电用电烙铁的余热焊接40个引脚3次就可以焊接完成,同时能够确保单片机芯片被损坏。
第二点是在焊接单片机时钟晶振时,设计好晶振的位置,要尽可能的把晶振离单片机近些,同时要选好晶振的稳频电容,一般其容量在20P~30P之间就能满足要求。
第三点是要注意发光二极管的极性,一般长引脚是发光二极管的正极,短脚是发光二极管的负极,不要接错。
可用锁紧口插座方面烧写程序
焊接时所用的DIP-40芯片插座
焊接电路板正面
步骤5:焊接好电路板进行调试
51单片机电源要加5v不能太高,否则会烧坏芯片。前两天刚自己做好一个可调稳压电源,调节好电源5V,在没接电源之前一定要先检查一下焊接的电路板,主要看看极性有没有接错,有没有虚焊、漏焊等。检查没有问题可以通电试验。
南北绿灯亮东西红灯亮进行中
南北红灯亮东西绿灯亮进行中
南北黄灯亮东西黄灯亮等待下一循环中
以上是为各位刚学单片机朋友提供了开发的思路和经验,可以让大家从实践过程中提高自己发现问题、分析问题、解决问题的能力。 想学好单片机这门技术,只能是拿起烙铁焊电路,动手写程序,我们在学习技术的时候,一定要多动脑筋,遇到问题后,三思而后问。每天前进一小步,坚持一段时间后回头看看,就会发现你学会了很多。
欢迎刚学习单片机的小伙伴们转载、讨论。感觉喜欢的朋友给个赞哦!!
基于单片机的十字路口交通信号灯控制系统设计与调试
第一章 控制要求
1.1 控制要求
(1)系统工作受开关控制,起动开关 ON 则系统工作;起动开关 OFF 则系统停止工作。
(2)控制对象有八个:
东西方向红灯两个 , 南北方向红灯两个,
东西方向黄灯两个 , 南北方向黄灯两个,
东西方向绿灯两个 , 南北方向绿灯两个,
东西方向左转弯绿灯两个,南北方向左转弯绿灯两个。
(3)另外东西方向、南北方向各设置显示两位十进制的7段显示器,用来显示倒数计数值。
1)高峰时段按时序图二(见附图)运行, 正常时段按时序图三(见附图)运行,晚上时段按提示警告方式运行,规律为: 东、南、西、北四个黄灯全部闪亮,其余灯全部熄灭。
高峰时段、正常时段及晚上时段的时序分配按时序图一运行(见附图)。
可以只选择高峰时段或正常时段进行设计,但最后评分值最高以良好评议;如果全部功能实现(需要设计一个24小时的时钟作为时段划分的基础),最高评分值以优秀评议。
时序图
第二章 系统方案设计
2.1交通灯运行状态分析
根据控制要求,系统以下图交通的运行状态来设计系统方案。
状态1南北直行;状态2南北左转; 状态3东西直行;状态4东西左转。
共有四种状态,分别设定为S1、S2、S3、S4,交通灯以这四种状态为一个周期。循环执行如图1.5所示:
图2.1 交通灯状态循环图
2.2系统总体方案设计
图2.2系统总体方案图
本系统采用MCS-51系列单片机AT89C51为中心器件来设计交通灯控制器,实现了正常、高峰、晚间时通过单片机的P1口设置红、绿、黄灯亮灭的功能。东西、南北两位7段显示器用来显示倒数计数值。系统分三种工作时段:正常、高峰、晚间,并且通过时间段来控制"正常"、"高峰"、"晚间"相互转化。
正常时段:南北段直行通行(绿灯)、东西段禁止(红灯)40s,同时南北段和东西段方向的数码管分别从40s和70s开始倒计时,至最后5s时南北段绿灯变成黄灯闪烁;此后南北段左转(左转绿灯亮)通行、东西段禁止(红灯)20s,同时南北段和东西段方向的数码管都从20s开始倒计时,至最后5s时南北段左转灯变成黄灯闪烁;再后东西段直行通行(绿灯)、南北段禁止(红灯)40s,同时东西段和南北段方向的数码管分别从40s和70s开始倒计时,至最后5s时东西段绿灯变成黄灯闪烁;最后东西段左转(左转绿灯亮)通行、南北段禁止(红灯)20s,同时东西段和南北段方向的数码管都从20s开始倒计时,至最后5s时东西段左转灯变成黄灯闪烁。
高峰时段:南北段、东西段的通行时间改为45s,左转的时间改为15s,其它与正常时段相同。
晚间时段:禁止左转和直行,东西南北四个方向黄灯闪亮。
第三章 系统电路设计
3.1控制芯片选择
图3.1 AT89C51引脚图
AT89C51是美国ATMEL公司生产的低电压,高性能CMOS 8位单片机,有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个可编程定时计数器,2个全双工串行通信口,2个读写口线,器件采用ATMEL公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8051产品引脚兼容,片内置通用8位中央处理器(CPU)和Flash存储单元,可以按照常规方法对其进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
3.2状态灯选择
该系统设计红、绿、黄状态灯显示的功能,用LED灯来代替实际的交通灯,由于有四种不同的运行状态,一个十字路口需要16个LED灯,倒计时数码管显示选用两位带片选的7段数码管,需要4个。数码管显示简单,程序简单,端口用的少。普通单色发光二极管具有体积小、工作电压低、工作电流小、发光均匀稳定、响应速度快、寿命长等优点,可用各种直流、交流、等电源驱动点亮,它属于电流控制型,使用时需串接合适的限流电阻。
3.3系统硬件原理图设计
图3.2系统原理布置图
第四章 系统软件设计
4.1 程序流程图设计
图4.1主程序流程图
系统通电后,初始化定时器,进行24小时定时,在7:00到8:15或16:30到17:00时,按高峰时段运行。在6:30到7:00或8:15到16;30或18:00到19:00时,按正常时段运行。其余时段,按晚间时段运行。
图4.2 时钟及晚间时段程序流程图
本设计利用单片机的定时器T0中断来设置24小时定时,设置TH1=0x3C,TL1=0xB0.即每0.05秒中断一次。到第20次中断即过了20*0.05秒=1秒时,计60S时,满意1分钟,计满60分钟,满1小时,计满24小时,又重新开始计时。用定时器T1中断来设置数码管倒计时,每满1S时,使时间的计数值减1,便实现了倒计时的功能。
图4.3 高峰时段及正常时段流程图
4.2 系统编程
4.2.1定时器的中断设置
在单片机中,中断技术主要用于实时控制。所谓实时控制,就是要求计算机能及时地响应被控对象提出的分析、计算和控制等请求,使被控对象保持在最佳工作状态,以达到预定的控制效果。由于这些控制参量的请求都是随机发出的,而且要求单片机必须做出快速响应并及时处理,对此,只有靠中断技术才能实现。
本系统中的定时时钟及倒计时的设置和相应中断服务子程序如下:
/*24小时时钟 */
void Timer0Cofig(){
TMOD=0x01; //T0定时器工作方式
TH0=0x3C; //设置初始值,定时50MS
TL0=0xB0;
ET0=1; //定时器开中断
TR0=1; //启动定时器0
EA=1; //CPU开中断总允许
}
void T0int() interrupt 1{
TH0=0x3C; //设置初始值
TL0=0xB0;
second_counter++;
if(second_counter>=20){second++;second_counter=0;}
if(second>=60){minute++;second=0;}
if(minute>=60){hour++;minute=0;}
if(hour>=24){hour=0;}
}
/********倒数显示定时器*********/
void Timer1Cofig()
{
TMOD=0x01; //T1定时器工作方式
TH1=0x3C; //定时器初值50ms中断一次
TL1=0xB0;
ET1=1; //定时器开中断
TR1=1; //启动定时器1
EA=1; //CPU开中断总允许
}
/*定时器中断函数*/
void timer1() interrupt 3{
TH1=0x3C; //重新装入初值
TL1=0xB0;
RGY_second++;
if(RGY_second==20){
RGY_second=0;
Time_EW--;//满1秒,数码管值减1
Time_SN--;
}
}
第五章 系统调试与仿真
5.1 proteus仿真结果
根据系统设计要求,进行keil调试和proteus系统仿真,不断调试程序。发光二极管,数码管都能按要求显示,符合要求。proteus总体仿真图如下。
图5.1 仿真结果
相关问答
单片机 编程 交通灯 ,求数码管显示程序,先显示45秒倒计时,然后从25秒开始倒计时,再从45秒倒计时?仿真实例,有汇编的也有C语言的。仿真实例,有汇编的也有C语言的。
城市红绿灯控制是用plc还是 单片机 ?城市红绿灯控制一般采用PLC(可编程逻辑控制器)进行控制。PLC具有高稳定性、灵活性和可编程性,能够满足复杂的交通控制需求,并具有良好的抗干扰能力。PLC还可...
红绿灯能连蓝牙吗?哈哈,这个问题真有趣!红绿灯和蓝牙是完全不同的东西,它们的功能和用途也不一样。红绿灯是用来控制交通流量的信号灯,而蓝牙是一种无线通信技术,用于在短距离...
交通事故红绿灯能人为改变吗?红绿灯可以通过人为调整时间,也可以通过感应,自动调整时间,红绿灯在路口设有车辆检测器,方案是由计算机或智能控制机计算,可以随时改变。目前最简单的是定...
过红绿灯感应线的问题?红绿灯感应线是一组闭合线圈,电感线圈与电容及及其放大反馈电路组合成振荡器,振荡频率一般设计为10KHz到1MHz范围内的一个固有频率,当车辆在感应线上通过时,...
单片机 的主程序为什么是死循环?朋友们好,我是电子及工控技术,我来回答这个问题。我们从单片机的工作原理可以看出单片机是执行程序来完成我们所要求的任务的,在单片机中有很多子程序,单片机...
过生日收到一个 单片机 ,该怎么玩?别误了学业,人生中有许多“爱好”注定是用来接“尘土”的。学单片机,最好从“模拟器”开始。等你真正(迫切)需要一个实体环境时,一定不会有“怎么玩”这样...
街上的红绿灯谁控制?[回答]其中红绿灯智能引导系统常见解决方案有以下几种:一、单辆车通行控制方式(单车通行,无需刷卡)本方案适用于:通道较短,对进、出车辆的通行效率...
电气工程及其自动化毕业之后一般做什么?近几年的就业和收入怎...电气工程及其自动化专业(简称电气)是电类里面学的最广,最多的专业。高压电、自动控制、通讯、机械基础都会学,所以就业的时候可以选择的面很广。\电...
初学者想系统的学习PLC,请问应该怎么学?有没有好的学习方法或学习步骤?大家好,我是王俊杰,做项目的,从2010年接触电气自动化编程到现在已经有11年时间了。还记得第一次做工程的情景,那是一个夏天,天气炎热,我负责做公司PLC编程...现...