收藏 分销(赏)

单片机优秀课程设计彩灯控制器的设计.doc

上传人:w****g 文档编号:2656978 上传时间:2024-06-03 格式:DOC 页数:28 大小:1.06MB 下载积分:10 金币
下载 相关 举报
单片机优秀课程设计彩灯控制器的设计.doc_第1页
第1页 / 共28页
单片机优秀课程设计彩灯控制器的设计.doc_第2页
第2页 / 共28页


点击查看更多>>
资源描述
黄河科技学院课程设计任务书 工 学院 机械 系 机械设计制造及其自动化 专业 09 级 1 班 学号 姓名 朱施泽 指导老师 郭晓君 题目: 彩灯控制器设计 课程: 单片机课程设计 课程设计时间 12月21 日 至1 月3日 共 2 周 课程设计工作内容和基础要求(设计要求、设计任务、工作计划、所需相关资料)(纸张不够可加页) 1.设计要求 利用AT89C51单片机作为微控制器,用16盏以上LED小灯,实现最少4种彩灯灯光效果(不含全部点亮,全部熄灭);能够用输入按钮在多个灯光效果间切换;能够经过按钮暂停彩灯效果,使小灯全亮,再次按下相同按钮后继续之前效果。 2. 设计任务和要求 2.1系统硬件电路设计 依据该系统设计功效要求选择所用元器件,设计硬件电路。要求用Proteus绘制整个系统电路原理图。 2.2软件设计 依据该系统要求功效进行软件设计,绘制整个系统软件步骤图;依据步骤图编写程序并汇编调试经过;列出软件清单,软件清单要求逐条加以注释。 2.3 Proteus仿真 用Proteus对系统进行仿真并进行软硬件调试。 2.4 编写设计说明书 内容包含任务书、设计方案分析、硬件部分设计、软件部分设计、调试结果整理分析、设计调试心得体会等,字数不少于4000字;硬件部分设计要绘制整个系统电路原理图,对各部分电路设计原理做出说明;软件设计部分要绘制整个系统及各部分软件步骤图,列出程序清单,逐条加以注释,并在各功效块前加程序功效注释。 3.工作计划 序号 设计内容 所用时间 1 部署任务及调研 4天 3 制作和调试 8天 4 撰写设计汇报书 2天 合 计 14天 4.关键参考资料 单片机课程设计指导书 皮大能 北京理工大学出版社 .7 8051单片机实践和应用 吴金戎 清华大学出版社 .8 单片机技术基础教程和实践 夏路易 电子工业出版社  .1 MCS-51单片机原理接口及应用 王质朴 北京理工大学出版社.11 基于Proteus单片机系统设计和仿真实例 蒋辉平 机械工业出版社 .7 指导老师签字: 日 期: 目 录 1 系统硬件设计 4 1.1 电路设计 4 1.2 关键元器件介绍 5 1.2.1 AT89c51单片机芯片介绍 5 1.2.2 关键特征 5 2 系统软件设计 7 2.1 综述 7 2.2 主程序及步骤图 7 2.2.1 主程序 7 2.3 子程序编程思绪 8 2.3.1延迟子程序步骤图 9 3 系统调试和仿真分析 11 3.1 软件调试 11 3.1.1 单片机C语言 11 3.1.2 Keil uVision2 11 3.1.3 Proteus 12 3.2 软件仿真结果及分析 13 3.2.1闪光效果一:单灯向里移动 13 3.2.2闪光效果二:流水左移 14 3.2.3闪光效果三:3灯走马右移 15 3.2.4闪光效果三:红色流水内外移动 16 4 致谢 17 5 参考文件 18 附录 程序代码 18 1 系统硬件设计 整个系统以AT-89C51单片机作为主控关键,和发光二极管LED等较少辅助硬件电路相结合,利用软件实现对LED彩灯进行控制。本系统含有体积小、硬件少、电路结构简单及轻易操作等优点。 1.1 电路设计 彩虹灯控制器电路见【图1】。其关键设计器件有AT89C51,复位电路,时钟电路,5个按钮(其中一个为检测按钮)。经过软件设计,使单片机P0和P1作为LED驱动信号输出口,4个外部按钮作为按钮输入口。 图1 彩虹灯控制器电路图 1.2 关键元器件介绍 1.2.1 AT89c51单片机芯片介绍 AT89C51是一个带4K字节闪烁可编程可擦除只读存放器(FPEROM—Falsh Programmable and Erasable Read Only Memory)低电压,高性能CMOS8位微处理器,俗称单片机。单片机可擦除只读存放器能够反复擦除100次。该器件采取ATMEL高密度非易失存放器制造技术制造,和工业标准MCS-51指令集和输出管脚相兼容。因为将多功效8位CPU和闪烁存放器组合在单个芯片中,ATMELAT89C51是一个高效微控制器。AT89C单片机为很多嵌入式控制系统提供了一个灵活性高且价廉方案。 1.2.2 关键特征 ·和MCS-51 兼容 ·4K字节可编程闪烁存放器 寿命:1000写/擦循环 数据保留时间: ·全静态工作:0Hz-24Hz ·三级程序存放器锁定 ·128*8位内部RAM ·32可编程I/O线 ·两个16位定时器/计数器 ·5个中止源 ·可编程串行通道 ·低功耗闲置和掉电模式 ·片内振荡器和时钟电路; 1.2.3引脚定义及功效见【图2】。 图2 AT89C51引脚图 (1) 输入输出引脚(P0、P1和P2端口引脚) P0~P3是89C51和外界联络4个8位双向并行I/O口。 本设计中P0和P1口作为LED驱动信号输出口,P2口和4个按钮连接作为按钮输入口,控制4中彩虹灯效果。 (2) AT89C51单片机基础结构见【图3】 图3 AT89C51基础结构 2 系统软件设计 2.1 综述 此次任务是设计一个基于单片机LED彩灯控制器,需要循环运行四种以上预设彩灯闪烁方案,这里多种方案还有显示方法全部是由单片机内部程序控制。在这里我将16个发光二极管分别接在P0和P1口,经过程序控制这两个端口电平高低,将16个发光二极管负极接P0和P1口,正极接外部高电平,即P0和P1口对应端口为低电平时LED就能被点亮。再经过程序循环让各个端口以不一样方法点亮来达成多种花样效果,而且当中要有一定延时,延时时间小于人眼视觉暂留时间,不然人眼看上去每个灯全部是亮也就没有实际效果。 设计LED彩灯系统分为两部分,即AT89C51主控模块和发光二极管LED受控模块。整个系统工作由软件程序控制运行,同时依据不一样需要,用户能够在LED彩灯工作时经过主控模块上按钮来实现4种彩灯灯光效果(不含全部点亮,全部熄灭)。 模块功效:该部分关键包含功效实现方法,即程序编写。程序要实现功效包含读按键,经过对读入按键值控制LED点亮方法。键盘有5个按键,其中K1、K2、K3、K4控制LED点亮模式。 2.2 主程序及步骤图 2.2.1 主程序 AT89C51经过编写程序应完成以下功效: 经过P0口和P1控制发光二极管LED亮和灭,从而实现多个闪烁方案; 用16 盏以上LED小灯,实现最少4种彩灯灯光效果(不含全部点亮,全部熄灭)。用输入按钮在多个灯光效果间转换。 根据上述要求即可写出主程序代码并绘制出主程序步骤图。 2.2.2 主程序步骤图 开始 扫描按键 按钮一 否 按钮二 是 否 按钮三 效果一 是 否 效果二 按钮四 是 效果三 否 是 效果四 2.3 子程序编程思绪 即使大致步骤图已经绘制完成,但编程过程中会碰到愈加具体问题,需要编制部分子程序来处理,以下是部分关键子程序步骤图绘制思绪。 2.3.1延迟子程序步骤图 数码管显示必需有足够长时间长到肉眼能够觉察到,所以在点亮数码管时要给 开始 予其一个合适延迟。 触发时间i>0 · 否 调用 是 计时 j <125 否 是 输出信号0 一个机器周期包含12个时钟周期。单片机AT89C51工作于12M晶振,它时钟周期是1/12(微秒)。它一个机器周期是12*(1/12)也就是1微秒。一共实施1000次,恰好1000微秒,也就是1毫秒。 2.3.2按键扫描子程序 按键扫描子程序用来检测并识别外部输入按钮输入信号。 void KeyScan() { if(P2==0xf7) { ys1ms(100); if(P2==0xf7) { flag=0xf7; } } if(P2==0xfb) { ys1ms(100); if(P2==0xfb) { flag=0xfb; } } if(P2==0xfd) { ys1ms(100); if(P2==0xfd) { flag=0xfd; } } if(P2==0xfe) { ys1ms(100); if(P2==0xfe) { flag=0xfe; } } } 其中状态标志分别为:0xfe为按键1标志 ,0xfd为按键2标志 ,0xfb为按键3标志,0xf7为按键4标。 3 系统调试和仿真分析 3.1 软件调试 此次全部软体程序均采取C51语言编写,程序写完后要对其编译,在Proteus软件里实现硬件电路仿真。下面分别简单介绍单片机C语言和这两款软件。 3.1.1 单片机C语言 单片机C语言程序设计不一样于通用计算机应用程序设计,它必需针对具体微控制器及外围电路来完成,为了便于学习单片机应用程序设计和系统开发,很多企业退出了单片机试验箱、仿真器和开发板等,这些硬件设备可用于验证单片机程序,开发和调试单片机应用系统。开发8051单片机系统时,使用C语言会使开发周期大为缩短,开发效率大幅提升,程序可读性好且易于移植,所以使用C语言开发单片机系统已经成为肯定趋势。C语言在单片机系统开发中优势: ⑴ 用C语言编写程序可读性强; ⑵ 在不了解单片机指令系统而仅熟悉8051单片机存放结构时就能够开发单片机程序; ⑶ 寄存器分配和不一样存放器寻址及数据类型等细节可由编译器管理; ⑷ 程序可分为多个不一样函数,这使程序设计结构化; ⑸ 函数库丰富,数据处理能力强; ⑹ 程序编写及调试时间大大缩短,开发效率远高于汇编语言; ⑺ C语言含有模块化编程技术,已编写好通用程序模块很轻易植入新程序,这深入提升了程序开发效率。 3.1.2 Keil uVision2 C51单片机支持HEX文件,我采取编译器是Keil uVision2软件,该软件是美国Keil Software 企业开发,相关8051系列MCU开发工具,是现在世界上最好51单片机开发工具之一。软件本身支持数百种51系列单片机芯片,能够用来编译C源码,汇编源程序和二者混合编程代码,连接重定位目标文件和库文件,创建HEX文件,调试目标程序等,是一个集成化文件管理编译环境。 使用步骤以下: ⑴ 建立一个项目,开启Keil,单击“Project菜单/New”选项,从弹出窗口中选择要保留路径,并输入项目文件名“彩灯.uv2”,然后保留。这时会弹出一个选择CPU型号对话框,依据所使用单片机来选择,我用单片机是AT89C51。 ⑵ 创建程序文件,单击“File菜单/New”选项,输入C51语言源程序,单击“File菜单/Save”并输入程序文件名“彩灯.C”,保留。 ⑶ 程序文件添加到项目中,右键点击“Target 1”前面“+”,展开里面内容“Source Group 1”,右键单击“Source Group 1”弹出一个右键菜单,单击“Add File to Group’s Source Group 1”,从弹出窗口中选择之前保留文件“彩灯.C”添加到项目中去。 ⑷ 设置目前项目标目标选项,右键单击“Target 1”,从弹出右键菜单中单击“Option for Target”选项,从弹出“Options”窗口中选择“Target”标签栏,在“Create HEX File”前面打钩。 ⑸ 运行编译,右键单击“Target 1”,从弹出右键菜单中单击“Build target”选项,此时若源程序没有语法错误,Keil就会生成HEX文件,并自动保留在之前设置路径里。 3.1.3 Proteus Proteus是英国Labenter electronics企业开发电路分析和实物仿真软件,是现在最好模拟单片机外围器件工具,它能够仿真、分析多种模拟电路和集成电路,软件提供了大量模拟和数字元器件及外部设备,多种虚拟仪表(如电压表、电流表、示波器、逻辑分析仪、信号发生器等),尤其是它含有对单片机及其外围电路组成综合系统交互仿真功效。 现在,Proteus仿真系统支持主流单片机有ARM7(LPC21xx)、8051/52系列、AVR系列、PIC10/12/16/18系列、HC11系列等,它支持第三方软件开发、编译和调试环境有Keil uVision2/3、MPLAB等[18]。 Proteus关键由ISIS和ARES两部分组成,ISIS关键功效是原理图设计及电路原理图交互仿真,ARES关键用于印制电路板设计。 ISIS提供Proteus VSM(Virtual System Modelling)实现了混合式SPICE电路仿真,它将虚拟仪器、高级图表应用、单片机仿真、第三方程序开发和调试环境有机结合,在搭建硬件模型之前即可在PC上完成原理图设计、电路分析和仿真及单片机程序实时仿真、测试及验证。 Proteus操作很简单,开启“ISIS.exe”。在设计原理图时,依据目前电路复杂程度和特定要求,选择合适模块进行设计,打开模块式需要单击“文件/新建设计”(File/New Design)菜单,打开“创建新设计”(Create New Design)对话框,然后选择对应模块。 创建空白文件后,先将DSN文件保留到指定位置,接下来就能够开始在图纸中添加元件了,单击模式工具上元件模式(Component Mode)图标,对象选择窗口上会出设备(Device),这时单击“P”按钮,打开元件选择窗口,在元件库选择硬件电路所需要元器,合理摆放位置,然后按要求连接好电路图。 3.2 软件仿真结果及分析 完成单片机系统仿真电路图设计后,即可开始仿真运行单片机绑定程序文件,双击单片机,打开单片机属性窗口(也能够先在单片机上单击右键,再单击左键,或选中单片机后按下(Ctrl+E组合键),在“Program Files”项中选择对应HEX文件。 在仿真电路和程序全部没有问题时,直接单击Proteus主窗口下“运行”(Play)按钮,即可仿真运行单片机系统, 在运行过程中假如期望观察内存、24C0X、温度寄存器、时钟芯片等内部数据可在运行时单击“单步”(Step)或“暂停”(Pause)按钮,然后再“调试”(Debug)菜单中打开对应设备。 3.2.1闪光效果一:单灯向里移动 即按键1彩虹灯光效果:上下两排各8个led二极管自两端向里依次点亮再返回,单次两端各亮两盏,以此循环。能够用输入按钮在灯光效果间切换。 3.2.2闪光效果二:流水左移 即按键2彩虹灯光效果:上下两排各8个led二极管自两端单向挨个点亮直至全明,点亮后不熄灭,最终回到初始状态,以此循环。能够用输入按钮在灯光效果间切换。 3.2.3闪光效果三:3灯走马右移 即按键3彩虹灯光效果:上下两排各8个led二极管自左端点亮右移,上下两排最多各点亮三盏,以此循环。能够用输入按钮在灯光效果间切换。 3.2.4闪光效果三:红色流水内外移动 即按键4彩虹灯光效果:上下两排各8个led二极管自两端挨个点亮向内移动,最终全部点亮,出现渐亮效果;接着上下两排二极管自内侧挨个点亮向外移动,最终全部点亮并出现渐暗效果,以此循环。能够用输入按钮在灯光效果间切换。 4 致谢 在这里首先要感谢我导师郭晓君老师。郭老师平日里工作繁重,日理万机,但从协调选题,到确定最终任务书,再到最终程序调试,我无时无刻不感受着郭晓君老师细致而无私关心和帮助。本人课程设计“彩灯控制器设计”是此次众多选题中较为棘手一个,鄙人并不扎实专业知识更是为之雪上加霜。不过面对如此低级甚至有些反复问题,郭老师却诲人不倦,耐心、认真地为我一一解答。郭老师高超专业素养,严谨治学态度和甘为人师奉献精神深深地影响了我,也并将继续主动地影响我以后工作和学习生活。郭老师,谢谢您! 其次我还想感谢和我一起肩并肩奋斗在此次单片机课程设计第一线09机电各位同学们。是你们陪我一起努力,给我鼓劲儿,才使我能在硕士考试后有限时间里快速地投入,高效地完成,并最终确保了整个设计任务按时按量顺利地完成。 最终,经过此次课程设计,我对“厚积薄发”有了更深刻了解——做学问是一个过程而不是一个结果,关键不是出成绩某一下,而是平日里积累点点滴滴,分分秒秒。所以,我要感谢大学四年来关心和教育过我领导们、老师们、同学们,是你们为我指明了做人方向,扎实了专业基础,分享了绚丽而多彩青春!! 祝福你们! 祝你们身体健康,生活愉快,工作顺利,新年吉祥!!! 5 参考文件 [1] 吴金戎. 8051单片机实践和应用[M]. 北京:清华大学出版社, .8 [2] 王质朴. MCS-51单片机原理接口及应用[M] 北京:北京理工大学出版社,.11 [3] 皮大能. 单片机课程设计指导书[M]. 北京:北京理工大学出版社,.7 [4] 夏路易. 单片机技术基础教程和实践[M]. 北京:电子工业出版社, .1 [5] 蒋辉平. 基于Proteus单片机系统设计和仿真实例[M]. 北京:机械工业出版社, .7 附录 程序代码 #include<reg51.h> //包含单片机寄存器头文件 #include <intrins.h> unsigned char flag=0xff;//状态标志 void ys1ms(unsigned int i); void KeyScan(); rzy(); rlszy(); rsdzmyy(); rlsnwyd(); rjl(); rja(); zkb(unsigned char d); /***************************** 函数功效:主函数 *****************************/ void main(void) { while(1) { KeyScan(); switch(flag) { case 0xfe:rzy();break;//扫描状态标志,为1时,第1种效果 case 0xfd: rlszy(); break;//扫描状态标志,为2时,第2种效果 case 0xfb:rsdzmyy(); break;//扫描状态标志,为3时,第3种效果 case 0xf7:rlsnwyd();break; //扫描状态标志,为4时,第4种效果 // default:P1=0x00; } } } /***************************** 延时程序 *****************************/ void ys1ms(unsigned int i) //延时程序,i是形式参数,i为1时 延时约1MS { unsigned int j; for(;i>0;i--) //变量i由实际参数传入一个值,所以i不能赋初值 for(j=0;j<125;j++) //j由0自增到125 所用时间大约是1MS {;} } /***************************** 按键扫描 状态标志 0xfe按键1标志 0xfd按键2标志 0xfb按键3标志 0xf7按键4标志 *****************************/ void KeyScan() { if(P2==0xf7) { ys1ms(100); if(P2==0xf7) { flag=0xf7; } } if(P2==0xfb) { ys1ms(100); if(P2==0xfb) { flag=0xfb; } } if(P2==0xfd) { ys1ms(100); if(P2==0xfd) { flag=0xfd; } } if(P2==0xfe) { ys1ms(100); if(P2==0xfe) { flag=0xfe; } } } /***************************** 按键1效果程序:单灯向里移动 *****************************/ rzy() { P0=0x7e;//01111110 P1=0x7e; ys1ms(90); P0=0xbd;//10111101 P1=0xbd; ys1ms(90); P0=0xdb;//11011011 P1=0xdb; ys1ms(90); P0=0xe7;//11100111 P1=0xe7; ys1ms(90); P0=0xff; P1=0xff; ys1ms(300); P0=0xe7; P1=0xe7; ys1ms(90); P0=0xdb; P1=0xdb; ys1ms(90); P0=0xbd; P1=0xbd; ys1ms(90); P0=0x7e; P1=0x7e; ys1ms(90); P0=0xff; P1=0xff; } /***************************** 按键2效果程序:流水左移函数 *****************************/ rlszy() { unsigned char a,b,i,led,led1; //申明无字符整形变量a,i,led,led1 led=0xfe; //左移初始值定位 led1=0x7f; P0=led; //输出 P1=led1; ys1ms(120); //延时 for(i=1;i<8;i++) //设置移动7次 { a=led<<i;//灯左移i位 P0=a; //依次点亮 b=led1>>i; P1=b; ys1ms(150); } } /***************************** 按键3效果程序:3灯走马右移函 *****************************/ rsdzmyy() { P0=0x1f;//00011111 P1=0xff; ys1ms(80); P0=0x8f; P1=0xfe; ys1ms(80); P0=0xc7; P1=0xfc; ys1ms(80); P0=0xe3; P1=0xf8; ys1ms(80); P0=0xf1; P1=0xf1; ys1ms(80); P0=0xf8; P1=0xe3; ys1ms(80); P0=0xfc; P1=0xc7; ys1ms(80); P0=0xfe; P1=0x8f; ys1ms(80); P0=0xff; P1=0x1f; ys1ms(80); } /***************************** 按键4效果程序:红色流水内外移动函数(灯光渐暗渐明) *****************************/ rlsnwyd() { P0=0xe7; P1=0xe7; ys1ms(90); P0=0xc3; P1=0xc3; ys1ms(90); P0=0x81; P1=0x81; ys1ms(90); P0=0x00; P1=0x00; rjl(); ys1ms(500); P0=0x7e; P1=0x7e; ys1ms(90); P0=0x3c; P1=0x3c; ys1ms(90); P0=0x18; P1=0x18; ys1ms(90); P0=0x00; P1=0x00; rja(); } /****************************************************************************/ rjl() //渐亮函数 { unsigned char a, b;//a控制延时长度 b控制循环周期 P0 = 0xff; P1=0xff; a = 0; for (b=250; b>0; b--) //循环周期设置 { a++; zkb (a); //延时长度随a而改变 P0 = 0xff; P1 = 0xff; a = ~a; //a值取反,决定灯灭时占空比 zkb (a); P0 = 0x00; P1 =0x00; a = ~a; //a值取反 使a回到原值继续循环 } } /****************************************************************************/ rja() //渐暗函数 { unsigned char a, b;//a控制延时长度 b控制循环周期 P0 = 0x00; //亮起LED P1=0x00; a = 0; for (b=250; b>0; b--) { a++; zkb (a); P0 = 0x00; P1 = 0x00; a = ~a; zkb (a); P0 = 0xff; P1=0xff; a = ~a; } } /****************************************************************************/ zkb(unsigned char d) //占空比函数,由d决定延时长度 { unsigned char i; while( --d != 0) { for(i = 0; i < 1; i++); //占空比时间设置 } } /****************************************************************************/
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服