找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3965|回復(fù): 9
收起左側(cè)

stc8單片機(jī)ADC 不起作用

[復(fù)制鏈接]
ID:837933 發(fā)表于 2020-11-2 19:32 | 顯示全部樓層 |閱讀模式
void main()
{
        P3M0 = 0x00;
        P3M1 = 0X04;                   //設(shè)置P3^2為高阻輸入
        ADCCFG = 0x0F;                   //轉(zhuǎn)換結(jié)果左對齊,時鐘16分頻給ADC
        ADC_CONTR = 0x8A;      //使能并啟動ADC模塊,選擇P3^2口為ADC輸入口
        ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40|0X0A ;    //啟動 AD 轉(zhuǎn)換
        _nop_();
        _nop_();
        _nop_()
        _nop_();
        _nop_();
        P11 = 0;
        while(!(ADC_CONTR & 0X20));
        ADC_CONTR &= ~0X20;
        while(1)
        {
                P11 = !P11;
                delay();
        }
}

上面程序有啥錯,P3.2作ADC輸入口,程序一直運(yùn)行不到最后while(1)循環(huán)里面

回復(fù)

使用道具 舉報

ID:235200 發(fā)表于 2020-11-3 00:32 | 顯示全部樓層
說明 while(!(ADC_CONTR & 0X20));這一循環(huán)無法結(jié)束
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2020-11-3 08:18 | 顯示全部樓層
如果是用Keil調(diào)試, 這里while(!(ADC_CONTR & 0X20));會過不去,可人為操作轉(zhuǎn)換完成標(biāo)志1,燒程序時再改回來。
        while(!(ADC_CONTR & 0X20))
        {
                ADC_CONTR|=0X20;
        }
        ADC_CONTR &= ~0X20;
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2020-11-3 08:18 | 顯示全部樓層
如果你對于STC單片機(jī)操作已經(jīng)差不多了,那以后編程就直接到下載器那復(fù)制代碼就可以了,對于一些常用操作,比如:ADC,定時器,PWM,都是有的
回復(fù)

使用道具 舉報

ID:382454 發(fā)表于 2020-11-3 10:17 | 顯示全部樓層
火龍電子有,人家寫的非常好,自已摸,太費(fèi)時間了。
回復(fù)

使用道具 舉報

ID:608872 發(fā)表于 2020-12-7 20:26 | 顯示全部樓層
univers 發(fā)表于 2020-11-3 10:17
火龍電子有,人家寫的非常好,自已摸,太費(fèi)時間了。

紅龍電子怎么找呢
回復(fù)

使用道具 舉報

ID:975054 發(fā)表于 2022-3-5 23:26 | 顯示全部樓層
本帖最后由 ax6808 于 2022-3-5 23:48 編輯

剛好近日用到STC8G1K08(3.3V)的ADC:     測3.7V鋰電池電壓,代碼今天已最優(yōu)化,并有最為詳細(xì)的說明(兩通道中之一的代碼),供參考:
//   ADC設(shè)置(查詢方式):  
    ADCCFG = 0x2f;  //設(shè)置ADC時鐘為系統(tǒng)時鐘/2/16 ,右對齊;
  //P_SW2 |= 0x80;  //訪問擴(kuò)展RAM寄存器(ADCTIM)需先將P_SW2的BIT7置1才可正常讀寫; 后面P_SW2 &= 0x7f釋放非必要!
  //ADCTIM = 0x30;  //用復(fù)位默認(rèn)值0X2A(0010,1010)可去掉這2句;設(shè)置ADC時序控制2A~3F,采樣時間0A~1F; 低5位不能小于默認(rèn)值A(chǔ);
                              //P32ADC10:測BAT1一半分壓值);                              
    ADC_CONTR = 0xCA;          //3句合并ok!;復(fù)位000x,0000;開ADC電源(B7:1)、啟動AD轉(zhuǎn)換(B6:1)、選通道A(P32);
    _nop_(),_nop_();                 //參考手冊這里空操作2次;
    while (!(ADC_CONTR & 0x20));          //查詢ADC完成標(biāo)志;  手冊:檢測工作約耗時1mS;
    ADC_CONTR &= ~0x20;                   //清完成標(biāo)志;
    //ADC_CONTR &= 0x7F;                   //可選ADC轉(zhuǎn)換完即斷電更省電;        20220305;ok
    res = (ADC_RES << 8) | ADC_RESL;  //讀取ADC結(jié)果(右對齊:高2位低8位,前面自動補(bǔ)0);
    BAT1 = (int)(3300L*res/1024L);        //計算監(jiān)測電壓mV;特別注意數(shù)據(jù)類型后面帶L(因I易混淆)!及VDD3.3V參考電壓穩(wěn)定性;

回復(fù)

使用道具 舉報

ID:975054 發(fā)表于 2022-3-6 00:20 | 顯示全部樓層
我又仔細(xì)看了一下你的代碼:
經(jīng)過試驗驗證,運(yùn)行沒任何問題(前提:頭文件等都完備、I/O口設(shè)置正確);
你前面ADC沒有錯,轉(zhuǎn)換完了也給了個標(biāo)志!
但是:1.你最后死循環(huán)并沒有用到ADC轉(zhuǎn)換結(jié)果數(shù)據(jù)呀!
          2.除 P3.0 和 P3.1 外,其余所有 I/O 口上電后的狀態(tài)均為高阻輸入狀態(tài),用戶在使用 I/O 口時必須先設(shè)置 I/O 口模式;你只設(shè)了P3口,P1口未重新設(shè)置就是高阻輸入,所以不能輸出驅(qū)動P11 LED!
         應(yīng)加上:P1M0=0x00;P1M1=0x00;就對了

#include "STC8G_H.h"              //主要頭文件;
#include "intrins.h"                 //_nop_() 等要;
#include "stdio.h"                    //pringf()等要;
回復(fù)

使用道具 舉報

ID:942056 發(fā)表于 2022-3-7 19:10 來自觸屏版 | 顯示全部樓層
p3口不能用于adc輸入,p0和p1才是吧
回復(fù)

使用道具 舉報

ID:975054 發(fā)表于 2022-3-19 00:38 | 顯示全部樓層
Dxiaofeng 發(fā)表于 2022-3-7 19:10
p3口不能用于adc輸入,p0和p1才是吧

看手冊吧, 20Pin的STC8G就有十5路ADC呢!!!8H少4路換為PWM稍有不同.
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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