深圳湾 发表于 2023-3-8 20:24:21

求助:while (!(ADC_CONTR & 0x20))这句过不去可能是什原因

本帖最后由 深圳湾 于 2023-3-8 20:29 编辑

求助:while (!(ADC_CONTR & 0x20)),这句执行不过去,可能是什么原因,是不是那里写错了

void acd_init()
{
   / *设置电池电压检测IO(P1.3)为高阻输入模式*/
   P1M1 |= 1 << 3;
   P1M0 &= ~(1 << 3);

   ADCTIM = 0x3f;   // 设置ADC内部时序
   ADCCFG = 0x2f;      // 设置ADC时钟为系统时钟/2/16(最慢),ADC数据为右对齐
   ADC_CONTR = 0x80; // 使能ADC(开启ADC电源)

   ADC_CONTR &= 0xf0; // 设置ADC通道前先清空寄存(ADC通道配置位在ADC_CONTR寄存的低4位)
   ADC_CONTR |= 0x03; // 使用ADC3通道,P1.3端口
}

unsigned long adc_reader()
{
   ADC_CONTR |= 0x40; // 启动ADC控制器
   _nop_();
   _nop_();

/ *启动ADC后,要等待ADC转换完成,才能得到ADC数据*/
while (!(ADC_CONTR & 0x20)) ;

   ADC_CONTR &= ~0x20; /*ADC转换完成要手动清除 ADC转化完成标志位*/
   return ((ADC_RES << 8) + ADC_RESL);


神农鼎 发表于 2023-3-8 21:38:44


神农鼎 发表于 2023-3-8 21:39:05

#include "reg51.h"
#include "intrins.h"

sfr   ADC_CONTR   =   0xbc;
sfr   ADC_RES   =   0xbd;
sfr   ADC_RESL    =   0xbe;
sfr   ADCCFG      =   0xde;

sfr   P_SW2   =   0xba;
#define ADCTIM(*(unsigned char volatile xdata *)0xfea8)

sfr   P0M1    =   0x93;
sfr   P0M0    =   0x94;
sfr   P1M1    =   0x91;
sfr   P1M0    =   0x92;
sfr   P2M1    =   0x95;
sfr   P2M0    =   0x96;
sfr   P3M1    =   0xb1;
sfr   P3M0    =   0xb2;
sfr   P4M1    =   0xb3;
sfr   P4M0    =   0xb4;
sfr   P5M1    =   0xc9;
sfr   P5M0    =   0xca;

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    P1M0 = 0x00;                              //设置P1.0为ADC口
    P1M1 = 0x01;
    P_SW2 |= 0x80;
    ADCTIM = 0x3f;                              //设置ADC内部时序
    P_SW2 &= 0x7f;
    ADCCFG = 0x0f;                              //设置ADC时钟为系统时钟/2/16
    ADC_CONTR = 0x80;                           //使能ADC模块

    while (1)
    {
      ADC_CONTR |= 0x40;                      //启动AD转换
      _nop_();
      _nop_();
      while (!(ADC_CONTR & 0x20));            //查询ADC完成标志
      ADC_CONTR &= ~0x20;                     //清完成标志
      P2 = ADC_RES;                           //读取ADC结果
    }
}

乘风飞扬 发表于 2023-3-9 09:11:16

最好能清楚的描述一下你的测试环境,是将程序直接烧录到芯片里测试?还是通过仿真方式测试?如果是仿真的话需要注意“Debug”标签的设置,要使用硬件仿真才行,软件模拟仿真不会产生完成标志,就会卡在while语句。

深圳湾 发表于 2023-3-9 09:39:42

是烧录到芯片里运行的,刚从视频中学的,试一下,现在能运行了,不过数字不变,一直显示312,回头买个8H的实验箱回来再研究了,还不确定电路对不对,电路是别人做的,有TL431电路,P1.3通过分压电阻的方式连接在电池上,分压后是最高2.4V,用表量了下,满电时,不到2.4V

didimeme 发表于 2023-9-15 14:18:35

你好 我也卡在这一句 请问后面过了是发现了什么原因吗

梁工 发表于 2023-9-15 15:38:20

didimeme 发表于 2023-9-15 14:18
你好 我也卡在这一句 请问后面过了是发现了什么原因吗

启动ADC时使用ADC_CONTR = 0x80 + channel; 试试。

ADC_CONTR = 0x80 + channel;
NOP(5);
while((ADC_CONTR & 0x20) == 0) ;
页: [1]
查看完整版本: 求助:while (!(ADC_CONTR & 0x20))这句过不去可能是什原因