找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8683|回复: 2
收起左侧

MSP430单片机简易交通信号灯设计与实现(PCB文件+代码+文档)

[复制链接]
ID:451410 发表于 2018-12-21 11:35 | 显示全部楼层 |阅读模式
本文介绍了一种基于单片机控制的交通信号灯的控制系统。该系统采用MSP430G2553单片机为核心,以LED灯作为交通灯红、黄、绿三色灯用发光二极管作为模拟交通信号灯,可以模拟各种道路交通灯控制情况。
关键词:交通信号灯;单片机;LED灯

目录

1 项目要求
2 项目分析和系统设计
3 硬件设计
3.1单片机选型模块
3.2 LED流水灯模块
3.3功能模式选择模块
4 软件设计
4.1主程序
4.2子程序
5 系统调试
5.1硬件调试
5.2程序调试
5.3联合调试
6 外延
7 项目演练
8 项目总结
附录1电路设计原理图(参考)
附录2  PCB设计原理图(参考)
附录3 关键程序(参考)

基于单片机的简易交通信号灯设计与实现
1 项目要求
本项目花样流水灯采用MSP430单片机为控制器件,用于交通信号的输出,此交通信号灯共有12盏灯,分3盏灯一组分别控制四个路口。
1设计一个交通信号灯控制器,由条主干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。
(2)在每次由绿灯亮到红灯亮的转换过程中,要亮5秒黄灯作为过渡,使行驶中的车辆有时间停到禁行线外。
2 项目分析和系统设计
本系统分为硬件和软件模块。硬件上我们打算在单片机的不同的i/o中装上一个LED灯来进行对信号灯进行控制。
在程序方面,首先对msp430的i/o口进行的定义和设置,然后在去定义了一个delay进行延时功能,在用一个switch循环来使得流水灯不断的循环亮灭。
3 硬件设计
本系统采用MSP430单片机为控制核心进行设计,该LED灯系统共可分为两个模块:单片机选型模块和交通信号灯模块。
   3-1系统原理框图
3.1单片机选型模块
MSP430单片机是16位的单片机,采用了精简指令集(RISC)结构,只有简洁的27条内核指令,大量的指令则是模拟指令;众多的寄存器以及片内数据存储器都可参加多种运算。这些内核指令均为单周期指令,功能强,运行的速度快。
3-2 单片机选型模块
3.2 交通信号灯模块
要实现流水灯功能,我们只要将发光二极管LED1~LED8 依次按照交通信号规则点亮、熄灭,12盏灯就可以按照交通信号灯的方式进行闪烁了。在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到其效果了。且每一个LED灯于一个电阻串联。电阻的作用就是对通过LED灯的电流进行一定的限制起到去LED灯进行的保护作用。使得其在高电压的时候使得LED在电阻的保护下不会烧坏。
3-3 LED灯接线原理
此图为共阴极接法,因此当LED_RED给高电平“1”时LED_RED亮;当LED_RED给低电平“0”时,LED_RED灭。
3-4交通信号灯模块
如图3可知此原理图的LED灯为共阴极的接法,因此我们只要给它一个高电平就能点亮此LED灯。
3.3功能模式选择模块
此设计有6种功能模式可以选择:
(1)初始化后,执行8个LED灯从右至左逐次点亮,每隔0.2s亮一个LED灯,直到8个LED灯全亮,再从左至右依次熄灭直到全灭,以此循环;
(2)当按下按键后,执行8个LED灯从右至左每隔0.2s逐一亮灭,直到点亮最左边一个灯后再从左至右每隔0.2s逐一亮灭,以此循环;
0.png
3-5交通信号灯的功能示意图
4 软件设计4.1主程序
本系统整体工作主要由单片机程序控制实现,其工作过程为:对端口进行初始化,在主程序中用不同的端口定义分别来点亮LED灯。再用延时程序来实现每一个LED的亮灭。
程序整体框架如下图5所示。
              
4-1程序整体框架图
4.2子程序
一个完整的程序是由一个主程序和若干个子程序组成。在一个加工程序中,如果其中有些加工内容完全相同或相似,为了简化程序,可以把这些重复的程序段单独列出,并按一定的格式编写成子程序。主程序在执行过程中如果需要某一子程序,通过调用指令来调用该子程序,子程序执行完后又返回到主程序,继续执行后面的程序段。
本系统中所使用的子程序都是比较简单的,用for语句实现循环之后再使用延时函数进行延时。

5 系统调试
本单片机的交通信号灯系统的设计分为硬件电路设计和软件设计两个部分,因此调试也分成两部分进行调试。
5.1硬件调试
主要根据系统框图和硬件原理设计进行原理的绘制、各参数的设置、电路板的制作,以及元器件的焊接等。具体如下:
5.1.1 各单元电路,确认各单元电路链接无误,尤其是关键元器件,一定要接保护电阻。
(1)选择合适规格的元器件,在放置期间前一定要检查规格;
(2)关键器件放置:在器件布置方面与其它逻辑电路一样,应把相互有关的器件尽量放靠近些,这样可以减少材料,更加美观。
5.1.2 PCB设计原则:
在进行PCB设计时,必须遵守PCB设计的一般原则,并应符合要实现的效果设计的要求。
(1)尽量采用印制电路板,印制电路板不像万用板一样会有一定的接触不好或者焊盘不稳和线路连接有问题的情况,印制电路板的制作可防止产生地电位差和元件之间的耦合。
(2)元件面和焊接面应采用相互垂直、斜交、或者弯曲走线,避免相互平 导线尽量短,使用45°或者圆弧折线布线,不要使用90°折线,以减小高频信号的发射。
5.2程序调试
在本系统中,主要分为主程序部分、中断程序、子程序等。在调试过程中,按照程序功能一项项进行调试,首先确认主程序正确,在确认其他程序。调试方法主要跟踪调试、断点调试等等,可以参考相关专业书籍。
5.1.1 CCSV5的打开步骤
  • 右键Code Composer Studio v5快捷方式,左键打开。会出现如图6所示界面:
5-1Code Composer Studio v5软件加载界面

(2)加载完毕之后会有如图7所示界面出现:
5-2Code Composer Studio v5软件打开界面

(3)选择Project->Import Existing CCS Eclipse Project,导入程序文件夹中的工程;具体操作如图8:

5-3Code Composer Studio v5程序导入步骤图
5.3联合调试
整个系统的软硬件都完成后,需要进行联合调试,主要是针对系统设定的功能能否完成和完善进行调试。
调试步骤:
(1) 将PC和硬件电路通过USB线相连;
(2) 选择对该工程进行编译链接,生成.out文件。然后选择,将程序下载到实验板中。程序下载完毕之后,可以选择   全速运行程序,也可以选择单步调试程序,选择F3查看具体函数。也可以程序下载之后,按下,软件界面恢复到原编辑程序的画面。再按下实验板的复位键,运行程序。(调试方式下的全速运行和直接上电运行程序在时序有少许差别,建议上电运行程序)
1



5-4联合调试效果
6 外延
除交通信号灯的显示方式之外,我们在以上功能基础上,还能将其加上语音提示以及时间显示的效果。

基于单片机的交通信号灯系统设计与实现,充分运用了LED灯通过MSP430单片机为控制核心,多个中断程序控制其亮灭来实现对道路交通的控制,从而使单一的LED灯变得多元化。主要利用的知识点有中断操作、单片机原理知识等,并利用C语言编程,最后制作出一个完善的作品,该作品再经过一定的功能完善和外观制作,符合现代化商场和各市场的装饰,更有利于推广。
1



附录1电路设计原理图(参考)
附录2  PCB设计原理图(参考)

附录3 关键程序(参考)
  1. void main()
  2. {

  3. WDTCTL = WDTPW + WDTHOLD; // Stop WDT
  4. BCSCTL1 = CALBC1_1MHZ;
  5. DCOCTL = CALDCO_1MHZ;

  6.   led_init();
  7.   timer_init();
  8. _BIS_SR(GIE); //开总中断

  9. while(1)
  10. {

  11.                 if((flag1>=0)&&(flag1<=10))
  12.                 {
  13.                   led_red1_h;
  14.                   led_yellow1_l;
  15.                   led_green1_l;

  16.                   led_red2_l;
  17.                   led_yellow2_l;
  18.                   led_green2_h;
  19.                 }

  20.                 if((flag1>10)&&(flag1<=12))
  21.                 {
  22.                                 led_red1_h;
  23.                                 led_yellow1_l;
  24.                                 led_green1_l;

  25.                                 led_red2_l;
  26.                                 led_yellow2_h;
  27.                                 led_green2_l;
  28.                 }

  29.                 if((flag1>12)&&(flag1<=22))
  30.                 {
  31.                                 led_red1_l;
  32.                                 led_yellow1_l;
  33.                                 led_green1_h;

  34.                                 led_red2_h;
  35.                                 led_yellow2_l;
  36.                                 led_green2_l;
  37.                 }

  38.                 if((flag1>22)&&(flag1<=24))
  39.                 {
  40.                                 led_red1_l;
  41.                                 led_yellow1_h;
  42.                                 led_green1_l;

  43.                                 led_red2_h;
  44.                                 led_yellow2_l;
  45.                                 led_green2_l;
  46.                 }

  47. }

  48. }


  49. //--------定时器中断函数------------
  50. #pragma vector=TIMER0_A0_VECTOR
  51. __interrupt void Timer_A(void)
  52. {
  53.   //TACCTL0&=~ CCIE; //关中断
  54.   static int cc=0;

  55.   cc+=1;


  56.   if(cc==50) //1s=1000ms=20*50 定时
  57.   {
  58.   flag1++;
  59.   cc=0;
  60.   }

  61.   if(flag1>=25)
  62.                 flag1=0;

  63. }
复制代码

0.png 0.png

全部资料51hei下载地址:
基于单片机的简易交通信号灯设计与实现.rar (1.39 MB, 下载次数: 83)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:645136 发表于 2019-11-19 16:34 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:245004 发表于 2019-11-19 23:05 | 显示全部楼层
交通灯程序有非常多的写法,原帖这种写法学习起来比较简单明了。作为初学者完成整个制作已经很不错了,值得学习。


后面可以逐步改进优化程序,例如:

191119_temp1.png
带上花括号是更规范,不易出错;
放在if语句里面是减少系统执行无用的过程,因为只有“flag1++;"后才有必要执行它;

191119_temp2.png

if应该结合else if ,避免重复判断;
如果改成switch语句更简洁。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表