根據(jù)最近自己學(xué)習(xí)的C8051F330單片機(jī).寫了一個(gè)關(guān)于AD轉(zhuǎn)換的程序,但是在調(diào)試的時(shí)候,總是發(fā)現(xiàn)其精度沒有我想象中的高,不知道是不是因?yàn)樽约核玫娜f用表不準(zhǔn),還是因?yàn)槲业幕鶞?zhǔn)電壓不夠,其測試的結(jié)果總是比用萬用表測試的相差那么0.1V左右.想了好久了,就是沒有解決的了啊.我想大概是因?yàn)槿f用表的精度還不過的原因應(yīng)該是主要原因.呵呵.還是再調(diào)試..............
本文引用地址:
http://m.butianyuan.cn/article/201611/320197.htm主要是將數(shù)據(jù)通過串口傳到上位機(jī)上來顯示.
其基本的代碼如下:
#i nclude
typedef unsigned char uint8;
#define clk 24500000
sfr16 adc0=0xbd;
void delay(uint8 time)
{
uint8 i;
while(--time)
{
for(i=0;i<125;i++);
}
}
void systemclk(void)
{
RSTsrc="/0X04";
OSCICN=0X83;
}
void port(void)
{
P0MDOUT=0X30;
P1MDIN=0x00;
XBR0=0X01; //將發(fā)送位設(shè)置為推挽輸出。
XBR1=0X40;
}
void timer(void)
{
TMOD = 0x20;
CKCON = 0X00; //系統(tǒng)時(shí)鐘12分頻。 波特率為9600
TH1 = 0x96;
}
void uart(void)
{
SCON0=0X10;//接受允許。
}
void AD_start(void)
{
ADC0CN=0X00; //采用AD0BUSY啟動。
REF0CN=0X0b; //采用內(nèi)部基準(zhǔn)電壓VDD. // REF0CN=0X03;
AMX0P=0X08; //P1.0口采樣。
AMX0N=0X11;//單端輸入方式。
ADC0CF=((clk/3000000)-1)<<3;//設(shè)置SAR時(shí)鐘為3M。
ADC0CF |=0X00; //設(shè)置為右對齊狀態(tài)。
AD0EN=1; //AD轉(zhuǎn)換為活躍狀態(tài)。
}
void begin(void)
{
systemclk();
port();
timer();
uart();
AD_start();
}
void main(void)
{
PCA0MD &=~0x40;
PCA0MD =0X00;
begin();
TR1=1;
TI0=0;
AD0INT=0; //清零。
while(1)
{
AD0BUSY=1;
while(AD0INT==0);
ADC0H &=0X03;
SBUF0=ADC0H;
while(TI0==0);
TI0=0;
delay(200);
SBUF0=ADC0L;
while(TI0==0);
AD0BUSY=0;
TI0=0;
delay(200);
}
}
評論