本帖最后由 晨星之光 于 2011-6-28 16:04 编辑
大家好!
有个问题想大家帮帮忙!
我在用PIC12F683 ADC模块时,AD转换的数据都是0。请问这是什么原因呀????
我用软件仿真和实物仿真时,程序都只执行
if(get_ad()<206)
{
MOS_ON;
}
我在实物仿真时不论怎么改变电压都是只执行以上的指令。
如何知道转换后的值是否已经存入ADRESH和ADRESL两个结果寄存器?????
完整代码如下:
#include<pic.h>
__CONFIG(0x0014);
#define uint unsigned int
#define uchar unsigned char
#define MOS_ON GPIO5=1
#define MOS_OFF GPIO5=0
uint AD_V[8];
uint AD_data;
uint adval,i,AD_sum;
void delay_ms(uchar ms)
{
uchar x,y;
for(x=ms;x>0;x--)
for(y=220;y>0;y--);
}
void IO_init(void)
{
TRISIO5 = 0; //
TRISIO0 = 1; //7脚设置为输入
OSCCON = 0x77; //内部振荡器8M时钟
OPTION = 0x00; //定时器0 8分频
CMCON0 = 0x07; //比较器关闭
ANSEL = 0x61; //0110 1000 ADC时钟64分频,GP3 ADC输入
ADCON0 = 0x81; //1000 1111 AD转换结果右对齐,参考电压VDD,3通道,开AD转换
ADON=1;
delay_ms(10);
}
/**********************************
电池电压检测
**********************************/
uint get_ad(void)
{
ADON=1;
for(i=0;i<8;i++)
{
GODONE=1;
while(GODONE);
adval=ADRESH;
adval=(adval<<8)+ADRESL;
AD_V=adval;
}
AD_sum=0;
GODONE=0;
for(i=0;i<8;i++)
{
AD_sum +=AD_V;
}
AD_data=AD_sum>>3;
return (AD_data);
}
void main(void)
{
IO_init();
while(1)
{
if(get_ad()<206)
{
MOS_ON;
}
else
{
MOS_OFF;
}
}
} |