打印
[STC单片机]

STC12 AD高阻设置问题

[复制链接]
3681|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bingshuixichen|  楼主 | 2013-8-7 13:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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);  
}

相关帖子

沙发
qq986433936| | 2013-8-8 19:27 | 只看该作者
sfr P1   = 0x90;
sfr P1M0 = 0x92;
sfr P1M1 = 0x91;   
从STC官网的资料看到的。                                                                     

使用特权

评论回复
板凳
lyjian| | 2013-8-8 19:33 | 只看该作者
你测量哪里对地电流为7.4MA?怎么测?

使用特权

评论回复
地板
lyjian| | 2013-8-8 19:56 | 只看该作者
本帖最后由 lyjian 于 2013-8-8 19:58 编辑

P1M0=0x03;  //  设置高阻   这里P1.0已经设置了高阻状态啊
P1M1=0x00;
****************
你这设的那是高阻状态?
这设的是P1.0/P1.1推挽输出

使用特权

评论回复
5
opal11| | 2013-8-12 22:15 | 只看该作者

P1M1=0x03;  //  设置高阻  
P1M0=0x00;

使用特权

评论回复
6
autopccopy| | 2013-8-16 13:15 | 只看该作者
本帖最后由 autopccopy 于 2013-8-16 13:17 编辑

LZ将 P1M0/P1M1 地址搞错了导致设置错误。

简便方法是下载STC官方头文件:http://www.****ducst/datasheet/stc/STC-AD-PDF/STC_NEW_8051.H 或使用STC-ISP V6.XX导出的头文件,替换原“reg51.h” ,去除原程序自定义的寄存器即可。

(注意该头文件不可用于STC12C56XX系列)

(60)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

27

帖子

1

粉丝