本帖最后由 yyao00 于 2016-1-16 14:32 编辑
P1.0接2.5V基准电源
P1.1接电源电压
P1.2接待测电压
现在遇到的问题用基准电源来计算电源电源压总是计算不对
下面是源代码
main :
#include<STC12C5A60S2.h>
#include <intrins.h>
#include <ad.h>
//AD转换电压
void checkpower()
{
unsigned int temp;
f_adconverting = 1;
GetADCResult(0); //测基准电压
while (f_adconverting); //等待转换完成
temp = ad_result10; //保存2.5V基准电压转换值
GetADCResult(1); //测电源电压
while (f_adconverting); //等待转换完成
vin = 2.5 * ad_result10 / temp; //求电源电压
display_num = (int)(vin * 10);
shi = display_num / 10;
ge = display_num % 10;
}
void display(unsigned char c2, unsigned char c1)
{
P0 = seg7[c2]; //送入十位的段码
en2 = 0; //显示DS2
delay(10);
en2 = 1; //关闭DS2
P0 = seg7[c1]; //送入个位的段码
en1 = 0; //显示DS1
delay(10);
en1 = 1; //关闭DS1
}
void main()
{
delay(10);
InitADC(); //AD初始化
while(1)
{
checkpower(); //测量电源电压
display(shi,ge); //电源电压显示
}
}
ad.h:
typedef unsigned char BYTE;
typedef unsigned int WORD;
/*Define SFR operation const for ADC_CONTR */
#define ADC_POWER 0x80 //ADC 电源控制位
#define ADC_FLAG 0x10 //ADC 转换结束标志位
#define ADC_START 0x08 //ADC 转换启动控制位
#define ADC_SPEEDLL 0x00 //540 个时钟转换一次
#define ADC_SPEEDL 0x20 //360 个时钟转换一次
#define ADC_SPEEDH 0x40 //180 个时钟转换一次
#define ADC_SPEEDHH 0x60 //90 个时钟转换一次
unsigned int ad_result10; //10位精度的电压转换值
float vin;
unsigned int display_num;
unsigned char shi, ge; //定义十位、个位要输出的数据
bit f_adconverting; //正在AD转换标志
sbit en1 = P2^6;
sbit en2 = P2^7;
/*
共阴极数码管0 - 9的字形码
“0” 3FH “5” 6DH
“1” 06H “6” 7DH
“2” 5BH “7” 07H
“3” 4FH “8” 7FH
“4” 66H “9” 6FH
*/
const unsigned char seg7[10] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f};
void delay(unsigned int max)
{
unsigned int i,j;
for(i=max;i>0;i--)
for(j=1230;j>0;j--);
}
//初始化 ADC sfr
void InitADC()
{
P1ASF = 0xff; //打开8通道ADC功能
ADC_RES = 0; //清除以前的结果
ADC_CONTR = ADC_POWER|ADC_SPEEDLL;
delay(1); //ADC的上电和延迟
}
//获取ADC结果
BYTE GetADCResult(BYTE ch)
{
ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
_nop_(); //经过4个时钟延时后,才能够正确写入ADC_CONTR
_nop_();
_nop_();
_nop_();
while(!ADC_CONTR&ADC_FLAG); //等待完成标志
ADC_CONTR &= ~ADC_FLAG; //关闭ADC
ad_result10 = ADC_RES;
ad_result10 = ( ad_result10 << 2 ) | ADC_RESL;
f_adconverting = 0;
} |