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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5750|回復: 14
打印 上一主題 下一主題
收起左側

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

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

使用道具 舉報

沙發
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 | 只看該作者



回復

使用道具 舉報

5#
ID:425825 發表于 2022-6-1 08:38 | 只看該作者
stc8g1k08應該是沒有AD,stc8g1k08A最后帶A的單片機帶AD
回復

使用道具 舉報

6#
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. }

復制代碼
回復

使用道具 舉報

7#
ID:213173 發表于 2022-6-1 10:44 | 只看該作者
來51學習 發表于 2022-6-1 08:38
stc8g1k08應該是沒有AD,stc8g1k08A最后帶A的單片機帶AD

STC8G1K08型號中8腳的有此說法,16-20腳的都有ADC。
回復

使用道具 舉報

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

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

使用道具 舉報

9#
ID:716660 發表于 2022-6-1 18:58 | 只看該作者
來51學習 發表于 2022-6-1 08:38
stc8g1k08應該是沒有AD,stc8g1k08A最后帶A的單片機帶AD

用的是16腳的有ad
回復

使用道具 舉報

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

使用道具 舉報

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

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

這……問個問題都得競猜么?
回復

使用道具 舉報

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

使用道具 舉報

13#
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;
回復

使用道具 舉報

14#
ID:77589 發表于 2023-10-27 11:39 | 只看該作者
有用,今天也上了有沒有A的當
回復

使用道具 舉報

15#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人jvid在线播放 | 一区中文字幕 | av影音资源 | 国产精品区一区二区三区 | 色婷婷九月| 成人网av | 国产精品亚洲二区 | 中文字幕三区 | 欧美精品久久久 | 国产成人精品免高潮在线观看 | 日韩一区二区在线视频 | 日韩久久久久 | 成人性视频免费网站 | 国产精品一区二区在线播放 | 国产精品久久久久久久久久免费看 | 久久久久久久久国产成人免费 | 在线看免费 | 蜜桃毛片| 国产一二三区电影 | 国产激情视频在线免费观看 | 伊人超碰在线 | 一区二区三区久久久 | 日韩成人在线观看 | 在线观看国产91 | 中文字幕在线人 | 一区二区三区四区在线视频 | 国产精品久久精品 | 日韩三级免费观看 | 日韩中文字幕视频在线观看 | www.日韩免费| 一区二区视频在线 | 99久久精品国产麻豆演员表 | 成人在线视频一区 | 国产区第一页 | 欧美成人免费电影 | 亚洲精品一区二区三区免 | 久久久久久久久久久高潮一区二区 | 精品无码久久久久国产 | 亚洲免费一区 | 欧美精品一区在线发布 | 亚洲精品4 |