四路交通灯设计,基于MSP430G2553(IAR和Proteus)

电子系统设计课程设计报告

目录

电子系统设计课程设计报告

目录

1. 引言

2. 方案论证

(1)方案一

(2)方案二

(3)方案论证

3. 数学建模

4. 系统设计

(1)硬件系统框图

(2)软件系统主流程图及程序设计

<1>初始化程序

<2>主程序

<3>延时服务程序

<4>显示

5. 基于同步串口的数码管显示电路设计

5.1 串行同步总线工作原理

5.2 74ls164芯片简介

5.3 系统电路

6. 系统联调

7. 总结

参考文献

基于MSP430系列微控制器的交通灯控制电路设计

  1. 引言

一个好的交通灯控制系统,将给道路拥挤、违章控制等方面给予技术革新。随着大规模集成电路及计算机技术的迅速发展,以及人工智能在控制技术方面的广泛运用,智能设备有了很大的发展,是现代科技发展的主流方向。基于MSP430单片机的交通控制系统以MSP430G2553单片机为路口控制核心、 LED 作为显示、驱动电路与部分模拟器件构成的一种电子产品。MSP430G2553单片机为控制核心,能实时的进行控制;由于 LED 有高节能、安全性高、寿命长、快速响应、运行成本低等优点,所以用作显示很合理;

74HC245驱动电路用于对 LED 的驱动;此系统可以长时间稳定的运行,可用于各种十字路口。

在本设计中充分利用了单片机内部资源,涉及到了 数码管显示、中断系统、定时/计数器、串口通信等。

  1.  方案论证

(1)实验目的                                                      

  东西方向绿灯亮,南北方向红灯亮,时间9s;

东西方向与南北方向黄灯亮,时间3s;

南北方向绿灯亮,东西方向红灯亮,时间9s;

可以通过按键实现计数器时间的加和减以及开关。

    (2)方案二

        采用两个寄存器共同连接,一个充当位选一个充当段选,利用连接口进行选择。在段选与数码管连接间加入限流电阻,避免电流过大损耗数码管。        

(3)方案论证

       这两种方案都可以实现模拟交通红绿灯。在proteus仿真中,都可以正常的运转。但是方案二明显优于方案一。虽然在理论中这两个方案都切实可行,但仅仅只是在仿真中得以实现,实际制作电路上必须考虑数码管的损耗问题。        

       基于实际电路制作和方案完整性来说,我们选择了方案二。首先方案二使用了寄存器减少了I/O口的使用,有效利用了I/O口。其次,考虑了在实践运用中,数码管比较容易损耗,加入了限流电阻,利于实际电路的制作。即方案二的更加完善,规避了方案一的弊端。最后,基于成本和简易程度,方案一成本更低,电路连线也更加简单,方案二成本和复杂度都要高于方案一。但是从实现效果来看,方案二最后呈现的效果更加好。

  1. 数学建模

183a3da80bd7484da5120aa08777741c.png

图1.交通灯数学建模

序号

绿

时间

4

0

1

0

6

5

0

1

0

5

6

0

1

0

4

7

0

1

0

3

8

0

1

0

2

9

0

1

0

1

10

0

0

1

3

11

0

0

1

2

12

0

0

1

1

16

1

0

0

9

17

1

0

0

8

18

1

0

0

7

19

1

0

0

6

20

1

0

0

5

21

1

0

0

4

22

1

0

0

3

23

1

0

0

2

24

1

0

0

1

表1.红绿灯真值表

  1. 系统设计

(1)硬件系统

该系统由MSP430单片机最小系统、电源电路、按键电路、数码管显示电路、红绿灯显示电路组成。强大的处理能力MSP430系列单片机是一个16位的单片机,采用了精简指令集( RISC )结构,具有丰富的寻址方式(7种源操作数寻址、4种目的操作数寻址)、简洁的27条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储都可以参加多种运算;还有高效的查表处理指令;有较高的处理速度,在8MHZ晶体驱动下指令周期为125ns。这些特点保证了可编制出高效率的源程序,完全可以满足本系统的需要;与其他控制方法相比,所用器件可以说是比较简单经济的。电源电路主要负责对整个系统进行供电,让系统能够正常运行。按键电路实现对一些时间和工作模式的转换,很好的实现了人机交互的功能。数码管显示电路实现对倒计时间的显示功能,红绿灯显示电路实现十字路口红黄绿之间的转换。

  1. 软件系统主流程图及程序设计

道口交通控制系统程序主要分为以下几个模块:初始化程序、主程序、显示和延时。

4eb9b51f83964525af57e808d6dcc853.png

图2.软件系统主流程图

<1>初始化程序

初始化程序主要完成的是对显示初值以及定时器初值。

<2>主程序

主程序要负责总体程序管理功能,实现人机交换设定。由于采用动态扫描方式显示时间,因此主程序大部分时间要调用扫描显示程序。按键也加在主程序中了。

<3>延时服务程序

主要是在整个电路中,在动态显示时间得用延时来保证数码管亮足够的时间。

<4>显示

主要是对数码管的显示,让人们能更准确的看清时间,可以什么时间通过。

在整个程序流程图中,提高了系统的灵活性中断任务主要进行紧急情况处理,并保护当前的现场,以便于恢复。

<5>以下为源码

/*
  南北方向红、黄、绿 对应p0\p1\p2  时间由p2.2与p2.3驱动
  东西方向红、黄、绿 对应p5\p6\p7  时间由p2.0与p2.1驱动
*/
#include<msp430.h>
int num;
int flag;
void seg71s_S_N(unsigned char);
void seg71s_E_W(unsigned char);
void Delay(void);//一秒延时
unsigned char code_seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管数据
 
void seg71s_S_N(unsigned char date_seg71_s_n){ //南北数码换显示函数,date_seg71_s_n
  unsigned char data=date_seg71_s_n/10;//传过来数字十的位,date_seg71_s_n/10
  unsigned char data_1=date_seg71_s_n%10;//过来数字个的位,date_seg71_s_n%10
  unsigned char bit[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//八个引脚对应输出h g f e d c b a;
  
  //eg.0为0x3f---0011 1111 对于a b c d e f;
    for(unsigned int i=0;i<8;i++){ //循环八次输出数字的十位   
    P2OUT&=~BIT3; //P2.3输出低电平   p2.3为时钟位
    if(code_seg[data]&bit[i]){ 
      P2OUT|=BIT2; //P2.2输出高电平  p2.2为数据位
    }
    else{
      P2OUT&=~BIT2;//P2.2输出低电平
    }
    P2OUT|=BIT3; //P2.3输出高电平   
    }
  
    for(unsigned int i=0;i<8;i++){ //再循环八次输出数字的个位
    P2OUT&=~BIT3; 
    if(code_seg[data_1]&bit[i]){ 
      P2OUT|=BIT2;  //P2.2输出低电平   p2.2为时钟位
    }
    else{
      P2OUT&=~BIT2; //P2.2输出高电平  p2.2为数据位
    }
    P2OUT|=BIT3; 
    }   
}
 
void seg71s_E_W(unsigned char date_seg71_e_w){ //东西数码换显示函数
  unsigned char data=date_seg71_e_w/10; //传过来数字十的位
  unsigned char data_1=date_seg71_e_w%10; //传过来数字个的位
  // 判断显示代码位的状态80/40/20/10/08/04/02/01
  unsigned char bit[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
  
  
  for(unsigned int i=0;i<8;i++){ //循环八次输出数字的十位
    P2OUT&=~BIT1; //P2.1输出低电平   p2.1为时钟位
    if(code_seg[data]&bit[i]){ 
      P2OUT|=BIT0; //P2.0输出高电平  p2.0为数据位
    }
    else{
      P2OUT&=~BIT0; //P2.0输出低电平
    }
    P2OUT|=BIT1; //P2.1输出高电平 
    }
    
    for(unsigned int i=0;i<8;i++){ //循环八次输出数字的个位
    P2OUT&=~BIT1; 
    if(code_seg[data_1]&bit[i]){ 
      P2OUT|=BIT0; 
    }
    else{
      P2OUT&=~BIT0;
    }
    P2OUT|=BIT1; 
    } 
}
 

  
void Delay(void){ 
  unsigned long i;
  for(i=0;i<5700;i++){ 
  ;
  }
}
int main(void){ 
  WDTCTL = WDTPW | WDTHOLD;       //关闭看门狗
  //P1配置
  P1SEL=0x00;
  P1SEL2=0x00;
  P1DIR=0xff;

  //P2配置
  P2DIR |= BIT0;                                 //DIR方向控制寄存器 0,1,2,3,    4,5,6按键
  P2DIR |= BIT1;
  P2DIR |= BIT2;
  P2DIR |= BIT3;
  P2DIR &= ~BIT4;
  P2DIR &= ~BIT5;
  P2DIR &= ~BIT6;
 // _EINT();                             		// MSP430 系统开中断
  __bis_SR_register(GIE);                     //打开全局中断
  P2IE |= BIT4;                                       // 设置 zhongduan
  P2IES |= BIT4; 
  P2IFG &= ~BIT4; 
  
  P2IE |= BIT5;                                       // 设置 zhongduan
  P2IES |= BIT5; 
  P2IFG &= ~BIT5; 
  
  P2IE |= BIT6;                                       // 设置 zhongduan
  P2IES |= BIT6; 
  P2IFG &= ~BIT6; 
num = 9;
flag = 0;
unsigned char i,c,b,a;  
unsigned char light[4]={0x81,0x41,0x24,0x22};
//东西绿17秒,南北红17秒
//0x81,0b1000,0001
//东西黄3秒,南北红3秒
//0x41,0b0100,0001   A7~A0
//东西红17秒,南北绿17秒
//0x24,0b0010,0100
//东西红3秒,南北黄3秒
//0x22,0b0010,0010
    while(1)
    {
      if(!flag)
	    {
            seg71s_S_N(num + 3);
            seg71s_E_W(num);
            Delay();
	    }
      else{
       for(i = 0;i < 4;i++){ //四次一组
        P1OUT = light[i];
        if(i % 2){                          //i关于2取余为1运行,i可取1,3
          for( a = 3;a > 0;a--){ //循环3次 
            seg71s_S_N(a);                //南北数码换显示
            seg71s_E_W(a);                //东西数码换显示
            Delay();                      //一秒延时
          }
        }
        else{ 
          for(a = num;a > 0;a--){ //循环27次
            if(i<2){                       //i为0
              b = a;                           //东西27miao
              c = a+3;                         //南北30miao
            }
            else{                          //i为2
              b = a+3;                       //东西30miao
              c = a;                         //南北27miao
            }
            seg71s_S_N(c);                //南北数码换显示
            seg71s_E_W(b);                //东西数码换显示
            Delay();                      //一秒延时
          }
        }
       }
      }
    }
}
#pragma vector = PORT2_VECTOR
 __interrupt void Port2_ISR(void)
{
  if(P2IFG & BIT4) {
        //Delay();
        P2IFG &= ~BIT4;//清除中断
        flag = 1;   
    }
  if(P2IFG & BIT5){
        //Delay();
        P2IFG &= ~BIT5;
        num += 1;            
    }          
  else if(P2IFG & BIT6){
        //Delay();
        P2IFG &= ~BIT6;
        num -= 1;     
  }
}

  1.  基于同步串口的数码管显示电路设计

数码管显示电路采用74ls164数据锁存器,对数码管进行驱动,同时还具有数据所存作用,方便程序设计。采用两个独立的共阴极数码管实现倒计时间的显示。对两片74ls164通过级联达成输出二位数的倒计时电路(具体级联方法为:将74ls164芯片U5的Q7接入到74ls164芯片U6的A-B端)

14ad248bf6d940428716ffb3a770b455.png

图3.数码管显示电路

    1. 串行同步总线工作原理

SPI 是一个环形总线结构,由 ss ( cs )、 sck 、 sdi 、 sdo 构成,其时序其实很简单,主要是在 sck 的控制下,两个双向移位寄存器进行数据交换。假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。那么第一个上升沿来的时候数据将会是 sdo =1;寄存器中的10101010左移一位,后面补入送来的一位未知数 x ,成了0101010x。下降沿到来的时候, sdi 上的电平将锁存到寄存器中去,那么这时寄存器=0101010sdi,这样在8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个 spi 时序。

    1. 74ls164芯片简介

(1)介绍:74LS164是一种集成电路芯片,它属于低功耗S系列快速数字逻辑器件。该芯片具有广泛的用途,在数字电路设计和信号处理等领域中得到了广泛应用。

(2)74LS164引脚图及功能:74LS164共有14个引脚,每个引脚的功能如下:1 - Shift/Load (移位/装载)2 - Clock (时钟)3,4,5,6,7,8,9 - Parallel Data Inputs (并行数据输入)10 - Master Reset (主复位)11 - Output Enable (输出使能)12,13,14 - Serial Data Output (串行数据输出)

(3)工作原理:74LS164是一个8位移位寄存器,可以对8个二进制位进行并行输入和串行输出。当Shift/Load引脚为HIGH电平时,芯片处于装载模式;当它为LOW电平时,芯片处于移位模式。

在移位模式下,时钟信号的上升沿将输入的数据向左移位,并将最右边的位移出芯片,接着的上升沿又将之前移位的数据再向左移一位,以此类推,直到所有的数据都被移出芯片。在串行输出模式下,最右边的移位出的位将从串行输出引脚输出,这种方式可以将8个并行输入的位进行串行输出。

(4)内部结构:74LS164的内部由多个逻辑门和触发器组成,可以实现数据的存储、传输和输出等功能。具体的内部结构设计已经通过专利申请保护。

(5)作用和用途:74LS164常用于LED显示屏控制、数码管控制、信息显示、LED灯带控制等数字显示场合中。因为其具有广泛的兼容性,可以与其他数字电路或单片机集成在一起,方便地实现各种复杂的数字逻辑功能。此外,它还可以使用在数字信号处理、计算机网络通讯、工业自动化等领域中。

    1. 系统电路

1ee6945cb8cd4336a4b5a67046b31641.png

图4.系统电路

P2.0与用P2.2作串行数据管脚,P2.1与用P2.3用作串行时钟管脚。

  1.  系统联调

基于MSP430单片机的交通控制系统测试通过将时间显示模块,红绿灯显示模块,按键模块与MSP430G2553芯片进行连接,实现了:

  1. 南北绿灯时,东西红灯(12S);
  2. 南北黄灯闪烁(3S),东西红灯;
  3. 南北红灯,东西绿灯(12S);
  4. 南北红灯,东西黄灯闪烁(3S);
  5. 倒计时显示用2位 LED 显示;
  6. 有紧急情况处理机制,在需要可以调节红绿灯显示时间;
  7. 在整个测试中,运行正常无异常。
  1.  总结

经过几个月课程学习的努力以及这几周对于这个题目的研究,我终于完成了这次的课题设计《基于MSP430单片机的交通信号灯控制系统》。从接受到这个课题到逐步的完成,每一步的完成对我来说都有着新的体会。

大学三年以来,这是给我的一个很大的挑战。从拿到这个题目开始,到收集这方面的资料,一步一步的逐步完善自己的方案设计,在这个过程中可以说自己收获了很多,同时也发现了自身知识的不足,我们必须具备一定的专业基础知识,才能成功的设计出一件合格的东西。

当然最重要的是学到了关于基本MSP430的一些基本应用,同时也加深了对一些常用电路的了解及设计方法。但是其中遇到的问题也不少,因为我们之前学的都是stm32单片机,现在着手做MSP430的芯片,这是一个很有难度和挑战性的设计,所以很多的内容都是需要自己去自学的,比如有些MSP430的芯片和引脚问题不懂的时候就可以试着去参考stm32单片机的,两者相比较一下,一些问题就能迎刃而解,这也是一种很好的学习方法。

通过这次课程设计,加强了我动手、思考和解决问题的能力。在设计过程,经常会遇到这样的情况,就是心里想老着这样的接法可以行得通,但实际接上电路,总是实现不了。所以这几天吃饭睡觉,脑子里总是想着如何解决这些问题,如何想出更好的方法。我认为做课程设计同时也是对课本知识的巩固和加强,平时看课本学习时,只是理论知识的学习,做完课程设计,就是把课本知识拿来实际运用。而且还可以深刻记住很多东西。此次电子设计的成功不仅帮助我们更好地掌握书本知识,尤其重要的是增强了我们的自信,培养了我们独立思考的能力和互相帮助互相合作精神!

参考文献

[1]谢维成、杨加国.单片机原理与应用及C51程序设计[M]四版.北京:清华大学出版社,2019.

[2]丁元杰.单片微机原理及应用[M].北京:机械工业出版社,2000.

[3]赵亮、侯国锐.单片机C语言编程与实例[M].北京:人民邮电出版社,2003.

[4]蒋辉平.基于Proteus的单片机系统设计与仿真实例[M].北京:机械工业出版社,2009.

[5]李建忠.单片机原理及应用[M].西安:西安电子科技大学,2002.

[6]谭浩强.C程序设计[M]第2版.北京:清华大学出版社,1999.

[7]蔡菲娜.单片微型计算机原理和应用[M].杭州:杭州大学出版社,1995.

[8]马淑华.单片机原理与接口技术[M]第2版.北京:北京邮电大学出版社,2005.

  • 23
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初煁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值