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

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

QQ登錄

只需一步,快速開始

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

用RC充放電實(shí)現(xiàn)檢測外部電壓STC15F單片機(jī)Keil工程與代碼

  [復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 10 黑幣 回復(fù)本帖可獲得 10 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
ID:971077 發(fā)表于 2021-10-19 09:35 | 顯示全部樓層 |閱讀模式
對(duì)于沒有ADC的MCU,而又要測量外部的一個(gè)電壓時(shí),使用RC充放電的方式是比較容易實(shí)現(xiàn)并且低成本的方法。
STC15F系列是1T的MCU,其IO口有OPEN-DRAIN模式,此模式可以很容易用一個(gè)IO口配合一個(gè)定時(shí)器實(shí)現(xiàn)RC充放電來測量外部未知電壓。如果沒有空余的定時(shí)器,也可以使用指令循環(huán)的方式實(shí)現(xiàn)。本例使用定時(shí)器。

本范例使用P3.2(INT0)來做RC測量
電路原理圖如下:
下載.png

單片機(jī)源程序如下:
  1. /*

  2. 功能描述: 使用STC15F系列C版本做的RC測量電壓的例子.

  3. */

  4. #include "reg51.h"

  5. #define MAIN_Fosc                            22118400L              //定義主時(shí)鐘

  6. #define              uchar              unsigned char
  7. #define uint              unsigned int

  8. sfr AUXR = 0x8e;    //Auxiliary register
  9. sfr P3M1  = 0xB1;              //P3M1.N,P3M0.N               =00--->Standard,              01--->push-pull
  10. sfr P3M0  = 0xB2;              //                                                                      =10--->pure input,              11--->open drain

  11. sbit              P_TXD1  = P3^1;              //定義模擬串口發(fā)送腳,打印信息用
  12. sbit    P_RC = P3^2;              //RC port
  13. uchar              SampleCnt;                            //發(fā)送結(jié)果的采樣間隔計(jì)數(shù)
  14. uchar              LineCnt;                            //每行顯示結(jié)果計(jì)數(shù)
  15. bit                            B_Over;                                          //超時(shí)標(biāo)志
  16. bit                            B_ADC_OK;                            //檢測完成標(biāo)志
  17. uint              adc;                                          //RC做的ADC值

  18. void              RC_start(void);
  19. void              Tx1Send(uchar dat);
  20. void               InitTimer(void);
  21. void              delay_ms(unsigned char ms);

  22. ///////////////////////////////////////////////////////////

  23. void main(void)
  24. {

  25.               InitTimer();                            //初始化Timer

  26.     P3M1 |=  1 << 2;         //P3.2 config as Open-Drain
  27.               P3M0 |=  1 << 2;
  28.               P_RC = 0;               //Clear RC port to 0
  29. //    TMOD |= 0x00;           //T0 as 16 bits timer, auto reload

  30.     while (1)
  31.     {
  32.         delay_ms(5);   //放電時(shí)間
  33.                            
  34.                             B_ADC_OK = 0;                            //清除ADC結(jié)束標(biāo)志
  35.                             B_Over = 0;                                          //清除超量程標(biāo)志
  36.         RC_start();           //RC charge-decharge
  37.                             while(!B_ADC_OK && !B_Over)              ;              //等待ADC結(jié)束或超時(shí)
  38.                             if(B_ADC_OK)
  39.                             {
  40.                                           if(++SampleCnt >= 100)              //1秒鐘發(fā)一個(gè)結(jié)果給串口
  41.                                           {
  42.                                                         SampleCnt = 0;
  43.                                                         Tx1Send(adc / 10000 + '0');           //send to PC from the UART
  44.                                                         Tx1Send(adc % 10000 / 1000 + '0');
  45.                                                         Tx1Send(adc % 1000 / 100 + '0');
  46.                                                         Tx1Send(adc % 100 / 10 + '0');
  47.                                                         Tx1Send(adc % 10 + '0');
  48.                                                         Tx1Send(' ');
  49.                                                         Tx1Send(' ');
  50.                                                         if(++LineCnt >= 10)                            //10個(gè)結(jié)果后換行
  51.                                                         {
  52.                                                                       LineCnt = 0;
  53.                                                                       Tx1Send(0x0d);   //send CR
  54.                                                                       Tx1Send(0x0a);
  55.                                                         }
  56.                                           }
  57.                             }
  58.     }
  59. }


  60. ///////////////////////////////////////////////////////////

  61. //============================================================
  62. // 函數(shù): void  delay_ms(unsigned char ms)
  63. // 描述: 延時(shí)函數(shù)。
  64. // 參數(shù): ms,要延時(shí)的ms數(shù).
  65. // 返回: none.
  66. // 版本: VER1.0
  67. // 日期: 2010-12-15
  68. // 備注:
  69. //============================================================
  70. void  delay_ms(unsigned char ms)
  71. {
  72.      unsigned int i;
  73.               do
  74.               {
  75.                             i = MAIN_Fosc / 14000L;              //1T
  76.                             while(--i)              ;   //13T per loop
  77.      }while(--ms);
  78. }


  79. /**************** RC啟動(dòng)函數(shù) ******************************/
  80. void   RC_start(void)
  81. {
  82.                         //使用Timer 0 計(jì)時(shí)
  83.     TH0 = 0;            //clear Timer 0
  84.     TL0 = 0;
  85.               B_Over = 0;                                          //Clear Over flag
  86.     P_RC = 1;           //RC charge
  87.     TR0 = 1;            //enable Timer 0
  88.               IE0 = 0;                                          //Clear INT0 flag
  89.               EX0 = 1;                            //INT0 Enable
  90.               IT0 = 0;                            //INT0 上升,下降沿中斷            
  91. }

  92. /********************* INT0中斷函數(shù) *************************/
  93. void INT0_int (void) interrupt 0                            //
  94. {
  95.     if(INT0 && !B_Over)                            //上升沿中斷,無超時(shí)
  96.               {
  97.                             TR0 = 0;            //deable Timer 0
  98.                             P_RC = 0;           //decharge
  99.                             adc = TH0;            //read the RC time
  100.                             adc = (adc << 8) + TL0;
  101.                             B_ADC_OK = 1;                            //標(biāo)志ADC結(jié)束
  102.               }
  103. }


  104. /**************** Timer初始化函數(shù) ******************************/
  105. void InitTimer(void)
  106. {
  107.               TMOD = 0;                            //for STC15Fxxx系列              Timer0 as 16bit reload timer.
  108.               TH0 = 0;
  109.               TL0 = 0;
  110.               ET0 = 1;                            //允許Timer0中斷
  111.               TR0 = 0;
  112.               EA  = 1;                            //允許總中斷
  113. }

  114. /********************** Timer0中斷函數(shù)************************/
  115. void timer0 (void) interrupt 1
  116. {
  117.               TR0 = 0;              //超量程關(guān)閉
  118.               B_Over = 1;              //標(biāo)志超量程
  119. }


  120. /********************** 模擬串口相關(guān)函數(shù)************************/

  121. void              BitTime(void)              //位時(shí)間函數(shù)
  122. {
  123.               uint i;
  124.               i = ((MAIN_Fosc / 100) * 104) / 130000L - 1;                            //根據(jù)主時(shí)鐘來計(jì)算位時(shí)間
  125.               while(--i);
  126. }

  127. //模擬串口發(fā)送
  128. void              Tx1Send(uchar dat)                            //9600,N,8,1                            發(fā)送一個(gè)字節(jié)
  129. {
  130.               uchar              i;
  131.               EA = 0;
  132.               P_TXD1 = 0;
  133.               BitTime();
  134.               for(i=0; i<8; i++)
  135.               {
  136.                             if(dat & 1)                            P_TXD1 = 1;
  137.                             else                                          P_TXD1 = 0;
  138.                             dat >>= 1;
  139.                             BitTime();
  140.               }
  141.               P_TXD1 = 1;
  142.               EA = 1;
  143.               BitTime();
  144.               BitTime();
  145. }
復(fù)制代碼
51hei.png
Keil代碼hex文件下載:
STC15Fxx.rar (9.61 KB, 下載次數(shù): 47)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:941265 發(fā)表于 2021-10-20 10:36 | 顯示全部樓層
51黑有你更精彩,謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:313048 發(fā)表于 2021-10-20 14:10 | 顯示全部樓層
還有這種操作,漲知識(shí)了
回復(fù)

使用道具 舉報(bào)

ID:32289 發(fā)表于 2021-10-20 21:22 | 顯示全部樓層
精度如何?準(zhǔn)確度呢?
回復(fù)

使用道具 舉報(bào)

ID:480510 發(fā)表于 2021-10-22 18:38 | 顯示全部樓層
有時(shí)間我也試試
回復(fù)

使用道具 舉報(bào)

ID:4867 發(fā)表于 2021-10-25 18:07 | 顯示全部樓層
檢測充放電時(shí)間來判斷電壓,精度和電容、電阻、頻率都有關(guān)系!要求不高的應(yīng)用是可以應(yīng)急用用!
回復(fù)

使用道具 舉報(bào)

ID:85865 發(fā)表于 2021-10-25 18:48 | 顯示全部樓層
這種方式檢測的電壓準(zhǔn)嗎
回復(fù)

使用道具 舉報(bào)

ID:965189 發(fā)表于 2021-10-25 23:06 | 顯示全部樓層
漲知識(shí)了,檢測中斷間隔時(shí)間。
回復(fù)

使用道具 舉報(bào)

ID:854138 發(fā)表于 2021-11-4 13:24 | 顯示全部樓層
51黑有你更精彩,謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:977934 發(fā)表于 2021-11-7 00:22 | 顯示全部樓層

51黑有你更精彩,謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:978845 發(fā)表于 2021-11-7 11:45 來自手機(jī) | 顯示全部樓層
51黑有你更精彩,謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:976070 發(fā)表于 2021-11-7 17:12 | 顯示全部樓層
可調(diào)電阻范圍????????
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-11-7 23:00 | 顯示全部樓層
252622979 發(fā)表于 2021-10-25 18:48
這種方式檢測的電壓準(zhǔn)嗎

不準(zhǔn),要準(zhǔn)的話,最起碼要用比較器。 這個(gè)就是STC官網(wǎng)上面的范例,范例中也有說明,這個(gè)方法僅僅只是用于,連比較器都沒有的單片機(jī)偏偏需要一個(gè)大約的電壓值的權(quán)宜之計(jì)。
回復(fù)

使用道具 舉報(bào)

ID:305762 發(fā)表于 2021-11-8 08:17 | 顯示全部樓層

51黑有你更精彩,謝謝分享。!
回復(fù)

使用道具 舉報(bào)

ID:548757 發(fā)表于 2021-11-9 15:28 | 顯示全部樓層
學(xué)習(xí)學(xué)習(xí),借鑒一種分析方法!
回復(fù)

使用道具 舉報(bào)

ID:928284 發(fā)表于 2021-11-27 16:36 | 顯示全部樓層
論壇里有你,才有更大的意義,我在學(xué)習(xí)中。
回復(fù)

使用道具 舉報(bào)

ID:985476 發(fā)表于 2021-11-27 23:11 | 顯示全部樓層
真是大開眼界,非常有學(xué)習(xí)價(jià)值
回復(fù)

使用道具 舉報(bào)

ID:979106 發(fā)表于 2021-11-28 13:51 | 顯示全部樓層

漲知識(shí)了,檢測中斷間隔時(shí)間。
回復(fù)

使用道具 舉報(bào)

ID:652804 發(fā)表于 2021-11-28 16:42 | 顯示全部樓層
有時(shí)間我也試試
回復(fù)

使用道具 舉報(bào)

ID:986042 發(fā)表于 2021-12-6 16:50 | 顯示全部樓層

好資料,51黑有你更精彩!
回復(fù)

使用道具 舉報(bào)

ID:137736 發(fā)表于 2021-12-6 21:27 | 顯示全部樓層
原來網(wǎng)上有用89C2051比較強(qiáng)做的電壓測量程序
回復(fù)

使用道具 舉報(bào)

ID:989283 發(fā)表于 2021-12-7 20:09 | 顯示全部樓層


好資料,51黑有你更精彩!
回復(fù)

使用道具 舉報(bào)

ID:996104 發(fā)表于 2021-12-23 14:25 | 顯示全部樓層


好資料,51黑有你更精彩!
回復(fù)

使用道具 舉報(bào)

ID:993969 發(fā)表于 2022-2-4 15:59 | 顯示全部樓層

51黑有你更精彩,謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:983641 發(fā)表于 2022-2-18 12:23 | 顯示全部樓層
這種方法比較新穎,不知道精度和量程如何。
回復(fù)

使用道具 舉報(bào)

ID:974778 發(fā)表于 2022-2-18 14:07 | 顯示全部樓層

51黑有你更精彩,謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:1014986 發(fā)表于 2022-4-3 14:34 | 顯示全部樓層
51黑有你更精彩,謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:1017657 發(fā)表于 2022-4-11 21:41 | 顯示全部樓層
這樣測電壓準(zhǔn)嗎
回復(fù)

使用道具 舉報(bào)

ID:1020136 發(fā)表于 2022-4-20 19:16 | 顯示全部樓層
漲知識(shí)了,謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:973561 發(fā)表于 2022-5-16 10:34 | 顯示全部樓層

漲知識(shí)了,謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:1028891 發(fā)表于 2022-5-23 16:44 | 顯示全部樓層
51黑有你更精彩,謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:297903 發(fā)表于 2022-5-24 09:45 | 顯示全部樓層
學(xué)習(xí)了,謝謝!
回復(fù)

使用道具 舉報(bào)

ID:1030839 發(fā)表于 2022-5-30 13:36 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:1031100 發(fā)表于 2022-5-30 22:33 | 顯示全部樓層
太強(qiáng)啦
回復(fù)

使用道具 舉報(bào)

ID:1033422 發(fā)表于 2022-6-9 16:02 | 顯示全部樓層
檢測充放電時(shí)間來判斷電壓,精度和電容、電阻、頻率都有關(guān)系!
回復(fù)

使用道具 舉報(bào)

ID:1034398 發(fā)表于 2022-6-14 11:34 | 顯示全部樓層
好強(qiáng),我直接學(xué)暈了
回復(fù)

使用道具 舉報(bào)

ID:1034398 發(fā)表于 2022-6-14 11:36 | 顯示全部樓層
請(qǐng)問能教一下51單片機(jī)溫度報(bào)警器怎么搞?
回復(fù)

使用道具 舉報(bào)

ID:334440 發(fā)表于 2022-6-14 21:15 | 顯示全部樓層
精確度如何,有驗(yàn)證過的大師嗎
回復(fù)

使用道具 舉報(bào)

ID:257564 發(fā)表于 2022-6-15 13:21 | 顯示全部樓層
這種方法不錯(cuò),挺實(shí)用的
回復(fù)

使用道具 舉報(bào)

ID:1043176 發(fā)表于 2022-9-14 09:18 | 顯示全部樓層
  51黑有你更精彩,謝謝分享!!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美黄色网 | 国产精品一区二区三 | 国产一区二区三区网站 | 日韩在线小视频 | 久久久九九 | 欧美日韩福利 | 三级在线免费观看 | 国产一区二区电影 | 亚洲国产精品久久久久久 | 欧美激情视频一区二区三区在线播放 | 国产精品免费一区二区三区四区 | 一区免费观看 | 国产1区 | 性生活毛片 | 久久成人一区 | 中文字幕日韩在线观看 | 欧美mv日韩mv国产网站91进入 | 欧美一区中文字幕 | 精品成人佐山爱一区二区 | 国产精品1区 | 国产91精品久久久久久久网曝门 | 99亚洲 | 美女艹b| 亚洲欧美中文日韩在线v日本 | 亚洲福利一区二区 | 国产成人小视频 | 久久毛片| 国产免费一区二区 | 小视频你懂得 | 91中文在线观看 | 成人免费在线播放视频 | 7777精品伊人久久精品影视 | 国产精品久久午夜夜伦鲁鲁 | 国产成人精品久久二区二区 | 在线日韩欧美 | 久久国产精品一区二区 | 国产日韩精品一区二区三区 | 天天色影视综合 | 亚洲精品久久久久久国产精华液 | 欧美第一区 | 视频一二区 |