电子开发网

电子开发网电子设计 | 电子开发网Rss 2.0 会员中心 会员注册
搜索: 您现在的位置: 电子开发网 >> 电子开发 >> 单片机 >> 正文

STC89C52单片机数字电流表电压表源码与电路图  51单片机电流电压表

作者:佚名    文章来源:本站原创    点击数:    更新时间:2022-11-23

STC89C52单片机数字电流表电压表电路原理图如下:
51单片机电流表电压表线路原理图 

电流表电压表原理框图 

51单片机电流表电压表程序流程图 

BOM元器件报表 

51单片机源程序如下:

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#include

#include "1602.h"

#include "delay.h"

#include "i2c.h"


char dis0[16];                           //打印数组初始化

unsigned long time_20ms=0;                   //定时器计数


float Volt=0.0;                          //检测电压

float Acurrent=0.0;                                  //检测电流


void Init_Timer0(void);                //函数声明

void uartSendStr(unsigned char *s,unsigned char length);

void UART_Init(void);

void uartSendByte(unsigned char dat);


void main (void)

{     

        unsigned char midvolt,midcur;  //电压电流中间变量值


        Init_Timer0();        //定时器0初始化

        UART_Init();                  //串口初始化

                     

        LCD_Init();           //初始化液晶

        DelayMs(20);          //延时有助于稳定

        LCD_Clear();

        sprintf(dis0,"My Designer!!  ");//打印

        LCD_Write_String(0,0,dis0);//显示第一行

        sprintf(dis0,"V:%3.2fv A:%3.2fA",Volt,Acurrent);//打印电压电流值

        LCD_Write_String(0,1,dis0);//显示第二行

        uartSendStr("reday ok!!",10);

        while (1)         //主循环

        {

                midvolt=ReadADC(1);                                //读取AD检测到的 电压值

                DelayMs(50);          //延时有助于稳定

                midcur=ReadADC(0);                //读取电流转化后的电压值


                Volt=(float)midvolt*5.13/255*3;                //计算出电压 *3表示分压值

                Acurrent=(float)midcur*5.13/255;                //计算出电流

                                                                                               

                if(Acurrent>2.62)                         //如果电流转换后的电压值超过2.62

                {

                        Acurrent=(Acurrent-2.62)/0.185;         //电流模块 电压转换计算

                }

                else

                {

                        Acurrent=0;

                }       


                sprintf(dis0,"V:%3.2fv A:%3.2fA",Volt,Acurrent);//打印电压电流值

                LCD_Write_String(0,1,dis0);//显示第二行

//                uartSendStr(dis0,16);          //串口上报

//                uartSendStr("n",1);                           //换行

                DelayMs(200);          //延时有助于稳定

        }

}



void Init_Timer0(void)

{

        TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     

        TH0=(65536-20000)/256;                  //重新赋值 20ms

        TL0=(65536-20000)%256;

        EA=1;            //总中断打开

        ET0=1;           //定时器中断打开

        TR0=1;           //定时器开关打开

}


void Timer0_isr(void) interrupt 1

{

        TH0=(65536-20000)/256;                  //重新赋值 20ms

        TL0=(65536-20000)%256;

       

        time_20ms++;

}



void UART_Init(void)

{

    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  

    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装

    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz

        TL1 = TH1;  

    TR1   = 1;                  // TR1:  timer 1 打开                        

    EA    = 1;                  //打开总中断

    ES    = 1;                  //打开串口中断

}


void uartSendByte(unsigned char dat)

{

        unsigned char time_out;

        time_out=0x00;

        SBUF = dat;                          //将数据放入SBUF中

        while((!TI)&&(time_out<100))  //检测是否发送出去

        {time_out++;DelayUs2x(10);}        //未发送出去 进行短暂延时

        TI = 0;                                                //清除ti标志

}


void uartSendStr(unsigned char *s,unsigned char length)

{

        unsigned char NUM;

        NUM=0x00;

        while(NUM        {

                uartSendByte(*s);  //放松单字节数据

                s++;                  //指针++

                NUM++;                  //下一个++

           }

}


void UART_SER (void) interrupt 4         //串行中断服务程序

{

        if(RI)                        //判断是接收中断产生

        {

                RI=0;                      //标志位清零

        }

        if(TI)  //如果是发送标志位,清零

        TI=0;

}


……………………

Tags:单片机,电流表,电压表,设计  
责任编辑:admin
  • 上一篇文章:
  • 下一篇文章: 没有了
  • 请文明参与讨论,禁止漫骂攻击,不要恶意评论、违禁词语。 昵称:
    1分 2分 3分 4分 5分

    还可以输入 200 个字
    [ 查看全部 ] 网友评论
    关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 在线帮助 - 文章列表
    返回顶部
    刷新页面
    下到页底
    晶体管查询