单片机原理与接口技术人体反应速度测试仪设计大学论文.docx
- 文档编号:30019328
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:16
- 大小:18.50KB
单片机原理与接口技术人体反应速度测试仪设计大学论文.docx
《单片机原理与接口技术人体反应速度测试仪设计大学论文.docx》由会员分享,可在线阅读,更多相关《单片机原理与接口技术人体反应速度测试仪设计大学论文.docx(16页珍藏版)》请在冰豆网上搜索。
单片机原理与接口技术人体反应速度测试仪设计大学论文
学号14132201413序号6
单片机原理与接口技术
实验报告
实验项目序号4
实验项目名称人体反应速度测试
姓名莫旭涛专业电子信息工程
班级电信13-4BF完成时间2014年月10月16日
一.调试心得
这是我们第一个用C语言编写的项目实例,刚刚开始的时候,对C是有些陌生的,但是经过这么一个案例的编写,明显对C语言的操作变得熟练了。
相比起汇编来,C语言人性化许多,修改错误也比较让人习惯。
在这程序的编写中,同样遇到了许多的问题,但是只要花时间,就没有解决不了了问题。
在编写这个程序的时候,首先要解决的问题是矩阵键盘和数码管的显示,这两个模块我们用得非常多,在以后对单片机的操作中也会经常用到,所以,我们最好写成模块的形式,方便以后调用。
再次遇到要使用矩阵键盘和数码管的时候,就可以直接把代码复制粘贴过来使用。
编写这个程序遇到的第一个疑难杂症就是游戏次数的设置,因为书上的代码是在一个while循环中进行的,所以没有游戏次数可言。
每次反应速度的测试显示一个相应的值,但是我们自己写的代码中明显是要设置游戏次数的,这样才能取出平均值,让我们测量的反应时间变得更加精确。
所以我们while循环中要设置一个调出循环的次数,这个次数就是我们游戏次数,在这里,要注意初值和减一所放的位置。
第二个疑难是随机数的生成,因为在51单片机中是不支持对系统时间的调用,所以没有
再次,如果用另外一个定时器来生成随机数,就可以做到代替时间函数,生成真正的随机数。
二.程序代码
功能简介:
第一部分的代码:
第八个数码管显示要按下的键,第6个数码管显示实际按下的键值。
若按对,录入反应时间;若按错,置反应时间为9999ms。
1-4个数码管显示几次按键的平均反应时间。
第二部分代码:
实现书上测试反应速度的程序。
程序开始后,按下按键,led灯一直亮着,直到一个随机的时间,led灯熄灭。
此时可以松手,记灯熄灭到松手的时间差为反应时间。
代码如下:
矩阵键盘模块:
#include"project18s.h"
#include
ucharkey_value=0x10;
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;//P2.0置零
temp=P2;//读P2口的值
temp=temp&0xF0;//取高四位,都得用temp,即temp=p2,temp=temp&0xf0;
while(temp!
=0xF0)//如果高四位不全为0,则有键下
{
delay(5);//延时消抖
while(temp!
=0xF0)//再读一次,如果高四位还是不全为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=P1^3;//数码管显示使能端,低电平有效
sbitduanxuan=P1^4;//数码管的段选端
sbitweixuan=P1^5;//数码管的位选端
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)); } } voidInt_T0(void)interrupt1 { ++mstime; TH0=0xfc;//(65535-1000)/256=252=0xfc定时时间1ms TL0=0x17;//(65535-1000)%256=23=0x17 } 书上的代码经调试可用,如下: 主程序代码: #include"project18.h" #include #include #include sbitkey=P2^0; sbitled=P1^0; 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; TR1=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(TF1==1) { TH1=0xfc; TL1=0x18; TR1=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=P1^3;//数码管显示使能端,低电平有效 sbitduanxuan=P1^4;//数码管的段选端 sbitweixuan=P1^5;//数码管的位选端 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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 原理 接口 技术 人体 反应速度 测试仪 设计 大学 论文