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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

  3. //測試工作頻率為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時鐘為系統(tǒng)時鐘/2/16
  24.         ADC_CONTR = 0x8B;                           //使能ADC模塊
  25.         EADC = 1;                                   //使能ADC中斷
  26.         EA = 1;
  27.         ADC_CONTR |= 0x40;                          //啟動AD轉(zhuǎn)換

  28.         while (1);
  29. }

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

使用道具 舉報

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

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

使用道具 舉報

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

還是不行,P3^3口怎么修改都是顯示00.00,我是用P3^3口采集5V信號顯示在數(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ù)

使用道具 舉報

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

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

使用道具 舉報

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


  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信號
  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時鐘為系統(tǒng)時鐘/2/16
  52.         ADC_CONTR=0x8B; //P3^3為ADC口 ADC_CONTR=1XXX1011
  53.         while(1)
  54.         {
  55.                 ADC_CONTR |= 0x40;    //啟動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ù)制代碼

評分

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

查看全部評分

回復(fù)

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

INITADC:
MOV P_SW2,#80H           ;訪問X寄存器打開
MOV DPTR,#ADCTIM;        ;設(shè)置 ADC 內(nèi)部時序 #0FEA8H 這是廠家的數(shù)值
MOV A,#3FH               ;必須通過A才能送到
MOVX @DPTR,A
MOV P_SW2,#00H           ;訪問X寄存器關(guān)閉
MOV ADCCFG,#0FH          ;設(shè)置 ADC 時鐘為系統(tǒng)時鐘/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ù)

使用道具 舉報

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

使用道具 舉報

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

INITADC: ...

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

回復(fù)

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久一区二区三区四区 | 国产精品视频免费看 | 国产96在线 | 日韩中文一区二区 | 日日碰碰| 日韩一级一区 | 亚洲视频一区在线播放 | 一区二区三区欧美在线 | 日本不卡视频 | 国产日韩欧美精品一区二区 | 亚洲精品一区av在线播放 | 99精品久久| 国产成人在线免费 | 亚洲自拍偷拍免费视频 | 91秦先生艺校小琴 | 深夜福利亚洲 | 九九热免费在线观看 | 青青草一区二区 | 男人av的天堂 | 国产真实乱对白精彩久久小说 | 国产精品欧美一区二区三区不卡 | 99视频在线免费观看 | 成人美女免费网站视频 | 欧美a级网站 | 亚洲天堂精品久久 | 天天干夜夜拍 | 一区二区三区中文字幕 | 精品免费国产视频 | 欧美一级欧美三级在线观看 | 黄色成人在线 | 精品中文字幕一区二区 | 亚洲欧美国产精品久久 | 中文字幕国产视频 | 天天做日日做 | 亚洲女人天堂成人av在线 | 国产精品久久一区二区三区 | 国产在线一区二区三区 | 美女久久| 日本一区二区影视 | 欧美一级片在线观看 | 精品视频在线一区 |