Re: [請益] 關於ADC0804訊號擷取的問題

看板ASM (組合語言)作者時間15年前 (2009/09/16 15:44), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/4 (看更多)
小弟把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)
文章代碼(AID): #1Ai9T7tb (ASM)
文章代碼(AID): #1Ai9T7tb (ASM)