微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > c8051f330系列单片机AD转换

c8051f330系列单片机AD转换

时间:11-23 来源:互联网 点击:
c8051f330系列单片机AD转换. 作者 lml198694 日期 2008-7-21 10:53:00

2

推荐

根据最近自己学习的C8051F330单片机.写了一个关于AD转换的程序,但是在调试的时候,总是发现其精度没有我想象中的高,不知道是不是因为自己所用的万用表不准,还是因为我的基准电压不够,其测试的结果总是比用万用表测试的相差那么0.1V左右.想了好久了,就是没有解决的了啊.我想大概是因为万用表的精度还不过的原因应该是主要原因.呵呵.还是再调试..............

主要是将数据通过串口传到上位机上来显示.

其基本的代码如下:

#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; //将发送位设置为推挽输出。
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);
}
}


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top