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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3896|回復: 4
收起左側

STC8G1K08A單片機模數轉換問題

[復制鏈接]
ID:704846 發表于 2021-7-4 01:46 | 顯示全部樓層 |閱讀模式
四個電阻串聯,用STC8G1K08A單片機的P3^0口做模數轉換ADC,用萬用表測 2  3  4 點的電壓,分別為 1.25V,2.50V,3.75V 按照理論,這三個點的模數變換數值應該為 256, 512, 768 ,實際顯示的是250,377,440,除去變換的誤差,這和理論值差的也太多了,程序是按照廠家提供的例程編寫的,電路上的5V電壓直接取自單片機的VCC和GND.測量時就是直接用杜邦線連P3^0口和 2 3 4 點,沒有串限流電阻,也沒有并分流電阻,這是程序出了問題還是電路出了問題?求論壇里的大神給指點一二。
1.png
回復

使用道具 舉報

ID:213173 發表于 2021-7-4 07:31 | 顯示全部樓層
給你一個應用實例參考,因電池供電,P3.2既作ADC輸入,也作中斷喚醒。ADC檢測壓力傳感器信號,當無壓力達到一定時間,進入休眠。一旦有壓力MCU喚醒正常工作。你的問題可能是ADC轉換結果寄存器設置不當。
  1. //STC8G1K08A工作電壓范圍1.9~5.5V
  2. //#include "reg51.h"
  3. #include <STC8.H>
  4. #include "intrins.h"
  5. typedef unsigned char uchar;
  6. typedef unsigned int uint;
  7. typedef unsigned long ulong;
  8. #define  ADCTIM  (*(unsigned char volatile xdata *)0xfea8)
  9. //#define ceiling 636 //上限
  10. //#define floor   923 //下限
  11. sbit LED_R=P5^4;
  12. sbit LED_G=P5^5;
  13. //sbit AVDD =P3^3;

  14. uint code table[36]={
  15. 923         ,//        0
  16. 915         ,//        1
  17. 907         ,//        2
  18. 898         ,//        3
  19. 890         ,//        4
  20. 882         ,//        5
  21. 874         ,//        6
  22. 866         ,//        7
  23. 858         ,//        8
  24. 850         ,//        9
  25. 841         ,//        10
  26. 833         ,//        11
  27. 825         ,//        12
  28. 817         ,//        13
  29. 809         ,//        14
  30. 800         ,//        15
  31. 792         ,//        16
  32. 784         ,//        17
  33. 776         ,//        18
  34. 768         ,//        19
  35. 760         ,//        20
  36. 751         ,//        21
  37. 743         ,//        22
  38. 735         ,//        23
  39. 727         ,//        24
  40. 719         ,//        25
  41. 710         ,//        26
  42. 702         ,//        27
  43. 694         ,//        28
  44. 686         ,//        29
  45. 677         ,//        30
  46. 669         ,//        31
  47. 661         ,//        32
  48. 653         ,//        33
  49. 645         ,//        34
  50. 636    };//35

  51. bit flag=0;//完成標志
  52. //uchar i;
  53. uint CY_ADC;//采樣值
  54. uint time;

  55. void Timer0Init()                //2毫秒@11.0592MHz
  56. {
  57.         AUXR |= 0x80;                //定時器時鐘1T模式
  58.         TMOD &= 0xF0;                //設置定時器自動重裝模式
  59.         TL0 = 0x9A;                        //設置定時初值
  60.         TH0 = 0xA9;                        //設置定時初值
  61.         TF0 = 0;                        //清除TF0標志
  62.         TR0 = 1;                        //定時器0開始計時
  63. }
  64. /*----------------------------
  65.         讀取ADC結果
  66. ----------------------------*/
  67. void GetADCResult()
  68. {        //ADC 控制器  電源  啟動  完成  --   15通道模擬選擇位
  69.         //ADC_CONTR    B7    B6    B5   B4   B3   B2   B1   B0
  70.         static uint count=0;
  71.         static uint PJZ_ADC=0;                //累加10次采樣的變量1

  72.         count++;
  73.         if(count==1)ADC_CONTR = 0x80;           //使能ADC模塊
  74.         if(count>=2&&count<=11)
  75.         {
  76.                 ADC_CONTR|= 0x42;       //啟動AD轉換,P3.2 ADC輸入   
  77.                 _nop_();_nop_();
  78.                 while (!(ADC_CONTR & 0x20));            //查詢ADC完成標志
  79.                 ADC_CONTR &= ~0x20;                     //清完成標志
  80.                 PJZ_ADC+=(ADC_RES<<8|ADC_RESL);         //累計10次讀取10位ADC結果
  81.         }
  82.         if(count==11)
  83.         {
  84.                 CY_ADC=PJZ_ADC/10;
  85.                 PJZ_ADC=0;
  86.                 ADC_CONTR = 0x00;                //關閉ADC
  87.                 flag=1;
  88.         }
  89.         if(count>=10)//200ms
  90.                 count=0;
  91. }

  92. void main()
  93. {
  94.         P3M0 = 0x00;        //設置P3.2為ADC口
  95.         P3M1 = 0x04;        //設置P3.2為ADC口
  96.         P5M0 = 0x00;
  97.         P5M1 = 0x00;
  98.         P_SW2 |= 0x80;                //打開
  99.         ADCTIM = 0x3f;          //設置 ADC 內部時序
  100.         P_SW2 &= 0x7f;                //關閉
  101.         ADCCFG = 0x27;           //設置ADC結果右對齊,速度為512系統時鐘        ADCCFG = 0x0f;  // 設置 ADC 時鐘為系統時鐘 /2/16/16
  102. //        ADC_CONTR = 0x80;  // 使能 ADC 模塊
  103.         Timer0Init();
  104.   //ADC配置寄存器 --  --  格式控制  --   速度控制位
  105.   //   ADCCFG     B7  B6     B5     B4   B3 B2 B1 B0     
  106.         while (1)
  107.         {
  108.                 if(TF0)
  109.                 {
  110.                         TF0=0;
  111.                         GetADCResult();
  112.                         if(flag==1)
  113.                         {
  114.                                 flag=0;
  115.                                 if(CY_ADC>table[0])
  116.                                 {
  117.                                         time++;
  118.                                         LED_R=1;
  119.                                         LED_G=1;
  120.                                 }
  121.                                 else if(CY_ADC>table[0] && CY_ADC<table[36])
  122.                                 {
  123.                                         time=0;
  124.                                         LED_R=1;
  125.                                         LED_G=0;
  126.                                 }
  127.                                 else if(CY_ADC<table[36])
  128.                                 {
  129.                                         time=0;
  130.                                         LED_R=0;
  131.                                         LED_G=0;
  132.                                 }
  133.                                 if(time>=15000)
  134.                                 {
  135.                                         time=0;
  136.                                         P3M1 = 0x00;//設置P3.2為準雙向
  137. //                                        AVDD = 0;
  138.                                         TR0 = 0;//關閉定時器
  139.                                         EX0 = 1; // 使能 INT0 中斷 , 用于喚醒 MCU
  140.                                         EA = 1;
  141.                                         _nop_();_nop_();_nop_();_nop_();
  142.                                         PCON = IDL;  //MCU 進入空閑(省電)模式   
  143.                                         _nop_();_nop_();_nop_();_nop_();
  144.                                 }
  145.                         }
  146.                 }
  147.         }
  148. }

  149. void INT0_Isr() interrupt 0
  150. {
  151.         EX0 = 0; // 關閉 INT0 中斷
  152.         EA = 0;        // 關閉總中斷
  153. //        AVDD = 1;
  154.         P3M1=0x04; //設置P3.2為ADC口
  155.         TR0 = 1;                //啟動定時器
  156. }
復制代碼
回復

使用道具 舉報

ID:401564 發表于 2021-7-4 19:02 | 顯示全部樓層
代碼呢?
STC8G1K08A這個IC容易受干擾,特別是電路中有高頻信號的情況下
在ADC的采樣輸入一定要有一個104以上的電容,而且得是靠近端口的
單片機的VCC一定在做好濾波,104電容一定要靠近VCC
GND不能到處亂跑
回復

使用道具 舉報

ID:123289 發表于 2021-7-5 11:32 | 顯示全部樓層
這個問題許多人會遇到,其它很多人不知道原因。
多路AD采樣系統中有一個采樣電容。系統會對電容上的電壓進行對分試探轉換,系統希望電容上的電壓不要跳動,否則影響AD對分計算。于是系統在轉換時會斷開采樣電容與外界的聯系(本處AD是不是這樣處理就不清楚了),這就需要切換采樣通道后,稍等一下,待采樣電容上的電充、分完全后,再下令開始采樣!!
樓主試試看:切換采樣通道后,等50ms,再下令轉換電壓。改變等待時間,看看AD值有何變化?
回復

使用道具 舉報

ID:704846 發表于 2021-7-5 23:38 | 顯示全部樓層
謝謝各位大俠的指點。
    我想做個小對講機,限于體積,選用STC8G1K08A做控制芯片,它的IO口只有六個,去掉兩個串口,再去掉三個用于功能選擇按鍵的IO口,就剩一個IO口,只能用LED的閃爍頻率來顯示功能選擇項,顯得很LOW,后來發現了一個例子,按照他的思路,精簡了一下,就三個選擇項,裝上后就是這個樣,電壓和ADC數值不成比例。我自己總結的原因是 ADC有內阻,接上后相當于并聯,可能影響讀數,也有可能是我的十位ADC結果轉換成十進制數的計算方法有問題,也有可能是設置ADC各個寄存器的時候沒有仔細看說明書,直接按照例程搬過來的,可能某個寄存器的高位或低位沒設置,造成讀數不準。
    但是,按照這個電路,每個按鍵的讀數都比較穩定,目的已經達到了,先不探究具體原因了,節省下來的IO口,我弄了個IIC的OLED顯示屏,用來顯示頻率,音量,亞音,話筒靈敏度等等,就顯得很高大上了。想想還有一大堆的字模 bmp要自己畫,腦袋都大了。
  再次感謝各位大神的指導,受益匪淺。希望以后能繼續得到大家的幫助。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频免费观看 | 99reav| 亚洲国产精品成人无久久精品 | 亚洲欧美综合精品久久成人 | 亚洲精品亚洲人成人网 | 国产最新精品视频 | 欧美成人一级 | 久久高清| 午夜视频一区二区 | 久久免费精品视频 | 亚洲午夜精品在线观看 | 国产三级国产精品 | 日韩综合网 | 国产精品日韩高清伦字幕搜索 | 欧美男人天堂 | 最新国产精品视频 | 亚洲视频在线看 | 午夜视频在线 | 国产精品美女久久久久aⅴ国产馆 | 国产亚洲精品精品国产亚洲综合 | 蜜桃毛片 | 九九综合| 亚洲国产精品美女 | 国产精品波多野结衣 | 成人在线视频免费观看 | 国精品一区 | 欧美888 | 国产成人精品免高潮在线观看 | 久久久久久久久久久久久九 | 91免费观看国产 | 麻豆va | 拍真实国产伦偷精品 | 亚洲国产一区二区三区在线观看 | 福利片在线观看 | 亚洲欧美在线视频 | 在线一级片 | 韩国久久| 精品国产一区二区三区久久狼黑人 | 日韩在线观看一区 | 久久久久国产一区二区三区 | 日韩精品在线观看网站 |