单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 875|回复: 4
打印 上一主题 下一主题
收起左侧

基于pic16f1503单片机的电源电压不足检测和指示方法 含源码+仿真

[复制链接]
跳转到指定楼层
楼主
基于pic16f1503单片机的电源电压不足检测和指示方法:
原理:
利用单片机内部的FVR稳压电源,ADC进行检测判断单片机的VDD电压是否足够,不足进行输出显示。
应用:
当单片机的供电是由电池供电时,可以测量单片机的供电是否足够,指示电池电量不足。
实际电路测试功能可行,已经应用在具体电路上
软件:
MPLAB X IDE v4.15    proteus 8.6.
1、仿真电路图;
2、源程序加注释。
请看附件,

说明:1、利用PIC16F1501内部的FVR,ADC可以测量VDD电压,判断单片机是否供电电压不足。
2、将ADC的基准设为Vdd,通过FVR使能并稳定到1.024V后,用ADC测量值。
3、有公式ADC读值=(1.024/VDD)*1024。设置Vdd参考为3.3V,则(1.024/VDD)*1024=318.
4、VDD越大,FVR的ADC读值越小,所以只要判断读值小于318,说明VDD 大于3.3V
5、图中左边VDD=3.3V.输出指示灯亮,正常,右边VDD=3.29V输出指示灯灭。
6、两个芯片的程序相同,电压基准是3.3V,3.3V以下指示输出灯不亮。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)




单片机源程序如下:
  1. #include"sys.h"
  2. #include <stdint.h>        /* For uint8_t definition */
  3. #include <stdbool.h>       /* For true/false definition */
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include<math.h>
  8. #define POWER_LED PORTCbits.RC0           //RC0 为系统电源指示灯,
  9.                                           //电源大于3.3V时,灯亮;
  10.                                                 //电源小于3.3V时,灯灭;

  11. void sys_init()                                //系统初始化
  12. {
  13.     OSCCON=0x7F;                //16M  内部晶振
  14.     FVRCON=0B01010001;          //FVREN,ADCFVR=01(1.024V)
  15.     ADCON0=0B01111100;          //FVR channel,ADCON   
  16.     ADCON1=0B10000000;          //right 对齐
  17.     ANSELC=0;                   //PORTC是IO口
  18.     PORTC=0;                                
  19.     TRISC=0;                              //PORTC是输出
  20.    
  21. }
  22. void main()
  23. {
  24.     sys_init();                         //系统初始化
  25.     while(1)
  26.     {
  27.         FVRCONbits.FVREN=1;        //FVR 使能
  28.         while(!FVRCONbits.FVRRDY); //FVR 是否稳定
  29.         ADCON0bits.ADON=1;         //ADC 使能
  30.         __delay_ms(1);             //delay
  31.         ADCON0bits.GO=1;           //ADC 转换开始
  32.         while(ADCON0bits.GO);      //等待ADC 转换结束
  33.         uint16_t adc_result=(uint16_t)ADRESH<<8 |ADRESL; //得到ADC 读数
  34.         if(adc_result<318) POWER_LED=1;     //(1.024/3.3)*1024=318        
  35.         else POWER_LED=0;     
  36.         FVRCONbits.FVREN=0;                 //FVR 使能关闭,节能
  37.         __delay_ms(5000);
  38.         
  39.     }
  40. }
复制代码

所有资料51hei提供下载:
一种单片机检测VDD输入的方法.rar (331.46 KB, 下载次数: 23)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
51hei团团 发表于 2018-5-24 00:04 | 只看该作者
感谢斑竹的分享,正好要用,准备移植到51单片机
回复

使用道具 举报

板凳
sz_frank 发表于 2018-12-8 23:35 | 只看该作者
多谢分享                    
回复

使用道具 举报

地板
sz_frank 发表于 2018-12-8 23:36 | 只看该作者
多谢分享                              
回复

使用道具 举报

5#
sz_frank 发表于 2018-12-9 08:41 | 只看该作者
多谢分享           
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机.

Powered by 单片机教程网

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