liming 发表于 2023-6-6 19:35:17

ADC采集电压为0,求答疑解惑。




   按照STC8H手册里19.6范例程序,把ADC采集通道改了下。电压测量显示结果传到串口助手,一直是0?
附代码:

#include <STC8H.h>
#include <intrins.h>
#include <stdio.h>

void Delay1000ms()                //@11.0592MHz
{
        unsigned char data i, j, k;

        i = 57;
        j = 27;
        k = 112;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}



void UartInit(void)//9600bps@11.0592MHz
{
               SCON = 0x50;//8位数据,可变波特率
        AUXR |= 0x40;//定时器1时钟为FOSC,就是1T
          AUXR &= 0xFE;//串口1选择定时器1为波特率发生器
                TMOD &= 0x0F;//设定定时器1为16位重装载方式
                  TL1 = 0xE0;//设定定时器低位值
                TH1 = 0xFE ;//设定定时器高位值
           ET1 = 0;//禁止定时器1中断
                  TR1 = 1;//启动定时器1
}

void Uart1_SendChar(unsigned char Udat)
{
    SBUF = Udat;//串口1数据寄存器
    while(!TI);//串口1中断发送请求标志
    TI = 0;   
}

char putchar(char c)
{
    Uart1_SendChar(c);
                return c;
}       

void main()
{
                                                P_SW2 |= 0x80; //使能访问XFR
                                                P0M0 = 0x00;
                                                P0M1 = 0x00;
                                                P1M0 = 0x00;
                                                P1M1 = 0x00;
                                                P2M0 = 0x00;
                                                P2M1 = 0x00;
                                                P3M0 = 0x00;
                                                P3M1 = 0x00;
                                                P4M0 = 0x00;
                                                P4M1 = 0x00;
                                                P5M0 = 0x00;
                                                P5M1 = 0x00;
       
                                  P0M0 = 0x00; P0M1 = 0x10; //设置P0.4(47引脚)ADC测量的引脚为高阻输入模式
                                               
       
                                                ADCTIM = 0x3f; //设置ADC 内部时序
                                                ADCCFG = 0x2f; //设置ADC 时钟为系统时钟/2/16
                                                ADC_CONTR = 0x8c; //开启ADC测量功能,设置第12通道为ADC测量作用
                UartInit();
                                                while (1)
                                                {
                                                       
                                                                ADC_CONTR = 0xcc; //启动AD 转换
                                                                _nop_();
                                                                _nop_();
                                                                while (!(ADC_CONTR & 0x20)); //查询ADC 完成标志
                                                       
                                                                ADC_CONTR &= ~0x20; //清完成标志
                                                                printf("测得外部ADC电压为%u",ADC_RES); //读取ADC 测量结果显示至串口助手
                                                        Delay1000ms();
                                                }
}

梁工 发表于 2023-6-6 23:24:39

请下载“07-8H8K64U-15路12位ADC转换-串口1(P3.1)返回结果-C语言”里的HEX文件测试,STC8H4K64TLCD与STC8H8K64U的ADC完全兼容。MCU将ADC结果转成十进制文本上传,串口助手可以看到结果。

WHX 发表于 2023-6-7 07:57:54

你实物测试时是否和图中一样没有接VCC吧?

liming 发表于 2023-6-7 08:35:12

wenhuixuan 发表于 2023-6-7 07:57
你实物测试时是否和图中一样没有接VCC吧?

VCC引脚接的,实验LED全部都能点亮。{:loveliness:}

liming 发表于 2023-6-7 09:18:27

梁工 发表于 2023-6-6 23:24
请下载“07-8H8K64U-15路12位ADC转换-串口1(P3.1)返回结果-C语言”里的HEX文件测试,STC8H4K64TLCD与STC8H8 ...

       谢谢,梁工。电路中的R2电阻坏掉了,可能是焊接时温度过高时间过长,给烧坏了吧。换了个电阻就好了,有数值了。

梁工 发表于 2023-6-7 09:44:31

liming 发表于 2023-6-7 09:18
谢谢,梁工。电路中的R2电阻坏掉了,可能是焊接时温度过高时间过长,给烧坏了吧。换了个电阻就好 ...

这种情况,万用表量一下ADC输入电压马上就知道了,量到0V,ADC是0是正常的,然后就查为什么是0V,立刻就知道电阻坏了。
页: [1]
查看完整版本: ADC采集电压为0,求答疑解惑。