单片机原理与接口技术人体反应速度测试仪设计大学论文.docx

上传人:b****5 文档编号:30019328 上传时间:2023-08-04 格式:DOCX 页数:16 大小:18.50KB
下载 相关 举报
单片机原理与接口技术人体反应速度测试仪设计大学论文.docx_第1页
第1页 / 共16页
单片机原理与接口技术人体反应速度测试仪设计大学论文.docx_第2页
第2页 / 共16页
单片机原理与接口技术人体反应速度测试仪设计大学论文.docx_第3页
第3页 / 共16页
单片机原理与接口技术人体反应速度测试仪设计大学论文.docx_第4页
第4页 / 共16页
单片机原理与接口技术人体反应速度测试仪设计大学论文.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

单片机原理与接口技术人体反应速度测试仪设计大学论文.docx

《单片机原理与接口技术人体反应速度测试仪设计大学论文.docx》由会员分享,可在线阅读,更多相关《单片机原理与接口技术人体反应速度测试仪设计大学论文.docx(16页珍藏版)》请在冰豆网上搜索。

单片机原理与接口技术人体反应速度测试仪设计大学论文.docx

单片机原理与接口技术人体反应速度测试仪设计大学论文

学号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--);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 公务员考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1