单片机反应速度器课设论文_第1页
单片机反应速度器课设论文_第2页
单片机反应速度器课设论文_第3页
单片机反应速度器课设论文_第4页
单片机反应速度器课设论文_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、摘 要设计的反应速度测量器,主要由51单片机、数码管和少量的独立按键构成,其中单片机是核心,数码管作为显示设备,独立按键作为控制设备。当测试键按下后,测试LED点亮,当定时时间到后,测试LED熄灭,此时测试按键才可以松开,否则判断犯规,通过数码管显示测试结果。关键词:单片机;反应速度;数码管AbstractThe design speed measurement device mainly consists of 51 single-chip, digital control and few independent press constitutes, SCM is the core, dig

2、ital tube display device, independent press as a control device. After when the test button is pressed, the test LED lights, when time after time, the test LED is off, when test button can loosen, or judge fouls by digital tube display test results.Keywords: Microcontroller; speed; digital tube目 录引言

3、11. 设计要求22. 设计方案22.1 系统功能模块22.2 方案Proteus初步仿真32.3 单片机最小系统72.4 驱动电路72.4 显示电路82.5 控制电路93. 程序流程图104. 关键部分程序代码124.1 功能选择124.2 等待测试键按下124.3 等待LED熄灭134.4 LED熄灭,CPU开始计时145. PCB制作小结146. 总结15谢 辞16参考文献17附录1元器件清单18附录2 原理图19附录3 PCB20附录4 完整程序21桂林电子科技大学基础工程设计论文引言随着现代科技的发展,很多东西都走向了电子化,为了准确和方便的测试人的反应速度,人们也就发明出各种各样的

4、反应速度测试器,现在的测试器种类越来越多,技术越来越先进。为了让我们了解反应速度测试器的基本原理,这次课程设计就要求做一个基于单片机的反应速度测试器。通过实践证明,单片机、数码管、独立按键等结合起来可以达到我们目的。1.设计要求(1)测试者按下按钮,测试指示灯亮起,测试开始。(2)在测试过程中,测试者要集中注意力,一直观察测试灯,当看到灯灭时,测试者要迅速放开按钮,从测试灯灭到按键弹起的这一段时间,即为反应时间,在4位LED数码管上 用毫秒作为单位显示结果。(3)若测试者在灯灭前放开按钮,则系统自动判定为犯规,并显示出错信息。(4)测试灯亮灭的时间长短可设定及系统自动产生。2.设计方案以单片机

5、作为核心,选择数码管作为输出设备,独立按键作为输入设备。因为选择的数码管是共阴的。若直接使用单片机进行驱动,则驱动能力不够,所以通过控制74LS373来对数码管进行驱动。其中数码管是通过动态扫描显示,虽然也可以选择静态显示的方式,但是静态显示意味着额外的硬件开销,而在能达到同样的效果的前提下,首选开销小的方案。四个独立按键基本功能是功能键1、功能键2、确定和测试开始/结束。2.1系统功能模块单片机最小系统显示电路驱动电路控制电路电源 图2.1系统框图2.2 方案Proteus初步仿真图2.2初始化完成在Proteus的初步仿真中,单片机通过控制74LS373对数码管进行驱动显示,显示执行到各个

6、阶段的提示,比如系统初始化完成提示为FFFF、选择手动设置熄灭LED的时间提示为A001等等,最后就是测试完成以后显示测试结果。四个独立按键分别为功能键1、功能键2、确定键和测试开始/结束键。如图2.2所示,现在系统已经初始化完毕。图2.3选择手动设置时间系统开始运行时,需要选择熄灭LED的时间间隔,有两种选择:一种是手动设置;一种是系统随机生成。选择完后,系统根据测试者的选择进行设置熄灭LED时间间隔。之后等待测试者按下测试键,开始进行测试。在LED熄灭之前,测试者提前松开测试键,数码管输出报错提示F000,测试结束。如图2.3所示,现在选择的是手动设置LED熄灭时间,数码管显示提示代码A0

7、01,设置为3秒后测试LED熄灭。图2.4系统设置完成LED熄灭时间在测试者选定好LED熄灭时间后,如图2.4所示,系统根据测试者设定的时间间隔进行设置完成后,数码管显示提示代码B000,表明系统已经进行设置完毕,可以开始进行测试。只要测试者按下测试键后,测试立即开始。图2.5等待LED熄灭如图2.5所示,等待LED熄灭阶段。测试者按下测试键以后,如果在LED熄灭之前不松开测试按键,则不会报错,否则报错输出提示代码F000,本次测试失败。图2.6 CPU开始计时如图2.6所示,此时LED已经熄灭,CPU开始计时,只要测试者松开按键,经过单片机进行数据处理,测试者的反应速度通过数码管进行显示。图

8、2.7 显示测试结果如图2.7所示,当测试LED熄灭后,测试者迅速松开测试键,数码管显示出测试者的反应速度时间。若测试者需要继续按照原先的设置再次进行一次测试,先按下功能键1,再按确定键。若要重新进行选择LED熄灭时间设置,选择功能键2,再按下确定键即可。通过Protues进行初步的仿真,可知道这个方案是可行的,而在实际的制板和这个原理图肯定是有差别的,但是大体上是一样的。因为在仿真软件中,部分元件的不存在并不影响单片机的运行,所以在仿真的原理图中省略了一部分的元件。因为Proteus是仿真的,处于理想条件下的设计,所以在实际中还需要仔细的调试程序和板子才可以真正达到最初的设计目标。所以根据这

9、个基本的仿真方案,进行了符合实际的修改。2.3 单片机最小系统图2.8 最小系统单片机的P0口作为数据IO口,P3.2P3.6分别控制KEY1KEY4。而P1.51.6和RST引脚用来配合烧录器进行下载程序进单片机。图2.8中的C4、C5电容起到稳定振荡频率的作用。2.4 驱动电路图2.9 驱动电路当单片机通过74LS373进行驱动数码管显示的时候,因为P0口是一个准双向的端口,它内部没有集成上拉电阻,因此它只能输出低电平,而不能输出高电平,继而影响对数码管的控制。因此如果想让它输出高电平的话,需要接上拉电阻。因此在P0口接到74LS373的数据口之间加上上拉电阻,使P0口可以正常的输出高电平

10、。2.4 显示电路图2.10显示电路驱动芯片74LS373 的Q01Q08分别接到4位7段的数码管的引脚18,作为数据输入口。而数码管的引脚912分别是决定数码管的位选,单片机的P2.0P2.3进行控制。数码管的显示采用动态扫描进行显示,相比传统的静态显示方式,更加节省资源和可靠。动态数码扫描显示方式是利用了人眼的视觉暂留效应,把数码管按一定顺序进行点亮,当点亮的频率(即扫描频率)不大时,我们看到的是数码管一个个的点亮,然而,当点亮频率足够大时,我们看到的不再是一个一个的点亮,而是全部同时显示(点亮),与传统方式得到的视觉效果完全一样。因此我们只要给数码管这样一个扫描频率,那么就可以实现数码管

11、同时点亮。2.5 控制电路图2.11 控制电路在默认情况下,单片机检测到按键端口为高电平。当按键被按下的时候,经过软件消抖后,检测到端口变为低电平,即认为按键被按下。四个按键的功能分别为功能键1、功能键2、确定键和测试开始/结束键。在系统初始化完毕时,功能键1和功能键2分别表示手动设置LED熄灭时间和系统随机生成熄灭时间。而当进入手动设置熄灭时间时,此时功能键1和功能键2表示为设定秒和设定百毫秒。开始3.程序流程图系统初始化Y是否使用系统随机时间?N手动设定时间间隔设定是否完成?NY设置熄灭LED时间N测试开始按键是否按下?Y定时时间是否到了?NYLED熄灭,CPU开始进行计时测试开始按键是否

12、松开?NY显示反应时间是否重新设置测试间隔时间?NY图3.1 程序流程图因为数码管的显示有限,所以通过显示以下代码作为各个运行阶段的提示初始化代码 FFFF手动设置定时熄灭LED时间 A001系统随机定时熄灭LED时间 A002系统设定完成定时时间 B000在LED熄灭前松开测试键报错 F000CPU计时超时FF004.关键部分程序代码4.1功能选择while(1)key = KeyScan();/默认返回0Display();if(1 = key)Menu_Choice = 1;/选择手动设置时间提示代码 'A001' Dis0 = 1;Dis1 = Dis2 = 0;Dis

13、3 = 10;else if(2 = key)Menu_Choice = 2;/系统随机设置时间提示代码 'A002'Dis0 = 2;Dis1 = Dis2 = 0;Dis3 = 10;else if(3 = key)/确定键结束选择break;4.2等待测试键按下while(1)Display();if(0 = KEY_4) /等待测试键按下Dis_Pos = 0xff;/数码管熄灭LED_0 = 0;/点亮测试灯TR0 = 1;/启动定时器0,开始计时break;/跳出,执行下一阶段 4.3 等待LED熄灭milsec_time= time_back; /恢复计时时间wh

14、ile(1)if(1 = TF0)-milsec_time;TF0 = 0;TH0 = 0xFC;TL0 = 0x18;if(milsec_time <= 0)LED_0 = 1;/定时时间到,熄灭LEDbreak;if(1 = KEY_4)/判断是否松开测试按键Dis0 = Dis1 = Dis2 = 0;/设置错误提示代码 'F000'Dis3 = 14;Err = 1;break;4.4 LED熄灭,CPU开始计时Reflect_Time = 0;TR0 = 1;/启动定时器0,开始计时while(0 = KEY_4)if(1 = TF0)/ 1ms为计时单位TF0

15、 = 0;TH0 = 0xFC;TL0 = 0x18;+Reflect_Time;if(Reflect_Time >= 10000) /超出显示9999最大时间,提示代码'EE00' 表示超时 ,结束本次测试Reflect_Time = 0;Time_Out = 1;break;5.PCB制作小结因为4位7段的数码管和芯片74LS373引脚号都是交叉的,如果想要单面板走线而且不用跳线的情况下是很困难的,而与其选择跳线,不如直接做双面板更好,虽然双面板的制作比单面板来得麻烦点,但是比用跳线更加稳定和美观。此外,在板子腐蚀以后,先钻孔,再用砂纸磨掉板子上的碳粉,最后涂上松香。

16、但是有一点需要注意的就是,涂的松香不能太薄,否则不能起到防氧化的作用,造成板子光泽显得很暗淡。对数码管进行布局的时候注意引脚位置,仔细对照原理图,否则很容易放反。最后,在制作双面板的时候,最重要一步就是对孔,底层和顶层的转印纸在对孔时候一定尽可能的重合在一起,否则做出来的板子在钻孔后是不能使用的。而在使用熨斗进行转印的时候,注意控制时间,时间太长了会带来腐蚀上的麻烦。6.总结因为预算有限,所以设计的方案使用的是数码管作为显示设备,但其先天不足之处是显示不够直观,只能通过一些固定的提示代码来说明当前运行情况。如果在预算允许的情况下,使用12864液晶作为显示设备更加好,能够使测试者使用起来更加容

17、易,显示得更加直观。在制版之前,先进行Proteus仿真,在仿真中进行代码调试,仿真成功意味已经成功了一半。其中需要注意的就是仿真中的延迟和实际运行的延迟是有区别的,最好的方法就是使用定时器进行延迟。在Proteus中进行代码调试的时候,为了方便观察各个阶段执行的情况,分别设置不同的提示代码,确认执行的情况是否如预期所想。每完成一个阶段的设置,就在数码管上显示当前阶段的提示代码,并且只有当按下确定键后,才能执行下一个阶段设置。这样有利于测试各个部分代码的执行情况,并且容易定位有问题的地方。虽然通过数码管显示提示代码,可以具体知道执行到那个阶段,但是因为数码管能显示的信息有限,所以就算有问题,能

18、了解问题的情况很有限,如果能更换12864液晶显示,那就更加方便和直观了。在对板子进行第一次调试的时候,就发现了问题,数码管无法进行正常的显示和控制,经过检查PCB和程序,发现没有问题,排除了软件和PCB线路方面的问题。那就剩下是否是元件插反的问题,最后发现是数码管放反了,调整好数码管之后,显示方面的问题解决了。接下来就是软件部分的调试,首先是检查按键是否能正常控制系统的各种功能,这部分在仿真经过仔细的调试,所以在实际板子中也没有问题。再下来就是检查各个功能能否正常运行,在检查到LED熄灭定时部分和CPU计时部分出现了问题。在LED熄灭定时部分,按照预先的设想,当按下测试键以后,LED点亮,定

19、时时间到,LED熄灭。可是,实际上是LED点亮后即使超过了定时时间,也不熄灭。经过分析,问题是出在显示函数,因为我希望通过数码管来了解系统运行到具体那个阶段,所以在每个运行阶段都添加了显示函数,而显示函数里面需要用到延迟,造成了定时时间出现错误。当我把这两部分里面的显示函数都删掉以后,系统才运行正常。改进的方法是使用LCD1602或者12864液晶显示,这样就不必要像数码管那样需要动态扫描,也就不会需要延迟函数的调用,继而就不会造成定时上的误差了。最后就是整理一下程序代码,对关键部分代码进行详细的注释,删掉一些测试部分的代码,优化程序,使程序运行得更加快。在随机设定LED熄灭时间里,随机时间用

20、的是rand()函数和srand()函数配合使用生产随机数,srand()函数的随机种子是根据上一次生成的随机数为基础的。还有一种方法就是系统运行开始就启动一个定时器不断的计数,某一个时刻生成的随机数种子以定时器里面的数值为基础。最终,经过硬件和软件的调试,板子运行正常,达到如期的设想。经过本次经历,了解到了一个完整系统设计的步骤和方法。对于加深了对单片机的认识,加强了对单片机在应用方面的能力,特别是硬件方面的。谢 辞参考文献1 王选民.智能仪器原理及设计M.清华大学出版社,2010:7678.2 王守中.51单片机开发入门与典型实例M.人民邮电出版社,2008:4142, 6870.3 白驹

21、珩, 雷晓平.单片计算机及其应用M.高等教育出版社, 电子科技大学出版社,2005:8692 .4 彭伟.基于8051+Proteus仿真M.电子工业出版社,2012:1321.附录1元器件清单序 号名 称数 量单 价备 注1单片机89C51及底座12圆孔插座*113四位共阴数码管14电解电容10uf1574LS373芯片16排阻10K*817LED 5MM18按键6MM*6MM59电容30pF210电阻360欧111晶振12MHz112电阻10K113电阻100欧114ISP下载口1151617合计19附录2 原理图附录3 PCB附录4 完整程序#include <reg52.h>

22、;#include <stdlib.h>typedefunsigned int uint16;typedefunsigned char uint8;#define Dis_Port P0#define Dis_Pos P2/*变量*/char Dis4;char code Seg16 = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/共阴char code Seg_Pos4 = 0xf7,0xfb,0xfd,0xfe;uint16 Reflect_Time;uint1

23、6 milsec_time;uint8 seed = 5000; /随机数种子/*IO引脚定义*/sbit LED_0 = P32; /测试灯sbit KEY_1 = P33;/秒设置 功能选择1 手动设置定时sbit KEY_2 = P34;/毫秒设置功能选择2随机设置定时sbit KEY_3 = P35;/确定键sbit KEY_4 = P36;/测试开始/返回键/*函数定义*/void Display(void);uint8 KeyScan(void);void Delay(uint8 x);void Set_Time(void);void Rand_Time(void);void De

24、lay2(uint8 x);void main()uint8 Menu_Choice = 0;uint8 key, Time_Out, Err, return_key = 0;uint16 time_back = 0;uint8 re_begin = 0;/* 以12MHZ晶振为标准进行定时1MS 定时器0 定时1 初始化 16位计数器 */*利用软件TR0 TR1 进行控制定时器启动*/*其中TR0用于计时,TR1用于延时计时 */ TMOD = 0x11;TH0 = 0xFC;TL0 = 0x18;TH1 = 0xFC;TL1 = 0x18;Err = 0;while(1)/*显示初始化提

25、示 'FFFF' */Dis0 = Dis1 = Dis2 = Dis3 = 15;Time_Out = 0;LED_0 = 1;if(0 = re_begin)/*进行功能选择 KEY1进入手动设定时间间隔, KEY2进行系统随机设定*/while(1)key = KeyScan();/默认返回0Display();if(1 = key)Menu_Choice = 1;/选择手动设置时间提示代码 'A001' Dis0 = 1;Dis1 = Dis2 = 0;Dis3 = 10;else if(2 = key)Menu_Choice = 2;/系统随机设置时间

26、提示代码 'A002'Dis0 = 2;Dis1 = Dis2 = 0;Dis3 = 10;else if(3 = key)/确定键结束选择break;if(1 = Menu_Choice)/手动设置Set_Time();else/随机设置Rand_Time();time_back = milsec_time;/存储定时时间/* 设定完成 提示代码 'B000'*/Dis0 = Dis1 = Dis2 = 0;Dis3 = 11;/重新开始else/*原来的设置重新进行测试 提示代码 B000 */Dis0 = Dis1 = Dis2 = 0;Dis3 = 11

27、;/*等待测试开始*/while(1)Display();if(0 = KEY_4)Dis_Pos = 0xff;LED_0 = 0;/点亮测试灯TR0 = 1;/启动定时器0,开始计时break;milsec_time= time_back; /恢复计时时间while(1)if(1 = TF0)-milsec_time;TF0 = 0;TH0 = 0xFC;TL0 = 0x18;if(milsec_time <= 0)LED_0 = 1;/定时时间到,熄灭LEDbreak;if(1 = KEY_4)/判断是否松开测试按键Dis0 = Dis1 = Dis2 = 0;Dis3 = 15;

28、Err = 1;break;/设置错误提示代码 'F000'TR0 = 0;/关闭定时器0TH0 = 0xFC;TL0 = 0x18;if(0 = Err)Reflect_Time = 0;TR0 = 1;/启动定时器0,开始计时while(KEY_4 = 0)if(1 = TF0)/ 1ms为计时单位TF0 = 0;TH0 = 0xFC;TL0 = 0x18;+Reflect_Time;if(Reflect_Time >= 10000) /超出显示9999最大时间,提示代码'FF00' 表示超时 ,结束本次测试Reflect_Time = 0;Time_

29、Out = 1;break;/*测试结束 显示测试结果 */TR0 = 0;/关闭定时器0 结束计时if(0 = Time_Out)/处理显示数据Dis0 = Reflect_Time % 10;Reflect_Time /= 10;Dis1 = Reflect_Time % 10;Reflect_Time /= 10;Dis2 = Reflect_Time % 10;Reflect_Time /= 10;Dis3 = Reflect_Time % 10;else/显示超时错误 'FF00'Dis1 = Dis0 = 0;Dis3 = Dis2 = 15;/*确定键 开始再一次

30、测试 以原来的设置 测试键 重新进行设置 进行测试*/while(1)Display();key = KeyScan();if(1 = key)/保持原来的设置进行测试Err = 0;re_begin = 1;Dis0 = 1;Dis1 = Dis2 = 0;Dis3 = 12;else if(2 = key)/重新选择设置进行测试Err = 0;re_begin = 0;Dis0 = 2;Dis1 = Dis2 = 0;Dis3 = 12;else if(3 = key)break;/整体while()/*函数体*/void Delay(uint8 x)uint8 i;TR1 = 1;i = 0;while(i < x)if(1 = TF1)TF1 = 0;TH1 = 0xFC;TL1 = 0x18;+i;TR1 = 0;voi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论