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

单独运行ADC电压采集代码无电压时输出0,和获取内部1.19V的代码一起运行就会输出161

[复制链接]

4

主题

6

回帖

46

积分

新手上路

积分
46
发表于 2023-6-13 20:42:36 | 显示全部楼层 |阅读模式
     STC8H4K64TLCD单独运行ADC12电压采集数值这部分代码,串口助手显示正常为0。当先获取内部1.19V电压代码和运行ADC电压采集代码一起时运行,ADC通道无电压也会输出161的数值。
#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;
}       

                      unsigned        int xinpianneibiaoya,ADC_celiangdianya;
void main()
{
                  P0M0 = 0x00; P0M1 = 0x10; //设置P0.4(47引脚)ADC测量的引脚为高阻输入模式
                                                while(1)
                                                 {
                                                                                 /************************内部电压采集*************************/                                                                                                                                       
                                                                                                        UartInit();
                                                                                                                        EA = 1;
                                                                                                P_SW2 = 0x80;//当需要访问XFR寄存器时,必须先将寄存器的B7位置EAXFR  置1,才能对XFR 进行正常的读写操作。                                                       
                                                                                                                        xinpianneibiaoya = ((int)CHIPID7<<8) + CHIPID8;
                                                                                                                         printf("芯片内部标压  %02u\r\n", xinpianneibiaoya);        //测量结果显示至串口助手显示出来,显示输出的单位为(mV)毫伏。
                                                                                                                         Delay1000ms();                                                       
                                                                                        /***********************外部电压采集基数**************************/
                                                                                        P_SW2 |= 0x80; //使能访问XFR特殊寄存器                                               
                                                                                        ADCTIM = 0x3f; //设置ADC 内部时序
                                                                                        ADCCFG = 0x2f; //设置ADC 时钟为系统时钟/2/16
                                                                                        ADC_CONTR = 0x8c; //开启ADC测量功能,设置第12通道为ADC测量作用
                                                                                        UartInit();                                                                                               
                                                                                                        ADC_CONTR = 0xcc; //启动AD 转换
                                                                                                        _nop_();//延时1微秒
                                                                                                        _nop_();//延时1微秒
                                                                                                        while (!(ADC_CONTR & 0x20)); //查询ADC 完成标志                                                       
                                                                                                        ADC_CONTR &= ~0x20; //清完成标志
                                                                                                        printf("采集外部的ADC信息为%02u\r\n",ADC_RES); //读取ADC 测量结果显示至串口助手显示出来,打印输出的单位为(mV)毫伏。
                                                                                                Delay1000ms();       
                                        //            /******************电压测量计算**********************/
                                        //      ADC_celiangdianya = xinpianneibiaoya / ADC_RES * 4096;//根据MCU手册查询公式得知,外部的ADC电压=4096*内部标压/外部电压采集基数
                                        //                         UartInit();
                                        //      printf("测得外部的ADC电压为%02u\r\n",ADC_celiangdianya);
                }
}

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15632
发表于 2023-6-13 21:29:25 | 显示全部楼层
将原理图的PDF贴上来
回复 支持 反对

使用道具 举报 送花

4

主题

6

回帖

46

积分

新手上路

积分
46
发表于 2023-6-13 22:07:07 | 显示全部楼层
原理图
192535ume3muzeiku0i6by.png
回复

使用道具 举报 送花

4

主题

6

回帖

46

积分

新手上路

积分
46
发表于 2023-6-13 22:09:42 | 显示全部楼层
串口助手显示内容
串口助手显示.png
回复 支持 反对

使用道具 举报 送花

4

主题

6

回帖

46

积分

新手上路

积分
46
发表于 2023-6-13 22:12:51 | 显示全部楼层
测量1节5号电池的电压串口助手显示结果
20230613221100.png
回复 支持 反对

使用道具 举报 送花

4

主题

6

回帖

46

积分

新手上路

积分
46
发表于 2023-6-13 22:17:40 | 显示全部楼层
把获取芯片内部1.19V的电压代码注释掉,接入1节5号电池,串口助手输出以下结果:
20230613221515.png
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2023-6-14 18:16:22 | 显示全部楼层
本帖最后由 乘风飞扬 于 2023-6-14 18:18 编辑
lim*** 发表于 2023-6-13 22:17
把获取芯片内部1.19V的电压代码注释掉,接入1节5号电池,串口助手输出以下结果: ...
代码我稍微整理测试了一下,采集结果基本正常,主要修改以下部分,其它内容不变:
  1. unsigned int xinpianneibiaoya,ADC_Result;
  2. float ADC_celiangdianya;
  3. void main()
  4. {
  5.     P_SW2 = 0x80;//当需要访问XFR寄存器时,必须先将寄存器的B7位置EAXFR  置1,才能对XFR 进行正常的读写操作。                                                      
  6.     P0M0 = 0x00; P0M1 = 0x10; //设置P0.4(47引脚)ADC测量的引脚为高阻输入模式
  7.     ADCTIM = 0x3f; //设置ADC 内部时序
  8.     ADCCFG = 0x2f; //设置ADC 时钟为系统时钟/2/16
  9.     ADC_CONTR = 0x8c; //开启ADC测量功能,设置第12通道为ADC测量作用
  10.     UartInit();
  11.     EA = 1;
  12.     while(1)
  13.     {
  14.         Delay1000ms();      
  15.         /************************内部电压采集*************************/                                                                                                                                       
  16.         xinpianneibiaoya = ((int)CHIPID7<<8) + CHIPID8;
  17.         printf("芯片内部标压  %02umV\r\n", xinpianneibiaoya);        //测量结果显示至串口助手显示出来,显示输出的单位为(mV)毫伏。
  18.         /***********************外部电压采集基数**************************/
  19.         ADC_CONTR = 0xcf; //启动AD 转换
  20.         _nop_();//延时1微秒
  21.         _nop_();//延时1微秒
  22.         while (!(ADC_CONTR & 0x20)); //查询ADC 完成标志                                                      
  23.         ADC_CONTR &= ~0x20; //清完成标志
  24.         ADC_Result = ((unsigned int)ADC_RES << 8) + ADC_RESL;
  25.         printf("采集内部通道的ADC值为%02u\r\n",ADC_Result); //读取ADC 测量结果显示至串口助手显示出来。
  26. //        printf("采集外部的ADC信息为%02bu\r\n",ADC_RES); //读取ADC 测量结果显示至串口助手显示出来,打印输出的单位为(mV)毫伏。
  27.         /******************电压测量计算**********************/
  28.         ADC_celiangdianya = (float)xinpianneibiaoya / ADC_Result * 4096;//根据MCU手册查询公式得知,外部的ADC电压=4096*内部标压/外部电压采集基数
  29.         printf("测得外部的ADC电压为%fmV\r\n",ADC_celiangdianya);
  30.     }
  31. }
复制代码
实测结果如下:
1.png

另外,keil C51使用printf打印不同类型的数据需要指定数据宽度
(1)b 八位
(2)h 十六位(默认)
(3)l 三十二位

例如:
%bd  输出8位 十进制有符号整数
%hx 或者 %x  输出16位 十六进制整数
%lx  输出32位 十六进制整数
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 07:58 , Processed in 0.116162 second(s), 91 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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