佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1804|回复: 11

【原创】Reaction Time Tester ,PIC16F84A

[复制链接]
发表于 16-8-2010 08:59 PM | 显示全部楼层 |阅读模式
本帖最后由 电子达人 于 19-8-2010 04:53 PM 编辑

UPDATE 2010/8/19 -发现忘记加上电路中的hardware debouncing capacitor C1 ,现已加上去。


最近觉得很闷,我很想把我DIY的东西分享出来,好让大家欣赏!
这次,我在此分享的是一个很简单的MCU 制作,那就是----Reaction Time Tester ...
这个电路,顾名思义,就是测量人体对stimulus反应的速度。需要两个人来玩。
电路里有两个开关: INT0/RB0 那边的作为start counting 和 stop counting 的switch(SW1)是给想要被测量的人拿的;RA4那边的作为trigger (SW2),是给"Gamemaster"拿的.
如何玩:1. 电源接上时,所有的LED全部一起闪。这是idle mode。
2.(如测量Player A的反应时间:)player A 需要按下Sw1, 使所有的LED都同时亮起。这时他要专注于LED。
3. Player B 需要按下sw2(最好让player A 不知道几时按), 这时候所有的LED都会灭掉,同时开始计时,并显示在LED上。(第一个LED亮代表50ms,第二个100ms,以此类推。次序是:RB7->RB1,RA3->RA1)
4. Player A 看到LED灭后,要马上按下SW1 来停止计时。所显示的时间即是反应时间。
5. 再次按下SW1以进入idle mode。





以下是PIC16F84A  的源码(HI-TECH C):
  1. #include "htc.h"
  2. __CONFIG(WDTDIS&RC&PWRTEN&UNPROTECT);
  3. #define bitset(var,bitno)((var)|=1UL<<(bitno))
  4. #define bitclr(var,bitno)((var)&=~(1UL<<(bitno)))
  5. #define testbit_on(data,bitno) ((data>>bitno)&0x01)
  6. #define _XTAL_FREQ 80000
  7. bit flashing=0,started=0,incre=0,testing=0,stop=0,qui=0,blink=0,debnc=0;


  8. void init(void)
  9. {
  10. TRISA=0B11110001;
  11. TRISB=0B00000001;
  12. OPTION=0B01010100; //SET RBPU,CLOCK SELECT,PRESCALER=64 for flashing LEDs
  13. INTCON=0B00010000; //only int0 is enabled
  14. PORTB=0B0;
  15. PORTA=0B0;
  16. flashing=0;started=0;incre=0;testing=0;stop=0;qui=0;blink=0;
  17. }

  18. void interrupt isr_a(void)
  19. {

  20.         if(T0IF)
  21.         {
  22.                 if(flashing)
  23.                 {
  24.                         TMR0=0X63;        //for flashing all leds at 2hz
  25.                         PORTA=~PORTA;
  26.                         PORTB=~PORTB;
  27.                 }
  28.                 if(testing)
  29.                 {
  30.                         TMR0=5;              
  31.                         incre=1;
  32.                 }
  33.                
  34.                 T0IF=0;
  35.         }
  36.         if(INTF)
  37.         {
  38.                 if(stop)
  39.                         qui=1;
  40.                 if(testing)
  41.                 {
  42.                         stop=1;
  43.                 }
  44.                 else
  45.                 {
  46.                         started=1;
  47.                 }
  48.        
  49.                 INTF=0;
  50.         }
  51. }

  52. void incdisplay(void)
  53. {
  54.         if(!started)
  55.         {
  56.                 if(!(testbit_on(PORTA,1))&&!(blink))
  57.                 {
  58.                         if((PORTB-1))
  59.                         {
  60.                                 if(testbit_on(PORTB,1))
  61.                                 {
  62.                                         PORTB=0;
  63.                                         bitset(PORTA,3);
  64.                                 }
  65.                                 else
  66.                                         PORTB>>=1;
  67.                         }
  68.                         else
  69.                         {
  70.                         PORTA>>=1;
  71.                         }
  72.                 }
  73.                 else
  74.                 {
  75.                 if(!blink) OPTION+=2;  // THIS IS TO SLOW THE BLINKING DOWN, OPTION WILL BE INCREMENTED ONLY ONCE AFTER THE FIRST ENTRANCE OF THIS PART
  76.                 if(testbit_on(PORTA,1)) bitclr(PORTA,1);
  77.                 else bitset(PORTA,1);
  78.                 blink=1;
  79.                
  80.                 }
  81.         }
  82.         else
  83.         {
  84.                 bitset(PORTB,7);
  85.                 started=0;
  86.         }
  87.         incre=0;
  88. }

  89. void main(void)
  90. {

  91.         init();       
  92.         T0IE=1;
  93.         TMR0=0X63;
  94.         ei();
  95.         flashing=1;
  96. checkstart:
  97.         if(!started)goto checkstart;

  98. waiting:   //all the LEDs light for a period of time, then turns off, then the reaction time measurement will be started
  99.         GIE=0;
  100.         flashing=0;
  101.         //waiting=1;
  102.         PORTA=0XFF;
  103.         PORTB=0XFF;
  104. //        __delay_ms(23500);   //automatic delay about 3sec
  105.         while(testbit_on(PORTA,4)) ;                                //manual delay, triggered by a switch at RA4
  106.         TRISA=0B11100000;
  107.         PORTA=0B0;PORTB=0B0;

  108. testrespond:
  109.         //waiting=0
  110.         bitclr(OPTION,2);                //SETUP THE TIMER+PRESCALER
  111.         bitclr(OPTION,1) ;                //PRESCALER = 1:8 "010"
  112.         bitset(OPTION,0);                        //for the reaction time with 0.1s scale, use tmr0=5 as initial value& prescaler 1:8
  113.         TMR0=5  ;                                         //for 0.05 second scales,use TMR0=5,PRESCALER= 1:4 (001) DONT FORGET TO CHANGE IT IN THE INTERRUPT
  114.         INTCON&=0B11111001;            //CLEAR ALL INTERRUPT FLAGS EXCEPT RBIF
  115.         GIE=1;
  116.         started=1;testing=1 ;
  117.         while(1)
  118.         {
  119.                 if(incre)
  120.                         incdisplay();
  121.                 if(qui)
  122.                 {
  123.                         GIE=0;
  124.                         __delay_ms(2000);
  125.                         INTCON&=0B11111001;
  126.                         T0IE=0;       
  127.                         GIE=1;
  128.                         break;
  129.                 }
  130.                 if(stop)
  131.                 {
  132.                         if(T0IE)
  133.                         {
  134.                                 T0IE=0;       
  135.                                 GIE=0;
  136.                                 __delay_ms(2000);
  137.                                 T0IE=0;       
  138.                                 INTE=1;
  139.                                 GIE=1;       
  140.                         }
  141.                 }
  142.         }

  143. }
复制代码

评分

参与人数 1积分 +30 收起 理由
pic + 30 原创, 加分鼓励。

查看全部评分

回复

使用道具 举报


ADVERTISEMENT

发表于 17-8-2010 07:42 AM | 显示全部楼层
谢谢分享。
可以放实体的照片吗?
回复

使用道具 举报

 楼主| 发表于 17-8-2010 03:42 PM | 显示全部楼层
哈哈,其实,我做得不是很好看。。。PCB+VEROBOD ,有点丑...
回复

使用道具 举报

发表于 17-8-2010 05:37 PM | 显示全部楼层
哈哈,其实,我做得不是很好看。。。PCB+VEROBOD ,有点丑...
电子达人 发表于 17-8-2010 03:42 PM

为什么用16F84A?哪里买的?
回复

使用道具 举报

 楼主| 发表于 17-8-2010 06:26 PM | 显示全部楼层
因为那时候我不会上farnell 买。。。只好到kg. benggali (槟城北海)去买。价钱还可以。。。RM9.80 ...
回复

使用道具 举报

 楼主| 发表于 17-8-2010 06:39 PM | 显示全部楼层
本帖最后由 电子达人 于 18-8-2010 03:38 PM 编辑

真的是一个improvised 的作品。。没办法,全部过程从code到hardware只用了一星期。。。
照片:
整体

近距


背面 : 用手画的PCB:

装LED 的perfboard背面:
回复

使用道具 举报

Follow Us
发表于 17-8-2010 06:44 PM | 显示全部楼层
本帖最后由 pic 于 17-8-2010 06:45 PM 编辑

再接再厉哦。。
回复

使用道具 举报

 楼主| 发表于 17-8-2010 07:30 PM | 显示全部楼层
谢谢。。。
回复

使用道具 举报


ADVERTISEMENT

发表于 18-8-2010 04:24 PM | 显示全部楼层
哦,原来楼主也是北海人啊。加油加油
回复

使用道具 举报

 楼主| 发表于 18-8-2010 08:06 PM | 显示全部楼层
回复 9# waiweng83
是呀,但准确一点,是北赖。
回复

使用道具 举报

发表于 20-8-2010 03:53 PM | 显示全部楼层
请问楼主kg. benggali那一间有卖pic chip。有什么model的。
楼主,加油加油
回复

使用道具 举报

 楼主| 发表于 20-8-2010 04:47 PM | 显示全部楼层
回复 11# chieh2020
我在“【求助】请问哪里购买PIC较便宜 ?”回复你了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 16-2-2025 10:31 AM , Processed in 0.115454 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表