基于51单片机220V交流电流电压检测系统过流阈值报警设计原理图PCB

本系统基于STC89C52单片机设计,利用LCD1602实时显示电流电压,并支持采样电阻与互感器两种测量方式。具备声光报警功能,可通过按键设置阈值。

功能:
0.本系统采用STC89C52作为单片机
1.系统采用LCD1602液晶可以实时显示电流电压等参数
2.该系统支持采样电阻测电流和互感器测电流两种方式,其中采样电阻测量方式是需要将线路串接到电路中,而互感器是不需要串接。
3.系统具备四个功能按键可以设置电流阈值等参数
4.采用DC002作为电源接口可直接输入5V给整个系统供电
5.系统采用LED和蜂鸣器组成声光报警系统

该系统的电流电压测量精度是经过了市面上万用表和电流钳的验证,精度十分可靠!有很多类似的设计一旦测试吹风机或者电机这种感性负载,电流精度就会表现得十分差劲,而本系统是特地找了吹风机这种感性负载测试,精度仍然理想!

原理图:
在这里插入图片描述

PCB :
在这里插入图片描述

主程序:

#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include "lcd1602.h"
#include "delay.h"
#include "hlw8032.h"

sbit KEY_ADD = P3^4; //引脚定义
sbit KEY_SUB = P3^6; 
sbit KEY_SET = P3^3;
sbit KEY_ENTER = P3^5;
sbit BUZZER = P2^2;


bit setFlag = 0; //设置标志
unsigned char refreshFlag;       //显示更新标志
float setData = 4.0;         //电流值及设置值
xdata unsigned char dis0[16];

void Timer0_Init(void); //定时器初始化
void KeyProcess(void); //按键处理

void main(void)
{
    Timer0_Init(); //定时器0初始化    
    UART_Init();

    BUZZER = 0; //蜂鸣器响一声
    DelayMs(200);
    BUZZER = 1; //关闭蜂鸣器

    LCD_Init();  //初始化液晶
    DelayMs(20); //延时有助于稳定
    LCD_Clear(); //清屏

    while (1) //主循环
    {

        if (startFlag == 1) //开始电压电流功率数据处理
        {
            unsigned char i;
            if (count >= 23)
            {
                Data_Processing(&VCP_Data);
                for (i = 0; i < count; i++)
                {
                    buf[i] = 0; //清空数据
                }
            }
            startFlag = 0;
        }

        if (refreshFlag == 1) //显示标志
        {
            refreshFlag = 0; //显示标志

            sprintf(dis0, "Voltage: %6.2fV", VCP_Data.voltage); //打印
            LCD_DispStr(0, 0, dis0);                              //显示

            sprintf(dis0, "C:%5.2fA S:%4.1fA", VCP_Data.current, setData); //打印
            LCD_DispStr(0, 1, dis0);                              //显示

            if (setFlag == 1)
            {
                LCD_SetCursor(15, 1, 1);
            }

            if (VCP_Data.current >= setData) //超过设定阈值
            {
                BUZZER = 0; //打开蜂鸣器
            }
            else
            {
                BUZZER = 1; //关断蜂鸣器
            } 
        }
        KeyProcess();

    }
}

void KeyProcess(void)
{
    if (!KEY_SET) //设置键按下
    {
        DelayMs(20); //延时去抖
        if(!KEY_SET) //再次确认按键按下
        {
            setFlag = 1;
        }
        while(!KEY_SET);
    }

    if (!KEY_ENTER) //设置键按下
    {
        DelayMs(20); //延时去抖
        if(!KEY_ENTER) //再次确认按键按下
        {
            setFlag = 0;
            LCD_WriteCommand(0x0C, 0); //关闭闪烁
        }
        while(!KEY_ENTER);
    }

    if (setFlag == 1) //处于设置状态
    {
        if (!KEY_ADD) //加键按下
        {
            DelayMs(180); //延时去抖
            if(!KEY_ADD) //再次确认按键按下
            {
                if (setData < 10.0)
                {
                    setData = setData + 0.1;
                }
                sprintf(dis0, "S:%4.1fA", setData); //打印
                LCD_DispStr(9, 1, dis0); //显示
            }
            // while(!KEY_ADD);
        }

        if (!KEY_SUB) //减键按下
        {
            DelayMs(180); //延时去抖
            if(!KEY_SUB) //再次确认按键按下
            {
                if (setData > 0.10) //值-0.1
                {
                    setData = setData - 0.1;
                }
                sprintf(dis0, "S:%4.1fA", setData); //打印
                LCD_DispStr(9, 1, dis0); //显示
            }
            // while(!KEY_SUB);
        }
    }
}

void Timer0_Init(void)
{
    TMOD |= 0x01;                //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
    TH0 = (65536 - 18432) / 256; //重新赋值 20ms
    TL0 = (65536 - 18432) % 256;
    EA = 1;  //总中断打开
    ET0 = 1; //定时器中断打开
    TR0 = 1; //定时器开关打开
}

void Timer0_isr(void) interrupt 1
{
    static unsigned char time_20ms = 0; //定时变量

    TH0 = (65536 - 18432) / 256; //重新赋值 20ms
    TL0 = (65536 - 18432) % 256;
    time_20ms++;
    if (time_20ms >= 50)
    {
        refreshFlag = 1;
        time_20ms = 0;
    }
}

实物演示视频:
https://www.bilibili.com/video/BV1sM411C7ge/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值