科技与艺术学院单片机课程设计报告项目名称:交通灯控制系统设计系:机电系专业:电子信息工程班级:2班学生姓名:程斌学号:Xb******** 起止时间:2015年5月20日—2015年6 月18日目录1、设计内容和要求 (1)1.1课程设计意义 (1)1.2课程设计目的 (1)1.3课程设计项目 (2)2、系统总体结构 (2)3、硬件设计 (3)3.1电源单元 (3)3.2 LCD显示单元 (3)3.3 I2C扩展IO单元 (4)4、软件设计 (5)4.1主函数 (6)4.2 WDT中断函数:交通灯状态转换和倒计时 (6)4.3 Timer_A定时器的中断事件处理函数 (7)4.4 LED显示函数 (7)5、系统调试 (7)6、设计小结 (8)7、参考文献 (8)附录1:元器件清单 (8)附录2:程序清单 (9)附录3:实物图 (12)1、设计内容和要求1)课程设计意义单片机技术是一种应用非常广泛的实用性应用技术,主流机型有: 51、PIC、MSP430、ST、AVR等几十种,各机型各有其优势和适用场合。
选择其中一种作为入门机型,通过理论学习和大量实践,掌握单片机技术的一般学习方法和应用技巧,为从事项目开发和掌握其它机型的应用打下扎实基础。
单片机课程设计是《单片机原理及应用》的后续课程,是在学习和掌握单片机基本理论的基础上,通过项目案例式设计,进一步提高学生对理论知识的掌握和巩固,强化学生动手能力,积累项目开发经验,培养工程设计理念,提高创新精神。
2)课程设计目的《单片机课程设计》要求学生根据选题指标要求,通过资料查询、方案设计、硬件电路设计、器件选择、线路板焊接和调试、资源分配和定义、程序流程图绘制和软件编写调试、系统联调和优化、设计报告的规划和撰写等整个过程,熟悉和熟练掌握各环节的要求,分析和解决各环节中存在的问题,在提高自身实践能力的同时,培养和提高合作和创新精神,积累硬件和软件开发经验,为今后毕业设计或就业打下扎实基本功。
具体目标、能力要求如下:1.提高收集资料的能力,学会如何利用网站、论坛、馆藏图书等,收集相关资料和方案,并加以吸收和运用的能力;2.熟练掌握相关工具软件的使用:编程工具CCSv5(KeilC)、绘图工具Protel、仿真工具Proteus、流程图工具Visio等;3.掌握元器件布局、设计工艺等相关知识,提高自身焊接技术水平;结合硬件制作和调试过程中的各种现象,提高发现问题、分析问题和解决问题的能力;5.学会系统资源分配和功能预定义、由粗到细进行系统规划、先流程图后编程、先虚拟仿真后在线运行、调试先模块再联调等理念,掌握典型模块的库函数编程方法,熟练运用各种调试技巧,积累软件开发经验;6.学会资料整理、归纳,严守规范要求,撰写具体的设计报告;7.培养设计过程的团队合作、共同提高精神,树立做事细心、严谨的工作作风,克服毛糙、想当然等毛病,提高遇事有恒心、有毅力的素质;8.树立正确的设计追求思想,提高“技术、能力属于自己”的追求理念。
3)课程设计项目设计目的(1)学习MSP430内部定时器的原理及应用。
(2)掌握外部中断技术的原理及应用。
(3)掌握独立按键的识别方法及数码显示电路的设计。
设计指标(1)用发光二级管模拟东西、南北四个路口的交通信号灯。
(2)在十字路口处,交通灯的基本变化规律为:当东西方向放行、南北方向禁行时,东西方向放行的总时间为30s,其中绿灯亮25s,接着黄灯亮5s后,红灯开始点亮,东西方向禁行,南北方向又开始放行。
(3)用扩展板上的LED灯自定义东西和南北向的红、绿、黄灯。
(4)当有急救车到达时,路口的信号灯全部变红,以便让急救车通过。
设计要求(1)硬件设计:设计电路原理图,并进行系统功能描述。
(2)软件设计:设计程序流程图并编制编程。
(3)在软件平台中进行仿真调试。
(4)搭建实验电路,下载程序,进行硬件调试。
(5)整理实验报告,并对设计过程进行归纳总结。
2、系统总体结构3、硬件设计1)电源单元:由于扩展板需要对双极性信号进行处理,所以使用了双电源供电的运放。
图3-1 电源原理图2)LCD显示单元:通过HT1621控制器来实现驱动 128段LCD。
4个控制IO为TCA6416A的扩展IO。
晶振Y和C1、C2默认为可不焊接元件,R1用于调节LCD的对比度,视LCD制造参数不同需选择不同阻值,C3和C4用于HT1621供电电源去耦。
图3-2 128段液晶驱动3)I2C扩展IO单元:扩展板借用1片I2C接口控制的IO扩展芯片TCA6416A,为MSP430G2单片机额外扩展出16个双向IO。
TCA6416A不仅缓解了G2单片机IO数量少的压力,而且还可以从中学习I2C通信原理。
扩展出16个IO口中,8个作为输出口用于控制8个LED,4个作为输出口用于控制LCD驱动器(这个另行介绍),4个作为输入口用于识别4个机械按键。
图3-3 基于I2C的IO扩展4、软件设计主程序流程图1)主函数:void main(void){WDTCTL = WDTPW + WDTHOLD; //关狗BCSCTL1 = CALBC1_16MHZ; /* 设定系统时钟频率,使程序定时精准 */DCOCTL = CALDCO_16MHZ;WDT_init();TCA6416A_Init(); // 初始化IO扩展口HT1621_init(); // 初始化lcd_128conf[0] = 0x02;conf[1] = 0xFF;TCA6416_Tx_Frame(conf,2);__delay_cycles(myMCLK); //消除\延时TA0_Init();while(1){PinIN(); //读取键值I2C_IODect();LCD_Display(); //显示数字}}2)WDT中断函数:交通灯状态转换和倒计时void WDT_init(){//-----设定WDT为-----------WDTCTL=WDT_ADLY_16;//-----WDT中断使能----------------------IE1 |= WDTIE;}#pragma vector=WDT_VECTOR__interrupt void WDT_ISR(void){PinIN();I2C_IODect();__bic_SR_register_on_exit(LPM0_bits );}void LCD_Display(){if(key==0){LCD_DisplayDigit(n/10,3);LCD_DisplayDigit(n%10,4);LCD_DisplayDigit(m/10,1);LCD_DisplayDigit(m%10,2);HT1621_Reflash(LCD_Buffer); //更缓存__delay_cycles(myMCLK); //消除时延}if(key==1){LCD_Clear();LCD_DisplayDigit(red/10,5);LCD_DisplayDigit(red%10,6);HT1621_Reflash(LCD_Buffer);__delay_cycles(myMCLK);LCD_Clear();}}3)检测按键及中断事件处理函数void I2C_IODect() //检测事件确实发生了{static unsigned char KEY_Now=0;unsigned char KEY_Past;KEY_Past=KEY_Now;//----判断I2C_IO10所连的KEY1按键是否被按下------if((TCA6416A_InputBuffer&BIT8) == BIT8)KEY_Now |=BIT0;elseKEY_Now &=~BIT0;if(((KEY_Past&BIT0)==BIT0)&&(KEY_Now&BIT0) !=BIT0)I2C_IO10_Onclick();}void I2C_IO10_Onclick(){key=1;conf[1] = 0xF6;TCA6416_Tx_Frame(conf,2);}4)LED显示函数switch(s){case 0: conf[0] = 0x02;conf[1] = 0xEE;TCA6416_Tx_Frame(conf,2);break;case 1: conf[0] = 0x02;conf[1] = 0xDE;TCA6416_Tx_Frame(conf,2);break;case 2: conf[0] = 0x02;conf[1] = 0xF5;TCA6416_Tx_Frame(conf,2);break;case 3: conf[0] = 0x02;conf[1] = 0xF3;TCA6416_Tx_Frame(conf,2);break;}}5、系统调试此次课程设计我们用了Code Composer Studio v5进行编译调试。
由于我们用MSP430G2553单片机和其自配的扩展版,所以不用进行硬件调试。
刚刚开始调试的时候发现程序存在很多问题,包括LED与LCD显示屏上的显示相互不对应,不过最后通过对代码的修改解决了这一问题,还有就是当有紧急情况发生时按下key1,然后发现已经进入紧急情况模式之后,继续按下key1,还是可以进入紧急模式,并且是与上一个叠加的。
最后用进入中断之后就把中断关闭,然后等中断事件处理完毕之后再打开中断即可。
6、设计小结第一次接触单片机,感觉很陌生。
这次十个半天的课程设计让我对单片机有了更进一步的了解。
在整个设计过程中,遇到许多问题,然后通过和同学老师一起讨论来解决,比如计时器TimerA的使用,中断的使用等等。
发现街上的常见事物都可以用单片机来解决(比如本次实验报告中的红绿灯问题),发现自己所学的单片机还是有用处的,增加了我对单片机学习的热情。
7、参考文献[1] 傅强,杨艳. LaunchPad口袋实验平台——MSP-EXP430G2篇.德州仪器中国大学计划,2013附录1:元器件清单附录2:程序清单/*警告:由于G2 LaunchPad上的LED2使用了P1.6(I2C引脚),所以所有涉及到I2C的实验都必须把P1.6跳线拔除,包含本例程! * main.c*/ #include"MSP430G2553.h"#include"TCA6416A.h"#include"HT1621.h"#include"LCD_128.h"#define myMCLK 8000000unsigned char a=25,b=5,key=0;unsigned char m=30,n=25,s=0,red=10;unsigned char conf[2]={0};void WDT_init();void I2C_IO10_Onclick();void I2C_IODect();void TA0_Init();void LCD_Display(void);void main(void){WDTCTL = WDTPW + WDTHOLD; //关狗BCSCTL1 = CALBC1_16MHZ; /* 设定系统时钟频率,使程序定时精准 */DCOCTL = CALDCO_16MHZ;WDT_init();TCA6416A_Init(); // 初始化IO扩展口HT1621_init(); // 初始化lcd_128conf[0] = 0x02;conf[1] = 0xFF;TCA6416_Tx_Frame(conf,2);__delay_cycles(myMCLK); //消除\延时//----提示初始化成功----TA0_Init();while(1){PinIN(); //读取键值I2C_IODect();LCD_Display(); //显示数字}}void I2C_IODect() //检测事件确实发生了{static unsigned char KEY_Now=0;unsigned char KEY_Past;KEY_Past=KEY_Now;//----判断I2C_IO10所连的KEY1按键是否被按下------if((TCA6416A_InputBuffer&BIT8) == BIT8)KEY_Now |=BIT0;elseKEY_Now &=~BIT0;if(((KEY_Past&BIT0)==BIT0)&&(KEY_Now&BIT0) !=BIT0) I2C_IO10_Onclick();}void I2C_IO10_Onclick(){key=1;conf[1] = 0xF6;TCA6416_Tx_Frame(conf,2);}void WDT_init(){//-----设定WDT为-----------WDTCTL=WDT_ADLY_16;//-----WDT中断使能----------------------IE1 |= WDTIE;}#pragma vector=WDT_VECTOR__interrupt void WDT_ISR(void){PinIN();I2C_IODect();__bic_SR_register_on_exit(LPM0_bits );}void LCD_Display(){if(key==0){LCD_DisplayDigit(n/10,3);LCD_DisplayDigit(n%10,4);LCD_DisplayDigit(m/10,1);LCD_DisplayDigit(m%10,2);HT1621_Reflash(LCD_Buffer); //更缓存__delay_cycles(myMCLK); //消除时延}if(key==1){L CD_Clear();L CD_DisplayDigit(red/10,5);L CD_DisplayDigit(red%10,6);H T1621_Reflash(LCD_Buffer);__delay_cycles(myMCLK);L CD_Clear();}}void TA0_Init(){TA0CCR0 = 32768;TA0CTL = TASSEL_1 + MC_1+TAIE;//设置定时器时钟为SMCLK,递增方式为连续方式}#pragma vector=TIMER0_A1_VECTOR__interrupt void Timer_A0(void){TA0CTL &=~TAIFG;if(key==0){m--;n--;if(m==0||n==0){s++;if(s>3) s=0;switch(s){case 0:m=a+b,n=a;break;case 1:m=b,n=b;break;case 2:m=a,n=a+b;break;case 3:m=b,n=b;break;}}switch(s){case 0: conf[0] = 0x02;conf[1] = 0xEE;TCA6416_Tx_Frame(conf,2);break;case 1: conf[0] = 0x02;conf[1] = 0xDE;TCA6416_Tx_Frame(conf,2);break;case 2: conf[0] = 0x02;conf[1] = 0xF5;TCA6416_Tx_Frame(conf,2);break;case 3: conf[0] = 0x02;conf[1] = 0xF3;TCA6416_Tx_Frame(conf,2);break;}}if(key==1){red--;if(red==0){red=10;key=0;}}}附录3:实物图。