产品概述

交通灯单片机c语言 给初学单片机朋友的干货,如何用单片机制作模拟交通灯?

小编 2024-11-25 产品概述 23 0

给初学单片机朋友的干货,如何用单片机制作模拟交通灯?

在生活中十字路口经常会见到交通信号灯,很多朋友都习以为常,初学电子或单片机的小伙伴们想知道如何动手实现这样的电路吗?今天我利用单片机基础知识手把手教大家如何实现一个模拟交通灯的电路。而现实中的交通灯都是用大功率器件来驱动的,例如到功率三极管或晶闸管等。那其控制电路也必须要单片机芯片,我们讲的是比较典型的一种国产芯片,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,在没接电源之前一定要先检查一下焊接的电路板,主要看看极性有没有接错,有没有虚焊、漏焊等。检查没有问题可以通电试验。

南北绿灯亮东西红灯亮进行中

南北红灯亮东西绿灯亮进行中

南北黄灯亮东西黄灯亮等待下一循环中

以上是为各位刚学单片机朋友提供了开发的思路和经验,可以让大家从实践过程中提高自己发现问题、分析问题、解决问题的能力。 想学好单片机这门技术,只能是拿起烙铁焊电路,动手写程序,我们在学习技术的时候,一定要多动脑筋,遇到问题后,三思而后问。每天前进一小步,坚持一段时间后回头看看,就会发现你学会了很多。

欢迎刚学习单片机的小伙伴们转载、讨论。感觉喜欢的朋友给个赞哦!!

单片机入门-C51语言实现简单的红绿LED交通灯控制

视频教程如下:

视频加载中...

本文介绍了用C51语言实现十字路口交通灯控制:

四个路口各有红、绿2个LED,模拟交通灯的控制,即东西走向的灯变红,南北走向的灯应该变绿,反之亦然。同时思考如何增加手动控制功能。

要实现红绿灯的延时功能,首先要想怎么获取一秒的信号,在不用定时器的情况下,可以考虑用for循环实现简单的1s延时。

假设单片机采用了12MHz的时钟频率,利用for语句嵌套实现简单的延时1s功能。

unsigned int i;

Unsigned char j; //定义两个循环变量i、j

for (i = 1000; i > 0; i--) //外层循环1000次

for (j = 124; j > 0; j--) ; //内层循环124次

内层循环代码含义:

在12MHz的时钟频率下,for循环124次所消耗的时间ntime是:

ntime= 124次 × 8个指令周期 × 1μs = 992μs

也就是内循环延时大概为1ms。

外层循环代码含义:

外层循环又将内层循环重复1000次:

for (i = 1000; i > 0; i--) //外层循环1000次

那么,全部执行完成花费的总时间T大约是:

T = 1000 × ( ntime + 8 × 1 ) = 1000 ms=1s,基本上达到延时1s的功能。这个延时程序中外层循环的变量是多少,整个for嵌套语句就延时大约多少毫秒,在以后的应用当中,会经常用到这个程序进行不需要精确时间的延时。

比如,要实现2s的延时,就把i=1000修改为i=2000就可以了。

相关问答

单片机 的红绿灯控制程序如何写啊 - 小红薯BDA0DD94 的回答 -...

//--------------------------------------------------//名称:LED模拟交通灯//作者:彭伟《单片机C语言程序设计实训100例-基于8051PROT...

我想要 单片机 控制 交通灯 系统的论文,谁知道请发362242314@qq...

[回答]交通灯资料建议百度搜“梦想科技”论坛资料下载专区,更多完整的方案呢Mcuend工作室成立于09年05月份。Mcuend工作室是一个由南京理工大学在校教师...

请问城市交通信号灯的控制机用的是 单片机 还是PLC?

城市交通信号灯的控制机既可以使用单片机,也可以使用PLC。单片机控制成本低,适用于小型路口或者人流量较小的地区;而PLC控制适用于大型路口或者人流量较大的地...

行车记录仪红绿灯什么原理?

交通信号灯是用计算机语言的逻辑来编写的,根据不同的交通路口设定时间。由单片机芯片控制起灯亮的时间和灭的时间;具体就是当红灯该亮时,单片机控制信号灯红...

交通灯 晶振为什么采用12M?

首先需要明确:51单片机不是一定要用12M的晶振,11.05925M也行,18M也行,即一般来说35M以内的无源晶振(两脚的)都可以的。为什么常见的51单片机要用12M的晶振...

交通灯 的国内外研究现状和发展趋势怎样?

我也想知道啊不过我找到点研究现状目前设计交通灯的方案有很多,有应用CPLD设计实现交通信号灯控制器方法;有应用PLC实现对交通灯控制系统的设计;有...

【控制彩灯由三路组成,闪亮顺序为:红灯亮-绿灯亮-黄灯亮-红黄...

[回答]3BIT的二进制计数器,加上一个低频的时钟源就可以实现.当然用单片机也可以.来得更灵活.

红绿灯讯号机怎么把倒计时显示到LED屏?我测量了下都是220V的...

倒计时里的单片机测的每个灯亮的时间,然后驱动LED显示LED屏与红绿灯系统相连的关键在于接口和逻辑电路设计。通常会有一个专门的硬件组件(如译码器)将220V电源...

过红绿灯感应线的问题?

红绿灯感应线是一组闭合线圈,电感线圈与电容及及其放大反馈电路组合成振荡器,振荡频率一般设计为10KHz到1MHz范围内的一个固有频率,当车辆在感应线上通过时,...

什么是 单片机 单片机 有什么作用?

[回答]简单的说是一个处理器,一个特殊的处理器,为什么特殊,因为它集成了控制器,存储器,IO口等,一台电脑机箱里有CPU(中央处理器),内存,硬盘(存储器)等单片...

猜你喜欢