给初学单片机朋友的干货,如何用单片机制作模拟交通灯?
在生活中十字路口经常会见到交通信号灯,很多朋友都习以为常,初学电子或单片机的小伙伴们想知道如何动手实现这样的电路吗?今天我利用单片机基础知识手把手教大家如何实现一个模拟交通灯的电路。而现实中的交通灯都是用大功率器件来驱动的,例如到功率三极管或晶闸管等。那其控制电路也必须要单片机芯片,我们讲的是比较典型的一种国产芯片,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,在没接电源之前一定要先检查一下焊接的电路板,主要看看极性有没有接错,有没有虚焊、漏焊等。检查没有问题可以通电试验。
南北绿灯亮东西红灯亮进行中
南北红灯亮东西绿灯亮进行中
南北黄灯亮东西黄灯亮等待下一循环中
以上是为各位刚学单片机朋友提供了开发的思路和经验,可以让大家从实践过程中提高自己发现问题、分析问题、解决问题的能力。 想学好单片机这门技术,只能是拿起烙铁焊电路,动手写程序,我们在学习技术的时候,一定要多动脑筋,遇到问题后,三思而后问。每天前进一小步,坚持一段时间后回头看看,就会发现你学会了很多。
欢迎刚学习单片机的小伙伴们转载、讨论。感觉喜欢的朋友给个赞哦!!
电子仿真:模拟交通灯
今天分享一个模拟交通灯实验,这个实验和我们平时真实的交通灯还是有些许差别的,比如说在稳定性方面,和真实的交通灯有着天壤之别,而马路上所用的交通灯是用工控(如PLC)的方式来实现的,在平时运行时极少出问题。
由于电子实验的局限性,所以笔者更倾向于用电子仿真的方式来做实验,这样,大家看完之后也可以做出一样的实验现象,要想完成本次实验只需要两个软件,一个是仿真软件Proteus,另一个是编程软件Keil-C51。
物料清单
英文名字是电子元器件在Proteus中所对应的代号。
51单片机-AT89C51
电容-CAP
电解电容-CAP-ELEC
12M晶振-CRYSTAL
黄色LED-LED-YELLOW
电阻-RES
LED灯-LED
原理图
单片机左侧为单片机的最小系统,右侧是交通灯的连接方式,他们以共阳极方式连接,所谓共阳极方式是LED灯的阳极都接电源,而阴极接地的方式。当单片机I/O口输出高电平的时候,由于I/O口之间和VCC之间没有压差,所以不会有电流通过,而当I/O口输出低电平的时候,由于电源和I/O口之间有压差存在,此时会有电流通过,LED灯会被点亮。
程序源代码
#include <reg51.h> //头文件
sbit RED_A=P0^0; //把P0.0赋给RED_A
sbit YELLOW_A=P0^1; //把P0.1赋给YELLOW_A
sbit GREEN_A=P0^2; //把P0.0赋给GREEN_A
sbit RED_B=P0^3; //把P0.0赋给RED_B
sbit YELLOW_B=P0^4; //把P0.0赋给YELLOW_B
sbit GREEN_B=P0^5; //把P0.0赋给GREEN_B
uchar Flash_Count = 0;
Operation_Type = 1;
void Traffic_lignt()
{
switch(Operation_Type)
{
case 1:
RED_A=1;YELLOW_A=1;GREEN_A=0;
RED_B=0;YELLOW_B=1;GREEN_B=1;
DelayMS(2000);
Operation_Type = 2;
break;
case 2:
DelayMS(200);
YELLOW_A=~YELLOW_A;
if(++Flash_Count !=10)
return;
Flash_Count=0;
Operation_Type = 3;
break;
case 3:
RED_A=0;YELLOW_A=1;GREEN_A=1;
RED_B=1;YELLOW_B=1;GREEN_B=0;
DelayMS(2000);
Operation_Type = 4;
break;
case 4:
DelayMS(200);
YELLOW_B=~YELLOW_B;
if(++Flash_Count !=10)
return;
Flash_Count=0;
Operation_Type = 1;
break;
}
}
void main() //主函数
{
while(1)
{
Traffic_lignt();
}
}
实验现象
相关问答
单片机模拟交通灯 怎么设置?1,单片机1只,如果单片机要使用外部振荡器,+1个晶体两个电容;2,红色、绿色、黄色LED灯若干个;3,用于对LED限流的电阻若干个;4,5V直流电源1个或干电池3...1,...
我想要 单片机 控制 交通灯 系统的论文,谁知道请发362242314@qq...[回答]交通灯资料建议百度搜“梦想科技”论坛资料下载专区,更多完整的方案呢Mcuend工作室成立于09年05月份。Mcuend工作室是一个由南京理工大学在校教师...
单片机 里面的红绿灯名称叫什么?智能交通灯控制系统。智能交通灯控制系统。
单片机 独立按键控制流水灯的C语言程序怎么写?首先选择一款单片机学习。推荐使用51单片机:简单好用资料多。网上随便找一套入门视频教程就行了。如果c语言不会的话,先学c语言。如果c语言已经入门了,就可...
目前道路上 交通灯 主要是用什么控制的?PLC, 单片机 ,纯逻辑电路中那种用的广泛?一般交通灯用单片机控制比较多,因为成本低,且控制也不复杂,通讯也不难实现。一般交通灯用单片机控制比较多,因为成本低,且控制也不复杂,通讯也不难实现。
proteus 单片机 红绿灯怎么不亮?数码管的有一个位的其中一段不亮,而其他位的该段能正常显示。这有些不符合常理,因为共阳数码管的4个为的段是连在一起的,如果是程序问题或者硬件连接有问题,...
交通灯 控制器用红、绿、黄三色发光二极管作信号灯,设计一十...[最佳回答]你要的是电路图吧,就是有课怎么给你啊,只有建议你到网上搜了.高校课件下载网.
红绿灯那里的探头(电子警察)是按什么原理工作的?交通信号灯是用计算机语言的逻辑来编写的,根据不同的交通路口设定时间。由单片机芯片控制起灯亮的时间和灭的时间;具体就是当红灯该亮时,单片机控制信号灯...
交通灯 的国内外研究现状和发展趋势怎样?我也想知道啊不过我找到点研究现状目前设计交通灯的方案有很多,有应用CPLD设计实现交通信号灯控制器方法;有应用PLC实现对交通灯控制系统的设计;有...
交通灯 晶振为什么采用12M?首先需要明确:51单片机不是一定要用12M的晶振,11.05925M也行,18M也行,即一般来说35M以内的无源晶振(两脚的)都可以的。为什么常见的51单片机要用12M的晶振...