關於自動量測的軟體部分 |
答題得分者是:阿信
|
xaaaa
一般會員 發表:2 回覆:3 積分:1 註冊:2010-03-28 發送簡訊給我 |
個人在做一個自動範圍的電壓表 (目前先兩檔) 硬體的部分已經完成,不過軟體的部份 A/D值轉電壓的程式碼錯了, 知道是錯在哪但是不知道該如何修改 想請問前輩該如何修改 [code c#] #include "reg51.h" /* 含8051內部所有暫存器宣告 */ unsigned char xdata ADC_Port; /* ADC0804 I/O位址宣告 */ int sample=1000; /* 取樣率設定,消除顯示器跳動 */ char num=0; /* 動態掃描顯示位數 */ unsigned char value; /* 轉換後的數位資料 */ unsigned char buffer[4]={0,0,0,0}; /* 數位資料儲存緩衝區 */ void convert(void); /* 函數原型宣告 */ void convert1(void); /* 函數原型宣告 */ void display(void); /* 函數原型宣告 */ main() /* 主程式 */ { IE=0x83; /* 致能T0與外部中斷0中斷 */ TMOD=0x01; /* 設定計時器0工作於模式1 */ TH0=(65536-5000)/256; /* 設定計時器0初值 */ TL0=(65536-5000)%6; TCON=0x01; /* 設定外部中斷0為負緣觸發 */ TR0=1; /* 啟動計時器0 */ P1=0xff; /* 關閉七段顯示 */ ADC_Port=0; /* 開始轉換 (WR=0) */ P2=0x02; /* 設定一開始檔位*/ while(1) /* 等待中斷 */ ; } void EX0_int(void) interrupt 0 /* 偵測ADC0804是否已轉換完成 */ { while(--sample==0) /* 已取樣5000次? */ { sample=1000; /* 重設取樣率 */ value=ADC_Port; /* 讀取轉換完成的數位資料(RD=0) */ if (value < 20) { P2=0x01; /* 換擋 */ } else { convert1(); } } ADC_Port=0; /* 將類比資料寫入ADC0804中 */ } /* EX0_int */ void T0_int(void) interrupt 1 /* 四位七段顯示器動態掃描 */ { TH0=(65536-5000)/256; /* 重新初值 */ TL0=(65536-5000)%6; display(); /* 掃描顯示一位七段顯示器 */ } /* T0_int */ void convert(void) { unsigned int temp; /* 轉換暫存區 */ temp=2*value; /* 轉換修正 */ buffer[0]=((temp00)0); /* 儲存轉換修正後的結果 */ buffer[1]=((temp00)0)/10; buffer[2]=(temp00)/100; buffer[3]=temp/1000; } /* convert */ void convert1(void) { unsigned int temp; /* 轉換暫存區 */ temp=20*value; /* 轉換修正 */ buffer[0]=((temp00)0); /* 儲存轉換修正後的結果 */ buffer[1]=((temp00)0)/10; buffer[2]=(temp00)/100; buffer[3]=temp/1000; } /* convert */ void display(void) { char i; i=num; /* 選擇七段顯示器 */ i<<=4; /* 掃描下一位 */ i =buffer[num]; /* 取出七段顯示資料 */ P1=i; /* 將七段顯示資料輸出至P1 */ num ; /* 下一位 */ if(num==4) /* 已掃描至第4位? */ num=0; /* 重新掃描第1位 */ } /* display */ [/code] 這是硬體的電路圖 [img]http://img708.imageshack.us/img708/3924/autirange.jpg/img] |
kib72377
高階會員 發表:1 回覆:217 積分:238 註冊:2004-11-12 發送簡訊給我 |
|
阿信
版主 發表:111 回覆:983 積分:813 註冊:2005-03-10 發送簡訊給我 |
1.
你的換檔程式有問題! 在x10檔,若讀值<20,則切換為x1檔; 在x1檔,若讀值>220,則切換為x10檔。 而且還要點亮對應的小數點。 [code cpp] void EX0_int(void) interrupt 0 /* 偵測ADC0804是否已轉換完成 */ { while(--sample==0) /* 已取樣5000次? */ { sample=1000; /* 重設取樣率 */ value=ADC_Port; /* 讀取轉換完成的數位資料(RD=0) */ if (P2==2) //x10檔 { if (value < 20) { P2=1; //切為x1檔 } else { convert1(); //x10檔轉換 } } else //x1檔 { if (value > 220) } P2=2; //切為x10檔 } else { convert(); //x1檔轉換 } } ADC_Port=0; /* 將類比資料寫入ADC0804中 */ } /* EX0_int */ [/code] 2. >ADC_Port=0; /* 將類比資料寫入ADC0804中 */ 這個指令確定需要嗎? |
xaaaa
一般會員 發表:2 回覆:3 積分:1 註冊:2010-03-28 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |