单片机原理与接口技术人体反应速度测试仪设计大学论文_第1页
单片机原理与接口技术人体反应速度测试仪设计大学论文_第2页
单片机原理与接口技术人体反应速度测试仪设计大学论文_第3页
单片机原理与接口技术人体反应速度测试仪设计大学论文_第4页
单片机原理与接口技术人体反应速度测试仪设计大学论文_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、学序号 6院信息与通单片机原理与接口技术实验报告实验项目序实验项目名称人体反应速度测试姓 名莫旭涛 专 业电子信息工稈班 级 电信13-4BF完成时间2014年月10月16日一.调试心得这是我们第一个用C语言编写的项目实例,刚刚开始的时候,对 C是有些 陌生的,但是经过这么一个案例的编写,明显对C语言的操作变得熟练了。相比起汇编来,C语言人性化许多,修改错误也比较让人习惯。在这程序的编写中, 同样遇到了许多的问题,但是只要花时间,就没有解决不了了问题。在编写这个 程序的时候,首先要解决的问题是矩阵键盘和数码管的显示, 这两个模块我们用 得非常多,在以后对单片机的操作中

2、也会经常用到, 所以,我们最好写成模块的 形式,方便以后调用。再次遇到要使用矩阵键盘和数码管的时候,就可以直接把代码复制粘贴过来使用。编写这个程序遇到的第一个疑难杂症就是 游戏次数的设 置,因为书上的代码是在一个 while循环中进行的,所以没有游戏次数可言。每 次反应速度的测试显示一个相应的值,但是我们自己写的代码中明显是要设置游 戏次数的,这样才能取出平均值,让我们测量的反应时间变得更加精确。所以我 们while循环中要设置一个调出循环的次数,这个次数就是我们游戏次数,在这 里,要注意初值和减一所放的位置。第二个疑难是 随机数的生成,因为在51单片 机中是不支持对系统时间的调用,所以没有也

3、不能使用时间函数,而我们所有的算法算出来的数都会是一个有一定规律顺序的数。再次,如果用另外一个定时器来生成随机数,就可以做到代替时间函数,生成真正的随机数。二.程序代码功能简介:第一部分的代码:第八个数码管显示要按下的键,第6个数码管显示实际按下的键值。若按对,录入反应时间;若按错,置反应时间为9999ms。1-4个数码管显示几次按键的平均反应时间。第二部分代码:实现书上测试反应速度的程序。程序开始后,按下按键,led灯一直亮着,直到一个随机的时间,led灯熄灭。此时可以松手,记灯熄灭到松手的时间差为反应时间。代码如下:矩阵键盘模块:#include project18s.h#include

4、uchar key_value=0x10;uchar temp,a;uchar keyboard。uchar i,t=4;P2=0xFF;P2 口写 1a=0x7F; p_value 赋初始值 i=1;while(t-)a=_crol_(a,1);循环左移一位,检测下一行 key_scan();i+;if(i=5) i=1; a=0x7f;return key_value;void key_scan()P2=a;temp=P2;temp=temp&0 xF0;while(temp!=0xF0)delay(5);while(temp!=0xF0)/P2.0置零/读P2 口的值取高四位,都得用 t

5、emp, 即卩 temp=p2,temp=temp&0xf0;/如果高四位不全为0,则有键下延时消抖/再读一次,如果高四位还是不全为0,真的有键按下了temp=P2;/读 P2 口 的值给 tempswitch(temp)case 0xEE:key_value=0; break;case 0xDE:key_value=1; break;case 0xBE:key_value=2; break;case 0x7E:key_value=3; break;case 0xED:key_value=4; break;case 0xDD:key_value=5; break;case 0xBD:key_v

6、alue=6; break;case 0x7D:key_value=7; break;case 0xEB:key_value=8; break;case 0xDB:key_value=9; break;case 0xBB:key_value=10; break;case 0x7B:key_value=11; break;case 0xE7:key_value=12; break;case 0xD7:key_value=13; break;case 0xB7:key_value=14; break;case 0x77:key_value=15; break;while(temp!=0xf0)松手

7、检测temp=P2; temp=temp&0xf0; seed+=times; key_hit=1; times-;void delay(uint z)uint m,n;for(m=z; m0;m-)for(n=78;n0;n_);数码管显示模块:#include project18s.hsbit seg_oe=P1A3;/数码管显示使能端,低电平有效sbit duanxuan=P1A4;/数码管的段选端sbit weixuan=P1A5;/数码管的位选端uchar code smg_duan17=0x3F,0x06,0x5B,0x4F,0x66,0x6d,0x7d,0x07,0x7f,0x6

8、f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76; /数码管段选码表,我们的数码管是共阴极数码管uchar code smg_wei8=0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe;选择亮哪一个数码管void seg_disp(uchar wei,uchar duan)/ 单个数码管的显示weixuan=1;P0=smg_weiwei;weixuan=0;duanxuan=1;P0=smg_duanduan;duanxuan=0;seg_oe=0;delay10ms();seg_oe=1;void delay10ms()uchar i,

9、j;for(i=1;i40;i+)for(j=1;j40;j-);头文件:#ifndef Pro_H#define Pro_H#include #define uchar unsigned char#define uint unsigned int#define game_times 2/ 游戏次数extern uchar key_hit;extern int seed;extern int times;void seg_disp(uchar,uchar);void delay10ms();uchar keyboard();void key_scan();void delay(uint);#e

10、ndif主程序代码:/*项目18单片机人体反应速度测试仪的设计*包含模块:矩阵键盘,数码管,定时器 */#include project18s.h#include #include uchar key_hit=0;int seed=12;int times=game_times;uchar disp5;int mstime=0;void display(uint ms)/显示反应时间uchar i;disp3=ms/1000;disp2=(ms%1000)/100;disp1=(ms%100)/10;disp0=ms%10;for(i=0;i4;i+)seg_disp(i,dispi);uns

11、igned long random(uchar k)/ 生成随机数uint rt;srand(k);rt=rand();rt=rt*ra nd();return rt;int average(int time)/求反应时间的平均值int i,sum=0;for(i=0;igame_times-1;i+)sum+=timei;return(sum/game_times);void main()int timegame_times=0;uchar disp_num,hit_num;uchar disp_ms;TMOD=0x11;TH0=0xfc;TL0=0x17;TR0=1;ET0=1;EA=1;

12、while(1)while(times)while(1)disp_num=random(seed)%16;hit_num=keyboard();seg_disp(5,hit_num); seg_disp(7,disp_num);if(!key_hit)if(TF0=1)TR0=1;TF0=0;if(key_hit)TR0=0;key_hit=0; disp_ms=mstime; break;if(disp_num=hit_num)display(disp_ms); timetimes=disp_ms;elsedisplay(9999); timetimes=9999;mstime=0;TR0=

13、1;seg_disp(5,hit_num);seg_disp(7,disp_num);display(average(time);void Int_T0(void)interrupt 1+mstime;THO=Oxfc;(65535-1000)/256=252=0xfc 定时时间 1msTL0=0x17;(65535-1000)%256=23=0x17书上的代码经调试可用,如下:主程序代码:#include project18.h#include #include #include sbit key=P2A0;sbit led=P1A0;typedef unsigned char byte;t

14、ypedef unsigned int word;static byte disp5;code byte table11=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;byte bot(void)if(key=0)return 0;elsereturn 1;void display(word ms)uchar i;disp3=ms/1000;disp2=(ms%1000)/100;disp1=(ms%100)/10;disp0=ms%10;for(i=0;i0;-j) delay1ms();k=bot();if(k=1)mstime=999

15、9; goto loop;led=1;INIT_TMR1();while(1)if(TF 仁=1)TH1=0xfc;TL1=0x18;TR 仁1;TF1=0;+mstime;if(k=bot()break; loop:led=1;while(1)if(k=1)k=bot(); display(mstime);elsemstime=0;P2=0xff;break;头文件代码:#ifndef Pro_H#define Pro_H#include #define uchar unsigned char#define uint unsigned intvoid seg_disp(uchar,uchar);void delay10ms();#endif数码管模块:#include project18.hsbit seg_oe=P1A3;/数码管显示使能端,低电平有效sbit duanxuan=P1A4;/数码管的段选端sbit weixuan=P1A5;/数码管的位选端uchar code smg_duan16=0x3F,0x06,0x5B,0x4F,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/数码管段选码表,我们的数码管是共阴极数码管uchar code smg_wei8=0x7

温馨提示

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

评论

0/150

提交评论