四路交通灯设计,基于MSP430G2553(IAR和Proteus)
电子系统设计课程设计报告
目录
1. 引言
2. 方案论证
(1)方案一
(2)方案二
(3)方案论证
3. 数学建模
4. 系统设计
(1)硬件系统框图
(2)软件系统主流程图及程序设计
初始化程序
主程序延时服务程序
显示5. 基于同步串口的数码管显示电路设计
5.1 串行同步总线工作原理
5.2 74ls164芯片简介
5.3 系统电路
6. 系统联调
7. 总结
参考文献
基于MSP430系列微控制器的交通灯控制电路设计
- 引言
一个好的交通灯控制系统,将给道路拥挤、违章控制等方面给予技术革新。随着大规模集成电路及计算机技术的迅速发展,以及人工智能在控制技术方面的广泛运用,智能设备有了很大的发展,是现代科技发展的主流方向。基于MSP430单片机的交通控制系统以MSP430G2553单片机为路口控制核心、 LED 作为显示、驱动电路与部分模拟器件构成的一种电子产品。MSP430G2553单片机为控制核心,能实时的进行控制;由于 LED 有高节能、安全性高、寿命长、快速响应、运行成本低等优点,所以用作显示很合理;
74HC245驱动电路用于对 LED 的驱动;此系统可以长时间稳定的运行,可用于各种十字路口。
在本设计中充分利用了单片机内部资源,涉及到了 数码管显示、中断系统、定时/计数器、串口通信等。
- 方案论证
(1)实验目的
东西方向绿灯亮,南北方向红灯亮,时间9s;
东西方向与南北方向黄灯亮,时间3s;
南北方向绿灯亮,东西方向红灯亮,时间9s;
可以通过按键实现计数器时间的加和减以及开关。
(2)方案二
采用两个寄存器共同连接,一个充当位选一个充当段选,利用连接口进行选择。在段选与数码管连接间加入限流电阻,避免电流过大损耗数码管。
(3)方案论证
这两种方案都可以实现模拟交通红绿灯。在proteus仿真中,都可以正常的运转。但是方案二明显优于方案一。虽然在理论中这两个方案都切实可行,但仅仅只是在仿真中得以实现,实际制作电路上必须考虑数码管的损耗问题。
基于实际电路制作和方案完整性来说,我们选择了方案二。首先方案二使用了寄存器减少了I/O口的使用,有效利用了I/O口。其次,考虑了在实践运用中,数码管比较容易损耗,加入了限流电阻,利于实际电路的制作。即方案二的更加完善,规避了方案一的弊端。最后,基于成本和简易程度,方案一成本更低,电路连线也更加简单,方案二成本和复杂度都要高于方案一。但是从实现效果来看,方案二最后呈现的效果更加好。
- 数学建模

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

图2.软件系统主流程图
初始化程序
初始化程序主要完成的是对显示初值以及定时器初值。
主程序主程序要负责总体程序管理功能,实现人机交换设定。由于采用动态扫描方式显示时间,因此主程序大部分时间要调用扫描显示程序。按键也加在主程序中了。
延时服务程序
主要是在整个电路中,在动态显示时间得用延时来保证数码管亮足够的时间。
显示主要是对数码管的显示,让人们能更准确的看清时间,可以什么时间通过。
在整个程序流程图中,提高了系统的灵活性中断任务主要进行紧急情况处理,并保护当前的现场,以便于恢复。
以下为源码
/*南北方向红、黄、绿 对应p0\p1\p2 时间由p2.2与p2.3驱动东西方向红、黄、绿 对应p5\p6\p7 时间由p2.0与p2.1驱动
*/
#include
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_nunsigned char data=date_seg71_s_n/10;//传过来数字十的位,date_seg71_s_n/10unsigned char data_1=date_seg71_s_n%10;//过来数字个的位,date_seg71_s_n%10unsigned 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/01unsigned 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; // 设置 zhongduanP2IES |= BIT4; P2IFG &= ~BIT4; P2IE |= BIT5; // 设置 zhongduanP2IES |= BIT5; P2IFG &= ~BIT5; P2IE |= BIT6; // 设置 zhongduanP2IES |= 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,0010while(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,3for( 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为0b = a; //东西27miaoc = a+3; //南北30miao}else{ //i为2b = a+3; //东西30miaoc = 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; }
}
/*南北方向红、黄、绿 对应p0\p1\p2 时间由p2.2与p2.3驱动东西方向红、黄、绿 对应p5\p6\p7 时间由p2.0与p2.1驱动
*/
#include
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_nunsigned char data=date_seg71_s_n/10;//传过来数字十的位,date_seg71_s_n/10unsigned char data_1=date_seg71_s_n%10;//过来数字个的位,date_seg71_s_n%10unsigned 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/01unsigned 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; // 设置 zhongduanP2IES |= BIT4; P2IFG &= ~BIT4; P2IE |= BIT5; // 设置 zhongduanP2IES |= BIT5; P2IFG &= ~BIT5; P2IE |= BIT6; // 设置 zhongduanP2IES |= 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,0010while(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,3for( 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为0b = a; //东西27miaoc = a+3; //南北30miao}else{ //i为2b = a+3; //东西30miaoc = 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; }
}
- 基于同步串口的数码管显示电路设计
数码管显示电路采用74ls164数据锁存器,对数码管进行驱动,同时还具有数据所存作用,方便程序设计。采用两个独立的共阴极数码管实现倒计时间的显示。对两片74ls164通过级联达成输出二位数的倒计时电路(具体级联方法为:将74ls164芯片U5的Q7接入到74ls164芯片U6的A-B端)

图3.数码管显示电路
-
- 串行同步总线工作原理
SPI 是一个环形总线结构,由 ss ( cs )、 sck 、 sdi 、 sdo 构成,其时序其实很简单,主要是在 sck 的控制下,两个双向移位寄存器进行数据交换。假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。那么第一个上升沿来的时候数据将会是 sdo =1;寄存器中的10101010左移一位,后面补入送来的一位未知数 x ,成了0101010x。下降沿到来的时候, sdi 上的电平将锁存到寄存器中去,那么这时寄存器=0101010sdi,这样在8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个 spi 时序。
-
- 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灯带控制等数字显示场合中。因为其具有广泛的兼容性,可以与其他数字电路或单片机集成在一起,方便地实现各种复杂的数字逻辑功能。此外,它还可以使用在数字信号处理、计算机网络通讯、工业自动化等领域中。
-
- 系统电路

图4.系统电路
P2.0与用P2.2作串行数据管脚,P2.1与用P2.3用作串行时钟管脚。
- 系统联调
基于MSP430单片机的交通控制系统测试通过将时间显示模块,红绿灯显示模块,按键模块与MSP430G2553芯片进行连接,实现了:
- 南北绿灯时,东西红灯(12S);
- 南北黄灯闪烁(3S),东西红灯;
- 南北红灯,东西绿灯(12S);
- 南北红灯,东西黄灯闪烁(3S);
- 倒计时显示用2位 LED 显示;
- 有紧急情况处理机制,在需要可以调节红绿灯显示时间;
- 在整个测试中,运行正常无异常。
- 总结
经过几个月课程学习的努力以及这几周对于这个题目的研究,我终于完成了这次的课题设计《基于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.
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
