谢谢各位,已找到问题原因,犯了一个小错: 以下获取ADC值的函数内 while(ADC_CONTR&ADC_FLAG==0); 这里没有加括号,正确应该是 while((ADC_CONTR&ADC_FLAG)==0); 修改后一切正常!! 细节决定成败啊 ![]() 错误代码: void GetADC_Result(uchar ch) { ADC_RES=0;ADC_RESL=0; ADC_CONTR = ADC_POWER| ADC_SPEEDHH| ADC_START|ch; //电源开/90个CLK转换频率/开转换/设定通道 _nop_();_nop_();_nop_();_nop_(); while(ADC_CONTR&ADC_FLAG==0); //等待转换完成,注意(ADC_CONTR&ADC_FLAG)要括起来 ADC_CONTR &= ~ADC_FLAG; //清FLAG } |
本帖最后由 liuzx66 于 2021-6-15 15:44 编辑 忆1709 发表于 2021-6-14 16:36 这个我看错了,不好意思 |
本帖最后由 liuzx66 于 2021-6-15 15:46 编辑 忆1709 发表于 2021-6-14 16:36 我觉得你应该把错误贴出来看看,你这样描述不清。比方说实际值是多少,显示的是多少 |
忆1709 发表于 2021-6-14 16:28 这里右移2位会存在一个临时变量中。 |
liuzx66 发表于 2021-6-13 21:14 数组定义的是unsigned char型,1个字节;ADC_RES和ADC_RESL分别也是1个字节大小,这里应该没错吧 |
wulin 发表于 2021-6-12 17:26 谢谢你的指点,但有些地方没看明白 AD_V=ADC_RES<<2|ADC_RESL; ----这一行代码将ADC_RES左移2位,那ADC_RES的高2位不就没有了吗,然后跟ADC_RESL进行位或,得到的结果不是丢掉了高2位的10位ADC数据中的低8位数据吗?我看ADC_RES和ADC_RESL都是8位寄存器。 |
先去确认你的结果寄存器的值是对的。 |
要注意传送的是高位先,还是低位 |
看下ADC_RES和ADC_RESL这两个的定义,把数组定义成一样的类型 |
直接把寄存器的值打印试试 |
adc几位的?你的数组是8位的,adc的值超过数组大小就出错了。 |
10位AD转换值0x0000~0x03ff,在默认状态ADC_RES保存高8位,ADC_RESL保存低2位。 AD_V=ADC_RES<<2|ADC_RESL; arry[0] = AD_V>>8; //将16位数据AD_V高8位存入数组第0个元素 arry[1] = AD_V; //将16位数据AD_V低8位存入数组第1个元素 SendUart(arry[0]); //串口打印ADC_RES SendUart(arry[1]); //串口打印ADC_RESL |