硬體82G516內建ADC
掃描式共陽7段顯示器
74LS48,BCD-轉7段驅動
PORT0的-0-1-2-3當作掃描使用
P2當作數字值輸出給7448
P3.7當作小數顯示
工作方法:測量電瓶類比電壓--類比轉數位--輸出BCD碼--驅動7段顯示器
1:設定晶片輸出腳為推挽式
2:允許ACD啟動&ADC中斷,選擇通道,並且將轉換後的數位資料
ADCH的低6位元存在ADCL的高6位元
(因ACD資料10BIT,放在ADCH跟ADCL兩個暫存器
若不指定:資料前(高)8位元存於ADCH)
3:運算(ADC資料轉成電壓值)
4:顯示現在電壓值
5:GJ哥說!從新開始.....(囧)
----------------------------------------------------------------------------------
#include <mpc82.h></mpc82.h>
#define ch 0x00
//
void dellay(int); // 時間延遲
int volnumber;
int v10000,v1000,v100,v10,v1;
char code second[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
char code scan[]={0x01,0x02,0x04,0x08};
unsigned char led,i;
int gj;
main()
{ P1M0=0xff 1M1=0x00; //輸入MODE
P3M0=P0M0=P2M0=0x00; P3M1=P0M1=P2M1=0xff;//P2P0 scan
EA=1;AUXIE=EADC; //開啟adc中斷.
ADCTL=ADCON + ADCS + CH; //時脈.啟動.通道
AUXR=ADRJ; //ADCH>>6
//START//
gj=80;
while(gj)
{ for(i=0;i
{ switch(i)
{ case(0x00):{led=v1;break;}
case(0x01):{led=v10;break;}
case(0x02):{led=v100; P3=0xff;break;}
case(0x03):{led=v1000; break;}
}
P2=second[led] ;
P0=scan ;
dellay(2);
P0=0x00; P3=0x00;
}
gj=gj-1;
}
}
//
void ADC_Interrupt() interrupt 9
{ ADCTL=0;
volnumber= (((ADCH
v1000= (volnumber/10000) ; //1
v100= (volnumber%10000)/1000 ; //0.1
v10= (volnumber%1000)/100 ; //0.01
v1= (volnumber%100)/10 ; //0.001
}
//
void dellay (int x) //時間延遲
{ int ii,jj;
for(ii=0;ii<x></x>
{for(jj=0;jj
}
}
--------------------------------------------------------------------------------------
問題來了.....
比較正確的ADC10BIT
DATA*1000*5/1023(正確)
DATA*1000*5/1000(錯誤)
但是當我除1023顯示就會錯誤........囧
還是有誤差存在(很小),之後再看看能不能用KEIL除錯
本來是想說電壓範圍在8~16V,但是ADC-0~5V
為了保有較好的靈敏度,電壓輸入改0~4
輸入先拑位(-8)並且除2
顯示電路為上次紅綠燈剩下(省了一堆時間)
因此將電壓取至小數第2位,也似乎沒什麼意義...佔空間
之後會把電壓多次取樣再輸出,並且取至小數第一位就好
避免出現一些突波
總共花費250以內,7段顯示器可以依照喜好更改顏色.大小
--------------------------------------------------------------------
先測試一下是否顯示電路正確因此
我讓它顯示.........8057......我有錢啦....喔~哈哈哈
打完收工....
[ 本文章最後由 KUAS1099 於 2011-8-26 14:04 編輯 ] |