找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4815|回复: 14
收起左侧

stc8g1k08单片机adc采集不到电压值?

  [复制链接]
ID:716660 发表于 2022-6-1 00:23 | 显示全部楼层 |阅读模式
这个adc为什么采集不到呀,实在不知道哪里出了问题,我想看看读取到的adc值,后面用串口助手看了下采集的adc值,用手摸确实有温度变化,但是就是不触发加热,大哥们帮忙看看是哪里出了问题

下面是单片机程序:

#include "STC8.h"
#include "stdio.h"
#include "intrins.h"
#define ADCTIM  (*(unsigned char volatile xdata *)0xfea8)
#define WT_12M   0x83
sbit mouse_key  = P1^6;
sbit  cup_key   = P1^7;
sbit mouse_Temp = P1^0;
sbit  cup_Temp  = P1^1;
sbit mouse_led1 = P3^0;
sbit mouse_led2 = P3^1;
sbit mouse_led3 = P3^2;
sbit  cup_led1  = P3^3;
sbit  cup_led2  = P3^4;
sbit  cup_led3  = P3^5;
sbit  s2_mouse  = P3^6;
sbit  s1_cup    = P3^7;


bit   mouse_sign = 0;
bit   cap_sign   = 0;


#define unchar unsigned char     
#define unint unsigned int         


unchar z,u=0;
unint CUP_ADC,MOUSE_ADC;                                        //ADC采样值
unint FLAG_C,FLAG_M;


unint Get_CUP_ADCResult()
{        //ADC 控制器  电源  启动  完成  --   15通道模拟选择位
        //ADC_CONTR    B7    B6    B5   B4   B3   B2   B1   B0
        P1M0 = 0x00;                                                        //设置P1.1为ADC口
  P1M1 = 0x02;                                                        //设置P1.1为ADC口
        P_SW2 |= 0x80;                                                        //打开外设寄存器
        ADCTIM = 0x3f;                                                        //设置 ADC 内部时序
        P_SW2 &= 0x7f;                                                        //关闭外设寄存器
        ADCCFG = 0x2f;                                                        //设置 ADC 时钟为系统时钟/2/16
        ADC_CONTR = 0x80;                                                //使能 ADC 模块
        ADC_RES=0;
        ADC_RESL=0;                 //清除转换结果
        _nop_();_nop_();
        _nop_();_nop_();        
        _nop_();_nop_();        
        _nop_();_nop_();                //延时8个时钟
        ADC_CONTR|= 0x40;                                       //启动AD转换,P1.0 ADC输入
        while (!(ADC_CONTR & 0x20));                //查询ADC完成标志
        ADC_CONTR &= ~0x20;                                                //清完成标志
        return (ADC_RES << 8) | ADC_RESL;//返回10位ADC结果
}


unint Get_MOUSE_ADCResult()
{        //ADC 控制器  电源  启动  完成  --   15通道模拟选择位
        //ADC_CONTR    B7    B6    B5   B4   B3   B2   B1   B0
  P1M0 = 0x00;                                                        //设置P1.0为ADC口
  P1M1 = 0x01;                                                        //设置P1.0为ADC口
        P_SW2 |= 0x80;                                                        //打开外设寄存器
        ADCTIM = 0x3f;                                                        //设置 ADC 内部时序
        P_SW2 &= 0x7f;                                                        //关闭外设寄存器
        ADCCFG = 0x2f;                                                        //设置 ADC 时钟为系统时钟/2/16
        ADC_RES=0;
        ADC_RESL=0;                 //清除转换结果
        ADC_CONTR = 0x80;                                                //使能 ADC 模块
        _nop_();_nop_();
        _nop_();_nop_();        
        _nop_();_nop_();        
        _nop_();_nop_();                //延时8个时钟
        ADC_CONTR|= 0x41;                                       //启动AD转换,P1.1 ADC输入
        while (!(ADC_CONTR & 0x20));                //查询ADC完成标志
        ADC_CONTR &= ~0x20;                                                //清完成标志
        return(ADC_RES << 8) | ADC_RESL;//返回10位ADC结果
}


void Delay10ms()                //@11.0592MHz
{
        unsigned char i, j;


        _nop_();
        _nop_();
        i = 144;
        j = 157;
        do
        {
                while (--j);
        } while (--i);
}




void keys_can()                                                                //按键扫描
{if(mouse_key==0&&mouse_sign==0)
        {
                  Delay10ms();               


                      mouse_sign=1;      


        }
              if(mouse_key==1&&mouse_sign==1)
              {
                 mouse_sign=0;
                   u++;        
                                                      
              }   
                                                        
/*********************************************************************/                                                                                 
      if(cup_key==0&&cap_sign==0)
        {
                  Delay10ms();               


                      cap_sign=1;      


        }
              if(cup_key==1&&cap_sign==1)
              {
                 cap_sign=0;
                   z++;        


              }  }
              


void main ()


{
         
          P3M0 = 0xff;      
    P3M1 = 0x00;           //设置P3推挽输出
    P3=0xff;
          s1_cup=1;
          s2_mouse=0;
         while(1)
{
  keys_can();
  if(u>3)u=0;
        if(z>3)z=0;
    CUP_ADC  =  Get_CUP_ADCResult();
    if(CUP_ADC<FLAG_C)
                {
                        s1_cup=0;
     }else s1_cup=1;        
                 Delay10ms();                 
          MOUSE_ADC =  Get_MOUSE_ADCResult();
                 Delay10ms();
                     if(MOUSE_ADC < FLAG_M)
                {
                        s2_mouse=1;
     }else s2_mouse=0;                        


switch(u)
                                                        {
              case 0:
              mouse_led1 = 1;
              mouse_led2 = 1;
              mouse_led3 = 1;
                                                        FLAG_M=0x232;       //5V
              break;
              case 1:
              mouse_led1 = 0;
              mouse_led2 = 1;
              mouse_led3 = 1;
                                                        FLAG_M=0x176;      //40T
              break;
              case 2:
              mouse_led1 = 1;
              mouse_led2 = 0;
              mouse_led3 = 1;
                                                        FLAG_M=0x12A;      //50T
              break;
              case 3:
              mouse_led1 = 1;
              mouse_led2 = 1;
              mouse_led3 = 0;
                                                        FLAG_M=0xEB;      //60T
              break; default:break; }
switch(z)
                                                        {
              case 0:
              cup_led1 = 1;
              cup_led2 = 1;
              cup_led3 = 1;
                                                        FLAG_C=0x232;         //5V
              break;
              case 1:
              cup_led1 = 0;
              cup_led2 = 1;
              cup_led3 = 1;
                                                        FLAG_C=0x109;       //55T
              break;
              case 2:
              cup_led1 = 1;
              cup_led2 = 0;
              cup_led3 = 1;
                                                        FLAG_C=0xD1;      //65T
              break;
              case 3:
              cup_led1 = 1;
              cup_led2 = 1;
              cup_led3 = 0;
                                                        FLAG_C=0x82;     //85T
              break; default:break; }        


}

}

程序.zip

44.8 KB, 下载次数: 11

回复

使用道具 举报

ID:716660 发表于 2022-6-1 00:25 | 显示全部楼层
硬件连接应该不会有问题,我拿论坛里面T12的改的
回复

使用道具 举报

ID:213173 发表于 2022-6-1 07:09 | 显示全部楼层
本帖最后由 wulin 于 2022-6-1 10:28 编辑

#include "STC8.h"
#include "intrins.h"
#define uchar unsigned char     
#define uint unsigned int     
#define ADCTIM  (*(unsigned char volatile xdata *)0xfea8)
#define ADC_POWER   0x80                        //ADC电源控制位1000 0000
#define ADC_START   0x40                        //ADC启动控制位0100 0000
#define ADC_FLAG    0x20                        //ADC完成标志位0010 0000
#define ADC_EPWMT   0x10                        //ADC使能控制位0001 0000   

uint ADC_A,ADC_B;

void Delay1ms()                //@11.0592MHz
{
        unsigned char i, j;

        i = 15;
        j = 90;
        do
        {
                while (--j);
        } while (--i);
}
/*-----------------------------
  初始化ADC
------------------------------*/
void Init_ADC()
{        //ADC 控制器  电源  启动  完成  --   15通道模拟选择位
        //ADC_CONTR    B7    B6    B5   B4   B3   B2   B1   B0
        P_SW2 |= 0x80;                        //打开
        ADCTIM = 0x3f;                        //设置 ADC 内部时序
        P_SW2 &= 0x7f;                        //关闭
        ADCCFG = 0x27;                        //设置ADC结果右对齐,速度为512系统时钟
        ADC_RES=0;                                //清除ADC_RES存储器以前的结果
        ADC_RESL=0;
        ADC_CONTR=ADC_POWER; //ADC 开启电源
        Delay1ms();                                //上电延时1ms
}
/*----------------------------
        读取ADC结果
----------------------------*/
uint GetADCResult(uchar CH)
{
        ADC_CONTR=ADC_POWER|ADC_START|CH;//启动转换1100 1000
        _nop_();_nop_();                                //小延时
        while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成标志置位 1010 0000
        ADC_CONTR &=~ADC_FLAG;                        //清完成标志
        return ADC_RES<<8|ADC_RESL;                //返回十位ADC结果
}

void main ()
{         
        P3M0 = 0x00;
        P3M1 = 0x00;
        P1M0 = 0x03;//P1.0/P1.1高阻,模拟输入
        P1M1 = 0x00;
        P5M0 = 0x00;
        P5M1 = 0x00;
        Init_ADC();
        while(1)
        {
                ADC_A=GetADCResult(0);
                ADC_B=GetADCResult(1);
                //添加显示/控制代码
        }
}

回复

使用道具 举报

ID:688692 发表于 2022-6-1 08:35 | 显示全部楼层
8G08 NO ADC.PNG
8G08A WITH ADC.PNG

回复

使用道具 举报

ID:425825 发表于 2022-6-1 08:38 | 显示全部楼层
stc8g1k08应该是没有AD,stc8g1k08A最后带A的单片机带AD
回复

使用道具 举报

ID:213173 发表于 2022-6-1 10:27 | 显示全部楼层
STC8G1K08-16/20使用2个通道ADC的基本代码
  1. #include "STC8.h"
  2. #include "intrins.h"
  3. #define uchar unsigned char     
  4. #define uint unsigned int     
  5. #define ADCTIM  (*(unsigned char volatile xdata *)0xfea8)
  6. #define ADC_POWER   0x80                        //ADC电源控制位1000 0000
  7. #define ADC_START   0x40                        //ADC启动控制位0100 0000
  8. #define ADC_FLAG    0x20                        //ADC完成标志位0010 0000
  9. #define ADC_EPWMT   0x10                        //ADC使能控制位0001 0000   

  10. uint ADC_A,ADC_B;

  11. void Delay1ms()                //@11.0592MHz
  12. {
  13.         unsigned char i, j;

  14.         i = 15;
  15.         j = 90;
  16.         do
  17.         {
  18.                 while (--j);
  19.         } while (--i);
  20. }
  21. /*-----------------------------
  22.   初始化ADC
  23. ------------------------------*/
  24. void Init_ADC()
  25. {        //ADC 控制器  电源  启动  完成  --   15通道模拟选择位
  26.         //ADC_CONTR    B7    B6    B5   B4   B3   B2   B1   B0
  27.         P_SW2 |= 0x80;                        //打开
  28.         ADCTIM = 0x3f;                        //设置 ADC 内部时序
  29.         P_SW2 &= 0x7f;                        //关闭
  30.         ADCCFG = 0x27;                        //设置ADC结果右对齐,速度为512系统时钟
  31.         ADC_RES=0;                                //清除ADC_RES存储器以前的结果
  32.         ADC_RESL=0;
  33.         ADC_CONTR=ADC_POWER; //ADC 开启电源
  34.         Delay1ms();                                //上电延时1ms
  35. }
  36. /*----------------------------
  37.         读取ADC结果
  38. ----------------------------*/
  39. uint GetADCResult(uchar CH)
  40. {
  41.         ADC_CONTR=ADC_POWER|ADC_START|CH;//启动转换1100 1000
  42.         _nop_();_nop_();                                //小延时
  43.         while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成标志置位 1010 0000
  44.         ADC_CONTR &=~ADC_FLAG;                        //清完成标志
  45.         return ADC_RES<<8|ADC_RESL;                //返回十位ADC结果
  46. }

  47. void main ()
  48. {         
  49.         P3M0 = 0x00;
  50.         P3M1 = 0x00;
  51.         P1M0 = 0x03;//P1.0/P1.1高阻,模拟输入
  52.         P1M1 = 0x00;
  53.         P5M0 = 0x00;
  54.         P5M1 = 0x00;
  55.         Init_ADC();
  56.         while(1)
  57.         {
  58.                 ADC_A=GetADCResult(0);
  59.                 ADC_B=GetADCResult(1);
  60.                 //添加显示/控制代码
  61.         }
  62. }

复制代码
回复

使用道具 举报

ID:213173 发表于 2022-6-1 10:44 | 显示全部楼层
来51学习 发表于 2022-6-1 08:38
stc8g1k08应该是没有AD,stc8g1k08A最后带A的单片机带AD

STC8G1K08型号中8脚的有此说法,16-20脚的都有ADC。
回复

使用道具 举报

ID:716660 发表于 2022-6-1 18:56 | 显示全部楼层
wulin 发表于 2022-6-1 10:44
STC8G1K08型号中8脚的有此说法,16-20脚的都有ADC。

对的哥,我用的就是16脚的
回复

使用道具 举报

ID:716660 发表于 2022-6-1 18:58 | 显示全部楼层
来51学习 发表于 2022-6-1 08:38
stc8g1k08应该是没有AD,stc8g1k08A最后带A的单片机带AD

用的是16脚的有ad
回复

使用道具 举报

ID:401564 发表于 2022-6-1 20:33 | 显示全部楼层
1,先认真看一下你单片机和数据手册,有没有ADC功能
2,先看一下ADC是否可以正常,用电位器或者已知电压,连接到ADC,ADC转换之后,把转换结果发送到串口,自己计算一下,是不是对应的电压
3,在ADC功能正常之后,再检查你代码的逻辑,可以先直接赋值看一下是否可以控制
回复

使用道具 举报

ID:624769 发表于 2022-6-1 21:55 | 显示全部楼层
所以,什么叫采集不到?

是一运行:       ADC_CONTR|= 0x40;    就死机?
还是:        while (!(ADC_CONTR & 0x20));     永远读不到标志?
还是说:        return (ADC_RES << 8) | ADC_RESL;   返回的都是0?

这……问个问题都得竞猜么?
回复

使用道具 举报

ID:975054 发表于 2023-5-20 01:47 来自手机 | 显示全部楼层
   根本就没看到你设置哪个口作为ADC口!默认是0000,ADC0,P1.0,你只是设置了P1.1为高阻输入口。你应该来一句:ADC_CONTR = 0xC1;三合一,里面已设置P1.1为ADC1脚,同时开启了电源,还开始了转换。你查一查我这一句吧,是不是都包含了!我实测很好!当然要求高的得加1ms延时及外围电容等等   
回复

使用道具 举报

ID:383654 发表于 2023-8-9 09:46 | 显示全部楼层
wulin 发表于 2022-6-1 07:09
#include "STC8.h"
#include "intrins.h"
#define uchar unsigned char     

P1M0=0X03;
P1M1=0X00;这里错了。
应该是:
P1M0=0X00;
P1M1=0X03;
回复

使用道具 举报

ID:77589 发表于 2023-10-27 11:39 | 显示全部楼层
有用,今天也上了有没有A的当
回复

使用道具 举报

ID:72649 发表于 2024-1-11 22:19 | 显示全部楼层
Longan.Wang 发表于 2023-10-27 11:39
有用,今天也上了有没有A的当

STC8G1K08A
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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