/**************************内部AD***********************************
*功能:内部AD转换功能的测试
*芯片:STC12C5A60S2(1T)
*晶振:11.0592MHZ
*时间:2020年10月24日
*引脚:P1.0 -- AD
*******************************************************************/
/***************************AD.h************************************
#ifndef __AD_H_
#define __AD_H_
#include <STC12.h>
#include <intrins.h>
#include "delay.h"
#define ADC_POWER 0x80
#define ADC_Rate_540 0x00
#define ADC_Rate_270 0x20
#define ADC_Rate_180 0x40
#define ADC_Rate_90 0x60
#define ADC_ADRJ 0x04
#define VCC 5.0
void AD_Init(void);
float AD_Get_Res(unsigned char channel);
#endif
*******************************************************************/
/****************************AD.c***********************************
#include "AD.h"
//AD初始化
//p1.0 0x01 p1.1 0x02
//p1.3 0x04 p1.4 0x08
//p1.5 0x10 p1.1 0x20
//p1.3 0x40 p1.4 0x80
void AD_Init(void)
{
//选择模拟AD口
P1ASF = 0x01;
//0x00选择高八位低两位,0x04选择高两位低八位
AUXR1 = ADC_ADRJ;
//0x80打开AD电源位,5~6位选择模数转换速度
//11(90时钟周期)10(180时钟周期)01(360时钟周期)00(540时钟周期)
ADC_CONTR = 0x80| ADC_Rate_180;
//ADC_CONTR 必须延时
_nop_();
_nop_();
_nop_();
_nop_();
}
//AD值获取
//ADC_CONTR赋值要或上,不能直接赋值
//ADC_CONTR低三位选择通道:0x00~0x07对应模拟输入通道1~8
float AD_Get(unsigned char channel)
{
float res=0;
ADC_CONTR |= channel|0x08; //通道选择,0x08打开AD转换
_nop_(); //ADC_CONTR 必须延时
_nop_();
_nop_();
_nop_();
while((ADC_CONTR&0x10) != 0x10); //AD转换完成标志位
ADC_CONTR &= 0xef; //标志位清零
_nop_(); //ADC_CONTR 必须延时
_nop_();
_nop_();
_nop_();
res = ADC_RES*256+ADC_RESL; //高两位左移八位加低八位
res = res/1024.0*VCC ; //电压转换计算公式
return res;
}
//AD值取平均
float AD_Get_Res(unsigned char channel)
{
unsigned char num;
float res=0;
for(num=0; num<100; num++)
{
res += AD_Get(channel) ;
}
ADC_CONTR &= 0xf7; //关闭AD转换
res = res/100.0;
return res;
}
*******************************************************************/
/**************************内部AD***********************************
#include "AD.h"
#include "LCD12864.h"
#include "stdio.h"
void main()
{
uchar a[20] = "\0";
LCD12864_Init();
AD_Init();
while(1)
{
sprintf(a,"AD: %.3f ",AD_Get_Res(0x00)); //通道一
LCD12864_Dis_Str(1, 1, a);
}
}
*******************************************************************/