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

QQ登錄

只需一步,快速開始

搜索

STC8G1K08A單片機(jī)模數(shù)轉(zhuǎn)換問(wèn)題

查看數(shù): 3968 | 評(píng)論數(shù): 4 | 收藏 5
關(guān)燈 | 提示:支持鍵盤翻頁(yè)<-左 右->
    組圖打開中,請(qǐng)稍候......
發(fā)布時(shí)間: 2021-7-4 01:46

正文摘要:

四個(gè)電阻串聯(lián),用STC8G1K08A單片機(jī)的P3^0口做模數(shù)轉(zhuǎn)換ADC,用萬(wàn)用表測(cè) 2  3  4 點(diǎn)的電壓,分別為 1.25V,2.50V,3.75V 按照理論,這三個(gè)點(diǎn)的模數(shù)變換數(shù)值應(yīng)該為 256, 512, 768 ,實(shí)際顯示的是25 ...

回復(fù)

ID:704846 發(fā)表于 2021-7-5 23:38
謝謝各位大俠的指點(diǎn)。
    我想做個(gè)小對(duì)講機(jī),限于體積,選用STC8G1K08A做控制芯片,它的IO口只有六個(gè),去掉兩個(gè)串口,再去掉三個(gè)用于功能選擇按鍵的IO口,就剩一個(gè)IO口,只能用LED的閃爍頻率來(lái)顯示功能選擇項(xiàng),顯得很LOW,后來(lái)發(fā)現(xiàn)了一個(gè)例子,按照他的思路,精簡(jiǎn)了一下,就三個(gè)選擇項(xiàng),裝上后就是這個(gè)樣,電壓和ADC數(shù)值不成比例。我自己總結(jié)的原因是 ADC有內(nèi)阻,接上后相當(dāng)于并聯(lián),可能影響讀數(shù),也有可能是我的十位ADC結(jié)果轉(zhuǎn)換成十進(jìn)制數(shù)的計(jì)算方法有問(wèn)題,也有可能是設(shè)置ADC各個(gè)寄存器的時(shí)候沒有仔細(xì)看說(shuō)明書,直接按照例程搬過(guò)來(lái)的,可能某個(gè)寄存器的高位或低位沒設(shè)置,造成讀數(shù)不準(zhǔn)。
    但是,按照這個(gè)電路,每個(gè)按鍵的讀數(shù)都比較穩(wěn)定,目的已經(jīng)達(dá)到了,先不探究具體原因了,節(jié)省下來(lái)的IO口,我弄了個(gè)IIC的OLED顯示屏,用來(lái)顯示頻率,音量,亞音,話筒靈敏度等等,就顯得很高大上了。想想還有一大堆的字模 bmp要自己畫,腦袋都大了。
  再次感謝各位大神的指導(dǎo),受益匪淺。希望以后能繼續(xù)得到大家的幫助。
ID:123289 發(fā)表于 2021-7-5 11:32
這個(gè)問(wèn)題許多人會(huì)遇到,其它很多人不知道原因。
多路AD采樣系統(tǒng)中有一個(gè)采樣電容。系統(tǒng)會(huì)對(duì)電容上的電壓進(jìn)行對(duì)分試探轉(zhuǎn)換,系統(tǒng)希望電容上的電壓不要跳動(dòng),否則影響AD對(duì)分計(jì)算。于是系統(tǒng)在轉(zhuǎn)換時(shí)會(huì)斷開采樣電容與外界的聯(lián)系(本處AD是不是這樣處理就不清楚了),這就需要切換采樣通道后,稍等一下,待采樣電容上的電充、分完全后,再下令開始采樣。!
樓主試試看:切換采樣通道后,等50ms,再下令轉(zhuǎn)換電壓。改變等待時(shí)間,看看AD值有何變化?
ID:401564 發(fā)表于 2021-7-4 19:02
代碼呢?
STC8G1K08A這個(gè)IC容易受干擾,特別是電路中有高頻信號(hào)的情況下
在ADC的采樣輸入一定要有一個(gè)104以上的電容,而且得是靠近端口的
單片機(jī)的VCC一定在做好濾波,104電容一定要靠近VCC
GND不能到處亂跑
ID:213173 發(fā)表于 2021-7-4 07:31
給你一個(gè)應(yīng)用實(shí)例參考,因電池供電,P3.2既作ADC輸入,也作中斷喚醒。ADC檢測(cè)壓力傳感器信號(hào),當(dāng)無(wú)壓力達(dá)到一定時(shí)間,進(jìn)入休眠。一旦有壓力MCU喚醒正常工作。你的問(wèn)題可能是ADC轉(zhuǎn)換結(jié)果寄存器設(shè)置不當(dāng)。
  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;//完成標(biāo)志
  52. //uchar i;
  53. uint CY_ADC;//采樣值
  54. uint time;

  55. void Timer0Init()                //2毫秒@11.0592MHz
  56. {
  57.         AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
  58.         TMOD &= 0xF0;                //設(shè)置定時(shí)器自動(dòng)重裝模式
  59.         TL0 = 0x9A;                        //設(shè)置定時(shí)初值
  60.         TH0 = 0xA9;                        //設(shè)置定時(shí)初值
  61.         TF0 = 0;                        //清除TF0標(biāo)志
  62.         TR0 = 1;                        //定時(shí)器0開始計(jì)時(shí)
  63. }
  64. /*----------------------------
  65.         讀取ADC結(jié)果
  66. ----------------------------*/
  67. void GetADCResult()
  68. {        //ADC 控制器  電源  啟動(dòng)  完成  --   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;       //啟動(dòng)AD轉(zhuǎn)換,P3.2 ADC輸入   
  77.                 _nop_();_nop_();
  78.                 while (!(ADC_CONTR & 0x20));            //查詢ADC完成標(biāo)志
  79.                 ADC_CONTR &= ~0x20;                     //清完成標(biāo)志
  80.                 PJZ_ADC+=(ADC_RES<<8|ADC_RESL);         //累計(jì)10次讀取10位ADC結(jié)果
  81.         }
  82.         if(count==11)
  83.         {
  84.                 CY_ADC=PJZ_ADC/10;
  85.                 PJZ_ADC=0;
  86.                 ADC_CONTR = 0x00;                //關(guān)閉ADC
  87.                 flag=1;
  88.         }
  89.         if(count>=10)//200ms
  90.                 count=0;
  91. }

  92. void main()
  93. {
  94.         P3M0 = 0x00;        //設(shè)置P3.2為ADC口
  95.         P3M1 = 0x04;        //設(shè)置P3.2為ADC口
  96.         P5M0 = 0x00;
  97.         P5M1 = 0x00;
  98.         P_SW2 |= 0x80;                //打開
  99.         ADCTIM = 0x3f;          //設(shè)置 ADC 內(nèi)部時(shí)序
  100.         P_SW2 &= 0x7f;                //關(guān)閉
  101.         ADCCFG = 0x27;           //設(shè)置ADC結(jié)果右對(duì)齊,速度為512系統(tǒng)時(shí)鐘        ADCCFG = 0x0f;  // 設(shè)置 ADC 時(shí)鐘為系統(tǒng)時(shí)鐘 /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;//設(shè)置P3.2為準(zhǔn)雙向
  137. //                                        AVDD = 0;
  138.                                         TR0 = 0;//關(guān)閉定時(shí)器
  139.                                         EX0 = 1; // 使能 INT0 中斷 , 用于喚醒 MCU
  140.                                         EA = 1;
  141.                                         _nop_();_nop_();_nop_();_nop_();
  142.                                         PCON = IDL;  //MCU 進(jìn)入空閑(省電)模式   
  143.                                         _nop_();_nop_();_nop_();_nop_();
  144.                                 }
  145.                         }
  146.                 }
  147.         }
  148. }

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

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

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

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