功能:
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;
}
}
本系统基于STC89C52单片机设计,利用LCD1602实时显示电流电压,并支持采样电阻与互感器两种测量方式。具备声光报警功能,可通过按键设置阈值。
1万+

被折叠的 条评论
为什么被折叠?



