搜档网
当前位置:搜档网 › STC12C5A60S2单片机的AD转换(8位)

STC12C5A60S2单片机的AD转换(8位)

STC12C5A60S2单片机的AD转换(8位)
STC12C5A60S2单片机的AD转换(8位)

A/D转换测试程序(ADC查询方式)

#include “stc12c5a.h”//头文件在STC公司主页上下载

#include ”intrins.h”

//与STC12C5A60S2单片机ADC相关的寄存器说明//

Sfr ADC_CONTR = 0xBC;//AD转换控制寄存器

Sfr ADC_RES = 0xBD;//AD转换结果寄存器高

Sfr ADC_RESL = 0xBE;//AD转换结果寄存器低

Sfr P1ASF = 0x9D;//P1口模拟转换功能控制寄存器

Sfr AURX1 = 0xA2;//AD转换结果存储方式控制位

#define ADC_POWER 0x80 //ADC电源开

#define ADC_FLAG 0x10 //ADC结束标志位

#define ADC_START 0x08 //ADC启动控制位设为开

#define ADC_SPEEDLL 0x00 //设为540个时钟周期ADC一次

#define ADC_SPEEDL 0x20 //设为360个时钟周期ADC一次

#define ADC_SPEEDH 0x40 //设为180个时钟周期ADC一次

#define ADC_SPEEDHH 0x60 //设为90个时钟周期ADC一次void AD_init(void);

void delay(unsigned int a);

unsigned int AD_get(unsigned char n);

float AD_work(unsigned char n);

void main()

{

unsigned char i;

AD_init();

while(1)

{

for(i=0;i<8;i++)

{

AD_work(i);

delay(20);

}

}

}

unsigned int AD_get(unsigned char n) //第n通道ADC采样函数

{

unsigned int adc_data;

ADC_RES = 0; //清零

ADC_CONTR=ADC_POWER|ADC_SPEEDLL|n|ADC_START;//打开AD转换

电源、设定转换速度、设定通道号、AD转换开始

_nop_();_nop_();_nop_();_nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器

while(!(ADC_CONTR&ADC_FLAG)); //等待转换完成

adc_data=ADC_RES; //转换结果计算,取8位结果

ADC_CONTR&=~ADC_FLAG;//关闭AD转换,ADC_FLAG位由软件清0

return adc_data; //返回ADC的值

}

float AD_work(unsigned char n)

{

float AD_val; //定义处理后的数值AD_val为浮点数

unsigned char i;

for(i=0;i<100;i++)

AD_val+=AD_get(n); //转换100次求平均值(提高精度)

AD_val/=100;

AD_val=(AD_val*5)/256; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值

return AD_val;

}

void AD_init(void)

{

P1ASF = 0xff; //P1口全部作为模拟功能A/D使用

ADC_RES = 0; //清零转换结果寄存器高8位

ADC_CONTR = ADC_POWER|ADC_SPEEDLL;

delay(2);//等待1ms,让AD电源稳定

}

void delay(unsigned int a)

{

unsigned int i;

while (a--)

{

i=5000;

while(i--);

}

}

相关主题