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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關(guān)于15系列單片機(jī)AD采樣電壓的問題,想測量電池剩余電壓

[復(fù)制鏈接]
ID:122751 發(fā)表于 2018-8-21 23:03 | 顯示全部樓層 |閱讀模式
AD采樣的程序本人已經(jīng)弄好,想測量電池剩余電壓,但是15系列單片機(jī)上電后P1口的io普遍都有4v以上的電壓,而恰恰ad采樣口就在p1口的io上,那我怎么才能消除原有io上的電壓,用來測量電池電壓,不然總是在測量io口上原本的電壓
回復(fù)

使用道具 舉報

ID:386381 發(fā)表于 2018-8-22 00:33 來自觸屏版 | 顯示全部樓層
這個好辦呀,在P1口接下拉電阻P1口的電壓不就沒了嗎,因?yàn)镻1口那個電流很小的,是上拉電阻過來的,接個下拉電阻就把它給放掉了,電池電壓沒影響的

評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2018-8-22 06:36 | 顯示全部樓層
沙發(fā)的建議是錯誤的。有很多型號的STC15系列單片機(jī)內(nèi)置有ADC功能,只要把其P1相應(yīng)端口特殊功能寄存器初始化時設(shè)置為高阻即可。
以P1.0設(shè)置高阻為例:
        P1M1 = 0x01; //設(shè)置P1.0高阻:0000 0001
        P1M0 = 0x00;//設(shè)置P1.0高阻 :0000 0000
        P1ASF= 0x01;//設(shè)置P1的0通道端口作為模擬輸入
回復(fù)

使用道具 舉報

ID:164602 發(fā)表于 2018-8-22 08:58 | 顯示全部樓層
你想多了!
第一:你要測量的電源與單片機(jī)共地。
第二:設(shè)置好AD轉(zhuǎn)換通道,設(shè)置寄存器如圖所示: 1.jpg

其它設(shè)置,去看手冊。STC15的手冊可以從STC官網(wǎng)下載http://www.stcmcu.com/,手冊中還有例子。
第三:開啟AD轉(zhuǎn)換,單片機(jī)會自動從你設(shè)置的AD轉(zhuǎn)換口,讀取數(shù)據(jù)進(jìn)行轉(zhuǎn)換。

例如我的一個小程序(部分)
void ADCInit (void)//ADC設(shè)置
{
        P1ASF=0x03;//P10、P11為ADC輸入口。手冊P878
        CLK_DIV=0x20;//ADC轉(zhuǎn)換結(jié)果存放方式。手冊P880
}


void ADC0 (void)//第一路AD轉(zhuǎn)換函數(shù)
{
        ADC_CONTR=0xe8;//開ADC電源、速度最快、開始轉(zhuǎn)換、P10口。手冊P879
        while (!(ADC_CONTR&0x10));//如果轉(zhuǎn)換沒結(jié)束,則等待
        ADC_CONTR=0x00;//關(guān)ADC電源、清轉(zhuǎn)換完畢標(biāo)志
        ADCdate=ADC_RES;//ADC轉(zhuǎn)換數(shù)據(jù)高兩位。手冊P880
        ADCdate=(ADCdate<<8);
        ADCdate=(ADCdate|ADC_RESL);//合并10位轉(zhuǎn)換數(shù)據(jù)
        ADCXX();
}


我測過一節(jié)、兩節(jié)干電池的電壓。
注意:我不是高手,這樣做可能從電路來說是很粗暴的——僅僅是做了程序方面的試驗(yàn)。
歡迎指正
回復(fù)

使用道具 舉報

ID:155507 發(fā)表于 2018-8-22 09:02 | 顯示全部樓層
你可以運(yùn)用這個程序
讀ADC內(nèi)部基準(zhǔn)計算MCU的工作電壓, 不需要增加任何硬件零件.


  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited ----------------------------------*/
  3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/
  4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
  7. /* --- Web: www.GXWMCU.com --------------------------------------------*/
  8. /* --- QQ:  800003751 -------------------------------------------------*/
  9. /* 如果要在程序中使用此代碼,請在程序中注明使用了宏晶科技的資料及程序   */
  10. /*---------------------------------------------------------------------*/


  11. /*************        本程序功能說明        **************

  12. 讀ADC內(nèi)部基準(zhǔn)計算MCU的工作電壓, 不需要增加任何硬件零件.

  13. 用STC的MCU的IO方式控制74HC595驅(qū)動8位數(shù)碼管。

  14. 用戶可以修改宏來選擇時鐘頻率.

  15. 用戶可以在"用戶定義宏"中選擇共陰或共陽. 推薦盡量使用共陰數(shù)碼管.

  16. 使用Timer0的16位自動重裝來產(chǎn)生1ms節(jié)拍,程序運(yùn)行于這個節(jié)拍下, 用戶修改MCU主時鐘頻率時,自動定時于1ms.

  17. 右邊4位數(shù)碼管顯示MCU的工作電壓值值.


  18. ******************************************/

  19. #define MAIN_Fosc                22118400L        //定義主時鐘

  20. #include        "STC15Fxxxx.H"


  21. /***********************************************************/

  22. #define DIS_DOT                0x20
  23. #define DIS_BLACK        0x10
  24. #define DIS_                0x11

  25. #define P1n_pure_input(bitn)                P1M1 |=  (bitn),        P1M0 &= ~(bitn)

  26. /****************************** 用戶定義宏 ***********************************/

  27. #define                LED_TYPE        0x00                //定義LED類型, 0x00--共陰, 0xff--共陽

  28. #define        Timer0_Reload        (65536UL -(MAIN_Fosc / 1000))                //Timer 0 中斷頻率, 1000次/秒

  29. /*****************************************************************************/






  30. /*************        本地常量聲明        **************/
  31. u8 code t_display[]={                                                //標(biāo)準(zhǔn)字庫
  32. //         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  33.         0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  34. //black         -     H    J         K          L           N        o   P         U     t    G    Q    r   M    y
  35.         0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
  36.         0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};        //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

  37. u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                //位碼


  38. /*************        IO口定義        **************/
  39. sbit        P_HC595_SER   = P4^0;        //pin 14        SER                data input
  40. sbit        P_HC595_RCLK  = P5^4;        //pin 12        RCLk        store (latch) clock
  41. sbit        P_HC595_SRCLK = P4^3;        //pin 11        SRCLK        Shift data clock


  42. /*************        本地變量聲明        **************/

  43. u8         LED8[8];                //顯示緩沖
  44. u8        display_index;        //顯示位索引
  45. bit        B_1ms;                //1ms標(biāo)志

  46. u8        msecond;

  47. u16        Get_ADC10bitResult(u8 channel);        //channel = 0~7




  48. /**********************************************/
  49. void main(void)
  50. {
  51.         u8        i;
  52.         u16        j;

  53.         P0M1 = 0;        P0M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  54.         P1M1 = 0;        P1M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  55.         P2M1 = 0;        P2M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  56.         P3M1 = 0;        P3M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  57.         P4M1 = 0;        P4M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  58.         P5M1 = 0;        P5M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  59.         P6M1 = 0;        P6M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  60.         P7M1 = 0;        P7M0 = 0;        //設(shè)置為準(zhǔn)雙向口
  61.        
  62.         display_index = 0;
  63.         P1ASF = 0;        //對內(nèi)部基準(zhǔn)做ADC
  64.         ADC_CONTR = 0xE0;                        //90T, ADC power on
  65.        
  66.         AUXR = 0x80;        //Timer0 set as 1T, 16 bits timer auto-reload,
  67.         TH0 = (u8)(Timer0_Reload / 256);
  68.         TL0 = (u8)(Timer0_Reload % 256);
  69.         ET0 = 1;        //Timer0 interrupt enable
  70.         TR0 = 1;        //Tiner0 run
  71.         EA = 1;                //打開總中斷
  72.        
  73.         for(i=0; i<8; i++)        LED8[i] = 0x10;        //上電消隱

  74.        
  75.         while(1)
  76.         {
  77.                 if(B_1ms)        //1ms到
  78.                 {
  79.                         B_1ms = 0;
  80.                         if(++msecond >= 200)        //200ms到
  81.                         {
  82.                                 msecond = 0;

  83.                                 for(j=0,i=0; i<16; i++)                j += Get_ADC10bitResult(0);        //讀內(nèi)部基準(zhǔn)ADC, P1ASF=0, 讀0通道
  84.                                 j = (u32)128000UL*16 / j;        // ADC = 1024 * Uref / Ux, 則 Ux = 1024 * Uref / ADC = 1024 * 1.25 / ADC = 1280 / ADC

  85.                                 LED8[5] = j / 100 + DIS_DOT;        //顯示MCU電壓值, 計算時放大了100倍, 電壓有兩位小數(shù).
  86.                                 LED8[6] = (j % 100) / 10;
  87.                                 LED8[7] = j % 10;
  88.                         }
  89.                 }
  90.         }
  91. }
  92. /**********************************************/

  93. //========================================================================
  94. // 函數(shù): u16        Get_ADC10bitResult(u8 channel)
  95. // 描述: 查詢法讀一次ADC結(jié)果.
  96. // 參數(shù): channel: 選擇要轉(zhuǎn)換的ADC.
  97. // 返回: 10位ADC結(jié)果.
  98. // 版本: V1.0, 2012-10-22
  99. //========================================================================
  100. u16        Get_ADC10bitResult(u8 channel)        //channel = 0~7
  101. {
  102.         ADC_RES = 0;
  103.         ADC_RESL = 0;

  104.         ADC_CONTR = (ADC_CONTR & 0xe0) | 0x08 | channel;         //start the ADC
  105.         NOP(4);

  106.         while((ADC_CONTR & 0x10) == 0)        ;        //wait for ADC finish
  107.         ADC_CONTR &= ~0x10;                //清除ADC結(jié)束標(biāo)志
  108.         return        (((u16)ADC_RES << 2) | (ADC_RESL & 3));
  109. }



  110. /**************** 向HC595發(fā)送一個字節(jié)函數(shù) ******************/
  111. void Send_595(u8 dat)
  112. {               
  113.         u8        i;
  114.         for(i=0; i<8; i++)
  115.         {
  116.                 dat <<= 1;
  117.                 P_HC595_SER   = CY;
  118.                 P_HC595_SRCLK = 1;
  119.                 P_HC595_SRCLK = 0;
  120.         }
  121. }

  122. /********************** 顯示掃描函數(shù) ************************/
  123. void DisplayScan(void)
  124. {       
  125.         Send_595(~LED_TYPE ^ T_COM[display_index]);                        //輸出位碼
  126.         Send_595( LED_TYPE ^ t_display[LED8[display_index]]);        //輸出段碼

  127.         P_HC595_RCLK = 1;
  128.         P_HC595_RCLK = 0;                                                        //鎖存輸出數(shù)據(jù)
  129.         if(++display_index >= 8)        display_index = 0;        //8位結(jié)束回0
  130. }


  131. /********************** Timer0 1ms中斷函數(shù) ************************/
  132. void timer0 (void) interrupt TIMER0_VECTOR
  133. {
  134.         DisplayScan();        //1ms掃描顯示一位
  135.         B_1ms = 1;                //1ms標(biāo)志
  136. }


復(fù)制代碼


STC15Fxxxx.zip

8.73 KB, 下載次數(shù): 29

回復(fù)

使用道具 舉報

ID:65956 發(fā)表于 2018-8-22 11:26 | 顯示全部樓層
可能是你現(xiàn)在的IO口是懸空狀態(tài)吧,在所在測的IO口上加上加一個下拉10-100K的電阻就行了,如果要測試電池電壓,建議還是用分壓電阻方案測試穩(wěn)當(dāng)點(diǎn),我自己現(xiàn)在用的是10K+90K方案,測試正常,考慮到只有10位AD,精度并不是很好
回復(fù)

使用道具 舉報

ID:122751 發(fā)表于 2018-8-22 13:01 | 顯示全部樓層
angmall 發(fā)表于 2018-8-22 09:02
你可以運(yùn)用這個程序
讀ADC內(nèi)部基準(zhǔn)計算MCU的工作電壓, 不需要增加任何硬件零件.

并不是讀取單片機(jī)的工作電壓,我是想通過io口的ad采樣功能測量18650電池電量
回復(fù)

使用道具 舉報

ID:122751 發(fā)表于 2018-8-22 13:02 | 顯示全部樓層
wulin 發(fā)表于 2018-8-22 06:36
沙發(fā)的建議是錯誤的。有很多型號的STC15系列單片機(jī)內(nèi)置有ADC功能,只要把其P1相應(yīng)端口特殊功能寄存器初始化 ...

但是情況是我設(shè)置了高阻態(tài),設(shè)置為ad采樣的io還是有電壓
回復(fù)

使用道具 舉報

ID:122751 發(fā)表于 2018-8-22 13:14 | 顯示全部樓層
aking991 發(fā)表于 2018-8-22 11:26
可能是你現(xiàn)在的IO口是懸空狀態(tài)吧,在所在測的IO口上加上加一個下拉10-100K的電阻就行了,如果要測試電池電 ...

是懸空狀態(tài)用萬用表測量有電壓,我就是想測量電池電壓,怕ad采樣io口原來的電壓會影響測量的數(shù)據(jù),我不知道該怎么樣測量,還有所說的分壓電阻方案,是ad采樣io接上10k+90k的電阻,然后接地,電阻中間引線出來接待測的的電池正極是嗎
回復(fù)

使用道具 舉報

ID:122751 發(fā)表于 2018-8-22 13:26 | 顯示全部樓層
HC6800-ES-V2.0 發(fā)表于 2018-8-22 08:58
你想多了!
第一:你要測量的電源與單片機(jī)共地。
第二:設(shè)置好AD轉(zhuǎn)換通道,設(shè)置寄存器如圖所示:

學(xué)習(xí)了
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2018-8-22 15:42 | 顯示全部樓層
18277067187 發(fā)表于 2018-8-22 13:02
但是情況是我設(shè)置了高阻態(tài),設(shè)置為ad采樣的io還是有電壓

由于是高阻態(tài),此端口懸空時測到的電壓不必理會,不影響對外電路電壓的測量精度。我用STC15W404AS設(shè)計的產(chǎn)品從來沒有發(fā)生你擔(dān)心問題。
回復(fù)

使用道具 舉報

ID:388947 發(fā)表于 2018-8-22 16:04 | 顯示全部樓層
樓下說的有道理
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美在线观看一区二区 | 国产色99精品9i | 中文字幕一区在线 | 视频一区二区国产 | 亚洲国产一区二区视频 | 欧美白人做受xxxx视频 | 亚洲高清在线免费观看 | 在线播放中文字幕 | 一区二区三区免费在线观看 | 国产成人精品一区二区三区网站观看 | 91大神在线看 | 欧美日韩第一页 | 国产成人精品一区二区三区 | 成人福利在线观看 | 精品视频一区二区三区在线观看 | 日韩精品成人 | 成人一区av偷拍 | 久久精品国产99国产精品亚洲 | 国产欧美精品一区二区色综合 | 欧美激情国产精品 | 成人午夜免费视频 | 久久精品成人热国产成 | 久久国产传媒 | 国产在线观看一区二区三区 | 欧美激情视频一区二区三区免费 | 成人夜晚看av | 亚洲精品久久久久中文字幕二区 | 一区二区三区电影在线观看 | 国产一区二区高清在线 | 欧美日韩一区精品 | 国产精品久久久久久久久久了 | 久久精品一区二 | 日日爽| 日本三级网站在线观看 | 青青草这里只有精品 | 日本公妇乱淫xxxⅹ 国产在线不卡 | 一区精品视频在线观看 | 在线观看国产精品一区二区 | 亚洲免费三区 | 久久久久久国产精品免费免费狐狸 | 国产精品视频一区二区三区四蜜臂 |