找回密码
 立即注册
查看: 1742|回复: 30

ADC 读不到电压 | 已解决

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-5-23 17:33:03 | 显示全部楼层 |阅读模式
型号:STC8G1K08A-8Pin
测试仪器:P33/P54/P55脚分别接可调电源(已共地),输入0~5V

代码:用例程改的
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #include <stdio.h>//printf, sprintf
  4. #include <intrins.h>//_nop_, _cror_, _crol_
  5. typedef         unsigned char        u8;  //0 to 255
  6. typedef         unsigned int        u16;  //0 to 65535
  7. typedef         unsigned long        u32;  //0 to 4294967295
  8. //测试工作频率为11.0592MHz
  9. sfr         AUXR        =           0x8e;
  10. sfr     ADC_CONTR   =   0xbc;
  11. sfr     ADC_RES     =   0xbd;
  12. sfr     ADC_RESL    =   0xbe;
  13. sfr     ADCCFG      =   0xde;
  14. sfr P3M0        =   0xb2;                                       //P3口配置寄存器0
  15. sfr P3M1        =   0xb1;                                       //P3口配置寄存器1
  16. sfr P5M0        =   0xca;                                       //P5口配置寄存器0
  17. sfr P5M1        =   0xc9;                                       //P5口配置寄存器1
  18. bit Busy = 0;
  19. void Uart1_Isr(void) interrupt 4
  20. {
  21.         if (TI)                                //检测串口1发送中断
  22.         {
  23.                 TI = 0;                        //清除串口1发送中断请求位
  24.                 Busy = 0;
  25.         }
  26.         if (RI)                                //检测串口1接收中断
  27.         {
  28.                 RI = 0;                        //清除串口1接收中断请求位
  29.         }
  30. }
  31. u8 putchar(u8 dat)
  32. {
  33.         Busy = 1;
  34.         SBUF = dat;
  35.         while(Busy);
  36.         return dat;
  37. }
  38. void Uart1_Init(void)        //115200bps@11.0592MHz
  39. {
  40.         SCON = 0x50;                //8位数据,可变波特率
  41.         AUXR |= 0x40;                //定时器时钟1T模式
  42.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  43.         TMOD &= 0x0F;                //设置定时器模式
  44.         TL1 = 0xE8;                        //设置定时初始值
  45.         TH1 = 0xFF;                        //设置定时初始值
  46.         ET1 = 0;                        //禁止定时器中断
  47.         TR1 = 1;                        //定时器1开始计时
  48.         ES = 1;                                //使能串口1中断
  49. }
  50. void Delay1000ms(void)        //@11.0592MHz
  51. {
  52.         unsigned char data i, j, k;
  53.         i = 17;
  54.         j = 27;
  55.         k = 112;
  56.         do
  57.         {
  58.                 do
  59.                 {
  60.                         while (--k);
  61.                 } while (--j);
  62.         } while (--i);
  63. }
  64. void Delay1ms(void)        //@11.0592MHz
  65. {
  66.         unsigned char data i, j;
  67.         i = 15;
  68.         j = 90;
  69.         do
  70.         {
  71.                 while (--j);
  72.         } while (--i);
  73. }
  74. u16 Temp;
  75. u16 Cnt = 0;
  76. void main()
  77. {
  78.     P3M0 = 0x00; P3M1 = 0x0c;
  79.     P5M0 = 0x00; P5M1 = 0x10;
  80.     ADCCFG = 0x2f;                              //设置ADC时钟为系统时钟/2/16/16
  81.         Uart1_Init();
  82.         EA=1;
  83.                 ADC_CONTR = 0x82;                           //使能ADC模块
  84.                 Delay1ms();
  85.     while (1)
  86.     {
  87.                 Cnt++;
  88.                 printf("ADC Test: %u\r\n",Cnt);
  89.                 Delay1ms();
  90.         ADC_CONTR |= 0x42;                      //启动AD转换
  91.         _nop_();
  92.         _nop_();
  93.         while (!(ADC_CONTR & 0x20));            //查询ADC完成标志
  94.         ADC_CONTR &= ~0x20;                     //清完成标志
  95.         Temp = ADC_RES;                           //读取ADC结果
  96.                 Temp = Temp<<8 | ADC_RESL;
  97.                 printf("P32 Raw: %u\r\n",Temp);
  98.                 printf("P32 Volt: %lu x10mV\r\n",(u32)Temp*500/1024);
  99.                 Delay1ms();
  100.         ADC_CONTR |= 0x43;                      //启动AD转换
  101.         _nop_();
  102.         _nop_();
  103.         while (!(ADC_CONTR & 0x20));            //查询ADC完成标志
  104.         ADC_CONTR &= ~0x20;                     //清完成标志
  105.         Temp = ADC_RES;                           //读取ADC结果
  106.                 Temp = Temp<<8 | ADC_RESL;
  107.                 printf("P33 Raw: %u\r\n",Temp);
  108.                 printf("P33 Volt: %lu x10mV\r\n",(u32)Temp*500/1024);
  109.                 Delay1ms();
  110.         ADC_CONTR |= 0x44;                      //启动AD转换
  111.         _nop_();
  112.         _nop_();
  113.         while (!(ADC_CONTR & 0x20));            //查询ADC完成标志
  114.         ADC_CONTR &= ~0x20;                     //清完成标志
  115.         Temp = ADC_RES;                           //读取ADC结果
  116.                 Temp = Temp<<8 | ADC_RESL;
  117.                 printf("P54 Raw: %u\r\n",Temp);
  118.                 printf("P54 Volt: %lu x10mV\r\n",(u32)Temp*500/1024);
  119.                 Delay1000ms();
  120.     }
  121. }
复制代码
现象
2024-05-23_172953.png




回复

使用道具 举报 送花

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

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-5-23 19:08:44 | 显示全部楼层
确定芯片型号后面有带“A”?
截图202405231908271798.jpg
回复 支持 反对

使用道具 举报 送花

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

718

主题

1万

回帖

1万

积分

管理员

积分
15626
发表于 2024-5-23 19:14:05 | 显示全部楼层
确保是 STC8G1K08A-36I-SOP8, 有ADC
====STC8G1K08-36I-SOP8, 无ADC

截图202405231911586845.jpg

截图202405231913347438.jpg

截图202405231914027456.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-5-24 09:00:20 来自手机 | 显示全部楼层
乘风飞扬 发表于 2024-5-23 19:08
确定芯片型号后面有带“A”?

确定
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-5-24 09:00:46 来自手机 | 显示全部楼层
神农鼎 发表于 2024-5-23 19:14
确保是 STC8G1K08A-36I-SOP8, 有ADC
====STC8G1K08-36I-SOP8, 无ADC

确定
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-5-24 11:01:08 | 显示全部楼层
我猜想一下,第一次读取的时候 是不是只有前两路是正确的,,,从第二次开始就都不正确了?
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2024-5-24 11:12:55 | 显示全部楼层
/*************        功能说明        **************
用户请先别修改程序, 直接下载"02-5路ADC转换-BandGap-串口1(P3.1)返回结果-C语言"里的"ADC.hex"测试. 下载时选择主频11.0592MHZ。
测试时, 电脑的串口助手设置115200,8,n,1.
本程序演示4路ADC(P3.0 P3.2 P3.3 P5.4 P5.5)和bandgap查询采样,通过串口1(P3.1)发送给上位机,波特率115200,8,n,1.
0~3通道对应P3.0~P3.3, 4通道-->P5.4, 5通道-->P5.5, 15通道为内部1.19V基准电压做输入的ADC值.
初始化时先把要ADC转换的引脚设置为高阻输入.

ADC模块是一个硬件模块, 由ADC时钟驱动, 一旦触发ADC转换, 硬件会在ADC时钟驱动下自动完成.
CLK为ADC时钟, 是系统时钟的SysClk/2/(n+1)分频, ADC转换由下列操作完成:
通道选择时间     1或2个CLK (默认1)
通道选择保持时间 1~4个CLK (默认2)
模拟信号采样时间 1~32个CLK (默认11)
ADC转换时间      10个CLK(固定).
******************************************/


ADC相关程序-STC8G1K08A-8PIN.rar (85.3 KB, 下载次数: 128)



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:288
  • 最近打卡:2025-05-02 15:37:40

0

主题

52

回帖

1284

积分

金牌会员

积分
1284
发表于 2024-5-24 11:42:20 | 显示全部楼层
第一次采集的是ADC2,第二次采集的是ADC3,第三次采集的是ADC7,往后每一次采集的都是ADC7
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-5-24 15:41:36 | 显示全部楼层
_奶*** 发表于 2024-5-24 11:01
我猜想一下,第一次读取的时候 是不是只有前两路是正确的,,,从第二次开始就都不正确了? ...

对头!!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-5-24 15:46:44 | 显示全部楼层
梁*** 发表于 2024-5-24 11:12
/*************        功能说明        **************
用户请先别修改程序, 直接下载"02-5路ADC转换-Band ...

2024-05-24_154610.png

然后呢?

点评

什么然后呢? 你要问什么? 能不能多打几个字啊?  详情 回复 发表于 2024-5-24 17:04
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 15:42 , Processed in 0.168960 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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