全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1039
推到 Plurk!
推到 Facebook!

關於自動量測的軟體部分

答題得分者是:阿信
xaaaa
一般會員


發表:2
回覆:3
積分:1
註冊:2010-03-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-10-08 20:21:07 IP:203.74.xxx.xxx 訂閱

個人在做一個自動範圍的電壓表

(目前先兩檔)

硬體的部分已經完成,不過軟體的部份



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]
編輯記錄
xaaaa 重新編輯於 2010-10-08 20:23:14, 註解 無‧
xaaaa 重新編輯於 2010-10-08 20:23:16, 註解 無‧
xaaaa 重新編輯於 2010-10-08 20:23:17, 註解 無‧
xaaaa 重新編輯於 2010-10-08 20:27:22, 註解 無‧
kib72377
高階會員


發表:1
回覆:217
積分:238
註冊:2004-11-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-10-12 09:00:04 IP:218.170.xxx.xxx 未訂閱
% 是算 餘數嗎?
如果是,那麼:
  1. buffer[0]=temp;
  2. buffer[1]=(temp0 )/10
  3. buffer[2]=(temp00)/100;
  4. buffer[3]=temp/1000;

阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-10-20 10:12:34 IP:114.32.xxx.xxx 訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-10-20 17:17:18 IP:203.64.xxx.xxx 訂閱
謝謝 阿信版主
前幾天有自己改過成功了
但是網路連不上沒有即時來回應說解決了
也謝謝版主抽空回應

系統時間:2024-03-29 6:56:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!