作者WolfLord (呆呆小狼)
看板ASM
标题Re: [请益] 关於ADC0804讯号撷取的问题
时间Tue Sep 8 14:37:02 2009
※ 引述《endlessbbs ()》之铭言:
: 各位前辈好,小弟目前在专题遇上了瓶颈,上来发问还请各位不吝指教<(_ _)>
: 专题要利用ADC0804读取加速规的讯号
: 通过程式判别後输出到LED上
: 动作流程大约是这样:加速规→ADC0804→8051→LED
: 希望达到的目的是读到加速规的讯号
: 并且大致上把它输出的讯号范围切成8等份输出到LED灯上
: 让他亮1~8个灯(一颗一颗亮上去)最後後一个灯可以亮1~2秒
: 在撷取讯号及延迟这边遇到瓶颈
: 目前的想法是用if判别完後,用延迟副程式去延迟led的秒数
: 但是效果不佳,延迟副程式的秒数设定太小的话讯号会一下子就过去
: 太大的话加速规(用的是xy轴加速规)要晃动好几次才会读到讯号
: 或是晃一次就会显示两次灯号(亮完一次後还没晃就直接亮第二次囧)
: 请问要怎麽修正程式比较好,还请各位前辈指点一下>"<
: 不好意思,程式还蛮罗嗦的囧>
#include <reg51.h>
#include <stdlib.h>
void delay150us();//宣告ADC读取延迟副程式
void delay_fun(); //LED一颗一颗亮上去延迟副程式
sbit ADCRD=P3^7 ;//设ADCRD脚位为P3.7
sbit ADCWR=P3^6 ;//设ADCWR脚位为P3.6
sbit ADCINTR=P3^2;//设ADCINTR脚位为P3.2
char code ledtab[8]={0x1,0x3,0x7,0xf,0x1f,0x3f,0x7f,0xff};
//char code ledtab[8]={0xf,0xe,0xc,0x8,0x18,0x38,0x78,0xf8};
//这个显示表比较好玩 :P
main()
{
while(1)
{
ADCWR=0 ; ADCWR= 1 ;
delay150us() ;
ADCRD=0 ;
P1=ledtab[P2>>5];
delayfun();
}
}
你的程式改这样应该就可以了,因为动量感测器本身就是是线性的。
所以本来就会一阶一阶的跳,不需要你去show funny。
--
~~於是,银河的历史又被海贼抹黑了好几百页。
- A23203 -
BM4GRM Harlock WolfLord
★ <<上站通知>> -- 我来啦!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.46.226.44
1F:推 endlessbbs:原来如此阿~谢谢您的指点^^ 09/09 23:07
2F:推 endlessbbs:可以请问大大P1=ledtab[P2>>5];这句里面">>"5的含意吗 09/09 23:20
3F:→ endlessbbs:大概知道tab的意思,但是>>5不太懂 09/09 23:22
4F:→ endlessbbs:新手问题比较多不好意思>"< 09/09 23:22
5F:推 ruemann:就是吧P2的bit7~bit5右移到bit2~bit0 09/10 00:22
6F:→ WolfLord:因为你只有8个LED,所以把AD的内容/32 (256/32=8) 09/10 03:41
7F:→ WolfLord:这样才不会跑出TAB的范围啊~~ 09/10 03:41
8F:推 endlessbbs:原来是这样阿@@,感谢两位热心的回答<(_ _)> 09/11 00:17