[請益] 關於ADC0804訊號擷取的問題
各位前輩好,小弟目前在專題遇上了瓶頸,上來發問還請各位不吝指教<(_ _)>
專題要利用ADC0804讀取加速規的訊號
通過程式判別後輸出到LED上
動作流程大約是這樣:加速規→ADC0804→8051→LED
希望達到的目的是讀到加速規的訊號
並且大致上把它輸出的訊號範圍切成8等份輸出到LED燈上
讓他亮1~8個燈(一顆一顆亮上去)最後後一個燈可以亮1~2秒
在擷取訊號及延遲這邊遇到瓶頸
目前的想法是用if判別完後,用延遲副程式去延遲led的秒數
但是效果不佳,延遲副程式的秒數設定太小的話訊號會一下子就過去
太大的話加速規(用的是xy軸加速規)要晃動好幾次才會讀到訊號
或是晃一次就會顯示兩次燈號(亮完一次後還沒晃就直接亮第二次囧)
請問要怎麼修正程式比較好,還請各位前輩指點一下>"<
不好意思,程式還蠻囉嗦的囧>
#include <reg51.h>
#include <stdlib.h>
void delay150us();//宣告ADC讀取延遲副程式
void delay90();//燈號延遲1~2秒副程式
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
main()
{
while(1)
{
ADCWR=0 ; ADCWR= 1 ;
delay150us() ;
ADCRD=0 ;
if(P2>=0xF0)
{
P1=0x01;//P0 = 0000 0001
delay_fun();
P1=0x03;//P0 = 0000 0011
delay_fun();
P1=0x07;//P0 = 0000 0111
delay_fun();
P1=0x0F;//P0 = 0000 1111
delay_fun();
P1=0x1F;//P0 = 0001 1111
delay_fun();
P1=0x3F;//P0 = 0011 1111
delay_fun();
P1=0x7F;//P0 = 0111 1111
delay_fun();
P1=0xFF;//P0 = 1111 1111
}
else if(P2<=0xEF&&P2>=0xE0)
{
P1=0x01;//P0 = 0000 0001
delay_fun();
P1=0x03;//P0 = 0000 0011
delay_fun();
P1=0x07;//P0 = 0000 0111
delay_fun();
P1=0x0F;//P0 = 0000 1111
delay_fun();
P1=0x1F;//P0 = 0001 1111
delay_fun();
P1=0x3F;//P0 = 0011 1111
delay_fun();
P1=0x7F;//P0 = 0111 1111
delay_fun();
}
else if(P2<=0xDF&&P2>=0xD0)
{
P1=0x01;//P0 = 0000 0001
delay_fun();
P1=0x03;//P0 = 0000 0011
delay_fun();
P1=0x07;//P0 = 0000 0111
delay_fun();
P1=0x0F;//P0 = 0000 1111
delay_fun();
P1=0x1F;//P0 = 0001 1111
delay_fun();
P1=0x3F;//P0 = 0011 1111
delay_fun();
}
else if(P2<=0xCF&&P2>=0xC0)
{
P1=0x01;//P0 = 0000 0001
delay_fun();
P1=0x03;//P0 = 0000 0011
delay_fun();
P1=0x07;//P0 = 0000 0111
delay_fun();
P1=0x0F;//P0 = 0000 1111
delay_fun();
P1=0x1F;//P0 = 0001 1111
delay_fun();
}
else if(P2<=0xBF&&P2>=0xB0)
{
P1=0x01;//P0 = 0000 0001
delay_fun();
P1=0x03;//P0 = 0000 0011
delay_fun();
P1=0x07;//P0 = 0000 0111
delay_fun();
P1=0x0F;//P0 = 0000 1111
delay_fun();
}
else if(P2<=0xAF&&P2>=0xA0)
{
P1=0x01;//P0 = 0000 0001
delay_fun();
P1=0x03;//P0 = 0000 0011
delay_fun();
P1=0x07;//P0 = 0000 0111
delay_fun();
}
else if(P2<=0x9F&&P2>=0x90)
{
P1=0x01;//P0 = 0000 0001
delay_fun();
P1=0x03;//P0 = 0000 0011
delay_fun();
}
else if(P2<=0x8F&&P2>=0x87)
{
P1=0x01;//P0 = 0000 0001
delay_fun();
}
else if(P2<=0x86)
{
P1=0x00;//P0 = 0000 0000
}
ADCRD=1 ;
delay90();
}
}
void delay150us()
{
int i=0 ;
for(i=0 ; i < 18 ; i++) ;
}
void delay90()
{
int s,i,k;
for(s=0;s<550;s++)
for(k=0;k<10;k++)
for(i=0;i<12;i++);
}
void delay_fun()
{
int i,k;
for(k=0;k<70;k++)
for(i=0;i<1000;i++);
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.170.97.100
※ 編輯: endlessbbs 來自: 118.170.97.100 (09/08 13:23)
→
09/08 20:05, , 1F
09/08 20:05, 1F
推
09/08 20:49, , 2F
09/08 20:49, 2F
→
09/08 20:51, , 3F
09/08 20:51, 3F
→
09/08 20:51, , 4F
09/08 20:51, 4F
→
09/09 01:13, , 5F
09/09 01:13, 5F
推
09/09 01:23, , 6F
09/09 01:23, 6F
→
09/09 01:24, , 7F
09/09 01:24, 7F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 4 篇):
ASM 近期熱門文章
PTT數位生活區 即時熱門文章