求助: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);
#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结果
}
}
最好能清楚的描述一下你的测试环境,是将程序直接烧录到芯片里测试?还是通过仿真方式测试?如果是仿真的话需要注意“Debug”标签的设置,要使用硬件仿真才行,软件模拟仿真不会产生完成标志,就会卡在while语句。 是烧录到芯片里运行的,刚从视频中学的,试一下,现在能运行了,不过数字不变,一直显示312,回头买个8H的实验箱回来再研究了,还不确定电路对不对,电路是别人做的,有TL431电路,P1.3通过分压电阻的方式连接在电池上,分压后是最高2.4V,用表量了下,满电时,不到2.4V 你好 我也卡在这一句 请问后面过了是发现了什么原因吗
didimeme 发表于 2023-9-15 14:18
你好 我也卡在这一句 请问后面过了是发现了什么原因吗
启动ADC时使用ADC_CONTR = 0x80 + channel; 试试。
ADC_CONTR = 0x80 + channel;
NOP(5);
while((ADC_CONTR & 0x20) == 0) ;
页:
[1]