找回密码
 注册
查看: 202|回复: 2
打印 上一主题 下一主题

用RC充放电实现检测外部电压STC15F单片机Keil工程与代码

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-9-19 10:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
对于没有ADC的mcu,而又要测量外部的一个电压时,使用RC充放电的方式是比较容易实现并且低成本的方法。
STC15F系列是1T的MCU,其IO口有OPEN-DRAIN模式,此模式可以很容易用一个IO口配合一个定时器实现RC充放电来测量外部未知电压。如果没有空余的定时器,也可以使用指令循环的方式实现。本例使用定时器。
3 o2 d9 Y# W8 A& X0 r8 ~
# g, Y6 L8 V/ w" r) }0 M4 m* i' ^
本范例使用P3.2(INT0)来做RC测量
/ j( I3 I, v: h1 O电路原理图如下:$ I/ H( [1 `: L8 H8 V3 V& E8 x+ n0 ~7 X
( d/ [" g' ?, M5 l/ x% U6 @
( h1 `$ c0 _& D, d& x# K" `7 |
单片机源程序如下:" L% `- l9 Y: f) i0 Q8 B+ U
  • /*
  • 功能描述: 使用STC15F系列C版本做的RC测量电压的例子.
  • */
  • #include "reg51.h"
  • #define MAIN_Fosc                            22118400L              //定义主时钟
  • #define              uchar              unsigned char
  • #define uint              unsigned int
  • sfr AUXR = 0x8e;    //Auxiliary register
  • sfr P3M1  = 0xB1;              //P3M1.N,P3M0.N               =00--->Standard,              01--->push-pull
  • sfr P3M0  = 0xB2;              //                                                                      =10--->pure input,              11--->open drain
  • sbit              P_TXD1  = P3^1;              //定义模拟串口发送脚,打印信息用
  • sbit    P_RC = P3^2;              //RC port
  • uchar              SampleCnt;                            //发送结果的采样间隔计数
  • uchar              LineCnt;                            //每行显示结果计数
  • bit                            B_Over;                                          //超时标志
  • bit                            B_ADC_OK;                            //检测完成标志
  • uint              adc;                                          //RC做的ADC值
  • void              RC_start(void);
  • void              Tx1Send(uchar dat);
  • void               InitTimer(void);
  • void              delay_ms(unsigned char ms);
  • ///////////////////////////////////////////////////////////
  • void main(void)
  • {
  •               InitTimer();                            //初始化Timer
  •     P3M1 |=  1 << 2;         //P3.2 config as Open-Drain
  •               P3M0 |=  1 << 2;
  •               P_RC = 0;               //Clear RC port to 0
  • //    TMOD |= 0x00;           //T0 as 16 bits timer, auto reload
  •     while (1)
  •     {
  •         delay_ms(5);   //放电时间
  •                             B_ADC_OK = 0;                            //清除ADC结束标志
  •                             B_Over = 0;                                          //清除超量程标志
  •         RC_start();           //RC charge-decharge
  •                             while(!B_ADC_OK && !B_Over)              ;              //等待ADC结束或超时
  •                             if(B_ADC_OK)
  •                             {
  •                                           if(++SampleCnt >= 100)              //1秒钟发一个结果给串口
  •                                           {
  •                                                         SampleCnt = 0;
  •                                                         Tx1Send(adc / 10000 + '0');           //send to PC from the UART
  •                                                         Tx1Send(adc % 10000 / 1000 + '0');
  •                                                         Tx1Send(adc % 1000 / 100 + '0');
  •                                                         Tx1Send(adc % 100 / 10 + '0');
  •                                                         Tx1Send(adc % 10 + '0');
  •                                                         Tx1Send(' ');
  •                                                         Tx1Send(' ');
  •                                                         if(++LineCnt >= 10)                            //10个结果后换行
  •                                                         {
  •                                                                       LineCnt = 0;
  •                                                                       Tx1Send(0x0d);   //send CR
  •                                                                       Tx1Send(0x0a);
  •                                                         }
  •                                           }
  •                             }
  •     }
  • }
  • ///////////////////////////////////////////////////////////
  • //============================================================
  • // 函数: void  delay_ms(unsigned char ms)
  • // 描述: 延时函数。
  • // 参数: ms,要延时的ms数.
  • // 返回: none.
  • // 版本: VER1.0
  • // 日期: 2010-12-15
  • // 备注:
  • //============================================================
  • void  delay_ms(unsigned char ms)
  • {
  •      unsigned int i;
  •               do
  •               {
  •                             i = MAIN_Fosc / 14000L;              //1T
  •                             while(--i)              ;   //13T per loop
  •      }while(--ms);
  • }
  • /**************** RC启动函数 ******************************/
  • void   RC_start(void)
  • {
  •                         //使用Timer 0 计时
  •     TH0 = 0;            //clear Timer 0
  •     TL0 = 0;
  •               B_Over = 0;                                          //Clear Over flag
  •     P_RC = 1;           //RC charge
  •     TR0 = 1;            //enable Timer 0
  •               IE0 = 0;                                          //Clear INT0 flag
  •               EX0 = 1;                            //INT0 Enable
  •               IT0 = 0;                            //INT0 上升,下降沿中断
  • }
  • /********************* INT0中断函数 *************************/
  • void INT0_int (void) interrupt 0                            //
  • {
  •     if(INT0 && !B_Over)                            //上升沿中断,无超时
  •               {
  •                             TR0 = 0;            //deable Timer 0
  •                             P_RC = 0;           //decharge
  •                             adc = TH0;            //read the RC time
  •                             adc = (adc << 8) + TL0;
  •                             B_ADC_OK = 1;                            //标志ADC结束
  •               }
  • }
  • /**************** Timer初始化函数 ******************************/
  • void InitTimer(void)
  • {
  •               TMOD = 0;                            //for STC15Fxxx系列              Timer0 as 16bit reload timer.
  •               TH0 = 0;
  •               TL0 = 0;
  •               ET0 = 1;                            //允许Timer0中断
  •               TR0 = 0;
  •               EA  = 1;                            //允许总中断
  • }
  • /********************** Timer0中断函数************************/
  • void timer0 (void) interrupt 1
  • {
  •               TR0 = 0;              //超量程关闭
  •               B_Over = 1;              //标志超量程
  • }
  • /********************** 模拟串口相关函数************************/
  • void              BitTime(void)              //位时间函数
  • {
  •               uint i;
  •               i = ((MAIN_Fosc / 100) * 104) / 130000L - 1;                            //根据主时钟来计算位时间
  •               while(--i);
  • }
  • //模拟串口发送
  • void              Tx1Send(uchar dat)                            //9600,N,8,1                            发送一个字节
  • {
  •               uchar              i;
  •               EA = 0;
  •               P_TXD1 = 0;
  •               BitTime();
  •               for(i=0; i<8; i++)
  •               {
  •                             if(dat & 1)                            P_TXD1 = 1;
  •                             else                                          P_TXD1 = 0;
  •                             dat >>= 1;
  •                             BitTime();
  •               }
  •               P_TXD1 = 1;
  •               EA = 1;
  •               BitTime();
  •               BitTime();
  • }
    ! U8 n" E/ D. @

" h6 V# J, a' Z& K( x" p. D; X$ z& @: R( v

/ c1 p; N/ ]8 P& F8 v

该用户从未签到

2#
发表于 2022-9-19 11:10 | 只看该作者
本帖最后由 名字好听吗 于 2022-9-23 21:06 编辑
5 ]+ a- U$ {( G$ s) a
6 [+ D' x1 [; I, B买个万用表不就行了,搞得这么麻烦。又不精确。

该用户从未签到

3#
发表于 2022-9-19 13:09 | 只看该作者
本帖最后由 Maskman 于 2022-9-23 18:41 编辑 9 I" e9 a- t. I; M: ?6 {
5 h* ^: U' @  t
RC充放电的方式是比较容易实现并且低成本的方法,这是什么技术,安全可靠吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-2 16:38 , Processed in 0.093750 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表