找回密码
 立即注册
查看: 1431|回复: 6

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:300
  • 最近打卡:2025-05-13 10:43:57

23

主题

66

回帖

1912

积分

金牌会员

积分
1912
发表于 2023-3-8 20:24:21 | 显示全部楼层 |阅读模式
本帖最后由 深圳湾 于 2023-3-8 20:29 编辑

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

  1. void acd_init()
  2. {
  3.    / *设置电池电压检测IO(P1.3)为高阻输入模式*/
  4.    P1M1 |= 1 << 3;
  5.    P1M0 &= ~(1 << 3);
  6.    ADCTIM = 0x3f;     // 设置ADC内部时序
  7.    ADCCFG = 0x2f;      // 设置ADC时钟为系统时钟/2/16(最慢),ADC数据为右对齐
  8.    ADC_CONTR = 0x80; // 使能ADC(开启ADC电源)
  9.    ADC_CONTR &= 0xf0; // 设置ADC通道前先清空寄存(ADC通道配置位在ADC_CONTR寄存的低4位)
  10.    ADC_CONTR |= 0x03; // 使用ADC3通道,P1.3端口
  11. }
  12. unsigned long adc_reader()
  13. {
  14.    ADC_CONTR |= 0x40; // 启动ADC控制器
  15.    _nop_();
  16.    _nop_();
  17.   / *启动ADC后,要等待ADC转换完成,才能得到ADC数据*/
  18.   while (!(ADC_CONTR & 0x20)) ;
  19.    ADC_CONTR &= ~0x20; /*ADC转换完成要手动清除 ADC转化完成标志位*/
  20.    return ((ADC_RES << 8) + ADC_RESL);
复制代码



回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:66
  • 最近打卡:2025-05-13 11:26:56

719

主题

1万

回帖

1万

积分

管理员

积分
15711
发表于 2023-3-8 21:38:44 | 显示全部楼层
1.png
  • 打卡等级:常住居民I
  • 打卡总天数:66
  • 最近打卡:2025-05-13 11:26:56

719

主题

1万

回帖

1万

积分

管理员

积分
15711
发表于 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结果
    }
}

  • 打卡等级:以坛为家II
  • 打卡总天数:420
  • 最近打卡:2025-05-13 14:51:29
已绑定手机

39

主题

2017

回帖

6889

积分

论坛元老

积分
6889
发表于 2023-3-9 09:11:16 | 显示全部楼层
最好能清楚的描述一下你的测试环境,是将程序直接烧录到芯片里测试?还是通过仿真方式测试?如果是仿真的话需要注意“Debug”标签的设置,要使用硬件仿真才行,软件模拟仿真不会产生完成标志,就会卡在while语句。
  • 打卡等级:以坛为家I
  • 打卡总天数:300
  • 最近打卡:2025-05-13 10:43:57

23

主题

66

回帖

1912

积分

金牌会员

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

4

主题

6

回帖

56

积分

注册会员

积分
56
发表于 2023-9-15 14:18:35 | 显示全部楼层
你好 我也卡在这一句 请问后面过了是发现了什么原因吗

点评

启动ADC时使用 ADC_CONTR = 0x80 + channel; 试试。 ADC_CONTR = 0x80 + channel; NOP(5); while((ADC_CONTR & 0x20) == 0) ;  详情 回复 发表于 2023-9-15 15:38
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:62
  • 最近打卡:2025-05-13 17:13:14

73

主题

5923

回帖

1万

积分

超级版主

积分
12213
发表于 2023-9-15 15:38:20 | 显示全部楼层
didi*** 发表于 2023-9-15 14:18
你好 我也卡在这一句 请问后面过了是发现了什么原因吗

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

ADC_CONTR = 0x80 + channel;
NOP(5);
while((ADC_CONTR & 0x20) == 0) ;
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-13 18:53 , Processed in 0.117892 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表