本帖最后由 hanbing17 于 2010-10-24 13:42 编辑
我使用AN0 做模拟输入 ,参考电压使用单片机内部电压,接到RC0 和RC1 ,在程序里分别置0 和1
AN0 做模拟输入使用稳压电源 ,Ad后的数据通过液晶1602显示 ,但是采集到通过液晶显示的数据总是和实际的相差一点
比如实际3.4V 显示的话可能是4, 而且不停的跳动 不停的刷新液晶屏 光标不停的闪动,我是用中断写的 麻烦请教大家指点一下 谢谢了! 还有是不是采集时候延时时间太短了?看了手册上说的采集时间还没看明白怎样计算 麻烦大家了 单片机16M晶振
void main()
{
delay(); //调用延时子程序
TRISB=0x00; //定义RA口为输出
TRISD=0x00; //定义RC口为输出
TRISC=0x00; //定义RC口为输出
ad_init();
//ADCON1=0x37; //设置RA口全部为普通数字IO口 并选AN2 AN3 为参考电压
PORTCbits.RC0=0;
PORTCbits.RC1=1;
delay();
lcd_init();
writename();
INTCONbits.GIE=1; //总中断允许
ADCON0bits.GO=1; //启动A/D转换
while(1); //while死循环
}
AD初始化
void ad_init()
{
ADRES=0;
TRISAbits.TRISA0=0;
ADCON0=0b00000101;// RA1/AN1做为选定转换通道,此时为关闭状态,但AD已经使能
//GO/DONE=0 , ADON=1
ADCON1=0b00110111;//所选AN3 AN2为参考电压(RA2/AN2/VREF-/CVREF和RA3/AN3/VREF+ 参考电压)
ADCON2=0b10011110;//右对齐 64分频
PIE1bits.ADIE=1;//允许A/D外围中断;
INTCONbits.GIE=1;//允许global中断
INTCONbits.PEIE=1;//允许外围中断
ADIF=0;//初始时中断flag为0
}
中断程序
void chk_isr(void)
{
unsigned int adval;
float advalf;
unsigned char a1,a2,a3,a4;
delay(); //调用延时子程序
ADIF=0;
adval=ADRESH;//00000000 00000011
adval=adval<<8|ADRESL;//00000011 11111111
advalf=adval/1023.0*5.0;//==2.3843
adval=advalf*1000;
a1=adval/1000+'0';
a2=adval%1000/100+'0';
a3=adval%100/10+'0';
a4=adval%10+'0';
PORTD=0XC0; //设置第2行显示地址
enable();
write(a1);
write(a2);
write(a3);
write(a4);
delay();
ADCON0bits.GO=1; //启动下一次A/D转换
}
延时:
void delay()
{
int i;
for(i=0;i<5000;i++);
} |