《本科毕业设计论文--单片机课程设计多功能花样流水灯设计.doc》由会员分享,可在线阅读,更多相关《本科毕业设计论文--单片机课程设计多功能花样流水灯设计.doc(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、长 江 学 院 花样流水灯设计报告 课题:多功能花样流水灯 院系:机械与电子工程系 专业:自动化 班级: 学号: 姓名: 指导老师: 2016年12月20日目录摘要1一、课程设计的要求1二、总体方案分析21、硬件方案分析22、软件方案分析。三、软件设计思路和流程图41、设计思路32、流程图.4四、硬件设计思路和电路图71、设计思路72、电路图分析8五、实验过程步骤111、编程112、仿真调试11六、心得与体会13附录:.14摘要 随着人们生活环境的不断改善和美化,在许多场合可以看到彩色霓虹灯不断变化闪烁。LED灯由于其丰富的灯光色彩,低廉的造价以及控制简单等特点而得到了广泛的应用,用彩灯来装饰
2、街道和城市建筑物已经成为一种时尚。但目前市场上各式样的LED灯控制器大多数用全硬件电路实现。电路结构复杂、功能单一这样一旦制作成品只能按照固定的模式闪亮不能根据不同场合、不同时间段的需要来调节亮灯时间、模式、闪烁频率等动态参数。这种彩灯控制器结构往往有芯片过多、电路复杂、功率损耗大等缺点。此外从功能效果上看,亮灯模式少而且样式单调缺乏用户可操作性影响亮灯效果。因此有必要对现有的灯控制器进行改进。流水灯是一串按一定的规律像流水一样连续闪亮。流水灯控制是可编程控制器的一个应用(其控制思想在工业控制技术领域也同样适用。流水灯控制可用多种方法实现(但对现代可编程控制器而言(利用移位寄存器实现最为便利。
3、通常用左移寄存器实现灯的单方向移动,用双向移位寄存器实现灯的双向移动。本案例利用价格低廉的STC89C52RC系列单片机控制基色LED灯泡从而实现丰富的变化。关键词:STC89C52RC LED灯 单片机 花样流水灯一、课程设计的要求使用单片机设计一个流水灯控制系统,该控制系统可以实现以下要求LED灯按不同的花样和速度流动点亮,速度分九个等级,通过按键控制速度的加减,花样分五个种类,用按键控制加减,速度等级和花样种类通过数码管显示。二、总体方案分析 依照课程设计要求,分析设计方案。1、硬件方案分析1, 系统电源电路设计方案A, 使用LM317可调电压三段稳压芯片制作电源,但是我们系统供电电压为
4、5V且LM317外围期间较多,生产成本变大。故不选择此方案B, 使用7805三端稳压芯片制作电源,7805价格低廉外围器件少,稳压效果好输出电流最大可达1.5A,符合我们的需求,故使用此方案2, 单片机最小系统设计方案A, 使用STC89C52RC单片机,使用12Mhz晶振,设计按键复位电路,STC89C52RC单片机虽然也是51内核,但是片上资源有限B, 使用STC89C52RC单片机,使用12Mhz晶振,设计按键复位电路,STC89C52RC单片机为增强型单片机,相同价格下更具优势,使用12Mhz晶振是为了精确计算延时。3, 显示电路设计方案A, 使用单片机引脚直接控制,这个方案比较占用单
5、片机引脚,且驱动电流直接通过单片机,容易损坏或缩减单片机寿命。B, 使用74LS164芯片以静态方式驱动数码管,此方案直接外部芯片驱动,单片机只需要两个引脚节约引脚,而且需要添加数码管不需要消耗新的引脚。4, 流水灯显示方案设计A, 使用专业LED灯驱动芯片,驱动LED,此方案成本高,不适合B, 使用74LS164芯片以静态方式驱动数码管,此方案直接外部芯片驱动,单片机只需要两个引脚节约引脚,而且需要添加数码管不需要消耗新的引脚。2、软件方案分析 1, 显示子程序设计思路A, 使用普通引脚模拟串口驱动164显示数码管,缺点是代码量较大,不方便B, 使用单片机自带串行口驱动164显示数码管,使用
6、引脚单独控制数码管公共端这样可以起消隐作用,防止数据传输时显示乱跳2, 流水灯显示子程序设计思路A, 使用算法移位等操作实现流水灯花样,缺点是移植性不好代码量较大,每一个花样都需要新的代码B, 使用查表法实现流水灯,此方法只需一个查表程序,流水灯数组存在程序代码空间,可移植性好,方便编程,故选择这套方案。3, 延时方式设计思路A, 使用使用循环语句延时,此方法缺点是延时的时候无法检测到按键按下B, 使用中断计数的方式延时,此方法灵活多变,不影响单片机主程序运行4, 按键检测设计思路A, 在主循环里检测按键,当检测到按键按下延时10MS消抖,此方案堵塞单片机B, 在中断检测按键,利用10ms定时
7、中断检测按键,此方法灵活多变故选择此方案三、软件设计思路和流程图1:软件设计思路整个系统工作由软件程序控制运行,根据需要可以上电后系统经过初始化,进入用户设定模式状态。基于STC89C52RC单片机的灯控制方案实现对LED灯的控制。本方案以STC89C52RC单片机作为主控核心,与驱动等模块组成核心主控制模块。在主控模块上设有晶振电路和16个LED显示二极管,4个按键控制电路,及稳压控制电路。P0口和P2口控制流水灯,P1口控制按键,通过改变表头地址查表来根据需要编写若干种花样亮灯模式,并采用中断方式,运用简单的数学逻辑法来改变各种亮灯时间的长短,达到在不同时刻输出灯亮或灯灭的控制信号。通过单
8、片机的串行口来控制74HC164芯片控制数码管静态显示。软件资源分配:Key_Speed_Up BIT P1.0;速度按键加Key_Speed_Down BIT P1.1;速度按键减 Key_Pattern_UP BIT P1.2;花样按键加Key_Pattern_Down BIT P1.3 ;花样按键减Display_Sel BIT P1.7;数码管公共端控制引脚 Flag_Display BIT 20H.0 ;数码管显示更新标志位Flag_Speed_Set BIT 20H.1 ;流水灯中断计数标志位Speed EQU 30H;速度等级变量Pattern EQU 31H;花样类型变量Ms1
9、00 EQU 32H;100毫秒中断计数变量MsX EQU 33H ;用于计算有多少个100毫秒2:流程图主循环流程图各变量初始化开始判断流水灯花样赋值对应花样表格地址给DPTR使用查表指令取第(R1)个流水灯显示码给P0,R1加一使用查表指令取第(R2)个流水灯显示码给P2,R1加一R1清零,R4重新赋值16是R4显示次数寄存器减一比较是否为零否否,继续等待延时标志位Flag_Speed_Set是否置一是按键检测流程图中断入口是检测Key_Speed_Up是否为高电平(检测有无按键按下)否是检测Key_Speed_Up是否为低电平(检测按键是否弹起)否一次按键有效,速度变量加一,INC Sp
10、eed显示数据有变化,显示标志位置一,更新显示数据检测下一个按键(其余三个按键程序结构相同,不一一画出来了)开始更新显示程序流程图否检测Flag_Display标志位是否置一是Flag_Display标志位清零传送数码管段码前关闭公共端口(消隐作用)调用数码管段码传送子程序打开数码管公共端结束速度花样溢出处理程序流程图开始否比较速度变量是否等于10是速度变量清零否比较速度变量是否等于0是速度变量置10否比较花样变量是否等于5是花样变量清零否比较花样变量是否等于0是速度变量清零结束传送数码管段码到74LS164芯片子程序流程图开始初始化,把数码管笔形码表格首地址放到DPTR以Speed为变址取数
11、码管段码送到SBUF传送到164通过TI标志位判断发送是否成功否是发送成功软件清除TI标志位结束(送显Pattern变量亦如此,不赘述)中断计数程序流程图开始(位于定时器中断)否判断Speed是否为零是Ms100加一否是判断Ms100是否等于5Ms100清零,Flag_Speed_Set延时标志位置一,流水灯更新转跳到定时器重新赋初始值程序入口Ms100加一否判断Ms100是否等于10是Ms100清零,MsX加一否判断MsX是否等于Speed说明Speed*100ms到了MsX清零,Flag_Speed_Set延时标志位置一,流水灯更新是转跳到定时器重新赋初始值程序入口中断程序框架开始压栈,D
12、PH,DPL,ACC,关中断中间程序。出栈,ACC,DPL,DPH,开中断结束四、硬件设计思路和电路图1、硬件设计思路实验使用STC89C52RC单片机,电源供电使用以7805为核心的线性稳压电源供电,为了计算方便,使用12Mh晶振搭建起振电路,其次四个控制按键从P1.0、P1.1、P1.2、P1.3口输入,分别用来控制速度加减,花样加减。然后使用P0、P2口作为16个流水灯的输出口。 TXD、RXD作为显示串行输出。P1.7作为数码管公共端控制脚,作用是为了防止数码管数据更新时串行移位导致数码管短时间显示乱码,在送显之前先关掉公共脚,送显完毕再打开。驱动数码管的芯片选择74ls16芯片,根据
13、相应的连好线路图,其中单片机输出信号接74ls164的接收信号端,输出信号端接下一个驱动芯片的输入端,最后将所有的电源和地连接完毕,硬件设计部分就完成了。2、原理图 流水灯模块电路电源电路震荡电路 五、实验过程步骤1、编程在打开KEIL建立一个工程,建立一个以.ASM为后缀的文本并追加到新建工程,编完程序进行编译组建成HEX文件。2、仿真调试 (1) 新建设计文档。在进入原理图设计之前首先要构思好原理图(即必须知道所设计的项目需要哪些电路来完成(用何种模板,然后在Proteus ISIS编辑环境中画出。 (2) 设置工作环境。根据实际电路的复杂程度来设置图纸的大小等。在电路图设计的整个过程中图
14、纸的大小可以不断地调整。设置合适的图纸大小是完成原理图设计的第一步。 (3) 放置元器件。首先从添加元器件对话框中选取需要添加的元器件将其布置到 图纸的合适位置并对元器件的名称、标注进行设定,再根据元器件之间的走线等联系对元器件在工作平面上的位置进行调整和修改使得原理图美观、易懂。 (4)对原理图进行布线。根据实际电路的需要利用Proteus ISIS编辑环境所提供的各种工具、命令进行布线(将工作平面上的元器件用导线连接起来(构成一幅完整的电路原理图仿真过程 Proteus仿真时单片机需要加载程序(加载程序为.HEX文件。本设计利用Keil 在新建Keil项目时选择AT89C51单片机作为CP
15、U程序导入在“Options For Target”对话窗口中选中“Output”选项中的“Create HEX File”编译链接后就可以生成.HEX文件。在Proteus ISIS中选中AT89C52并单击鼠标左键对AT89C52进行设置设置单片机时钟频率为12MHz按照正确的文件路径加载.HEX文件。对单片机设置完毕后就可以开始仿真了。 六、心得与体会 此次单片机课程设计我学到了许多,第一次学会了软硬结合做一个项目出来,自我感觉非常自豪,但是由于自我能力的不足,我更加体会到理论知识与动手能力相结合的重要性,而且设计过程中使我懂得在设计程序之前,务必要对所用单片机的内部结构有一个系统的了解
16、,知道该单片机内有哪些资源?懂得设计的关键是要有一个清晰的思路和一个完整的软件流程图。在设计程序时,不能妄想一次就将整个程序设计好,反复修改,不断改进是程序设计的必经之路。比如在设计显示程序时,一开始数码管的显示不全,然后就不断地调试延时程序,结果数字缺定在0不动,经过反复的调试终于将程序调试成功。而且要学会拓展自己思路,一开始只做了一个速度显示,后来感觉挺好玩的,就做了花样显示。同时要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你思路,这样也为资料的保存和交流提供了方便。整个设计的过程中(还是碰到了一些问题 。比如对于键盘的延时防抖问题不能较好的解决,对于
17、编程的顺序及各模块程序调用掌握得还不够好,对于一些相关的应用软件没能熟练掌握。通过这几天的反复思考,以及参考网上的程序最终还是完成了设计。设计中我最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,在动手的过程中,不仅能增强实践能力而且在理论上可以有更深的认识 。 近年来随着科技的发展,单片机的应用正在不断走向深入,同时带动传统控制检测日新月异更新,在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象点的软件结合加以完善。流水灯可以更简单、方便的使用。通过本课程设计使学生进一步巩固单片机原理
18、及应用的基本概念、基本理论分析问题的基本方法,增强系统地运用已学的理论知识解决实际问题的能力和查阅资料的能力。培养一定的自学能力和独立分析问题、解决问题的能力(能通过独立思考、查阅工具书、参考文献等寻找解决方案。附录1程序清单 Key_Speed_Up BIT P1.0 Key_Speed_Down BIT P1.1 Key_Pattern_UP BIT P1.2 Key_Pattern_Down BIT P1.3 Display_Sel BIT P1.7;数码管的公共端控制脚,因为使用74LS164驱动,所以要控制公共端消隐 ;当速度或花样变化时,就会把这个位置1,数码管更新显示Flag_D
19、isplay BIT 20H.0;当定时器设定的计数时点到了,这个位就会置1,用来控制流水灯速度Flag_Speed_Set BIT 20H.1 Speed EQU 30H;存储速度 Pattern EQU 31H;存储花样Ms100 EQU 32H;存储0.1秒MsX EQU 33H ORG 0000H AJMP Zhaoying_Initialize ORG 001BH ;定时器1的中断地址 AJMP Time_1_Interrupt_Service_Routine ORG 0030HZhaoying_Initialize: MOV TMOD,#10H ;使用方式1来定时 ;使用12MHZ
20、的晶振 MOV TH1,#0ECH MOV TL1,#78H MOV IE,#88H ;enable TTimer 1 Interrupt SETB TR1 ;启动定时器1 MOV Speed,#00H MOV Pattern,#00H MOV Ms100,#00HMOV MsX,#00H MOVA,#03H ;对数码管零MOVSBUF,AJNBTI,$CLRTIMOVSBUF,AJNBTI,$CLRTI SETB Display_Sel;Turn on the digital tube power supplyMOV R1,#00H ;初始化元素 MOV R4,#16 MOV R2,#00H
21、Zhaoying_Main_Loop: MOV A,PatternPattern0:CJNE A,#00,Pattern1 ;当按下花样按键时,Pattern这个变量就会从0到4变化,这里通过比较Pattern的值选着对应花样 MOV DPTR,#TAB1 Pattern1: CJNE A,#01,Pattern2 MOV DPTR,#TAB2 Pattern2: CJNE A,#02,Pattern3 MOV DPTR,#TAB3 Pattern3: CJNE A,#03,Pattern4 MOV DPTR,#TAB4 Pattern4: CJNE A,#04, PNext MOV DPTR
22、,#TAB5 PNext: ; 使用查表法来更新流水灯状态 MOV A,R1 MOVC A,A+DPTR MOV P2,A INC R1 MOV A,R1 MOVC A,A+DPTR MOV P0,A INC R1 DJNZ R4,del MOV R1,#00 MOV R4,#16 del: JNB Flag_Speed_Set,$;延时等待时间到达CLR Flag_Speed_Set ;这里是计时标志位,只有对应的延时时间到了才会继续执行,这里的作用是延时 LJMP Zhaoying_Main_Loop ;回到新的一轮循环Time_1_Interrupt_Service_Routine: ;
23、定时器1中断函数,当定时器计数到溢出时就会自动来执行这段子程序 PUSH DPH;因为是中断子程序,打个比方就好像你在背单词,这时候快递小哥给你打电话,这时候你需要先记住你背到了那个单词 PUSH DPL;等一下回来就可以接着背 PUSH ACC ; 这三句PUSH是一样的道理,这是为了保存之前的寄存器状态,为了执行完中断函数后(取完快递),继续执行原来的程序(背单词)CLR EA;先关闭中断防止再次进入 Speed_U:JB Key_Speed_Up,Speed_D JNB Key_Speed_Up,$ INC SpeedSETB Flag_Display Speed_D:JB Key_Sp
24、eed_Down,Pattern_UJNB Key_Speed_Down,$DEC SpeedSETB Flag_DisplayPattern_U:JB Key_Pattern_Up,Pattern_D JNB Key_Pattern_Up,$ INC Pattern SETB Flag_DisplayPattern_D:JB Key_Pattern_Down,C_Speed_10 JNB Key_Pattern_Down,$ DEC Pattern SETB Flag_DisplayC_Speed_10: MOV A,Speed ;速度如果数字比10大则转到0 CJNE A,#10,C_Sp
25、eed_0 MOV Speed,#0C_Speed_0: CJNE A,#255,C_Pattern_5;速度如果数字比0小,则转到10 MOV Speed,#9C_Pattern_5: MOV A,Pattern CJNE A,#5,C_Pattern_0 ;花样如果数字比5大转到0 MOV Pattern,#0C_Pattern_0: CJNE A,#255,Next ;花样如果速度比0小,转到4 MOV Pattern,#4Next: JNB Flag_Display,EXT ;频率 CLR Flag_Display CLR Display_Sel LCALL Display SETB
26、Display_Sel EXT: ;0单独处理 MOV A,Speed CJNE A,#0,NextA INC Ms100 MOV A,Ms100 CJNE A,#5,INTEND MOV Ms100,#00H SETB Flag_Speed_Set LJMP INTEND NextA:INC Ms100 ;计数按键的数字,能达到延时的目的 MOV A,Ms100CNT_A:CJNE A,#10,INTEND MOV Ms100,#00H INC MsX MOV A,MsXCNT_B:CJNE A,Speed,INTEND MOV MsX,#00H SETB Flag_Speed_Set IN
27、TEND: MOV TH0,#0ECH;重置定时器的初值 MOV TL0,#78H POP ACC POP DPL POP DPH SETB EA RETI ;中断返回Display: MOVA,Speed ;显示速度MOVDPTR,#Digital_Tube_Code_AddressMOVCA,A+DPTRMOVSBUF,A JNBTI,$CLRTI MOVA,Pattern ;Display patternMOVCA,A+DPTRMOVSBUF,A JNBTI,$CLRTIRET Digital_Tube_Code_Address: DB03H,9FH,25H,0DH,99H DB49H,
28、41H, 1FH,01H,09H TAB1: DB 0FEH,0FFH,0FDH,0FFH DB 0FBH,0FFH,0F7H,0FFH ;向右的流水灯 DB 0EFH,0FFH,0DFH,0FFH DB 0BFH,0FFH,7FH,0FFH DB 0FFH,0FEH,0FFH,0FDH DB 0FFH,0FBH,0FFH,0F7H DB 0FFH,0EFH,0FFH,0DFH DB 0FFH,0BFH,0FFH,7FHTAB2: DB 0FFH,7FH,0FFH,0BFH DB 0FFH,0DFH,0FFH,0EFH ;向左的流水灯 DB 0FFH,0F7H,0FFH,0FBH DB 0FF
29、H,0FDH,0FFH,0FEH DB 7FH,0FFH,0BFH,0FFH DB 0DFH,0FFH,0EFH,0FFH DB 0F7H,0FFH,0FBH,0FFH DB 0FDH,0FFH,0FEH,0FFHTAB3: DB 0FEH,0FFH,0FBH,0FFH DB 0EFH,0FFH,0BFH,0FFH ;向右间隔流水灯 DB 0FFH,0FEH,0FFH,0FBH DB 0FFH,0EFH,0FFH,0BFHTAB4: DB 0FFH,7FH,0FFH,0BFH DB 0FFH,0F7H,0FFH,0FBH ;向左间隔流水灯 DB 7FH,0FFH,0BFH,0FFH DB 0F7H,0FFH,0FBH,0FFHTAB6: DB 0FEH,7FH,0FDH,0BFH DB 0FBH,0DFH,0F7H,0EFH ;聚拢的流水灯 DB 0EFH,0F7H,0DFH,0FBH DB 0BFH,0FDH,7FH,0FEHTAB5: DB 55H,55H,0AAH,0AAH DB 55H,55H,0AAH,0AAH ;花样表五,交替闪 DB 55H,55H,0AAH,0AAH DB 55H,55H,0AAH,0AAH END 19