Windtwet 发表于 2024-1-13 12:59:57

求助 STC8G1K08A单片机 ADC 转换结果串口输出 始终为0 | 已解决

各位大佬好,有大神能帮我检查一下ADC的程序吗?谢谢!
我正在学习单片机开发,我的需求是让单片机检测P3.3脚的电压,通过ADC转换,并用串口输出。
P3.3和P3.2脚上万用表测量电压是1.420V和1.416V
现在的问题是,上传单片机后,串口一直输出:
                  ADC:0
                  _____________
                  ADC:0
                  _____________
                  ADC:0
                  _____________
                  ADC:0
                  _____________我尝试更换引脚到P3.2、更改测量速度均为0。

#include "STC8G.h"
#include "stdio.h"
#include "intrins.h"

unsigned int Temp;

void UART_Init() {//串口模式初始化
SCON = 0x50;
TMOD = 0x00;// 设置定时器1为模式0
TL1 = 0xE5;   // TL1存储低8位
TH1 = 0xFF;   // TH1存储高8位
TR1 = 1;      // 启动定时器1
AUXR = 0x40;// 定时器1-1T模式
}

char putchar(char ch)   //定义printf串口发送函数
{
    SBUF = ch;          //串口1数据寄存器
    while(TI == 0);   //串口1中断发送请求标志
    TI = 0;
    return ch;
}

void ADC_Init() {
P_SW2 |= 0x80;
ADCTIM = 0x3f;      //设置ADC内部时序
P_SW2 &= 0x7f;
ADC_CONTR = 0x8b;   //打开ADC电源、选择P3.3引脚
ADCCFG = 0x2f;
}

void Get_Temp() {
ADC_CONTR |= 0x40;                      //启动AD转换
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20));            //查询ADC完成标志
ADC_CONTR &= ~0x20;                     //清完成标志
Temp = ADC_RESL;
Temp += ADC_RES*256;
printf("ADC:%u\n", Temp);
printf("_____________\n");
}

void main() {
P3M0 = 0x00;   //设置P3.0、3.1串口为准双向口,其余为高祖输入
P3M1 = 0xfc;
UART_Init();
ADC_Init();
      while(1){
                Get_Temp();
      }
}








十分感激!

_奶咖君_ 发表于 2024-1-13 16:00:22

P3.3 你试一试
ADC_CONTR = 0x83;   //打开ADC电源、选择P3.3引脚

shelock9527 发表于 2024-1-13 16:44:35

楼上正解

Windtwet 发表于 2024-1-13 16:49:06

_奶咖君_ 发表于 2024-1-13 16:00
P3.3 你试一试
ADC_CONTR = 0x83;   //打开ADC电源、选择P3.3引脚

十分感谢,是我傻了,看错芯片的规格书了,按照您的指导修改后正常运行,麻烦您了,谢谢!
附上正确的地址表:


Windtwet 发表于 2024-1-13 16:50:08

shelock9527 发表于 2024-1-13 16:44
楼上正解

感谢大佬帮忙,以后看规格书会更仔细一些,谢谢!

hjx5548 发表于 2024-2-25 04:47:46

_奶咖君_ 发表于 2024-1-13 16:00
P3.3 你试一试
ADC_CONTR = 0x83;   //打开ADC电源、选择P3.3引脚

ADC_CONTR |= 0x40;                      //启动AD转换
这句为什么不需要修改为0x43

21cnsound 发表于 2024-2-25 08:03:29

hjx5548 发表于 2024-2-25 04:47
ADC_CONTR |= 0x40;                      //启动AD转换
这句为什么不需要修改为0x43

这句只是将ADC_CONTR.6即ADC_START这个位置1

Golf 发表于 2024-3-5 14:05:54

本帖最后由 Golf 于 2024-3-5 14:08 编辑

为什么我用了你的程序他会一直处于检测ADC转换是否完成的那个循环那里,把循环屏蔽掉就可以正常运行了
页: [1]
查看完整版本: 求助 STC8G1K08A单片机 ADC 转换结果串口输出 始终为0 | 已解决