ADC第一次读取

在ADCCON中,最后0位和1位互斥。
如果1位选1的话,0位的值无效。
如果1位选0的话,0位的值才有效。
当1位选1的话:这是应用层的程序
#if ADSTART==0
void niuniu(void)
{
uart_init();
adc_init();
beeper_init();

adc_read();

while(1)
{
itoa(adc_read());
if(adc_read() > 2500)
{
beeper_on();
}
else
{
beeper_off();
}
delay(10000);
}
}
#endif
这里注意while循环的上面必须有adc_read();如果去掉这个adc_read();情况如下:
加一个
uart_init();
adc_init();
beeper_init();
puts("\r\n loudan");
//adc_read();
while(1)
{
itoa(adc_read());
if(adc_read() > 2500)
{
beeper_on();
}
else
{
beeper_off();
}
delay(10000);
}
测试结果如下:
loudan0000
3069
3069
3069
3069
3069
3069
3069
3069
3069
?
loudan0000(这里是我又重启了一次开发版)
3069
3069
3069
3069
3069
3069
3069
3069
3069
3069
3069
3069

loudan0000
3069
3069
*******************************************
如果联系后边的当客户端强求发送一个,ADC转化的数据时,必须每一次都是正确的,但是去掉adc_read();的情况下,第一次的数据就是错误的。
这里是驱动里边的情况:
void adc_init(void)
{
#if ADSTART==0
ADC.ADCCON = 0x1<<1|0xff<<6|0x1<<14;
#elif ADSTART==1
ADC.ADCCON = 0xff<<6|0x1<<14;
#endif
}

#if ADSTART==1
void adc_enable(void)
{
ADC.ADCCON |= 0x1;
}
#endif

int adc_read(void)
{
int result;

#if ADSTART==0(这是我们分析的最开始的ADCCON,如果1位选1的话,0位的值无效。如果result = ADC.ADCDAT0&0x3ff;放到下边则程序无法运行)
result = ADC.ADCDAT0&0x3ff;

while(!(ADC.ADCCON&(0x1<<15)))
{
}
#elif ADSTART==1(这是我们分析的最开始的ADCCON,如果1位选0的话,0位的值有效。这两个while相反,这两个无论哪一个while和result换位置都是不能运行程序的。)
while(!(ADC.ADCCON&(0x1<<15)))
{
}

result = ADC.ADCDAT0&0x3ff;
#endif

return 3300/0x3ff*result;
}
#endif

posted @ 2016-06-21 19:38  飘然离去  阅读(885)  评论(0编辑  收藏  举报