[求助]读取AD不正常
求助:
背景描述:
(1)用8051读取一个2路的12位AD器件;
(2)AD器件的读写顺序:先选择AD通道,再读高位,再读低位;
问题描述:
(1)我用串口调试助手将AD值读上来;读上来的数据格式是“40 XX YY ZZ SS FF”(XX:0路高4位;YY:0路低4位;ZZ:1路高4位;SS:1路低4位)
(2)如果程序这样写
“
ADC_chnum=0x02;
serial_rec_data[1]=ADC_1;
serial_rec_data[2]=ADC_0;
ADC_chnum=0x04;
serial_rec_data[3]=ADC_1;
serial_rec_data[4]=ADC_0;
”
串口调试工具读出的结果是
40 05 AF 05 AF FF
40 05 B9 05 B9 FF
也就是说,2路AD值一样,都为“05 AF”或“05 B9”,这是不对的。
(2)如果程序改为
“
ADC_chnum=0x04;
for(i=0;i <1;i++);
serial_rec_data[1]=ADC_1;
serial_rec_data[2]=ADC_0;
ADC_chnum=0x02;
for(i=0;i <1;i++);
serial_rec_data[3]=ADC_1;
serial_rec_data[4]=ADC_0;
”
串口调试工具读出的结果是
40 05 B2 00 00 FF
40 05 B0 00 00 FF
40 05 AD 00 00 FF
2路AD值分开了,很正常;
(3)于是,我怀疑是AD器件的时序不好,在选择完“AD通道”后,需要延时。于是,程序改为
“
ADC_chnum=0x04;
_nop_();_nop_();_nop_();_nop_();_nop_();//100个"_nop_();"
serial_rec_data[1]=ADC_1;
serial_rec_data[2]=ADC_0;
ADC_chnum=0x02;
_nop_();_nop_();_nop_();_nop_();_nop_();//100个"_nop_();"
serial_rec_data[3]=ADC_1;
serial_rec_data[4]=ADC_0;
”
串口调试工具读出的结果是
40 05 A2 05 A2 FF
40 05 9B 05 9B FF
2路AD值又一样了,这样又不对了。
(4)分析:100个_nop_()的延时比“for(i=0;i <1;i++);”长,
可是使用“for(i=0;i <1;i++);”时,串口输出结果就对;
而使用100个"_nop_();"时,串口输出结果就不对;
为什么?这个问题莫名其妙,毫无理由!
请教!!!!!!!!!
有遇到类似问题的吗?怎样解决?谢谢!
发表时间:2009年4月26日10:33:51