STC12 AD高阻设置以后 ,悬空后测量对地电流,达到7mA,请教各位大侠,这是什么原因导致AD高阻设置没有成功?程序如下:
STC12C5A60S2在程序中AD设置了高阻,可是把P1.0引脚悬空,测量对地电流为7.4MA,应该P1.0不是高阻状态。哪位大侠帮忙看看什么原因?
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define unit unsigned int
sfr ADC_CONTR = 0XBC;
sfr ADC_RES = 0XBD;
sfr ADC_RESL = 0XBE;
sfr P1ASF = 0X9D;
sfr P1M0 = 0X91;
sfr P1M1 = 0X92;
/********************************用于配置P1口对应管脚为AD模拟输入口**************************************/
#define ADC_PORT0 0X01
#define ADC_PORT1 0X02
#define ADC_PORT2 0X04
#define ADC_PORT3 0X08
#define ADC_PORT4 0X10
#define ADC_PORT5 0X20
#define ADC_PORT6 0X40
#define ADC_PORT7 0X80
#define ADC_PORTALL 0XFF
/*************************************用于获取对应通道的电压值******************************************/
#define ADC_CH0 0X00
#define ADC_CH1 0X01
#define ADC_CH2 0X02
#define ADC_CH3 0X03
#define ADC_CH4 0X04
#define ADC_CH5 0X05
#define ADC_CH6 0X06
#define ADC_CH7 0X07
/*********************************************定义AD转换速度*********************************************/
#define ADC_SPEEDLL_540 0X00
#define ADC_SPEEDLL_360 0X20
#define ADC_SPEEDLL_180 0X40
#define ADC_SPEEDLL_90 0X60
/***************************************定义转换控制寄存器控制位*****************************************/
#define ADC_POWER 0X80 //电源控制位
#define ADC_FLAG 0X10 //转换结束标志位
#define ADC_START 0X08 //转换开始位
/*********************************************************************************************************
** 函数功能 :内置ADC的初始化配置
*********************************************************************************************************/
void ADC_Init(unsigned char port)
{
P1M0=0x03; // 设置高阻 这里P1.0已经设置了高阻状态啊
P1M1=0x00;
P1ASF=port; //设置AD转换通道
ADC_RES=0; //清空转换结果
ADC_RESL=0; //清空转换结果
ADC_CONTR=ADC_POWER | ADC_SPEEDLL_540;//打开AD转化器电源
// IE=0XA0;//开启总中断,ADC中断
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************************************************************
*********************************************************************************************************/
float GetADCResult(unsigned char channel)//读取通道ch的电压值
{
unsigned int ADC_RESULT = 0;//用来存放结果
float result;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL_540 | ADC_START | channel;//开始转换,并设置测量通道为P1^0
_nop_();//需经过四个CPU时钟延时,上述值才能保证被设进ADC_CONTR控制寄存器
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & ADC_FLAG));//等待转换结束
ADC_CONTR &= ~ADC_FLAG;//软件清除中断控制位
ADC_RESULT = ADC_RES;
ADC_RESULT = (ADC_RESULT << 2) | (0x02 & ADC_RESL); //默认数据存储方式:高八位在ADC_RES,低二位在ADC_RESL低二位
result = ADC_RESULT *5 / 1024.0 ; //基准电压为电源电压5V,10的分辨率,即1024
return result;
}
/*电压显示函数*/
void dis_dianya()
{
float res0;
uchar a,d0,d1,d2,d3,d4,d5,d6;
ADC_Init(ADC_PORT0);
res0=GetADCResult(ADC_CH0)*10;
a=(int)res0 ;
d0='U';
d1='=';
d2=a/100; //电压十位
d3=a%100/10; //电压个位
d4=a%100%10; //电压小数位
d5='.';
d6='V';
delay_1ms(1);
write_cmd(0x90);
write_dat('U'); //显示百位
write_dat('=');
write_dat(d2+0x30); //电压十位
write_dat(d3+0x30); //电压个位
write_dat('.');
write_dat(d4+0x30); //电压小数位
write_dat('V');
delay_1ms(1000);
}
main()
{
lcd_init();
while(1)
{
dis_dianya();
delay_1ms(500);
}
|