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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4922|回復: 18
收起左側

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

  [復制鏈接]
ID:792404 發表于 2020-8-25 11:35 | 顯示全部樓層 |閱讀模式
1118.JPG
回復

使用道具 舉報

ID:792404 發表于 2020-8-25 11:37 | 顯示全部樓層
最近測試了一下stc8G的ADC功能,想單獨使用某一個口采集一路信號,比如P3^3口,怎樣設置IO口?
回復

使用道具 舉報

ID:548551 發表于 2020-8-25 12:12 | 顯示全部樓層
這個要初始化程序;首先 要把IO口最優先級的設置為輸入,且不開上拉.其次,就是配置ADC寄存器.比如說通道,你的是通道幾就配置通道機,還有就是采樣頻率,等這些寄存器一定要配置好,因為這個配置一旦配置好就不能改變.最后就是寫采集的程序了.程序的話就是采集中和采集后,初始化是采集前. 采集中就等待采集完成.采集完成以后把采集出來的值轉換成我們需要的10進制,因為一般情況下采集出來的是2進制的值. 再最后我們利用這個只來做比較,比如低電壓報警,或者利用這個值來調光,調速等一系列的.
回復

使用道具 舉報

ID:280512 發表于 2020-8-25 13:03 | 顯示全部樓層
包括這兩個設置   P3M0=00000000; P3M1=00001000(高阻);ADC_CONTR=XXXX1101;
回復

使用道具 舉報

ID:155507 發表于 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;                         //清中斷標志
  16.         P2 = ADC_RES;                               //讀取ADC結果
  17.         ADC_CONTR |= 0x40;                          //繼續AD轉換
  18. }

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

  28.         while (1);
  29. }

復制代碼
回復

使用道具 舉報

ID:792404 發表于 2020-8-25 18:19 | 顯示全部樓層
xqleft 發表于 2020-8-25 12:12
這個要初始化程序;首先 要把IO口最優先級的設置為輸入,且不開上拉.其次,就是配置ADC寄存器.比如說通道,你的 ...

感謝師傅賜教!
回復

使用道具 舉報

ID:792404 發表于 2020-8-25 18:32 | 顯示全部樓層
angmall 發表于 2020-8-25 13:13
我給你來個程序試試

還是不行,P3^3口怎么修改都是顯示00.00,我是用P3^3口采集5V信號顯示在數碼管上的。單片機用的是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()         //數據處理函數
  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))         //設置顯示范圍內執行的功能
  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;//強推挽
  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. }
復制代碼
回復

使用道具 舉報

ID:792404 發表于 2020-8-25 18:33 | 顯示全部樓層
青桑葉 發表于 2020-8-25 13:03
包括這兩個設置   P3M0=00000000; P3M1=00001000(高阻);ADC_CONTR=XXXX1101;

我試一下,謝謝
回復

使用道具 舉報

ID:155507 發表于 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()         //數據處理函數
  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))         //設置顯示范圍內執行的功能
  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;//強推挽
  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;   //設置ADC時鐘為系統時鐘/2/16
  52.         ADC_CONTR=0x8B; //P3^3為ADC口 ADC_CONTR=1XXX1011
  53.         while(1)
  54.         {
  55.                 ADC_CONTR |= 0x40;    //啟動AD轉換
  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. }

復制代碼

評分

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

查看全部評分

回復

使用道具 舉報

ID:792404 發表于 2020-8-25 21:10 | 顯示全部樓層
angmall 發表于 2020-8-25 20:35
給你改了一下試試。 對比一下就知道哪里錯了。

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

使用道具 舉報

ID:792404 發表于 2020-8-25 21:47 | 顯示全部樓層
angmall 發表于 2020-8-25 20:35
給你改了一下試試。 對比一下就知道哪里錯了。

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

使用道具 舉報

ID:283954 發表于 2020-8-25 21:48 | 顯示全部樓層
STC8G與STC12的AD不同之處在于有一個叫ADCTIM的寄存器,放在很遠的地址,需要用DPTR才能賦值。

INITADC:
MOV P_SW2,#80H           ;訪問X寄存器打開
MOV DPTR,#ADCTIM;        ;設置 ADC 內部時序 #0FEA8H 這是廠家的數值
MOV A,#3FH               ;必須通過A才能送到
MOVX @DPTR,A
MOV P_SW2,#00H           ;訪問X寄存器關閉
MOV ADCCFG,#0FH          ;設置 ADC 時鐘為系統時鐘/2/XXXX 16=慢,8=快 B6決定結果的格式
;MOV ADC_CONTR,#10001111B ;使能 ADC 模塊, #1000 CCCC B 通道暫定16  為內部參考電壓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
回復

使用道具 舉報

ID:280512 發表于 2020-8-26 08:14 | 顯示全部樓層
轉換出來的數據的對齊格式是:左對齊; 不能直接使用ADC_RES  的數據吧?
回復

使用道具 舉報

ID:792404 發表于 2020-8-26 11:57 | 顯示全部樓層
dalaoshi 發表于 2020-8-25 21:48
STC8G與STC12的AD不同之處在于有一個叫ADCTIM的寄存器,放在很遠的地址,需要用DPTR才能賦值。

INITADC: ...

謝謝,已經解決了。
回復

使用道具 舉報

ID:792404 發表于 2020-8-26 12:03 | 顯示全部樓層
青桑葉 發表于 2020-8-26 08:14
轉換出來的數據的對齊格式是:左對齊; 不能直接使用ADC_RES  的數據吧?

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

使用道具 舉報

ID:608872 發表于 2020-12-7 21:14 | 顯示全部樓層
YUANYUXING 發表于 2020-8-25 21:10
一切正常了,原來是ADC控制寄存器配置錯了, ADC_CONTR=0x8B; //P3^3為ADC口 ADC_CONTR=1XXX1011
難怪我 ...

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

使用道具 舉報

ID:608872 發表于 2021-1-6 22:05 | 顯示全部樓層
青桑葉 發表于 2020-8-25 13:03
包括這兩個設置   P3M0=00000000; P3M1=00001000(高阻);ADC_CONTR=XXXX1101;

使用兩路做ADC,ADC_CONTR是不是要重復寫兩次,還是能更簡單點呢
ADC_CONTR=XXXX1101;
ADC_CONTR=XXXX1110;

回復

使用道具 舉報

ID:1112016 發表于 2024-4-25 17:19 | 顯示全部樓層
angmall 發表于 2020-8-25 20:35
給你改了一下試試。 對比一下就知道哪里錯了。

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

使用道具 舉報

ID:1112016 發表于 2024-4-25 17:20 | 顯示全部樓層
angmall 發表于 2020-8-25 20:35
給你改了一下試試。 對比一下就知道哪里錯了。

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久久久久久久 | 精品免费视频一区二区 | 91视频大全 | 瑟瑟免费视频 | 日韩中文一区二区三区 | 成人在线免费视频 | 视频二区国产 | 在线视频a | 亚洲另类春色偷拍在线观看 | 九九热在线视频观看这里只有精品 | 天天摸天天干 | 精品国产一区二区三区久久久四川 | 久久精品国产亚洲 | 国产小视频自拍 | 日本a在线| 在线国产视频观看 | 中文字幕一区二区三区四区 | 91av在线电影 | av免费在线观看网站 | 国内精品免费久久久久软件老师 | 成人av一区 | 国产精品久久久久久久岛一牛影视 | 91精品国产手机 | av大片在线观看 | 国产精品一区免费 | 中文字幕综合在线 | 成人午夜免费福利视频 | 成人在线精品 | 91精品国产91久久久 | 日韩视频在线播放 | 久久久精品久久 | 亚洲精品一二三 | 免费观看一级毛片 | 免费观看黄a一级视频 | 天堂久久天堂综合色 | 国产一级大片 | 国产精品久久久久久久久久99 | 毛片av免费看 | 精品国产欧美一区二区三区成人 | 欧美在线观看一区二区 | 亚洲欧美一区二区三区视频 |