||
根据最近自己学习的C8051F330单片机.写了一个关于AD转换的程序,但是在调试的时候,总是发现其精度没有我想象中的高,不知道是不是因为自己所用的万用表不准,还是因为我的基准电压不够,其测试的结果总是比用万用表测试的相差那么0.1V左右.想了好久了,就是没有解决的了啊.我想大概是因为万用表的精度还不过的原因应该是主要原因.呵呵.还是再调试..............
主要是将数据通过串口传到上位机上来显示.
其基本的代码如下:
#include<c8051f330.h>
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; //将发送位设置为推挽输出。
XBR1=0X40;
}
/*****************************
定时器初始化。
*****************************/
void timer(void)
{
TMOD = 0x20;
CKCON = 0X00; //系统时钟12分频。 波特率为9600
TH1 = 0x96;
}
void uart(void)
{
SCON0=0X10; //接受允许。
}
void AD_start(void)
{
ADC0CN=0X00; //采用AD0BUSY启动。
REF0CN=0X0b; //采用内部基准电压VDD. // REF0CN=0X03;
AMX0P=0X08; //P1.0口采样。
AMX0N=0X11;//单端输入方式。
ADC0CF=((clk/3000000)-1)<<3;//设置SAR时钟为3M。
ADC0CF |=0X00; //设置为右对齐状态。
AD0EN=1; //AD转换为活跃状态。
}
/*****************************
调用子程序。
*****************************/
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);
}
}