打印

PIC16F1787单片机 ADC采样输出不正常(求教)

[复制链接]
1629|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
y18370990546|  楼主 | 2018-4-1 15:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目的:PIC16f1787单片机 RE0端口ADC采样,用LCD显示变化的电压值。
结果:LCD 一直显示同一个数字(W.112), 不知为何?

万用表量过RE0端口有电压输入且有变化,该程序LCD能够显示汉字(LCD显示正常)

不知道是哪里的原因,求教各位大神!!!!


unsigned int table[];   //用来存放数字值
void main()
{
unsigned int value;
init();                         //端口初始化
ADC_init;                    //ADC初始化
lcd_init();                   //LCD初始化
while(1)
{
   value=ADC_Convert();           //转换值存入value
   ADC_display(value);
}
    }

void init()                                   //其他端口的配置
{   
    TRISB=0B00111001;              //RB4,RB5,RB3为按键输入
    ANSELB=0X00;
    LATB=0X00;
    TRISC=0X00;
    LATC=0X00;  
    TRISD=0X00;
    ANSELD=0X00;
    LATD = 0x00;
    TRISCbits.TRISC5=0;
    LATCbits.LATC5=0;
    TRISEbits.TRISE2=0;
    LATEbits.LATE2=1;
    TRISEbits.TRISE1=0;
    LATEbits.LATE1=0;
   
}
void ADC_init()                   //ADC初始化
{  
    TRISEbits.TRISE0=1;     //RE0模拟通道
    ANSELEbits.ANSE0=1;
    WPUEbits.WPUE0=0;
    ODCONEbits.ODCONE0=0;
    PORTEbits.RE0=0;
    LATEbits.LATE0=0;
    ADCON1=0XF0;               //ADFM=1, 结果右对齐,Frc时钟
    ADCON2=0X0f;               //反相输入通道
    ADCON0=0b00000001;    //ADRMD=0,12位AD,ADON=1,允许AD转换
    delayms(10);
}

unsigned int ADC_Convert()
{   unsigned int adval;
    float advalf;
    ADCON0bits.CHS0=1;         //通道RE0(即AN5), CHS=00101
    ADCON0bits.CHS1=0;
    ADCON0bits.CHS2=1;
    ADCON0bits.CHS3=0;
    ADCON0bits.CHS4=0;
    ADCON0bits.DONE=1;
   while(ADCON0bits.DONE);
   adval=(unsigned int)ADRESH;
   adval=(adval<<8)+ADRESL;
   advalf=adval/4096.0*4.3;    (12位AD, 供电万用表量过大概是4.3V)
   adval=advalf*1000;
   return adval;   
}

void ADC_display(unsigned int x)
{
table[0]=x/1000+0x30;                //第一位 (整数)
table[1]=x/100%10+0x30;          //第二位
table[2]=x/10%10+0x30;           //第三位
table[3]=x%10+0x30;               //第四位
    send_i(0x80);
    writelcd(TAB1A);             //显示一行汉字,以验证LCD
    send_i(0x90);                //显示整数部分
    send_d(table[0]);
    send_d(0X2E);                //小数点
    delay(2);
    send_i(0x91);               //显示小数点后面三位
    send_d(table[1]);
    send_d(table[2]);
    send_d(table[3]);
}

沙发
ic90| | 2018-4-2 16:15 | 只看该作者
ADC没有初始化成功吧。你确定是ADC_init;而不是ADC_init();

使用特权

评论回复
板凳
JLennon| | 2018-4-3 08:34 | 只看该作者
ic90 发表于 2018-4-2 16:15
ADC没有初始化成功吧。你确定是ADC_init;而不是ADC_init();

犀利。

使用特权

评论回复
地板
ZG11211| | 2018-4-3 21:55 | 只看该作者
这样编译都能通过?

使用特权

评论回复
5
yy005566| | 2018-5-13 15:37 | 只看该作者
ZG11211 发表于 2018-4-3 21:55
这样编译都能通过?

能过

使用特权

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

本版积分规则

49

主题

112

帖子

0

粉丝