stc12c5a60s2 0-30电压测量 有注释

2019-11-08来源: 51hei关键字:stc12c5a60s2  0-30  电压测量  AD电压

#include

#include "intrins.h"


#define uchar unsigned char

#define uint  unsigned int

#define ulong unsigned long



/*Define ADC operation const for ADC_CONTR*/

#define ADC_POWER   0x80            //ADC 电源控制位  10000000  0X80  /

#define ADC_FLAG    0x10            //ADC 完成标志          00010000  0x10

#define ADC_START   0x08            //ADC 启动ADC开关 00001000        0x08  /

#define ADC_SPEEDLL 0x00            //420 转换速度          00000000        0x00  /

#define ADC_SPEEDL  0x20            //280 转换速度          00100000  0x20

#define ADC_SPEEDH  0x40            //140 转换速度          01000000  0x40

#define ADC_SPEEDHH 0x60            //70  转换速度          01100000        0x60 



/*----------------------------------------------------------------------------------------------

meidangzuidivoltage:表示AD最高电压5V对应10bit_AD转换的最小电压是多少 5/1024= 0.00488V 也就是AD在

//10bit下测量的最小电压,

//那么在计算AD电压值的时候将公式 “GetADCResult(ch)*5/1024”分两步进行 方便后面对数据分离显示到

//1602上面  先计算ADC_jiancedaozuidivoltage=5*10000000/1024  先将这个数放大100万倍

//最后在算AD_jie_guo=(ADC_jiancedaozuidivoltage*GetADCResult(ch);

----------------------------------------------------------------------------------------------*/ 

ulong  ADC_jiancedaozuidivoltage,temp,AD_jie_guo;          //长整形数据  16bit


float OVP;                 //定义一个浮点数  以保留小数点 提高进度


uint num,i,vlue;//ADC_mV,ADC_RESX,VCC_V=5.2;


sbit    lcden = P2^7;

sbit    rs = P2^6;

sbit    rw = P2^5;

sbit    LED = P3^0;


void Delay(uint n);              //延时函数

uint GetADCResult(uchar ch);                 // ad转换函数

void InitADC();                                         //ad初始化函数

void OCP_1();                                         //过压 欠压  提醒函数声明

float count(uchar ch);       //AD值100次平均值函数

//ulong  count(uchar ch);  //ad计算函数测量0-5V时候用的

uchar code table[20]= {"     Shu Kong QuDong"};        //  开机画面的布置

uchar code table2[20]={"     CQDZ Alan V1.01"};



/*-----------------

  延时函数

  -----------------*/

void delayms(uint xms)           //延时函数

{                                        

     uint i,j;                                         

         for(i=xms;i>0;i--)

           for (j=960;j>0;j--);

}


/*--------------------

写命令

---------------------*/

void   lcd_write_com(uchar com)

{


         rw=0;

                 rs=0;        //写命令状态

                 P0=com;

                 lcden=1;

             delayms(5);

                 lcden=0;

}


/**-----------------

写数据

--------------- ***/

void  write_date_(uchar date)

{

         rw=0; //写数据

                 rs=1; //写数据状态

                 P0=date;

                 delayms(5);

                 lcden=1;  //使能

             delayms(5);

                 lcden=0;    

}


/*---------------

初始化显示屏

---------------*/

void lcd_init(void)

{


                  lcden=0;

                  lcd_write_com(0x38); //设置8位格式,2行,5*7

                  lcd_write_com(0x0c); //整体显示,关光标,不显示

                  lcd_write_com(0x06); // 设定输入方式,增量不移位

                  lcd_write_com(0x01);//清屏幕

                  delayms(5);  //延?



}


/*-----------------------

函数名称    格式定义

函数的介绍  在某个屏幕位置上显示一个字符,X(0-16),y(1-2)

X:表示字的格式 一共16个  Y:表示行 一共2行

-------------------------*/

//格式定义


void lcd_disp_char(uchar y,uchar x, uint dat)

{

         uint  address;

             if(y==1)                   //y为1  在第一行

                   address=0x80+0x10+4+x;          //整屏左移动以后 从新定义新的起始位置 但是要加上之前移动后的地址

             else

               address=0xc0+0x10+x;           //y为2 在第二行  X显示字的位置   0XC0是 0x80+0x40的结果


           lcd_write_com(address);          //写入要写的位置

                   write_date_( dat);       //写入你要写的数据         

}         



/*------------------

显示函数2

-------------------*/

void  disp()

{


     AD_jie_guo = count(0);   //经过上面的计算求出来100次的平均值存放在AD_jie_guo里面



/*-------------------------------------------------------------------------------

        //扩大电压   我的量程是0-30V  分压电阻是 10k 2k 电阻比的6  反推 当测试电压为5v

   //的时候 最高电压为30V 测量后调试OK 因电阻误差 调整了数据为6.02  

  //同时这里也可以用(temp/0.167)/100  这个是电压比也就是30V分压为5V  

  //然后5/30=0.167的结果也是一样的

---------------------------------------------------------------------------------*/

         temp=((ADC_jiancedaozuidivoltage*AD_jie_guo)*6.02)/100;

//         temp=(temp*6.02)/100;    //备用算法 这样太占用位置 我把这步合并到上面了         

                 

                                                          

        //0x30是显示数字 0-9 30表示第一个数0  

        lcd_disp_char(1,0, temp%10000000/1000000+0x30 );   //十位

        lcd_disp_char(1,1, temp%1000000/100000+0x30);   //个位        

        lcd_disp_char(1,2,'.' );                                 // 小数点

        lcd_disp_char(1,3, temp%100000/10000+0x30 ); //个分位

        lcd_disp_char(1,4, temp%10000/10000+0x30 ); //百分位

        lcd_disp_char(1,5,'V' );

}

                                          //count(0)

/*-----------------------------------

名称  开机画面                  

功能  开机的时候显示一下铭牌

      for来完成 屏幕左移动

----------------------------------*/

void init()


{        




//        lcd_write_com(0x80+0x10);  //定义显示的位置 起始地址        

        lcd_write_com(0x80);           //定义显示的位置 起始地址


        for(num=0;num<20;num++)

         {        

                

                        write_date_(table[num]);               //初始化屏幕的初始数字“0000”

delayms(5);

[1] [2] [3]
关键字:stc12c5a60s2  0-30  电压测量  AD电压 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479369.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:蓝牙定时开关APP软件(附51单片机参考程序)
下一篇:LED8x8点阵显示屏设计报告+PCB原理图与单片机程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STC12C5A60S2利用PCA时钟溢出做的PWM信号
的功能是,控制CR的开通和关断来实现混频效果*//*第二次修改时间2019-10-6*//*作者 Alan*/#include <STC12C5A60S2.H>#include <stdint.h>//#include <intrins.h>#define FOSC 18432000/*分别定义了两个不高低位的变量用于保存 定时器初值,从而初值计算里面带变量计算以后保存到这个变量 这时候就能在中断正常重新装初值了,也不会出错*/uint8_t  TH,TL;      /*上一次的状态*/uint8_t  
发表于 2019-11-12
STC12C5A60S2利用PCA时钟溢出做的PWM信号
基于STC12C5A60S2的双电源供电智能控制系统设计
摘要:文章介绍了基于STC12C5A60S2单片机的双电源供电智能控制系统,实现对主电源和备用电源的实时监测,保证供电的连续性和可靠性。文中阐述丫系统的整体设计方案、硬件电路设计、软件设计及后台监控的设计。通过理论分析及实践汪明能有效的检测当前主备电路的电压值并实现双电源之间的准确转换,相应状态可以通过GSM模块发送给监控主机和相关操作人员,具有重要的现实意义。0 引言随着国民经济的迅速发展,人们对供电连续性、可靠性的要求越来越高,对于不允许断电的重要场合,如医院手术室、高层建筑安全保障系统、热电站、化工企业、银行等,都要求配备至少两路电源来保证供电的连续性。因此,需要一种能在两路电源之间进行自动转换的系统,以保证正在使用中的电源
发表于 2019-10-24
基于STC12C5A60S2的双电源供电智能控制系统设计
STC12C5A60S2_PWM
#include <reg52.h>#include <intrin.h>#define uint unsigned int #define uchar unsigned charsfr CCON = 0XD8;sbit CCFO = CCON^0;sbit CCF1 = CCON^1;sbit CR = CCON^6;sbit CF = CCON^7;sfr CMOD = 0XD9;sfr CL = 0XE9;sfr CH = 0XF9;sfr CCAPM0 = 0XDA;sfr CCAP0L = 0XEA;sfr CCAP0H = 0XFA;sfr CCAMP1 = 0XDB;sfr CCAP1
发表于 2019-06-01
单片机PWM输出控制直流电机(89c51系列、stc12c5a60s2系列)
= 0; if(time < PWM) pwm = 1; else if(time >= PWM) pwm = 0; }}proteus仿真结果由仿真结果来看,所得波形还是不算很精准,实际应用过程中还会有很多误差,但是这样已经比延时函数产生pwm的结果可靠的多。【STC12C5A60S2系列单片机输出PWM】我在做循迹小车时使用的是stc12c5a60s2单片机。stc12c5a60s2单片机集成了两路可编程计数器阵列(PCA)模块,可用于软件定时器、外部脉冲的捕捉、高速输出以及脉宽调制(PWM)输出。使用stc12c5a60s2单片机的PCA模块可通过程序设定,使其工作于8位PWM模式,通过P13和P14输出
发表于 2019-05-22
单片机PWM输出控制直流电机(89c51系列、stc12c5a60s2系列)
STC12C5A60S2的PCA模块输出PWM波
,就会去改变PWM的占空比,这也就是所说的脉宽调制。要改变PWM的周期,只能改变CL的取值范围,但是CL的取值范围是不可改变的,因为CL是一个8位寄存器。所以只能是改变CL每次加1的速度(原来CL加1用0.1s,现在要改为0.05s)也就是说我们要时钟源的频率。这种方法并没有被PCA模块所用,PCA模块所改变PWM频率的方法为,时钟源选择T0的溢出率,或者是选择外部时钟晶振源。上述为个人理解,下图为手册中的流程
发表于 2019-05-22
STC12C5A60S2的PCA模块输出PWM波
stm32 精确电压测量法(内部参考电压)
:1、ADC IN17内部参考电压原始数据,也就是下图公式中的 VREFINT_DATA2、读取电池电量连接通道原始数据,也就是下图公式中的ADC_DATAX值,我在板子上接的是ADC IN4下图的计算公式就是利用内部参考的校准电压值和实际读取的内部参考电压值作一个线性关系,将这个斜率对应到我们需要测量的通道值。说明:VREFINT_CAL:内部参考电压校准值,直接地址读取。比如该款芯片地址:0X1FF80078,那么我们可以这么做:VREFINT_CAL = *(__IO uint16_t *)(0X1FF80078);FULL_SCALE:根据我们设置的ADC分辨率而定,12位ADC分辨率值:2^12 - 1 = 4096
发表于 2019-11-06
stm32 精确电压测量法(内部参考电压)
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved