STC12C5A60S2单片机的AD转换(8位)
- 格式:doc
- 大小:21.50 KB
- 文档页数:2
A/D转换测试程序(ADC查询方式)
#include “”//头文件在STC公司主页上下载
#include ””
//与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--);
}
}