ASM 板


LINE

看板 ASM  RSS
※ 引述《endlessbbs ()》之銘言: : 下面是小弟自己寫的全部程式 : #include <reg51.h> : #include <stdlib.h> : 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;//喇叭控制定義位元 #define ADCData P2 #define LEDPort P1 #define DyBalance 64 //假設0G是64,事實上你要看你的動量感測器而定 char code ledtab[9]={0,0x1,0x3,0x7,0xf,0x1f,0x3f,0x7f,0xff}; // char code ledtab[9]={0xff;0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0}; // Invers table : 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。假設你使用12MHZ,我們希望DELAY的基本單位是1/1000秒 1000=0x3e8(1000uS),所以我們知道我們要先捕捉TH1>2然後等TL1>0xe7就可已知到是 經過了精確的1mS。當然,這還有些誤差,包括比對,啟動等等得動作都有延遲。不過精 確度比較高而且每次執行也比較穩定。 /* void delay1ms(void){ TR1=0; TH1=0; TL1=0; TR1=1; while(TH1<3); // wait TH1=3 while(TL1<0xe8); // wait TL1=0xe8 TR1=0; } */ 不過這樣讓CPU兜圈子似乎很浪費,那我們再來改良一下。AD轉換需要時間,而DELAY正 是讓CPU浪費時間。那位什麼不把AD轉換跟發呆一起作? char data adtmp=0; //用來計算累計動量 void delay1ms(void){ TR1=0; TH1=0; TL1=0; TR1=1; ADCWR=0; ADCWR=1; while(TH1<1); // delay 256 uS ADCRD=0; adtmp=adtmp+(ADCData-DyBalance); // 動量累積+(動量變化量 +64-64) ADCRD=1; if(adtmp<1){ // fix over flow and off LED adtmp=0; LEDPort=ledtab[0]; }else{ // not Zero or overflow Show LED LEDPort=ledtab[((adtmp>>4)&0x7)+1]; //Take table 1~8 range } while(TH1<3); // wait TH1=3 while(TL1<0xe8); // wait TL1=0xe8 TR1=0; } 好啦~ 我們現在有一個既能精確DELAY又能捕捉動量的DELAY程式了 : delay(int d) : { : int i,j; : for(i=0;i<d;i++) : for(j=0;j<200;j++); : } 你這段DELAY改成這樣如何? void delay(int d){ while(d>0){ delay1ms(); d--; } } : void t0isr(void)interrupt 1 : { : TH0=hi; : TL0=lo; : spk=~spk; : } : init_timer() : { :// TMOD=0x00; TMOD=0x10; //我們需要T1用MODE1工作 : 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好亂,改成這樣會不會比較簡潔? void main(void){ init_timer(); while(1){ play_song(song,len); delay(1000); //唱完了喔? 延遲1秒後來一次 } } -- 作別人不願作的事,是好人!。 作別人不敢作的事,是壞人!。 作別人不能作的事,是天才!。 作別人不會作的事,是…腦殘!! WolfLord --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.46.200.173 ※ 編輯: WolfLord 來自: 114.46.200.173 (09/17 03:29)
1F:推 sorkayi:改的不錯 比較簡潔了 09/17 11:10
2F:→ WolfLord:謝謝,不過我擔心原po可能還是看不懂真正的技術癥結在哪 09/17 14:24
3F:→ WolfLord:然後完全不懂怎麼修改又認為程式太敏感還是甚麼的又弄出 09/17 14:25
4F:→ WolfLord:一堆if...else 來,那我也沒辦法了......(笑) 09/17 14:26
5F:推 endlessbbs:程式測試時燈閃動的很快,覺得可能是只有延遲1ms的緣故 09/19 11:12
6F:→ endlessbbs:想說在else條件後面加delay(2000),請問w大我這樣理解 09/19 11:14
7F:→ endlessbbs:對嗎@@? 09/19 11:14
8F:→ WolfLord:這樣你會得到一個當機的程式,你在想想該怎麼辦 09/19 19:56
9F:→ WolfLord:我是建議能用數學解覺得東西沒必要弄一堆條件式 XD 09/19 19:57







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP