×
单片机 > 单片机程序设计 > 详情

stc12c5a60s2 0-30电压测量 有注释

发布时间:2020-06-18 发布时间:
|

#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);



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式