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

QQ登錄

只需一步,快速開始

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

最近測(cè)試了一下stc8G的ADC功能,想單獨(dú)使用某一個(gè)口采集一路信號(hào),比如P3^3口,怎....

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主

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

使用道具 舉報(bào)

沙發(fā)
ID:792404 發(fā)表于 2020-8-25 11:37 | 只看該作者
最近測(cè)試了一下stc8G的ADC功能,想單獨(dú)使用某一個(gè)口采集一路信號(hào),比如P3^3口,怎樣設(shè)置IO口?
回復(fù)

使用道具 舉報(bào)

板凳
ID:548551 發(fā)表于 2020-8-25 12:12 | 只看該作者
這個(gè)要初始化程序;首先 要把IO口最優(yōu)先級(jí)的設(shè)置為輸入,且不開上拉.其次,就是配置ADC寄存器.比如說通道,你的是通道幾就配置通道機(jī),還有就是采樣頻率,等這些寄存器一定要配置好,因?yàn)檫@個(gè)配置一旦配置好就不能改變.最后就是寫采集的程序了.程序的話就是采集中和采集后,初始化是采集前. 采集中就等待采集完成.采集完成以后把采集出來的值轉(zhuǎn)換成我們需要的10進(jìn)制,因?yàn)橐话闱闆r下采集出來的是2進(jìn)制的值. 再最后我們利用這個(gè)只來做比較,比如低電壓報(bào)警,或者利用這個(gè)值來調(diào)光,調(diào)速等一系列的.
回復(fù)

使用道具 舉報(bào)

地板
ID:280512 發(fā)表于 2020-8-25 13:03 | 只看該作者
包括這兩個(gè)設(shè)置   P3M0=00000000; P3M1=00001000(高阻);ADC_CONTR=XXXX1101;
回復(fù)

使用道具 舉報(bào)

5#
ID:155507 發(fā)表于 2020-8-25 13:13 | 只看該作者
我給你來個(gè)程序試試

  1. #include "reg51.h"
  2. #include "intrins.h"

  3. //測(cè)試工作頻率為11.0592MHz

  4. sfr     ADC_CONTR   =   0xbc;
  5. sfr     ADC_RES     =   0xbd;
  6. sfr     ADC_RESL    =   0xbe;
  7. sfr     ADCCFG      =   0xde;

  8. sbit    EADC        =   IE^5;

  9. sfr     P1M0        =   0x92;
  10. sfr     P1M1        =   0x91;
  11. sfr     P3M0        =   0xB2;
  12. sfr     P3M1        =   0xB1;

  13. void ADC_Isr() interrupt 5
  14. {
  15.         ADC_CONTR &= ~0x20;                         //清中斷標(biāo)志
  16.         P2 = ADC_RES;                               //讀取ADC結(jié)果
  17.         ADC_CONTR |= 0x40;                          //繼續(xù)AD轉(zhuǎn)換
  18. }

  19. void main()
  20. {
  21.         P3M0 = 0x00;                                //設(shè)置P3.3為ADC口
  22.         P3M1 = 0x08;       
  23.         ADCCFG = 0x0f;                              //設(shè)置ADC時(shí)鐘為系統(tǒng)時(shí)鐘/2/16
  24.         ADC_CONTR = 0x8B;                           //使能ADC模塊
  25.         EADC = 1;                                   //使能ADC中斷
  26.         EA = 1;
  27.         ADC_CONTR |= 0x40;                          //啟動(dòng)AD轉(zhuǎn)換

  28.         while (1);
  29. }

復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

6#
ID:792404 發(fā)表于 2020-8-25 18:19 | 只看該作者
xqleft 發(fā)表于 2020-8-25 12:12
這個(gè)要初始化程序;首先 要把IO口最優(yōu)先級(jí)的設(shè)置為輸入,且不開上拉.其次,就是配置ADC寄存器.比如說通道,你的 ...

感謝師傅賜教!
回復(fù)

使用道具 舉報(bào)

7#
ID:792404 發(fā)表于 2020-8-25 18:32 | 只看該作者
angmall 發(fā)表于 2020-8-25 13:13
我給你來個(gè)程序試試

還是不行,P3^3口怎么修改都是顯示00.00,我是用P3^3口采集5V信號(hào)顯示在數(shù)碼管上的。單片機(jī)用的是STC8G1K08的TSSOP20封裝的,我把代碼傳上去,幫忙看一下是哪里出了問題。

  1. #include"STC8G.H"
  2. #include"intrins.h"
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit led=P3^3;
  6. uchar data dis_buf[4];//顯示緩存
  7. uchar code ledduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
  8.                                          0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
  9. uchar i;
  10. uint num;

  11. void delay_ms(uint z)
  12. {
  13.         uint x,y;
  14.         for(x=z;x>0;x--)
  15.                 for(y=1150;y>0;y--);
  16. }

  17. void datapros()         //數(shù)據(jù)處理函數(shù)
  18. {   
  19.          float tp;         
  20.          tp=num;
  21.          num=tp*1.0/255*500;   
  22.          dis_buf[3]=ledduan[num/1000];
  23.           dis_buf[2]=ledduan[num%1000/100] & 0x7f;
  24.          dis_buf[1]=ledduan[num%100/10];
  25.          dis_buf[0]=ledduan[num%10];

  26.          if((dis_buf[2]>=1)&&(dis_buf[2]<=2))         //設(shè)置顯示范圍內(nèi)執(zhí)行的功能
  27.            led=0;
  28.            else
  29.            led=1;
  30.                   
  31.         P1=0xff;               
  32.         P3&=0x0f;                        
  33.         P1=dis_buf[i];               
  34.         P3|=0x10<<i;               
  35.         i++;
  36.         i%=4;
  37. }
  38. void main()
  39. {
  40.         P1M0=0X00;
  41.         P1M1=0X00;
  42.         P3M0=0Xff;//強(qiáng)推挽
  43.         P3M1=0X00;
  44.         P5M0=0X00;
  45.         P5M1=0X00;

  46.         P3M0=0Xff;
  47.         P3M1=0X08; //P3^3為ADC口
  48.         P_SW2|=0x80;
  49.         ADCTIM=0x3f;
  50.         P_SW2&=0x7f;
  51.         ADCCFG=0x0f;
  52.         ADC_CONTR=0x80;
  53.         while(1)
  54.         {
  55.            ADC_CONTR|=0x40;
  56.            _nop_();
  57.            _nop_();
  58.            while(!(ADC_CONTR&0x20));
  59.            ADC_CONTR&=~0x20;
  60.            num=ADC_RES;

  61.            datapros();        
  62.            delay_ms(1);
  63.         }
  64. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

8#
ID:792404 發(fā)表于 2020-8-25 18:33 | 只看該作者
青桑葉 發(fā)表于 2020-8-25 13:03
包括這兩個(gè)設(shè)置   P3M0=00000000; P3M1=00001000(高阻);ADC_CONTR=XXXX1101;

我試一下,謝謝
回復(fù)

使用道具 舉報(bào)

9#
ID:155507 發(fā)表于 2020-8-25 20:35 | 只看該作者
給你改了一下試試。 對(duì)比一下就知道哪里錯(cuò)了。


  1. #include "STC8G.H"
  2. #include "intrins.h"
  3. #define uint  unsigned int
  4. #define uchar unsigned char

  5. sbit led=P3^2;  //用P3^3口采集5V信號(hào)
  6. uchar data dis_buf[4]; //顯示緩存
  7. uchar code ledduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
  8.                           0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
  9. uchar i;
  10. uint num;

  11. void delay_ms(uint z)
  12. {
  13.         uint x,y;
  14.         for(x=z;x>0;x--)
  15.             for(y=1150;y>0;y--);
  16. }

  17. void datapros()         //數(shù)據(jù)處理函數(shù)
  18. {   
  19.         float tp;         
  20.         tp=num;
  21.         num=tp*1.0/255*500;   
  22.         dis_buf[3]=ledduan[num/1000];
  23.         dis_buf[2]=ledduan[num%1000/100] & 0x7f;
  24.         dis_buf[1]=ledduan[num%100/10];
  25.         dis_buf[0]=ledduan[num%10];

  26.         if((dis_buf[2]>=1)&&(dis_buf[2]<=2))         //設(shè)置顯示范圍內(nèi)執(zhí)行的功能
  27.           led=0;
  28.         else
  29.           led=1;
  30.        
  31.         P1=0xff;               
  32.         P3&=0x07;                        
  33.         P1=dis_buf[i];               
  34.         P3|=0x10<<i;               
  35.         i++;
  36.         i%=4;
  37. }
  38. void main()
  39. {
  40.         P1M0=0X00;
  41.         P1M1=0X00;
  42.         //P3M0=0Xff;//強(qiáng)推挽
  43.         //P3M1=0X00;
  44.         P5M0=0X00;
  45.         P5M1=0X00;

  46.         P3M0=0Xf7;
  47.         P3M1=0X08; //P3^3為ADC口 (高阻)
  48.         P_SW2|=0x80;
  49.         ADCTIM=0x3f;
  50.         P_SW2&=0x7f;
  51.         ADCCFG=0x0f;   //設(shè)置ADC時(shí)鐘為系統(tǒng)時(shí)鐘/2/16
  52.         ADC_CONTR=0x8B; //P3^3為ADC口 ADC_CONTR=1XXX1011
  53.         while(1)
  54.         {
  55.                 ADC_CONTR |= 0x40;    //啟動(dòng)AD轉(zhuǎn)換
  56.                 _nop_();
  57.                 _nop_();
  58.                 while(!(ADC_CONTR&0x20));
  59.                 ADC_CONTR&=~0x20;
  60.                 num=ADC_RES;

  61.                 datapros();        
  62.                 delay_ms(1);
  63.         }
  64. }

復(fù)制代碼

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

10#
ID:792404 發(fā)表于 2020-8-25 21:10 | 只看該作者
angmall 發(fā)表于 2020-8-25 20:35
給你改了一下試試。 對(duì)比一下就知道哪里錯(cuò)了。

一切正常了,原來是ADC控制寄存器配置錯(cuò)了, ADC_CONTR=0x8B; //P3^3為ADC口 ADC_CONTR=1XXX1011
難怪我怎么樣改P3口配置就是不行。謝謝老大!
回復(fù)

使用道具 舉報(bào)

11#
ID:792404 發(fā)表于 2020-8-25 21:47 | 只看該作者
angmall 發(fā)表于 2020-8-25 20:35
給你改了一下試試。 對(duì)比一下就知道哪里錯(cuò)了。

一切正常了,原來是ADC控制寄存器配置錯(cuò)了,ADC_CONTR=0x8B; //P3^3為ADC口 ADC_CONTR=1XXX1011
難怪我怎么改P3口的配置就是不行。謝謝老大!
回復(fù)

使用道具 舉報(bào)

12#
ID:283954 發(fā)表于 2020-8-25 21:48 | 只看該作者
STC8G與STC12的AD不同之處在于有一個(gè)叫ADCTIM的寄存器,放在很遠(yuǎn)的地址,需要用DPTR才能賦值。

INITADC:
MOV P_SW2,#80H           ;訪問X寄存器打開
MOV DPTR,#ADCTIM;        ;設(shè)置 ADC 內(nèi)部時(shí)序 #0FEA8H 這是廠家的數(shù)值
MOV A,#3FH               ;必須通過A才能送到
MOVX @DPTR,A
MOV P_SW2,#00H           ;訪問X寄存器關(guān)閉
MOV ADCCFG,#0FH          ;設(shè)置 ADC 時(shí)鐘為系統(tǒng)時(shí)鐘/2/XXXX 16=慢,8=快 B6決定結(jié)果的格式
;MOV ADC_CONTR,#10001111B ;使能 ADC 模塊, #1000 CCCC B 通道暫定16  為內(nèi)部參考電壓1.91V
MOV ADC_CONTR,#10001101B ;使能 ADC 模塊, #1000 CCCC B 通道13 X
;MOV ADC_CONTR,#10001100B ;使能 ADC 模塊, #1000 CCCC B 通道12 Y
;MOV ADC_CONTR,#10001010B ;使能 ADC 模塊, #1000 CCCC B 通道10 MIC
NOP
NOP
NOP
RET
回復(fù)

使用道具 舉報(bào)

13#
ID:280512 發(fā)表于 2020-8-26 08:14 | 只看該作者
轉(zhuǎn)換出來的數(shù)據(jù)的對(duì)齊格式是:左對(duì)齊; 不能直接使用ADC_RES  的數(shù)據(jù)吧?
回復(fù)

使用道具 舉報(bào)

14#
ID:792404 發(fā)表于 2020-8-26 11:57 | 只看該作者
dalaoshi 發(fā)表于 2020-8-25 21:48
STC8G與STC12的AD不同之處在于有一個(gè)叫ADCTIM的寄存器,放在很遠(yuǎn)的地址,需要用DPTR才能賦值。

INITADC: ...

謝謝,已經(jīng)解決了。
回復(fù)

使用道具 舉報(bào)

15#
ID:792404 發(fā)表于 2020-8-26 12:03 | 只看該作者
青桑葉 發(fā)表于 2020-8-26 08:14
轉(zhuǎn)換出來的數(shù)據(jù)的對(duì)齊格式是:左對(duì)齊; 不能直接使用ADC_RES  的數(shù)據(jù)吧?

謝謝,已經(jīng)解決了,可以直接使用ADC_RES的數(shù)據(jù)的。STC8G的手冊(cè)上說的,這款是新上市的單片機(jī),和之前的有些區(qū)別。
回復(fù)

使用道具 舉報(bào)

16#
ID:608872 發(fā)表于 2020-12-7 21:14 | 只看該作者
YUANYUXING 發(fā)表于 2020-8-25 21:10
一切正常了,原來是ADC控制寄存器配置錯(cuò)了, ADC_CONTR=0x8B; //P3^3為ADC口 ADC_CONTR=1XXX1011
難怪我 ...

就是把 ADC_CONTR=0x80  改為 ADC_CONTR=0x8B就可以正常顯示電壓了嗎?我這幾天也在看這款單片機(jī)。片內(nèi)1.19V的LDO怎么用呢
回復(fù)

使用道具 舉報(bào)

17#
ID:608872 發(fā)表于 2021-1-6 22:05 | 只看該作者
青桑葉 發(fā)表于 2020-8-25 13:03
包括這兩個(gè)設(shè)置   P3M0=00000000; P3M1=00001000(高阻);ADC_CONTR=XXXX1101;

使用兩路做ADC,ADC_CONTR是不是要重復(fù)寫兩次,還是能更簡(jiǎn)單點(diǎn)呢
ADC_CONTR=XXXX1101;
ADC_CONTR=XXXX1110;

回復(fù)

使用道具 舉報(bào)

18#
ID:1112016 發(fā)表于 2024-4-25 17:19 | 只看該作者
angmall 發(fā)表于 2020-8-25 20:35
給你改了一下試試。 對(duì)比一下就知道哪里錯(cuò)了。

您好!請(qǐng)問在ADC程序里,能解釋一下第24為什么是*500而不是1023呀?  num=tp*1.0/255*500;  
回復(fù)

使用道具 舉報(bào)

19#
ID:1112016 發(fā)表于 2024-4-25 17:20 | 只看該作者
angmall 發(fā)表于 2020-8-25 20:35
給你改了一下試試。 對(duì)比一下就知道哪里錯(cuò)了。

您好!請(qǐng)問在ADC程序里,能解釋一下為什么是*500而不是1023呀?  num=tp*1.0/255*500;  
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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