单片机原理与接口技术人体反应速度测试仪设计大学毕业设计论文.docx
- 文档编号:14000713
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:16
- 大小:35.55KB
单片机原理与接口技术人体反应速度测试仪设计大学毕业设计论文.docx
《单片机原理与接口技术人体反应速度测试仪设计大学毕业设计论文.docx》由会员分享,可在线阅读,更多相关《单片机原理与接口技术人体反应速度测试仪设计大学毕业设计论文.docx(16页珍藏版)》请在冰点文库上搜索。
单片机原理与接口技术人体反应速度测试仪设计大学毕业设计论文
学号14132201413序号6
院信息与通
单片机原理与接口技术
实验报告
实验项目序
实验项目名称人体反应速度测试
姓名莫旭涛专业电子信息工稈
班级电信13-4BF完成时间2014年月10月16日
一.调试心得
这是我们第一个用C语言编写的项目实例,刚刚开始的时候,对C是有些陌生的,但是经过这么一个案例的编写,明显对C语言的操作变得熟练了。
相
比起汇编来,C语言人性化许多,修改错误也比较让人习惯。
在这程序的编写中,同样遇到了许多的问题,但是只要花时间,就没有解决不了了问题。
在编写这个程序的时候,首先要解决的问题是矩阵键盘和数码管的显示,这两个模块我们用得非常多,在以后对单片机的操作中也会经常用到,所以,我们最好写成模块的形式,方便以后调用。
再次遇到要使用矩阵键盘和数码管的时候,就可以直接把
代码复制粘贴过来使用。
编写这个程序遇到的第一个疑难杂症就是游戏次数的设置,因为书上的代码是在一个while循环中进行的,所以没有游戏次数可言。
每次反应速度的测试显示一个相应的值,但是我们自己写的代码中明显是要设置游戏次数的,这样才能取出平均值,让我们测量的反应时间变得更加精确。
所以我们while循环中要设置一个调出循环的次数,这个次数就是我们游戏次数,在这里,要注意初值和减一所放的位置。
第二个疑难是随机数的生成,因为在51单片机中是不支持对系统时间的调用,所以没有
我们所有的算法算出来的数都会是一个有一定规律顺序的数。
再次,如果用另外
一个定时器来生成随机数,就可以做到代替时间函数,生成真正的随机数。
二.程序代码
功能简介:
第一部分的代码:
第八个数码管显示要按下的键,第6个数码管显示实际按下的键值。
若按对,录入反应
时间;若按错,置反应时间为9999ms。
1-4个数码管显示几次按键的平均反应时间。
第二部分代码:
实现书上测试反应速度的程序。
程序开始后,按下按键,led灯一直亮着,直到一个随机的
时间,led灯熄灭。
此时可以松手,记灯熄灭到松手的时间差为反应时间。
代码如下:
矩阵键盘模块:
#include"project18s.h"
#include
uchartemp,a;
ucharkeyboard。
{
uchari,t=4;
P2=0xFF;〃P2口写1
a=0x7F;〃p_value赋初始值i=1;
while(t--)
{
a=_crol_(a,1);〃循环左移一位,检测下一行key_scan();
i++;
if(i==5){i=1;a=0x7f;}
}
returnkey_value;
voidkey_scan()
{
P2=a;
temp=P2;
temp=temp&0xF0;
while(temp!
=0xF0)
{
delay(5);
while(temp!
=0xF0)
}
//P2.0置零
//读P2口的值
〃取高四位,都得用temp,即卩temp=p2,temp=temp&0xf0;
//如果高四位不全为0,则有键下
〃延时消抖
//再读一次,如果高四位还是不全为0,真的有键按下了
temp=P2;//读P2口的值给temp
switch(temp)
{
case0xEE:
key_value=0;break;
case0xDE:
key_value=1;break;
case0xBE:
key_value=2;break;
case0x7E:
key_value=3;break;
case0xED:
key_value=4;break;
case0xDD:
key_value=5;break;
case0xBD:
key_value=6;break;
case0x7D:
key_value=7;break;
case0xEB:
key_value=8;break;
case0xDB:
key_value=9;break;
case0xBB:
key_value=10;break;
case0x7B:
key_value=11;break;
case0xE7:
key_value=12;break;
case0xD7:
key_value=13;break;
case0xB7:
key_value=14;break;
case0x77:
key_value=15;break;
}
while(temp!
=0xf0)〃松手检测
temp=P2;temp=temp&0xf0;
}seed+=times;key_hit=1;times--;
}
voiddelay(uintz)
{
uintm,n;
for(m=z;m>0;m--)
for(n=78;n>0;n__);
}
数码管显示模块:
#include"project18s.h"
sbitseg_oe=P1A3;//数码管显示使能端,低电平有效
sbitduanxuan=P1A4;//数码管的段选端
sbitweixuan=P1A5;//数码管的位选端
ucharcodesmg_duan[17]={0x3F,0x06,0x5B,0x4F,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76};//数码管段选码表,我们的数码管是共阴极数码管
ucharcodesmg_wei[8]={0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe};〃选择亮哪一个数码管
voidseg_disp(ucharwei,ucharduan)//单个数码管的显示
{
weixuan=1;
P0=smg_wei[wei];
weixuan=0;
duanxuan=1;
P0=smg_duan[duan];
duanxuan=0;
seg_oe=0;
delay10ms();
seg_oe=1;
}
voiddelay10ms()
uchari,j;
for(i=1;i<40;i++)
for(j=1;j<40;j--);
}
头文件:
#ifndefPro_H
#definePro_H
#include
#defineucharunsignedchar
#defineuintunsignedint
#definegame_times2//游戏次数
externucharkey_hit;
externintseed;
externinttimes;
voidseg_disp(uchar,uchar);
voiddelay10ms();
ucharkeyboard();
voidkey_scan();
voiddelay(uint);
#endif
主程序代码:
/**项目18单片机人体反应速度测试仪的设计
***包含模块:
矩阵键盘,数码管,定时器*/
#include"project18s.h"
#include
#include
ucharkey_hit=0;
intseed=12;
inttimes=game_times;
uchardisp[5];
intmstime=0;
voiddisplay(uintms)
//显示反应时间
uchari;
disp[3]=ms/1000;
disp[2]=(ms%1000)/100;
disp[1]=(ms%100)/10;
disp[0]=ms%10;
for(i=0;i<4;i++)
{
seg_disp(i,disp[i]);
}
}
unsignedlongrandom(uchark)//生成随机数
{
uintrt;
srand(k);
rt=rand();
rt=rt*rand();
returnrt;
}
intaverage(inttime[])//求反应时间的平均值
{
inti,sum=0;
for(i=0;i sum+=time[i]; return(sum/game_times); } voidmain() { inttime[game_times]=0; uchardisp_num,hit_num; uchardisp_ms; TMOD=0x11; TH0=0xfc; TL0=0x17; TR0=1; ET0=1; EA=1; 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);time[times]=disp_ms; } else { display(9999);time[times]=9999; } mstime=0; TR0=1; } seg_disp(5,hit_num); seg_disp(7,disp_num); display(average(time)); } } ++mstime; THO=Oxfc; 〃(65535-1000)/256=252=0xfc定时时间1ms TL0=0x17;〃(65535-1000)%256=23=0x17 } 书上的代码经调试可用,如下: 主程序代码: #include"project18.h" #include #include #include sbitkey=P2A0; sbitled=P1A0; typedefunsignedcharbyte; typedefunsignedintword; staticbytedisp[5]; codebytetable[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; bytebot(void) { if(key==0) return0; else return1; } voiddisplay(wordms) { uchari; disp[3]=ms/1000; disp[2]=(ms%1000)/100; disp[1]=(ms%100)/10; disp[0]=ms%10; for(i=0;i<4;i++) { seg_disp(i,disp[i]); unsignedlongrandom(void) { wordrt; bytek=0;srand(50000);rt=rand(); rt=rt*rand();returnrt; } voidINIT_TMR1(void) { TMOD=0x11; TH1=0xfc; TL1=0x66; TR仁1; } voiddelay1ms(void) { INIT_TMR1(); while (1) { if(TF1==1)break; } } voidmain(void) { bytek=0; k=bot(); P2=0xff; while (1) { wordmstime=0,j;wordr;while(bot());led=0;r=random();for(j=r;j>0;--j){ delay1ms(); k=bot(); if(k==1) { mstime=9999;gotoloop; } } 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); } else { mstime=0; P2=0xff; break; } } } } 头文件代码: #ifndefPro_H #definePro_H #include #defineucharunsignedchar #defineuintunsignedint voidseg_disp(uchar,uchar); voiddelay10ms(); #endif 数码管模块: #include"project18.h" sbitseg_oe=P1A3;//数码管显示使能端,低电平有效 sbitduanxuan=P1A4;//数码管的段选端 sbitweixuan=P1A5;//数码管的位选端 ucharcodesmg_duan[16]={0x3F,0x06,0x5B,0x4F, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//数码管段选码表,我们的数码管是共阴极数码管 ucharcodesmg_wei[8]={0x7f,0xbf,0xdf,0xef, 0xf7,0xfb,0xfd,0xfe};//选择亮哪一个数码管 voidseg_disp(ucharwei,ucharduan) { uchari,j; for(i=0;i<8;i++) { weixuan=1; P0=smg_wei[wei]; weixuan=0; duanxuan=1; P0=smg_duan[duan]; duanxuan=0; seg_oe=0; delay10ms(); seg_oe=1; } }voiddelay10ms() { uchari,j; for(i=1;i<10;i++) for(j=10;j>0;j--);}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 原理 接口 技术 人体 反应速度 测试仪 设计 大学 毕业设计 论文