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

看板ASM (組合語言)作者 (呆呆小狼)時間15年前 (2009/09/08 14:37), 編輯推噓4(404)
留言8則, 3人參與, 最新討論串2/4 (看更多)
※ 引述《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

09/09 23:07, , 1F
原來如此阿~謝謝您的指點^^
09/09 23:07, 1F

09/09 23:20, , 2F
可以請問大大P1=ledtab[P2>>5];這句裡面">>"5的含意嗎
09/09 23:20, 2F

09/09 23:22, , 3F
大概知道tab的意思,但是>>5不太懂
09/09 23:22, 3F

09/09 23:22, , 4F
新手問題比較多不好意思>"<
09/09 23:22, 4F

09/10 00:22, , 5F
就是吧P2的bit7~bit5右移到bit2~bit0
09/10 00:22, 5F

09/10 03:41, , 6F
因為你只有8個LED,所以把AD的內容/32 (256/32=8)
09/10 03:41, 6F

09/10 03:41, , 7F
這樣才不會跑出TAB的範圍啊~~
09/10 03:41, 7F

09/11 00:17, , 8F
原來是這樣阿@@,感謝兩位熱心的回答<(_ _)>
09/11 00:17, 8F
文章代碼(AID): #1AfVkH8I (ASM)
文章代碼(AID): #1AfVkH8I (ASM)