久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: stc8g1k08單片機adc采集不到電壓值? [打印本頁]

作者: 呦呦奧利給    時間: 2022-6-1 00:23
標題: stc8g1k08單片機adc采集不到電壓值?
這個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


作者: 呦呦奧利給    時間: 2022-6-1 00:25
硬件連接應該不會有問題,我拿論壇里面T12的改的
作者: wulin    時間: 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);
                //添加顯示/控制代碼
        }
}


作者: cnos    時間: 2022-6-1 08:35




作者: 來51學習    時間: 2022-6-1 08:38
stc8g1k08應該是沒有AD,stc8g1k08A最后帶A的單片機帶AD
作者: wulin    時間: 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. }

復制代碼

作者: wulin    時間: 2022-6-1 10:44
來51學習 發表于 2022-6-1 08:38
stc8g1k08應該是沒有AD,stc8g1k08A最后帶A的單片機帶AD

STC8G1K08型號中8腳的有此說法,16-20腳的都有ADC。
作者: 呦呦奧利給    時間: 2022-6-1 18:56
wulin 發表于 2022-6-1 10:44
STC8G1K08型號中8腳的有此說法,16-20腳的都有ADC。

對的哥,我用的就是16腳的

作者: 呦呦奧利給    時間: 2022-6-1 18:58
來51學習 發表于 2022-6-1 08:38
stc8g1k08應該是沒有AD,stc8g1k08A最后帶A的單片機帶AD

用的是16腳的有ad

作者: Y_G_G    時間: 2022-6-1 20:33
1,先認真看一下你單片機和數據手冊,有沒有ADC功能
2,先看一下ADC是否可以正常,用電位器或者已知電壓,連接到ADC,ADC轉換之后,把轉換結果發送到串口,自己計算一下,是不是對應的電壓
3,在ADC功能正常之后,再檢查你代碼的邏輯,可以先直接賦值看一下是否可以控制
作者: 188610329    時間: 2022-6-1 21:55
所以,什么叫采集不到?

是一運行:       ADC_CONTR|= 0x40;    就死機?
還是:        while (!(ADC_CONTR & 0x20));     永遠讀不到標志?
還是說:        return (ADC_RES << 8) | ADC_RESL;   返回的都是0?

這……問個問題都得競猜么?
作者: ax6808    時間: 2023-5-20 01:47
   根本就沒看到你設置哪個口作為ADC口!默認是0000,ADC0,P1.0,你只是設置了P1.1為高阻輸入口。你應該來一句:ADC_CONTR = 0xC1;三合一,里面已設置P1.1為ADC1腳,同時開啟了電源,還開始了轉換。你查一查我這一句吧,是不是都包含了!我實測很好!當然要求高的得加1ms延時及外圍電容等等   
作者: Jang    時間: 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;

作者: Longan.Wang    時間: 2023-10-27 11:39
有用,今天也上了有沒有A的當
作者: hjx5548    時間: 2024-1-11 22:19
Longan.Wang 發表于 2023-10-27 11:39
有用,今天也上了有沒有A的當

STC8G1K08A




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 一区二区三区在线观看免费视频 | 日本不卡一区二区三区在线观看 | 蜜桃日韩| 亚洲成人黄色 | 九久久 | 成人久久18免费网站麻豆 | 一区二区三区国产好 | 91精品国产91久久久久久三级 | 国产美女特级嫩嫩嫩bbb片 | 日韩毛片免费视频 | 天天久| 九九精品在线 | 九九久久在线看 | 日韩在线免费视频 | 91精品国产91久久久久久丝袜 | 色狠狠一区 | 黑人中文字幕一区二区三区 | 成人不卡 | 一级毛毛片 | 久久91| 99在线精品视频 | 国产精品久久久久久亚洲调教 | 日韩中文字幕2019 | 精品无码久久久久久国产 | 日韩精品1区2区3区 成人黄页在线观看 | 久久久久久久久91 | 国产女人与拘做视频免费 | 成人在线视频免费观看 | 毛片黄片 | 在线免费观看黄网 | 亚洲一区二区网站 | 成年人在线播放 | 午夜影院| 午夜影院在线观看 | 在线观看av不卡 | 欧美精品一区二区三区在线播放 | 久久综合久久久 | 超碰在线观看97 | 九九免费视频 | 精品日韩一区 | 久久久精品视频一区二区三区 |