Re: [請益] 關於ADC0804訊號擷取的問題
小弟把W大給的程式拿去燒錄後
發現燈號一開始就會一直亮著四顆
應該是加速規有初始電壓的關係
當時小弟自己的寫法是以2.5V為基準
2.5V以下就為零
剩下的再用IF去切割成八份量燈
但是W大的寫法我不會修改>"<
有嚐試用if去判斷,不過不行(應該是我不會用冏)
而且燈號似乎是一口氣亮完沒有一顆顆的亮上去..冏
有嚐試把延遲的第一個FOR改大一點
結果整個讀取就慢下來了Orz
小弟的寫法會讀不到,猜測有可能是因為這段
else if(B<=0x86)
{
P1=0x00;//P0 = 0000 0000
導致AD一直轉換讀取0的值
假如不用比較器的話請問程式要怎麼修
假如要加音效讓他亮一個燈就逼一聲
音效的副程式要怎麼放?(已經有寫好音效了只是不知道要怎麼插W大給的主程式裡)
我自己適用最笨的寫法一個燈號後面就加一個副程式
那個B=P2是令B為暫存器
想說存進去在讀取會不會比較順
但是沒有效果= =
不好意思,一口氣問這麼多問題,還請各位前輩不吝指教>"<
下面是小弟自己寫的全部程式
#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
sbit spk=P0^0;//喇叭控制定義位元
unsigned char hi, lo;
unsigned char thi[]={0,223,229,232,233,236,238,240,241,242,244,246,247,247};//音階對應計時器0計數初值高位元組資料列表
unsigned char tlo[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3};//音階對應計時器0計數初值低位元組資料列表
unsigned char song[]={3,5,5,3,2,1,2,3,5,3,2,3,5,5,3,2,1,2,3,2,1,1,100};//旋律
unsigned char len[]={1,1,2,1,1,1,2,1,1,1,2,1,1,2,1,1,1,2,1,1,1,100};//拍子
delay(int d)
{
int i,j;
for(i=0;i<d;i++)
for(j=0;j<200;j++);
}
void t0isr(void)interrupt 1
{
TH0=hi;
TL0=lo;
spk=~spk;
}
init_timer()
{
TMOD=0x00;
IE=0X82;
}
tone(char t, char l)
{
hi=thi[t];
lo=tlo[t];
TR0=1;
delay(100*l);
TR0=0;
}
play_song(char*t,char*l)
{
while(1)
{
if(*t==100)break;
tone(*t++,*l++);
delay(5);
}
}
main()
{
init_timer();
{
play_song(song,len);
}
spk=0;
while(1)
{
ADCWR=0 ; ADCWR= 1 ;
ADCRD=0 ;
delay111us();
B=P2;
ADCRD=1 ;
if(B>=0xF0)
{
P1=0x01;//P0 = 0000 0001
be();
delay_fun();
P1=0x03;//P0 = 0000 0011
be();
delay_fun();
P1=0x07;//P0 = 0000 0111
be();
delay_fun();
P1=0x0F;//P0 = 0000 1111
be();
delay_fun();
P1=0x1F;//P0 = 0001 1111
be();
delay_fun();
P1=0x3F;//P0 = 0011 1111
be();
delay_fun();
P1=0x7F;//P0 = 0111 1111
be();
delay_fun();
P1=0xFF;//P0 = 1111 1111
be();
delay_fun();
}
else if(B<=0xEF&&B>=0xE0)
{
P1=0x01;//P0 = 0000 0001
be();
delay_fun();
P1=0x03;//P0 = 0000 0011
be();
delay_fun();
P1=0x07;//P0 = 0000 0111
be();
delay_fun();
P1=0x0F;//P0 = 0000 1111
be();
delay_fun();
P1=0x1F;//P0 = 0001 1111
be();
delay_fun();
P1=0x3F;//P0 = 0011 1111
be();
delay_fun();
P1=0x7F;//P0 = 0111 1111
be();
delay_fun();
}
else if(B<=0xDF&&B>=0xD0)
{
P1=0x01;//P0 = 0000 0001
be();
delay_fun();
P1=0x03;//P0 = 0000 0011
be();
delay_fun();
P1=0x07;//P0 = 0000 0111
be();
delay_fun();
P1=0x0F;//P0 = 0000 1111
be();
delay_fun();
P1=0x1F;//P0 = 0001 1111
be();
delay_fun();
P1=0x3F;//P0 = 0011 1111
be();
delay_fun();
}
else if(B<=0xCF&&B>=0xC0)
{
P1=0x01;//P0 = 0000 0001
be();
delay_fun();
P1=0x03;//P0 = 0000 0011
be();
delay_fun();
P1=0x07;//P0 = 0000 0111
be();
delay_fun();
P1=0x0F;//P0 = 0000 1111
be();
delay_fun();
P1=0x1F;//P0 = 0001 1111
be();
delay_fun();
}
else if(B<=0xBF&&B>=0xB0)
{
P1=0x01;//P0 = 0000 0001
be();
delay_fun();
P1=0x03;//P0 = 0000 0011
be();
delay_fun();
P1=0x07;//P0 = 0000 0111
be();
delay_fun();
P1=0x0F;//P0 = 0000 1111
be();
delay_fun();
}
else if(B<=0xAF&&B>=0xA0)
{
P1=0x01;//P0 = 0000 0001
be();
delay_fun();
P1=0x03;//P0 = 0000 0011
be();
delay_fun();
P1=0x07;//P0 = 0000 0111
be();
delay_fun();
}
else if(B<=0x9F&&B>=0x90)
{
P1=0x01;//P0 = 0000 0001
be();
delay_fun();
P1=0x03;//P0 = 0000 0011
be();
delay_fun();
}
else if(B<=0x8F&&B>=0x87)
{
P1=0x01;//P0 = 0000 0001
be();
delay_fun();
}
else if(B<=0x86)
{
P1=0x00;//P0 = 0000 0000
}
ADCRD=1 ;
delay90();
}
}
void delay111us()
{
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: 140.134.32.181
※ 編輯: endlessbbs 來自: 140.134.32.181 (09/16 15:50)
※ 編輯: endlessbbs 來自: 140.134.32.181 (09/16 15:53)
※ 編輯: endlessbbs 來自: 118.170.96.229 (09/16 17:37)
討論串 (同標題文章)
完整討論串 (本文為第 3 之 4 篇):
ASM 近期熱門文章
PTT數位生活區 即時熱門文章