电子系统设计课程设计报告
目录
基于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.软件系统主流程图
<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;
}
}
- 基于同步串口的数码管显示电路设计
数码管显示电路采用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.