新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > c8051f330系列單片機(jī)AD轉(zhuǎn)換

c8051f330系列單片機(jī)AD轉(zhuǎn)換

作者: 時(shí)間:2016-11-23 來(lái)源:網(wǎng)絡(luò) 收藏
c8051f330系列單片機(jī)AD轉(zhuǎn)換. 作者 lml198694 日期 2008-7-21 10:53:00
2
推薦

根據(jù)最近自己學(xué)習(xí)的C8051F330單片機(jī).寫(xiě)了一個(gè)關(guān)于AD轉(zhuǎn)換的程序,但是在調(diào)試的時(shí)候,總是發(fā)現(xiàn)其精度沒(méi)有我想象中的高,不知道是不是因?yàn)樽约核玫娜f(wàn)用表不準(zhǔn),還是因?yàn)槲业幕鶞?zhǔn)電壓不夠,其測(cè)試的結(jié)果總是比用萬(wàn)用表測(cè)試的相差那么0.1V左右.想了好久了,就是沒(méi)有解決的了啊.我想大概是因?yàn)槿f(wàn)用表的精度還不過(guò)的原因應(yīng)該是主要原因.呵呵.還是再調(diào)試..............

本文引用地址:http://butianyuan.cn/article/201611/320197.htm

主要是將數(shù)據(jù)通過(guò)串口傳到上位機(jī)上來(lái)顯示.

其基本的代碼如下:

#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啟動(dòng)。
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è)置為右對(duì)齊狀態(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);
}
}




評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉