找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5815|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

stc8g1k08單片機(jī)adc采集不到電壓值?

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這個(gè)adc為什么采集不到呀,實(shí)在不知道哪里出了問(wèn)題,我想看看讀取到的adc值,后面用串口助手看了下采集的adc值,用手摸確實(shí)有溫度變化,但是就是不觸發(fā)加熱,大哥們幫忙看看是哪里出了問(wèn)題

下面是單片機(jī)程序:

#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 控制器  電源  啟動(dòng)  完成  --   15通道模擬選擇位
        //ADC_CONTR    B7    B6    B5   B4   B3   B2   B1   B0
        P1M0 = 0x00;                                                        //設(shè)置P1.1為ADC口
  P1M1 = 0x02;                                                        //設(shè)置P1.1為ADC口
        P_SW2 |= 0x80;                                                        //打開(kāi)外設(shè)寄存器
        ADCTIM = 0x3f;                                                        //設(shè)置 ADC 內(nèi)部時(shí)序
        P_SW2 &= 0x7f;                                                        //關(guān)閉外設(shè)寄存器
        ADCCFG = 0x2f;                                                        //設(shè)置 ADC 時(shí)鐘為系統(tǒng)時(shí)鐘/2/16
        ADC_CONTR = 0x80;                                                //使能 ADC 模塊
        ADC_RES=0;
        ADC_RESL=0;                 //清除轉(zhuǎn)換結(jié)果
        _nop_();_nop_();
        _nop_();_nop_();        
        _nop_();_nop_();        
        _nop_();_nop_();                //延時(shí)8個(gè)時(shí)鐘
        ADC_CONTR|= 0x40;                                       //啟動(dòng)AD轉(zhuǎn)換,P1.0 ADC輸入
        while (!(ADC_CONTR & 0x20));                //查詢ADC完成標(biāo)志
        ADC_CONTR &= ~0x20;                                                //清完成標(biāo)志
        return (ADC_RES << 8) | ADC_RESL;//返回10位ADC結(jié)果
}


unint Get_MOUSE_ADCResult()
{        //ADC 控制器  電源  啟動(dòng)  完成  --   15通道模擬選擇位
        //ADC_CONTR    B7    B6    B5   B4   B3   B2   B1   B0
  P1M0 = 0x00;                                                        //設(shè)置P1.0為ADC口
  P1M1 = 0x01;                                                        //設(shè)置P1.0為ADC口
        P_SW2 |= 0x80;                                                        //打開(kāi)外設(shè)寄存器
        ADCTIM = 0x3f;                                                        //設(shè)置 ADC 內(nèi)部時(shí)序
        P_SW2 &= 0x7f;                                                        //關(guān)閉外設(shè)寄存器
        ADCCFG = 0x2f;                                                        //設(shè)置 ADC 時(shí)鐘為系統(tǒng)時(shí)鐘/2/16
        ADC_RES=0;
        ADC_RESL=0;                 //清除轉(zhuǎn)換結(jié)果
        ADC_CONTR = 0x80;                                                //使能 ADC 模塊
        _nop_();_nop_();
        _nop_();_nop_();        
        _nop_();_nop_();        
        _nop_();_nop_();                //延時(shí)8個(gè)時(shí)鐘
        ADC_CONTR|= 0x41;                                       //啟動(dòng)AD轉(zhuǎn)換,P1.1 ADC輸入
        while (!(ADC_CONTR & 0x20));                //查詢ADC完成標(biāo)志
        ADC_CONTR &= ~0x20;                                                //清完成標(biāo)志
        return(ADC_RES << 8) | ADC_RESL;//返回10位ADC結(jié)果
}


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;           //設(shè)置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, 下載次數(shù): 11

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:716660 發(fā)表于 2022-6-1 00:25 | 只看該作者
硬件連接應(yīng)該不會(huì)有問(wèn)題,我拿論壇里面T12的改的
回復(fù)

使用道具 舉報(bào)

板凳
ID:213173 發(fā)表于 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啟動(dòng)控制位0100 0000
#define ADC_FLAG    0x20                        //ADC完成標(biāo)志位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 控制器  電源  啟動(dòng)  完成  --   15通道模擬選擇位
        //ADC_CONTR    B7    B6    B5   B4   B3   B2   B1   B0
        P_SW2 |= 0x80;                        //打開(kāi)
        ADCTIM = 0x3f;                        //設(shè)置 ADC 內(nèi)部時(shí)序
        P_SW2 &= 0x7f;                        //關(guān)閉
        ADCCFG = 0x27;                        //設(shè)置ADC結(jié)果右對(duì)齊,速度為512系統(tǒng)時(shí)鐘
        ADC_RES=0;                                //清除ADC_RES存儲(chǔ)器以前的結(jié)果
        ADC_RESL=0;
        ADC_CONTR=ADC_POWER; //ADC 開(kāi)啟電源
        Delay1ms();                                //上電延時(shí)1ms
}
/*----------------------------
        讀取ADC結(jié)果
----------------------------*/
uint GetADCResult(uchar CH)
{
        ADC_CONTR=ADC_POWER|ADC_START|CH;//啟動(dòng)轉(zhuǎn)換1100 1000
        _nop_();_nop_();                                //小延時(shí)
        while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉(zhuǎn)換完成標(biāo)志置位 1010 0000
        ADC_CONTR &=~ADC_FLAG;                        //清完成標(biāo)志
        return ADC_RES<<8|ADC_RESL;                //返回十位ADC結(jié)果
}

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);
                //添加顯示/控制代碼
        }
}

回復(fù)

使用道具 舉報(bào)

地板
ID:688692 發(fā)表于 2022-6-1 08:35 | 只看該作者



回復(fù)

使用道具 舉報(bào)

5#
ID:425825 發(fā)表于 2022-6-1 08:38 | 只看該作者
stc8g1k08應(yīng)該是沒(méi)有AD,stc8g1k08A最后帶A的單片機(jī)帶AD
回復(fù)

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2022-6-1 10:27 | 只看該作者
STC8G1K08-16/20使用2個(gè)通道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啟動(dòng)控制位0100 0000
  8. #define ADC_FLAG    0x20                        //ADC完成標(biāo)志位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 控制器  電源  啟動(dòng)  完成  --   15通道模擬選擇位
  26.         //ADC_CONTR    B7    B6    B5   B4   B3   B2   B1   B0
  27.         P_SW2 |= 0x80;                        //打開(kāi)
  28.         ADCTIM = 0x3f;                        //設(shè)置 ADC 內(nèi)部時(shí)序
  29.         P_SW2 &= 0x7f;                        //關(guān)閉
  30.         ADCCFG = 0x27;                        //設(shè)置ADC結(jié)果右對(duì)齊,速度為512系統(tǒng)時(shí)鐘
  31.         ADC_RES=0;                                //清除ADC_RES存儲(chǔ)器以前的結(jié)果
  32.         ADC_RESL=0;
  33.         ADC_CONTR=ADC_POWER; //ADC 開(kāi)啟電源
  34.         Delay1ms();                                //上電延時(shí)1ms
  35. }
  36. /*----------------------------
  37.         讀取ADC結(jié)果
  38. ----------------------------*/
  39. uint GetADCResult(uchar CH)
  40. {
  41.         ADC_CONTR=ADC_POWER|ADC_START|CH;//啟動(dòng)轉(zhuǎn)換1100 1000
  42.         _nop_();_nop_();                                //小延時(shí)
  43.         while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉(zhuǎn)換完成標(biāo)志置位 1010 0000
  44.         ADC_CONTR &=~ADC_FLAG;                        //清完成標(biāo)志
  45.         return ADC_RES<<8|ADC_RESL;                //返回十位ADC結(jié)果
  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. }

復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

7#
ID:213173 發(fā)表于 2022-6-1 10:44 | 只看該作者
來(lái)51學(xué)習(xí) 發(fā)表于 2022-6-1 08:38
stc8g1k08應(yīng)該是沒(méi)有AD,stc8g1k08A最后帶A的單片機(jī)帶AD

STC8G1K08型號(hào)中8腳的有此說(shuō)法,16-20腳的都有ADC。
回復(fù)

使用道具 舉報(bào)

8#
ID:716660 發(fā)表于 2022-6-1 18:56 | 只看該作者
wulin 發(fā)表于 2022-6-1 10:44
STC8G1K08型號(hào)中8腳的有此說(shuō)法,16-20腳的都有ADC。

對(duì)的哥,我用的就是16腳的
回復(fù)

使用道具 舉報(bào)

9#
ID:716660 發(fā)表于 2022-6-1 18:58 | 只看該作者
來(lái)51學(xué)習(xí) 發(fā)表于 2022-6-1 08:38
stc8g1k08應(yīng)該是沒(méi)有AD,stc8g1k08A最后帶A的單片機(jī)帶AD

用的是16腳的有ad
回復(fù)

使用道具 舉報(bào)

10#
ID:401564 發(fā)表于 2022-6-1 20:33 | 只看該作者
1,先認(rèn)真看一下你單片機(jī)和數(shù)據(jù)手冊(cè),有沒(méi)有ADC功能
2,先看一下ADC是否可以正常,用電位器或者已知電壓,連接到ADC,ADC轉(zhuǎn)換之后,把轉(zhuǎn)換結(jié)果發(fā)送到串口,自己計(jì)算一下,是不是對(duì)應(yīng)的電壓
3,在ADC功能正常之后,再檢查你代碼的邏輯,可以先直接賦值看一下是否可以控制
回復(fù)

使用道具 舉報(bào)

11#
ID:624769 發(fā)表于 2022-6-1 21:55 | 只看該作者
所以,什么叫采集不到?

是一運(yùn)行:       ADC_CONTR|= 0x40;    就死機(jī)?
還是:        while (!(ADC_CONTR & 0x20));     永遠(yuǎn)讀不到標(biāo)志?
還是說(shuō):        return (ADC_RES << 8) | ADC_RESL;   返回的都是0?

這……問(wèn)個(gè)問(wèn)題都得競(jìng)猜么?
回復(fù)

使用道具 舉報(bào)

12#
ID:975054 發(fā)表于 2023-5-20 01:47 來(lái)自手機(jī) | 只看該作者
   根本就沒(méi)看到你設(shè)置哪個(gè)口作為ADC口!默認(rèn)是0000,ADC0,P1.0,你只是設(shè)置了P1.1為高阻輸入口。你應(yīng)該來(lái)一句:ADC_CONTR = 0xC1;三合一,里面已設(shè)置P1.1為ADC1腳,同時(shí)開(kāi)啟了電源,還開(kāi)始了轉(zhuǎn)換。你查一查我這一句吧,是不是都包含了!我實(shí)測(cè)很好!當(dāng)然要求高的得加1ms延時(shí)及外圍電容等等   
回復(fù)

使用道具 舉報(bào)

13#
ID:383654 發(fā)表于 2023-8-9 09:46 | 只看該作者
wulin 發(fā)表于 2022-6-1 07:09
#include "STC8.h"
#include "intrins.h"
#define uchar unsigned char     

P1M0=0X03;
P1M1=0X00;這里錯(cuò)了。
應(yīng)該是:
P1M0=0X00;
P1M1=0X03;
回復(fù)

使用道具 舉報(bào)

14#
ID:77589 發(fā)表于 2023-10-27 11:39 | 只看該作者
有用,今天也上了有沒(méi)有A的當(dāng)
回復(fù)

使用道具 舉報(bào)

15#
ID:72649 發(fā)表于 2024-1-11 22:19 | 只看該作者
Longan.Wang 發(fā)表于 2023-10-27 11:39
有用,今天也上了有沒(méi)有A的當(dāng)

STC8G1K08A
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表