基于8255扩展的多模式跑马灯设计_毕业设计论文(编辑修改稿)内容摘要:

写 8 2 5 5 控 制 字读 键 盘 保 存延 时 1 0 m s 消 抖再 读 键 盘两 次 键 值 相 同吗。 K 1 按 下N置 跑 马 模 式YK 2 按 下K 3 按 下速 度 加 1 速 度 减 1YYNNYN图 10 主程序流程图 — 青岛理工大学通信与电子信息工程学院 — 10 关 中 断保 护 现 场中 断 次 数 S p e e d ? 模 式 0。 模 式 0 模 式 1。 模 式 2。 模 式 1 模 式 2. . .. . .模 式 8。 模 式 8开 中 断返 回 主 函 数恢 复 现 场 YNNNNNYYYYN图 11 中断子程序 流程图 、 算法 程序的开始,先包含相应函数的头文件名,再定义 8255控制字、 PA 口、 PB 口以及各个参数和及各个位等。 编译三个函数,分别是 void Delay()函数、 void Led_Display()函数和 void KeyProcess()函数,它们依次是延时函数、 LED 显示函数和按键处理函数。 主函数中,开中断,启动定时器,设置 8255 的 PA、 PB 口为输出口,并且用 while(1)函数进行按键的判断和处理。 延时函数中,使用 while()和 for(。 )构成的嵌套函数来达到延时 的目的。 LED 显示函数中,让 PA 口显示高八位, PB 口显示低八位,再使用开关函数执行LED 不同的跑马模式。 如果 LED 滚动方向是逻辑 “1”,那么 LED 从右向左循环亮灯,如果LED 滚动方向是逻辑 “0”,那么 LED 从左向右循环亮灯。 按键处理函数中,如果检测到 K1 按下,那么 LED 的滚动方向 Dirtect 和移动位数mb_Count 重新设置为初始值, LED 的滚动模式加 1,并在数码管上显示相应的模式号。 如果检测到 K2 按下,那么在相应的模式上 LED 的滚动速度加 1,如果检测到 K3 按下,那么在相应的模式上 LED 的滚动 速度减 1。 程序中各个参数之间都一一对应,根据要求相互呼应。 通过控制这些参数的量值来实— 青岛理工大学通信与电子信息工程学院 — 11 现硬件仿真中多种跑马灯的运行模式。 、 编程技巧 设计中,将 PA 口设置为显示高八位 LED 灯, PB 口设置为显示低八位 LED灯,要注意两组初始值并不相同,多个函数和参数组合使用,实现跑马灯的多种运行方式。 、 源程序清单 (见附录一) 六、仿真过程综述 用 KEIL C 将程序编写好之后,先编译程序,检查程序有无错误。 如果有错误就要改正,直到没有错误,最后 编译、链接 生成 .HEX文件,再用 PROTEUS 画好硬件电路图,将刚生成的 .HEX文件添加到 AT89C52中,点击运行按钮进行仿真调试,在调试过程当中通过调试的结果完善程序。 仿真过程中,打开仿真开关,系统工作在默认的 0 模式,跑马速度也是默认的,当不断地按下按钮 K1 时,系统的跑马模式在 0~8 模式中更换;当不断地按下按钮 K2时, 16 只 LED 灯的跑马速度会在当前运行模式下不断地增加,直到达到最大跑马速度;当不断地按下按钮 K3 时, 16 只 LED 灯的跑马速度会在当前运行模式下不断地减小,直到达到最小跑马速度。 图 12 仿真结果图 — 青岛理工大学通信与电子信息工程学院 — 12 七、 调试过程中的主要难点及解决思路和办法 刚开始调试时, 我发现数码管显示不正常, LED灯没有跑马的运行方式,按键部分 KK2 和 K3 都不起作用。 后来经过仔细检查源程序和同学们的讲解,我找到了问题的原因所在。 因为我在主函数 main()中对 AT89C52 的 P0、 P P2 和 P3 端口都赋了初值 0xFF,才导致这四个端口处都是高电平,从而导致电路工作不正常。 把这一句代码删掉后,再进行仿真,这时电路的各个部分工作都正常了,但是美中不足的是 16 只 LED 灯的显示方式看起来不连贯,然后我又根据源程序更改了 8255 的 PA、 PB端口与 16 只 LED灯的连接顺序,直到 16只 LED 灯的 显示方式看起来循环连续。 八、课设结果及分析、收获、体会和建议 、结果及分析 打开仿真开关,系统工作在默认的 0 模式,如果 Dirtect=1, LEDFlag=1,那么执行语句 Led_Display(0xFFFEmb_Count), 16 只 LED 灯从右向左依次全亮;这时如果移动位数mb_Count=15,那么 Dirtect=!1=0, LEDFlag=1不变,同时 mb_Count 也变为初始值 0,并且 16 只 LED灯立即全灭,然后执行 else 中的语句 Led_Display(0x7FFFmb_Count), 16只 LED 灯从左向右依次全亮;这时如果 mb_Count=15,那么 Dirtect=!0=1, LEDFlag=!1=0,同时 mb_Count 重新变为初始值 0, 然后再执行第一个嵌套语句的 else 中的语句Led_Display(~(0x7FFFmb_Count)), 16 只 LED 灯第一个不亮,后 15 个同时全亮,接着从左向 右 LED灯依次全灭,在这一过程中,由于人眼视觉暂留原因,看不到 16 只 LED灯立即全灭接着第一个灯不亮,后 15 个同时全亮的过程;这时如果 mb_Count=15,那么Dirtect=!1=0, LEDFlag=0不变,同时 mb_Count 也变为 0,然后执行第二个嵌套语句的 else中的语句 Led_Display(~(0xFFFEmb_Count)), 16 只 LED 灯前 15个同时全亮,最后一个不亮,接着从右向左 LED灯依次全灭,这样就完成了一轮循环,然后按上述顺序再进行第二轮、第三轮 …… 循环。 、 收获体会 为期两周的单片机课程设计已经接近尾声,回顾这两周的课程设计,我感觉自己收获颇丰。 首先,我对单片机以及 C语言的认识和理解水平又上升了一个台阶,并且加深了我对软硬件结合的认识;其次,本次课设将我们 平时学到的理论知识真正应用到了实际应用中去,实现了学与用相结合这一宗旨;最后,本次课设涉及到了对两个软件 KEIL C 和 PROTEUS的学习,现在我已经基本熟悉了这两个仿真软件的相关知识和操作方法。 总之,从本次课设中我所收获到的知识,虽然目前看来没有用武之地,但是它为我们将来从事电子产品设计、软件编程等工作必会奠定良好的基础。 万事开头难,在刚开始课程设计的时候,大家都有点茫然而且都有无从下手的。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。