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

QQ登錄

只需一步,快速開始

搜索
查看: 18465|回復(fù): 52
打印 上一主題 下一主題
收起左側(cè)

STC8G1K08單片機(jī)adc采集問題

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:807182 發(fā)表于 2021-6-1 10:23 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
在AD采集中,ADC_FLAG硬件不能自動(dòng)置一,但是單片機(jī)其他功能都可以用,比如定時(shí)器,PWM,都可以用,會(huì)是單片機(jī)的問題嘛
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

53#
ID:583286 發(fā)表于 2024-8-12 14:55 | 只看該作者
wjw7680 發(fā)表于 2021-9-10 13:31
使用一般外購的下載器(CH340或者PL2303)在KEIL中按下“CTRL+F5”后都會(huì)出現(xiàn)如下提示"Connection to targe ...

感謝感謝
回復(fù)

使用道具 舉報(bào)

52#
ID:975054 發(fā)表于 2023-5-24 19:10 | 只看該作者
Y_G_G 發(fā)表于 2021-9-6 22:45
P_SW2|=0x7f;??這是干嘛使的?
不應(yīng)該是P_SW2&=0x7f;的嗎?
P3M1=0x00;

P_SW2 &=0x7f;??這是干嘛使的?  不應(yīng)該是P_SW2&=0x7f;的嗎?
禁止訪問XSRF用的:一般無需禁止! BIT7=0禁止,所以確實(shí)應(yīng)該用&=;
P_SW2 |= 0x80;   //XSRF!訪問XSRF先BIT7=1; 統(tǒng)一放前無需歸零(有外擴(kuò)64K擴(kuò)展RAM時(shí)才需要); 目標(biāo)設(shè)置PDATA,新手冊(cè)建議全用XDATA快!待研究?

   
P3M1=0x00;
P3M0=0x00;??這又是干嘛?傳統(tǒng)端口不一定能點(diǎn)亮LED的,運(yùn)氣好的會(huì)亮,運(yùn)氣不好就不亮,除非你有上拉電阻
現(xiàn)在的超亮小LED串大電阻一般用于小東西指示一下也夠了,不過一般都上拉用灌電流大.
回復(fù)

使用道具 舉報(bào)

51#
ID:975054 發(fā)表于 2023-5-24 18:47 | 只看該作者
188610329 發(fā)表于 2021-9-6 15:08
ADC_CONTR = 0x82;  //打開AD轉(zhuǎn)換電源,選擇AD的第二通道
ADC_CONTR |= 0x40;  //啟動(dòng)AD轉(zhuǎn)換

我一直STC8G1K08(20腳或帶A8腳)也是打開電源,選擇通道,啟動(dòng)轉(zhuǎn)換三合一了:  ADC_CONTR  = 0xC2;  
回復(fù)

使用道具 舉報(bào)

50#
ID:975054 發(fā)表于 2023-5-24 18:43 | 只看該作者
18701931930 發(fā)表于 2021-6-1 13:25
沒有遇到你說的情況,參考下我的:

//P3.5電壓采集

nop_();
  _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_(); //ADC啟動(dòng)后,必須要延時(shí) 33.1776MHZ 10個(gè)nop大約是337.7ns

究竟幾個(gè)nop()? 我一個(gè)都沒有也基本正常,手冊(cè)范例是2個(gè),又說整個(gè)轉(zhuǎn)換過程約1ms......我醉了,呵呵一起喝醉
回復(fù)

使用道具 舉報(bào)

49#
ID:614527 發(fā)表于 2023-5-17 23:02 | 只看該作者
wwh2382 發(fā)表于 2021-9-4 21:53
STC8G1K08沒有adc,有adc的是STC8G1K08a,型號(hào)后面帶a

STC8G1K08  20腳的親測(cè)有ADC,不過目前讀取到的只有8位ADC數(shù)據(jù)
回復(fù)

使用道具 舉報(bào)

48#
ID:824490 發(fā)表于 2022-5-31 09:25 | 只看該作者
Y_G_G 發(fā)表于 2021-9-8 09:07
仿真?我現(xiàn)在都還不會(huì)用那個(gè)軟件,倒是Multisim用得多,也就這玩意仿真是最接近實(shí)際結(jié)果的
就單片機(jī)而言,沒 ...

某原子的那款迷你型的可以考慮一下,日常的開發(fā)DIY是夠用了。不貴,也一次燒烤5人份的費(fèi)用。
回復(fù)

使用道具 舉報(bào)

47#
ID:373562 發(fā)表于 2022-5-31 01:18 | 只看該作者
帖子很有用,正好遇到8G1K的ADC問題了,標(biāo)記一下
回復(fù)

使用道具 舉報(bào)

46#
ID:688692 發(fā)表于 2022-4-23 00:28 來自手機(jī) | 只看該作者
顯然是被編譯器優(yōu)化掉了。一個(gè)8位的寄存器,跟常數(shù)0x20運(yùn)算,結(jié)果還是8位,而且結(jié)果不可能等于1,壞就壞在這個(gè)等于1了,你寫不等于0就好了。if((ADC_CONTR & 0x20) == 1)PC_OFF = 1;        //點(diǎn)亮一個(gè)LED
回復(fù)

使用道具 舉報(bào)

45#
ID:688692 發(fā)表于 2022-4-23 00:26 來自手機(jī) | 只看該作者
if((ADC_CONTR & 0x20) == 1)PC_OFF = 1;        //點(diǎn)亮一個(gè)LED
回復(fù)

使用道具 舉報(bào)

44#
ID:975054 發(fā)表于 2022-4-22 23:50 | 只看該作者
wulin 發(fā)表于 2021-6-1 20:26
這是STC8頭文件里的相關(guān)部分,你重復(fù)定義并且是錯(cuò)的。
//ADC 特殊功能寄存器
sfr ADC_CONTR   =   0xbc ...

就是就是!重復(fù)定義!搞復(fù)雜了還不行的。
回復(fù)

使用道具 舉報(bào)

43#
ID:975054 發(fā)表于 2022-3-27 23:48 | 只看該作者
近期用到了二路ADC電壓檢測(cè),很正常穩(wěn)定,沒有什么問題的,設(shè)置要正確.
精簡(jiǎn)代碼如下:
ADCCFG = 0x2f;                    //設(shè)置ADC時(shí)鐘為系統(tǒng)時(shí)鐘/2/16 ,右對(duì)齊;
    P_SW2 |= 0x80;                          //訪問擴(kuò)展RAM區(qū)域寄存器(ADCTIM),需先將P_SW2的BIT7設(shè)置為1,才可正常讀寫; 手冊(cè)后面P_SW2 &= 0x7f釋放P_SW2非必要已刪除沒問題!
    ADCTIM = 0x30;                    //設(shè)置ADC時(shí)序控制2A~3F,采樣時(shí)間:0A~1F,ok; 用復(fù)位默認(rèn)值0X2A(0010,1010)可省2句(已驗(yàn)證可以但暫未采用),注意低5位SMPDUTY一定不能設(shè)置小于A(01010B);
                                              //2、P32ADC10:測(cè)VTP1(BAT1一半分壓值);  3句合并ok!20220305;                             
    ADC_CONTR = 0xCA;                 //BAT1:復(fù)位值000x,0000;打開ADC電源(B7:1)、啟動(dòng)AD轉(zhuǎn)換(B6:1)、選通道A(P32);
    delay_ms(1);                                  //ADC模塊電源打開后需等待約1ms等ADC電源穩(wěn)定后再讓ADC工作?? 20220327增加;
    _nop_(),_nop_();                          //參考手冊(cè)空操作2次; ADC模塊電源打開后需等待約1ms等ADC電源穩(wěn)定后再讓ADC工作??
    while (!(ADC_CONTR & 0x20));      //查詢ADC完成標(biāo)志;  手冊(cè):檢測(cè)工作約耗時(shí)1mS;
    ADC_CONTR &= ~0x20;               //清完成標(biāo)志;
    ADC_CONTR &= 0x7F;                          //ADC轉(zhuǎn)換完即斷電更省電;            之前放PD改放這里測(cè)完即關(guān)省時(shí)即省電20220305;ok
    res = (ADC_RES << 8) | ADC_RESL;  //讀取ADC結(jié)果(右對(duì)齊:高2位低8位,前面自動(dòng)補(bǔ)0);
    BAT1 = (int)(3300L*res/1024L+17L);//計(jì)算監(jiān)測(cè)電壓mV;特別注意數(shù)據(jù)類型后面帶L(因I易混淆)!及VDD3.3V參考電壓穩(wěn)定性;修正值:+29L;OK20220309;+17L;OK20220327;
回復(fù)

使用道具 舉報(bào)

42#
ID:1011407 發(fā)表于 2022-3-18 21:07 | 只看該作者
xmsj 發(fā)表于 2021-12-30 20:41
還是不行啊,我這有這個(gè)starup.a51的文件啊。還是提示連接不到設(shè)備

請(qǐng)問解決了嗎,我的也是加了startup.a51文件也還是不行,本來是可以了的,結(jié)果發(fā)現(xiàn)是軟件仿真,到后面切換成硬件仿真還是不行
回復(fù)

使用道具 舉報(bào)

41#
ID:998702 發(fā)表于 2021-12-30 20:41 來自手機(jī) | 只看該作者
wjw7680 發(fā)表于 2021-9-11 13:29
鄭重道歉,由于建立STC工程的時(shí)失誤沒有添加啟動(dòng)文件“STARTUP.A51”文件,導(dǎo)致硬件仿真時(shí)候出現(xiàn)如下問題。 ...

還是不行啊,我這有這個(gè)starup.a51的文件啊。還是提示連接不到設(shè)備
回復(fù)

使用道具 舉報(bào)

40#
ID:998702 發(fā)表于 2021-12-30 20:18 來自手機(jī) | 只看該作者
wjw7680 發(fā)表于 2021-9-11 13:29
鄭重道歉,由于建立STC工程的時(shí)失誤沒有添加啟動(dòng)文件“STARTUP.A51”文件,導(dǎo)致硬件仿真時(shí)候出現(xiàn)如下問題。 ...

我也遇到了和樓主一樣的無法連接的問題,沒去注意這個(gè)a51,回家試試。真是,白天仿真得好好的,晚上忽然就不行了,差點(diǎn)沒氣死
回復(fù)

使用道具 舉報(bào)

39#
ID:695275 發(fā)表于 2021-10-27 15:41 | 只看該作者
用的USB_TTL仿真,總是出現(xiàn)這個(gè)錯(cuò)誤,一個(gè)下午沒有解決,顯示出現(xiàn)錯(cuò)誤,然后KEIL直接出錯(cuò)關(guān)閉
回復(fù)

使用道具 舉報(bào)

38#
ID:624769 發(fā)表于 2021-9-13 01:09 | 只看該作者
Y_G_G 發(fā)表于 2021-9-8 09:07
仿真?我現(xiàn)在都還不會(huì)用那個(gè)軟件,倒是Multisim用得多,也就這玩意仿真是最接近實(shí)際結(jié)果的
就單片機(jī)而言,沒 ...

STC的 硬件仿真, 嚴(yán)格來講已經(jīng)不算"仿真"了, 他是直接在單片機(jī)里面Debug你的程序,可以單步執(zhí)行,實(shí)時(shí)驗(yàn)證走到每一步的時(shí)候內(nèi)存值,寄存器值,以及IO口的狀態(tài)。對(duì)于不確定程序哪部分出問題時(shí)候,這種硬件仿真真的很直觀。畢竟當(dāng)你 MOV P1,@R1   的時(shí)候,直接能看到  R1 是 多少  @R1 是多少, P1 是多少,而且都是在單片機(jī)里面的真實(shí)值。 那么最后點(diǎn)亮了幾個(gè)LED, 你都能 直接明白是地址取錯(cuò)了,還是值算錯(cuò)了,還是P1寄存器不對(duì),還是說硬件電路不對(duì),可以省心很多。
回復(fù)

使用道具 舉報(bào)

37#
ID:298713 發(fā)表于 2021-9-11 13:31 | 只看該作者
STC工具使用說明書-20210701.pdf (7.39 MB, 下載次數(shù): 132)
回復(fù)

使用道具 舉報(bào)

36#
ID:298713 發(fā)表于 2021-9-11 13:29 | 只看該作者
鄭重道歉,由于建立STC工程的時(shí)失誤沒有添加啟動(dòng)文件“STARTUP.A51”文件,導(dǎo)致硬件仿真時(shí)候出現(xiàn)如下問題。

實(shí)際上使用CH340與PL2303的USB轉(zhuǎn)串口工具都是可以進(jìn)行硬件仿真的(親測(cè))。
回復(fù)

使用道具 舉報(bào)

35#
ID:298713 發(fā)表于 2021-9-10 13:31 | 只看該作者
使用一般外購的下載器(CH340或者PL2303)在KEIL中按下“CTRL+F5”后都會(huì)出現(xiàn)如下提示"Connection to target system lost! Please reset your target systemp and try again"。出現(xiàn)仿真失敗,鏈接不上目標(biāo)單元。
打STC官方技術(shù)支持后客服反饋,要使用STC官方的U8W(編程/仿真器)進(jìn)行仿真并設(shè)置直通模式才可以。






后來向STC官方技術(shù)支持免費(fèi)申請(qǐng)快遞了一個(gè)U8W,這才算解決芯片仿真問題
keil_v5.14.2
U8W固件版本:7.3.12U


回復(fù)

使用道具 舉報(bào)

34#
ID:624769 發(fā)表于 2021-9-8 14:01 | 只看該作者
wjw7680 發(fā)表于 2021-9-8 09:29
選了STC Monitor-51 Driver這選項(xiàng)也不能仿真

仿真時(shí),你的代碼里不能用到 3.0 3.1, 不然仿真會(huì)失敗, 因?yàn)檎麄(gè)仿真的通信,是通過3.0 3.1 建立的. 目標(biāo)單片機(jī)也要燒好仿真系統(tǒng),  在Keil 里面 芯片設(shè)置也要設(shè)置為 STC8G1K08A。 STC8G系列 我基本都仿真過,都是可以的,穩(wěn)定性也很好, 比STC8F系列好很多, 你可以再試試。
回復(fù)

使用道具 舉報(bào)

33#
ID:298713 發(fā)表于 2021-9-8 09:29 | 只看該作者
188610329 發(fā)表于 2021-9-7 21:28
仿真里你選錯(cuò)了, 要選 STC,如上圖。

選了STC Monitor-51 Driver這選項(xiàng)也不能仿真


回復(fù)

使用道具 舉報(bào)

32#
ID:401564 發(fā)表于 2021-9-8 09:07 | 只看該作者
wjw7680 發(fā)表于 2021-9-7 16:56
問題已經(jīng)解決,感謝各位的相助。由于對(duì)AD轉(zhuǎn)換后的數(shù)值計(jì)算錯(cuò)誤,導(dǎo)致后面的判斷出錯(cuò)。以為點(diǎn)不亮LED是程序 ...

仿真?我現(xiàn)在都還不會(huì)用那個(gè)軟件,倒是Multisim用得多,也就這玩意仿真是最接近實(shí)際結(jié)果的
就單片機(jī)而言,沒有什么比開發(fā)板加萬用表更好用的了,只可惜沒有錢買示波器
回復(fù)

使用道具 舉報(bào)

31#
ID:624769 發(fā)表于 2021-9-7 21:28 | 只看該作者
wjw7680 發(fā)表于 2021-9-7 16:56
問題已經(jīng)解決,感謝各位的相助。由于對(duì)AD轉(zhuǎn)換后的數(shù)值計(jì)算錯(cuò)誤,導(dǎo)致后面的判斷出錯(cuò)。以為點(diǎn)不亮LED是程序 ...



仿真里你選錯(cuò)了, 要選 STC,如上圖。


回復(fù)

使用道具 舉報(bào)

30#
ID:298713 發(fā)表于 2021-9-7 16:56 | 只看該作者
問題已經(jīng)解決,感謝各位的相助。由于對(duì)AD轉(zhuǎn)換后的數(shù)值計(jì)算錯(cuò)誤,導(dǎo)致后面的判斷出錯(cuò)。以為點(diǎn)不亮LED是程序死在了while判斷轉(zhuǎn)換標(biāo)志內(nèi)。下面是修改后的主函數(shù):
void main(void)
{
        u16 DC_Data = 0;         //AD轉(zhuǎn)換數(shù)據(jù)緩沖
        float  REF = (5.0/1024.0);   //10位AD的最小量化值
        float  DC_Data24V = 0;

        while(1)
        {       
                DC_Data = Get_ADCResult(2);
                               
                DC_Data24V = DC_Data*REF*6;  //AD轉(zhuǎn)換數(shù)值*最小量化值再*分壓比。   24v分壓取樣比例為6,,真實(shí)值為DC_Data的6倍
                if(DC_Data24V < 24)
                        PC_OFF = 1;              //點(diǎn)亮一個(gè)LED
                else
                        PC_OFF = 0;               
        }
       
}


問題雖然解決了,但是疑問還存在。

while(!(ADC_CONTR & 0x20));                        //查詢轉(zhuǎn)換結(jié)束標(biāo)志
if((ADC_CONTR & 0x20) == 1)PC_OFF = 1;        //點(diǎn)亮一個(gè)LED
ADC_CONTR &= (~0x20);          //清除轉(zhuǎn)換標(biāo)志
以上三條語句中,中間一條if語句始終執(zhí)行不到,也看不到LED被點(diǎn)亮證明AD轉(zhuǎn)換ADC_FLAG標(biāo)志已經(jīng)被置1。個(gè)人猜測(cè)這標(biāo)志極可能AD轉(zhuǎn)換結(jié)束置1后,如果被查詢就自動(dòng)清零了。

另外,STC仿真問題。如果能仿真,這個(gè)問題早就解決了,純粹盲人摸象。按照STC官方ISP燒寫器中“仿真器使用說明”,只有個(gè)別MCU能仿真。后來不死心,在列表中找到自己的MCU型號(hào)添加,設(shè)置好USB端口號(hào)與波特率,在Keil根目錄的INC文件夾中也看到了STC的頭文件列表。Keil5的Debug選項(xiàng)中配置Use:Keil Monitor-51 Driver。點(diǎn)開仿真燒寫入目標(biāo)MCU,但最后還是死在這個(gè)對(duì)話框上。



回復(fù)

使用道具 舉報(bào)

29#
ID:624769 發(fā)表于 2021-9-6 23:15 | 只看該作者
Y_G_G 發(fā)表于 2021-9-6 22:45
P_SW2|=0x7f;??這是干嘛使的?
不應(yīng)該是P_SW2&=0x7f;的嗎?
P3M1=0x00;

你可以看他前面的電路圖, 他接了 NPN的三級(jí)管,2uA的 電流夠了。
回復(fù)

使用道具 舉報(bào)

28#
ID:401564 發(fā)表于 2021-9-6 22:45 | 只看該作者
wjw7680 發(fā)表于 2021-9-6 18:57
我把你的程序稍微改了下AD采樣通道,成以下形式。如果采樣成功則點(diǎn)亮一個(gè)LED,很遺憾沒看到led亮起來,問 ...

P_SW2|=0x7f;??這是干嘛使的?
不應(yīng)該是P_SW2&=0x7f;的嗎?
P3M1=0x00;
P3M0=0x00;??這又是干嘛?傳統(tǒng)端口不一定能點(diǎn)亮LED的,運(yùn)氣好的會(huì)亮,運(yùn)氣不好就不亮,除非你有上拉電阻
回復(fù)

使用道具 舉報(bào)

27#
ID:624769 發(fā)表于 2021-9-6 19:30 | 只看該作者
wjw7680 發(fā)表于 2021-9-6 19:16
STC8G1K08A仿真不支持,STC官方的ISP下載器“仿真器使用說明”中表述:



如上圖, 可以的
回復(fù)

使用道具 舉報(bào)

26#
ID:298713 發(fā)表于 2021-9-6 19:16 | 只看該作者
188610329 發(fā)表于 2021-9-6 16:40
STC8G1K08A 自帶仿真功能,建議你仿真一下看看,具體問題出在哪里?茨愕碾娐穲D,3.0,3.1也沒有占用, ...

STC8G1K08A仿真不支持,STC官方的ISP下載器“仿真器使用說明”中表述:


回復(fù)

使用道具 舉報(bào)

25#
ID:298713 發(fā)表于 2021-9-6 18:57 | 只看該作者
wjw7680 發(fā)表于 2021-9-6 15:58
void        GPIO_config_HighZ(void)
{
        

我把你的程序稍微改了下AD采樣通道,成以下形式。如果采樣成功則點(diǎn)亮一個(gè)LED,很遺憾沒看到led亮起來,問題還是老問題,程序死在了 while(!(ADC_CONTR & 0x20));這條語句上。

void main(void)
{
        u16 DC_Data = 0;                   //AD轉(zhuǎn)換數(shù)據(jù)緩沖       
        EA = 1;          //開放所有中斷       
        P31 = 0;      //led熄滅

        while(1)
        {
       
        P3M1=0x0C;                      //P3.3高阻輸入模式,P3.0-3.2為推挽
        P3M0=0x00;
        P_SW2|=0x80;
        ADCTIM=0x3f;
        P_SW2|=0x7f;
        ADCCFG=0x2f;                   //設(shè)置ADC時(shí)鐘為系統(tǒng)頻率的/2/16
        ADC_CONTR=0x80;                //使能ADC模塊
        NOP(100);
      
        ADC_RES=0;                           //清除結(jié)果
        ADC_CONTR|=0x02;               // 設(shè)定轉(zhuǎn)換的通道,P3.3是0011
        ADC_CONTR|=0x40;                     // 開始AD轉(zhuǎn)換,即ADC_START=1
        _nop_();
        _nop_();
        while(!(ADC_CONTR & 0x20));    //  等待轉(zhuǎn)換完成 ,即ADC_FLAG=1
        ADC_CONTR&=~0x20;              //  清零 即D3位start清零,D4位轉(zhuǎn)換結(jié)束標(biāo)志位ADC_flag清零
        DC_Data=ADC_RES;                         //  取高八位
        P3M1=0x00;
        P3M0=0x00;
        P31 = 1;          //點(diǎn)亮一個(gè)LED
                         
     }
回復(fù)

使用道具 舉報(bào)

24#
ID:624769 發(fā)表于 2021-9-6 16:40 | 只看該作者
wjw7680 發(fā)表于 2021-9-6 15:58
void        GPIO_config_HighZ(void)
{
        

STC8G1K08A 自帶仿真功能,建議你仿真一下看看,具體問題出在哪里?茨愕碾娐穲D,3.0,3.1也沒有占用,完全可以仿真查原因。
回復(fù)

使用道具 舉報(bào)

23#
ID:298713 發(fā)表于 2021-9-6 15:58 | 只看該作者
void        GPIO_config_HighZ(void)
{
        
        GPIO_InitTypeDef        GPIO_InitStructure;                                //結(jié)構(gòu)定義
        
        GPIO_InitStructure.Pin  = GPIO_Pin_2|GPIO_Pin_3;                                //指定要初始化的IO, GPIO_Pin_2, GPIO_Pin_3
        GPIO_InitStructure.Mode = GPIO_HighZ;                        //指定IO浮空輸入方式
        GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);        //初始化
        
}
以上代碼就是配置GPIO的AD輸入模式的。
至于ADC_CONTR = 0x82;  ADC_CONTR |= 0x40; 合并寫成ADC_CONTR = 0xc2,沒什么區(qū)別,剛開始就是這么寫的,燒寫后還是原樣。
回復(fù)

使用道具 舉報(bào)

22#
ID:624769 發(fā)表于 2021-9-6 15:08 | 只看該作者
wjw7680 發(fā)表于 2021-9-6 10:43
以下是ADC采集程序:

ADC_CONTR = 0x82;  //打開AD轉(zhuǎn)換電源,選擇AD的第二通道
ADC_CONTR |= 0x40;  //啟動(dòng)AD轉(zhuǎn)換

你嘗試合并成  ADC_CONTR  = 0xC2;  試試看,
我用  STC8G1K08A  作了好幾個(gè)東西,都沒有這個(gè)問題。
不過我的代碼是  C + 匯編 混合編寫的,就不發(fā)上來了,
不過,你要是有興趣的話,可以跟我說一下。
回復(fù)

使用道具 舉報(bào)

21#
ID:170318 發(fā)表于 2021-9-6 14:27 | 只看該作者
wjw7680 發(fā)表于 2021-9-6 10:43
以下是ADC采集程序:

P3.3和P3.2端口要設(shè)置成“高阻”,轉(zhuǎn)換通道也沒有開
給個(gè)參考一下,結(jié)果取多少位自己去弄
void P33_ADC()                                                    //P3.3檢測(cè)
{
        P3M1=0x08;                           //P3.3高阻輸入模式,P3.0-3.2為推挽
        P3M0=0x00;
        P_SW2|=0x80;
        ADCTIM=0x3f;
        P_SW2&=0x7f;
        ADCCFG=0x0f;                   //設(shè)置ADC時(shí)鐘為系統(tǒng)頻率的/2/16
        ADC_CONTR=0x80;                //使能ADC模塊
        _nop_();
        _nop_();
        ADC_RES=0;                           //清除結(jié)果
        ADC_CONTR|=0x03;               // 設(shè)定轉(zhuǎn)換的通道,P3.3是0011
        ADC_CONTR|=0x40;                     // 開始AD轉(zhuǎn)換,即ADC_START=1
        _nop_();
        _nop_();
        while(!(ADC_CONTR & 0x20));    //  等待轉(zhuǎn)換完成 ,即ADC_FLAG=1
        ADC_CONTR&=~0x20;              //  清零 即D3位start清零,D4位轉(zhuǎn)換結(jié)束標(biāo)志位ADC_flag清零
        V_C=ADC_RES;                         //  取高八位
        P3M1=0x00;
        P3M0=0x00;
}

void P32_ADC()                                                    //P3.2檢測(cè)
{
        P3M1=0x04;                           //P3.2高阻輸入模式,P3.0-3.2為推挽
        P3M0=0x00;
        P_SW2|=0x80;
        ADCTIM=0x3f;
        P_SW2&=0x7f;
        ADCCFG=0x0f;                   //設(shè)置ADC時(shí)鐘為系統(tǒng)頻率的/2/16
        ADC_CONTR=0x80;                //使能ADC模塊
        _nop_();
        _nop_();
        ADC_RES=0;                           //清除結(jié)果
        ADC_CONTR|=0x02;               // 設(shè)定轉(zhuǎn)換的通道,P3.2是0010
        ADC_CONTR|=0x40;                     // 開始AD轉(zhuǎn)換,即ADC_START=1
        _nop_();
        _nop_();
        while(!(ADC_CONTR & 0x20));    //  等待轉(zhuǎn)換完成 ,即ADC_FLAG=1
        ADC_CONTR&=~0x20;              //  清零 即D3位start清零,D4位轉(zhuǎn)換結(jié)束標(biāo)志位ADC_flag清零
        V_A=ADC_RES;                         //  取高八位
        P3M1=0x00;
        P3M0=0x00;
}
回復(fù)

使用道具 舉報(bào)

20#
ID:170318 發(fā)表于 2021-9-6 14:02 | 只看該作者
wjw7680 發(fā)表于 2021-9-6 13:43
編寫了一段中斷程序并開放ADC中斷,在中斷內(nèi)清除ADC_FLAG,點(diǎn)亮LED。就這樣也行不通,真心懷疑這個(gè)帶“A” ...

帶“A”的與不帶“A”的不一樣,前者有ADC功能
回復(fù)

使用道具 舉報(bào)

19#
ID:298713 發(fā)表于 2021-9-6 13:43 | 只看該作者
編寫了一段中斷程序并開放ADC中斷,在中斷內(nèi)清除ADC_FLAG,點(diǎn)亮LED。就這樣也行不通,真心懷疑這個(gè)帶“A”后綴的MCU與不帶“A”后綴的是一伙的
void  ADC_VECTOR_int (void) interrupt  ADC_VECTOR
{
                 P31 = 1;                       //點(diǎn)亮LED
                ADC_CONTR &= (~0x20);          //清除轉(zhuǎn)換標(biāo)志
         
}

回復(fù)

使用道具 舉報(bào)

18#
ID:298713 發(fā)表于 2021-9-6 10:47 | 只看該作者
以下的電路圖:


回復(fù)

使用道具 舉報(bào)

17#
ID:298713 發(fā)表于 2021-9-6 10:43 | 只看該作者
以下是ADC采集程序:




#include        "config.h"
#include        "timer.h"
#include        "GPIO.h"
#include        "adc.h"


#define        POW_19V_ON   P54 //定義電源控制腳
#define Farad_ON  P55            //定義法拉電容供電控制腳
#define PC_OFF    P31           //定義PC斷電后的關(guān)斷信號(hào)輸出




/*************        GPIO端口功能說明        **************


本例程基于STC8G1K08A-8PIN 為主控芯片的編寫測(cè)試
1)P3.3的ADC3端采樣超級(jí)電容充放電電壓狀態(tài)
2)P3.2的ADC2端口采樣外部24V失電后下降速率。
3)P5.4使能DC_DC開關(guān)電源對(duì)PC供電。條件是P3.2失電低于22.8V使能DC_DC開始供電PC。
4)P5.5使能超級(jí)電容向外部供電。條件是P3.2采樣外部24V電壓下降到22.8V。


******************************************/






/************************ IO口輸出推挽配置 ****************************/
void        GPIO_config(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;                                //結(jié)構(gòu)定義
       
        GPIO_InitStructure.Pin  = GPIO_Pin_0|GPIO_Pin_1;                                //指定要初始化的IO, GPIO_Pin_0  GPIO_Pin_1
        GPIO_InitStructure.Mode = GPIO_OUT_PP;                        //指定IO推挽的輸入或輸出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);        //初始化
       
        GPIO_InitStructure.Pin  = GPIO_Pin_4|GPIO_Pin_5;                                //指定要初始化的IO, GPIO_Pin_4  GPIO_Pin_5
        GPIO_InitStructure.Mode = GPIO_OUT_PP;                        //指定IO推挽的輸入或輸出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P5,&GPIO_InitStructure);        //初始化
}




/********************* 配置P3.2與P3.3的ADC端口浮空輸入 **************************/


void        GPIO_config_HighZ(void)
{
       
        GPIO_InitTypeDef        GPIO_InitStructure;                                //結(jié)構(gòu)定義
       
        GPIO_InitStructure.Pin  = GPIO_Pin_2|GPIO_Pin_3;                                //指定要初始化的IO, GPIO_Pin_2, GPIO_Pin_3
        GPIO_InitStructure.Mode = GPIO_HighZ;                        //指定IO浮空輸入方式
        GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);        //初始化
       
}




/******************* AD配置函數(shù) *******************/
void        ADC_config(void)
{
        ADC_InitTypeDef                ADC_InitStructure;                //結(jié)構(gòu)定義
        ADC_InitStructure.ADC_SMPduty   = 31;                //ADC 模擬信號(hào)采樣時(shí)間控制, 0~31(注意: SMPDUTY 一定不能設(shè)置小于 10)
        ADC_InitStructure.ADC_CsSetup   = 0;                //ADC 通道選擇時(shí)間控制 0(默認(rèn)),1
        ADC_InitStructure.ADC_CsHold    = 1;                //ADC 通道選擇保持時(shí)間控制 0,1(默認(rèn)),2,3
        ADC_InitStructure.ADC_Speed     = ADC_SPEED_2X16T;                //設(shè)置 ADC 工作時(shí)鐘頻率        ADC_SPEED_2X1T~ADC_SPEED_2X16T
        ADC_InitStructure.ADC_Power     = ENABLE;                                //ADC功率允許/關(guān)閉        ENABLE,DISABLE
        ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED;        //ADC結(jié)果調(diào)整,右對(duì)齊        ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
        ADC_InitStructure.ADC_Polity    = Polity_0;                        //指定中斷優(yōu)先級(jí)(低到高)  Polity_0,Polity_1,Polity_2,Polity_3
        ADC_InitStructure.ADC_Interrupt = DISABLE;                        //中斷允許        ENABLE,DISABLE
        ADC_Inilize(&ADC_InitStructure);                                        //初始化


       
//          ADCCFG = 0x26;    // 轉(zhuǎn)換數(shù)據(jù)右對(duì)齊,設(shè)置AD工作時(shí)鐘頻率 SYSclk/2/6
//          P_SW2 |= 0x80;   //打開操作特殊功能寄存器
//          ADCTIM = 0x3f;
//          P_SW2 |= 0x7f;   //關(guān)閉操作特殊功能寄存器
}




/******************** 主函數(shù)**************************/
void main(void)
{
        u16 DC_Data = 0;                   //AD轉(zhuǎn)換數(shù)據(jù)緩沖
        u16 DC_Data24V = 0;
               


        GPIO_config();
        Timer_config();
        GPIO_config_HighZ();
        ADC_config();
       
       
       
        EA = 1;          //開放所有中斷
        TR1 = 1;         //允許定時(shí)器1運(yùn)行
        PC_OFF = 0;      //不激活觸發(fā)PC關(guān)閉信號(hào)
        POW_19V_ON = 1;  //打開19V的DC_DC電源
        Farad_ON = 0;
       


        while(1)
        {
               
                        ADC_CONTR = 0x82;  //打開AD轉(zhuǎn)換電源,選擇AD的第二通道
                ADC_CONTR |= 0x40;  //啟動(dòng)AD轉(zhuǎn)換
               
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
       
                while(!(ADC_CONTR & 0x20));  //查詢轉(zhuǎn)換結(jié)束標(biāo)志
                ADC_CONTR &= (~0x20);          //清除轉(zhuǎn)換標(biāo)志
               
                DC_Data = ((u16)ADC_RES << 8) | ADC_RESL;        //ADC_RES強(qiáng)制轉(zhuǎn)換成16位,與低八位轉(zhuǎn)換數(shù)據(jù)邏輯或后生成最終轉(zhuǎn)換數(shù)據(jù)
               
                DC_Data24V = DC_Data*6;    //24v分壓取樣比例為6,,真實(shí)值為DC_Data的6倍
                      if(DC_Data24V < 24)
                         PC_OFF = 1;              //點(diǎn)亮一個(gè)LED
                      else
                         PC_OFF = 0;       
        }
       
}




回復(fù)

使用道具 舉報(bào)

16#
ID:170318 發(fā)表于 2021-9-6 10:37 | 只看該作者
wjw7680 發(fā)表于 2021-9-6 09:49
我用的就是后綴帶A的,芯片型號(hào)STC8G1K08A。查找芯片手冊(cè)上說明帶有6路ADC。

將您的程序貼上來,估計(jì)是您的程序問題
回復(fù)

使用道具 舉報(bào)

15#
ID:298713 發(fā)表于 2021-9-6 09:49 | 只看該作者
我用的就是后綴帶A的,芯片型號(hào)STC8G1K08A。查找芯片手冊(cè)上說明帶有6路ADC。





但就是這樣也讀取不到ADC_FLAG標(biāo)志位,程序一直死在了while(!(ADC_CONTR & 0x20))中。查了好幾天都沒結(jié)果。程序基本上是用的芯片規(guī)格書中的范例。

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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