基于单片机的交通灯信号控制器设计

发布者:HappyExplorer最新更新时间:2011-10-22 关键字:单片机  交通灯信号控制器 手机看文章 扫描二维码
随时随地手机看文章

设计一个基于单片机的交通灯信号控制器。已知东、西、南、北四个方向各有红黄绿色三个灯,在东西方向有两个数码管,在南北方向也有两个数码管。要求交通灯按照表1进行显示和定时切换,并要求在数码管上分别倒计时显示东西、南北方向各状态的剩余时间。
表1 交通灯的状态切换表

南北方向

东西方向

序号

状态

序号

状态

1

绿灯亮25秒,红、黄灯灭

1

红灯亮30秒,绿、黄灯灭

2

黄灯亮5秒,红、绿灯灭

3

红灯亮30秒,绿、黄灯灭

2

绿灯亮25秒,红、黄灯灭

3

黄灯亮25秒,红、绿灯灭

回到状态1

回到状态1

3.2.1模块1:系统设计
(1)任务分析与整体设计思路
试题要求实现的功能主要包括计时功能、动态扫描以及状态的切换等几部分。
计时功能:要实现计时功能则需要使用定时器来计时,通过设置定时器的初始值来控制溢出中断的时间间隔,再利用一个变量记录定时器溢出的次数,达到定时1秒中的功能。当计时每到1秒钟后,东西、南北信号灯各状态的暂存剩余时间的变量减1。当暂存剩余时间的变量减到0时,切换到下一个状态,同时将下一个状态的初始的倒计时值装载到计时变量中。开始下一个状态,如此循环重复执行。
动态扫描:需要使用4个数码管分别显示东西、南北的倒计时数字,将暂存各状态剩余时间的数字从变量中提取出“十位”和“个位”,用动态扫描的方式在数码管中显示。
整个程序依据定时器的溢出数来计时,每计时1S则相应状态的剩余时间减1,一直减到0时触发下一个状态的开始。
   (2)单片机型号及所需外围器件型号,单片机硬件电路原理图

图3-5 交通灯硬件电路原理图
选用MCS51系列AT89S51单片机作为微控制器,选择两个四联的共阴极数码管组成8位显示模块,由于AT89S51单片机驱动能力有限,采用两片74HC244实现总线的驱动,一个74HC244完成共阴极数码管位控线的控制和驱动,另一个74HC244完成数码管的7段码输出,在7段码输出口上各串联一个100欧姆的电阻对7段数码管限流。用P3口的P3.0-P3.5完成发光二极管的控制,实现交通灯信号的显示,每个发光二极管串联500欧姆电阻起限流作用。硬件电路原理图如图3-5所示。
(3)程序设计思路,单片机资源分配以及程序流程
①单片机资源分配
单片机P3口的P3.0-P3.1引脚用作输出,控制发光二极管的显示。在计时模块中,需要定义两个数组变量(init_sn[3],init_ew[3])来存储东西、南北两个方向在不同状态中倒计时的初始值,题目中每个方向的交通灯共有3种显示状态,因此数组元素个数为3。还需要定义两个变量( cnt_ sn, cnt_ ew)暂存东西、南北两个方向的倒计时剩余时间。
    在状态的切换中,为了明确当前处于哪种状态,东西、南北方向各设置一个状态变量(state_val_sn, state_val_ew),当倒计时的剩余时间到零时,状态变量增1,表示启动下一个状态,当该变量增到3时变为0,回到序号为1的状态。
 ②程序设计思路
在设计中,由于没有键盘功能,因此只涉及定时计数和动态扫描功能。主程序将变量初始化之
后,设置单片机定时器和中断特殊功能寄存器的初始值,将定时器T1的工作方式设置为8位自动
装载模式,定时器每隔250us产生一次溢出。
在初始化变量与寄存器后,主程序进入一个循环结构,在循环中只做动态扫描的工作,根据东西、南北两向的剩余时时间进行动态扫描显示。
    计时以及状态的切换通过定时器的中断服务程序来实现,在中断服务程序中,每计时到一秒时,则各方向当前状态的剩余时间减1,一直减到0时触发下一个状态的开始,改变交通灯的指示。
 ③程序流程

(4)软硬件调试方案
     软件调试方案:伟福软件中,在“文件新建文件”中,新建C语言源程序文件,编写相应的程序。在“文件新建项目”的菜单中,新建项目并将C语言源程序文件包括在项目文件中。
 在 “项目编译”菜单中将C源文件编译,检查语法错误及逻辑错误。在编译成功后,产生以 “*.hex”和“*.bin” 后缀的目标文件。
硬件调试方案:在设计平台中,将单片机的P3.0-P3.5分别与独立式键盘的相应位通过插线连接起来。
在伟福中将程序文件编译成目标文件后,运行“MCU下载程序”,选择相应的flash 数据文件,点击“编程”按钮,将程序文件下载到单片机的Flash中。
然后,上电重新启动单片机,检查所编写的程序是否达到题目的要求,是否全面完整地完成试题的内容。

3.2.2  程序设计(仅供参考的C语言源程序)
//晶振:11.0592M  T1-250微秒溢出一次
/*变量的定义:
  show_val_sn,show_val_ew:  显示的值0-59
  state_val_sn,state_val_ew: 状态值 南北方向0-绿灯亮;1-黄灯亮;2-红灯亮
  T1_cnt:    定时器计数溢出数
  cnt_sn,cnt_ew:   倒计时的数值
  init_sn[3],init_ew[3] 倒计时
  led_seg_code:数码管7段码
*/
#include "reg51.h"
sbit SN_green=P3^2 ;//南北方向绿灯
sbit SN_yellow=P3^1 ;//南北方向黄灯
sbit SN_red=P3^0 ;//南北方向红灯
sbit EW_green=P3^5 ;//东西方向绿灯
sbit EW_yellow=P3^4 ;//东西方向黄灯
sbit EW_red=P3^3 ;//东西方向红灯
unsigned char data cnt_sn,cnt_ew;
unsigned int  data T1_cnt;
unsigned char data state_val_sn,state_val_ew;
char code led_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
char code init_sn[3]={24,4,29};
char code init_ew[3]={29,24,4};
//------------------------
void delay(unsigned int i)//延时
{  while(--i);  }
//------------------------
void led_show(unsigned int u,unsigned int v)
{ unsigned char i;
  i=u%10;       //暂存个位
  P0=led_seg_code[i];
  P2=0xbf;
  delay(100);  //延时
  i=u%100/10;   //暂存十位
  P0=led_seg_code[i];
  P2=0x7f;
  delay(100);  //延时
  i=v%10;       //暂存个位
  P0=led_seg_code[i];
  P2=0xfe;
  delay(100);  //延时
  i=v%100/10;   //暂存十位
  P0=led_seg_code[i];
  P2=0xfd;
  delay(100);  //延时
}
//-------------------------
void  timer1() interrupt 3     //T1中断
{ T1_cnt++;
  if(T1_cnt>3999)      //如果计数>3999, 计时1s
  {  T1_cnt=0;
     if (cnt_sn!=0) //南北方向计时
     { cnt_sn--; }
     else
     { state_val_sn++;
       if (state_val_sn>2) state_val_sn=0;
       cnt_sn=init_sn[state_val_sn]; 
       switch (state_val_sn) //根据状态值,刷新各信号灯的状态
        { case 0: SN_green=0 ;//南北方向绿灯
                  SN_yellow=1 ;//南北方向黄灯
                  SN_red=1 ;//南北方向红灯
                  break;
          case 1: SN_green=1 ;//南北方向绿灯
                  SN_yellow=0 ;//南北方向黄灯
                 SN_red=1 ;//南北方向红灯
                 break;
          case 2:SN_green=1 ;//南北方向绿灯
                 SN_yellow=1 ;//南北方向黄灯
                 SN_red=0 ;//南北方向红灯
                 break;
        }    
     }
     if (cnt_ew!=0) //东西方向计时
     { cnt_ew--; }
     else
     { state_val_ew++;
       if (state_val_ew>2) state_val_ew=0;
       cnt_ew=init_ew[state_val_ew];
       switch (state_val_ew) //根据状态值,刷新各信号灯的状态
       { case 0: EW_green=1 ;//东西方向绿灯
                 EW_yellow=1;//东西方向黄灯
                 EW_red=0 ;//东西方向红灯
                 break;
         case 1: EW_green=0 ;//东西方向绿灯
                 EW_yellow=1 ;//东西方向黄灯
                 EW_red=1 ;//东西方向红灯
                 break;
         case 2: EW_green=1 ;//东西方向绿灯
                 EW_yellow=0 ;//东西方向黄灯
                 EW_red=1 ;//东西方向红灯
                 break;
        }
     }
  }
}
//-------------------------
main()
{//初始化各变量
 cnt_sn=init_sn[0];
 cnt_ew=init_ew[0];
 T1_cnt=0;
 state_val_sn=0; //启动后,默认工作在序号为1的状态
 state_val_ew=0;
//初始化各灯的状态
 SN_green=0 ;//南北方向绿灯亮
 SN_yellow=1 ;//南北方向黄灯灭
 SN_red=1 ;//南北方向红灯灭
 EW_green=1 ;//东西方向绿灯灭
 EW_yellow=1;//东西方向黄灯灭
 EW_red=0 ;//东西方向红灯亮
//初始化51的寄存器
 TMOD=0x20;//用T1计时 8位自动装载定时模式
 TH1=0x19;//0x4b; //500微秒溢出一次;   250=(256-x)*12/11.0592 -> x= 230.4
 TL1=0x19;
 EA=1;     //开中断
 ET1=1;
 TR1=1;    //开定时器T1
while(1)
{  led_show(cnt_sn,cnt_ew);}}
//主程序结束

关键字:单片机  交通灯信号控制器 引用地址:基于单片机的交通灯信号控制器设计

上一篇:出租车计价器设计与制作
下一篇:单片机控制的简易定时报警器电路设计

推荐阅读最新更新时间:2024-03-16 12:44

关于DP801单片机教学中的几点思考-浅谈入门技巧
在DP801单片机的教学中,我们往往会存在从何处入手的问题,DP801单片机这个名字对于初次接触的孩子们来说是很陌生的。为了让初次接触的孩子们有一个更深入的认识,结合本人的教学经验总结了以下几点。 第一、 认识DP801单片机的基本结构 初见DP801单片机,学生们普遍都会认为这只是一个普通的电路版,并不会把它理解为一台计算机,诚然,DP801单片机的结构看起来简单、粗糙,与我们常用的电脑大相径庭,但归根结底它也是一台计算机。所以在教学的第一步,应该让学生对于DP801单片机的结构有一个清楚的认识,认清它与一般计算机之间的区别。要想让学生了解这一点,就要从DP801单片机的功能讲起,告诉学生DP801
[单片机]
瑞萨推出闪存和SRAM的32位通用微控制器
RX64M MCU集成4MB闪存和512KB SRAM, 实现了卓越的连通性和高性能,适用于工业设备及其他物联网应用。 2014年2月26日,日本东京讯—全球领先的半导体及解决方案供应商瑞萨电子株式会社(TSE:6723),今天发布了RX64M系列微控制器(MCU),作为RX族32位MCU的旗舰产品,该系列产品首次使用了40纳米工艺。这一最新系列共包括112个产品,均集成了2013年11月发布的RX系列新CPU内核“RXv2”, 运行频率为120MHz,并内置零等待周期高速闪存,,适用于要求高速实时性能及大容量存储器的工业设备及网络设备。新型MCU可以使系统设计人员更快速、更高效地开发出高性能、支持多种
[物联网]
瑞萨推出闪存和SRAM的32位通用<font color='red'>微控制器</font>
听技术达人细说51 单片机系列
MCS 51 单片机系列 按工艺划分: ◆ HMOS 工艺产品:如 8031 、 8051 、 8751 等; ◆ HCMOS 工艺产品:如 80C31 、 80C51 、 87C51 等;按 ROM 的类型划分: ◆ ROM 型产品、 ◆ PROM 型产品、 8051 ◆ EPROM 型产品、 87C51 、 87C52 ◆ Flash 型产品: AT89C51 、 AT89C52 (二) MCS 51 单片机的内部结构 一、 8051 微处理器 CPU ◆ 1 、运算器 :由算术逻辑单元 ALU、累加器ACC、B寄存器、两个暂存寄存器、程序状态寄存器组成 PSW ; 8 位,可以进行算术云算(加,减,乘,除,
[单片机]
AT89C51单片机快热式热水器程序设计
快热式热水器程序MCU AT89C51 XAL 12MHz //#pragmaSRC #include #include #include voiddelay(unsignedint);//延时函数 voiddisplay(void);//显示函数 unsignedcharkeysCAN(void);//按键扫描处理函数 voidheatCTRl(void);//加热控制函数 voidtemptest(void);//测温函数 sbitswkey=P1^0;//开关键 sbitupkey=P1^1;//加热档位“+”键 sbitdownkey=P1^2;//加热档位“-”键 sbitbuzz=P1^05;//蜂鸣器输出端 sbit
[单片机]
AT89C51<font color='red'>单片机</font>快热式热水器程序设计
32位MCU在伺服电机中的应用
      在伺服系统中,由于交流永磁同步电机具备十分优良的低速性能、可以实现弱磁高速控制,调速范围宽广、动态特性和效率都很高,已经成为伺服系统的主流之选。目前永磁同步交流伺服技术已成为工业自动化的支撑技术之一。       以瑞萨电子 32位变频用MCU V850E/IX3 UPD70F3454 为例,介绍其在交流伺服系统中的应用。       UPD70F3454是瑞萨电子开发的用于变频控制的32位高性能MCU,使用V850核、RISC架构、5级流水线、内置DSP功能、最大64MHZ,内置256K flash ROM及相关外围功能,例如DMA控制器,定时器/计数器,串行接口UART、SPI、IIC,A/D,总线
[工业控制]
基于单片机的函数发生器的设计实现
1 引言 在自动控制系统设计及调试过程中,不同频率的正弦波、三角波和方波常作为信号源,应用十分方便。过去常由分立元件及集成运放构成振荡器,后来出现的ICL8038其最高频率仅能达到100kHz。而MAX038芯片性能更好,最高频率可达20MHz,且三种波形由同一端输出。单片机控制品质卓越,基于单片机的函数发生器运行可靠,操作方便。 2 高频信号发生器芯片MAX038简介 MAXIM公司生产的MAX038芯片是一种高频精密的函数发生器,可产生三角波、锯齿波、正弦波、方波及脉冲波,且频率及占空比的控制可独立进行。 Lin管脚电流范围在10~400μA时电路获得最佳工作性能。输出波形的选择由逻辑地址引脚A0和A1的组合来决
[单片机]
51单片机实现利用AT24C02进行掉电后的数据保存
一、使用proteus绘制简单的电路图,用于后续仿真 关于IIC的读写: 二、编写程序 /******************************************************************************************************************** ---- @Project: AT24C02 ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200721 ---- @ModifiedTime:
[单片机]
51<font color='red'>单片机</font>实现利用AT24C02进行掉电后的数据保存
单片机上实现动态加载功能
本项目是一个在单片机(如:STM32)上实现动态加载功能的函数库,与Windows中的dll,Linux中的so类似,可以将代码动态地从其他的存储介质,动态加载到RAM中。 软件架构 本项目文件夹有三个,其中common存储了用于生成可重定位的.axf文件的工程与动态加载器工程交互用的函数,src提供动态加载器的源码,rel_axf_project_template提供了一个简单的可重定位的.axf文件的工程示例,example.c是一个简单的使用示例,所有文件的主要功能如下: /common/dl_extern_lib.h 描述了app程序用于调用host程序的函数向量表的基地址,以及相关的一些宏定义 /common/dl_
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved