首页 / 纵览天下 / 正文
基于STC89C52单片机,电压电流检测及显示的硬件设计

Time:2025年04月07日 Read:2 评论:0 作者:haiwenboyue

1.简述

本文介绍了以单片机为核心。其中有以 -05 芯片作为电流检测电路,还有串联分压电路作为电压检测电路。通过数模转换芯片来采集和转换电压信号,接着把这些信号传输给单片机进行处理。最后,将处理后的电压值和电流值在显示屏上显示出来。

2.硬件设计

本设计的硬件主要包含 5 个部分。其一为单片机最小系统;其二是电流信号采样电路;其三为电压信号采集电路;其四是 ADC 转换电路;其五是显示屏电路。硬件框图呈现如下:

(1)电流信号采集电路

电流信号采集电路采用了 -05 芯片。此芯片完全基于霍尔感应原理设计。它由一个精确的低偏移线性霍尔传感器电路以及位于接近 IC 表面的铜箔组成。当电流流过铜箔时,会产生一个磁场。霍尔元件能根据该磁场感应出一个线性的电压信号。这个信号经过内部的放大、滤波、斩波与修正电路后,会输出一个电压信号。该输出的电压信号从芯片的第七脚输出,直接反映出流经铜箔电流的大小。具体电路如图:

量程依据尾缀的不同分为三个规格,分别是±5A、±20A、±30A。此次使用的量程是±5A。因为 ADC 转换芯片只能识别正压信号,所以电流的量程是 0 到 5A。05 电流电压对应关系如下,当 Ip = 0A 也就是没有输入电流时,对应的输出电压为 2.5V。精确度为 1/A,也就是图中斜线的斜率。若取 VCC = 5V,其计算公式为:

Vout = 2.5 + 0.185*Ip

(2)电压信号采集电路

电压信号采集电路较为简单。它主要运用了两个电阻来构成串联分压电路,该分压电路的分压比是 3。例如,当检测表笔检测到 15V 的电压时,因为分压比为 3,所以 R3 端的电压是 5V。倘若需要提升测试电压的测量精度,就可以更改分压比。在选用分压电阻时,应尽量挑选阻值较大的电阻。若电阻过小,就会致使输入电流过大。此电路仅适用于在测试输入阻抗较大的电路上的电压,倘若用于其他情况,测试出来的误差会较大。电路如图:

(3)ADC转换电路

本次 ADC 转换电路采用了某芯片。此芯片是单电源低功耗的 8 位 CMOS 数据采集器件,其分辨率为 256。该芯片具有 4 路模拟输入、1 路模拟输出以及一个串行 I2C 总线接口,用于与单片机进行通信。此电路会把电流信号和电压信号进行转换,然后传送给单片机。电路如图:

(4)总体电路

3.软件设计

软件流程较为简单。单片机上电之后,程序会对各个模块进行初始化操作。初始化完成后,程序进入循环状态。在循环过程中,会定时检测电流及电压值。并且会将最新的数据显示在显示屏上。程序流程如图:

(1)主函数

void main (void)
{     
定义了两个无符号字符型变量 midvolt 和 midcur,这两个变量用于存储电压和电流的中间变量值。
初始化定时器 0 。
	UART_Init();		  //串口初始化
	             
	LCD_Init();           //初始化液晶
延时 20 毫秒;延时能够起到稳定的作用。
	LCD_Clear(); 
通过 sprintf 函数的调用,将 "My Designer!!  " 格式化后存储在 dis0 中,实现了打印的功能。
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)读取到的电压值。
DelayMs 为 50 ;延时这个行为有助于保持稳定。
读取电流转化后的电压值,将其赋值给 midcur,即 midcur = ReadADC(0);
Volt 等于 midvolt 乘以 5.13 再除以 255 然后乘以 3;这是在计算出电压,其中乘以 3 表示分压值。
计算出电流,将 midcur 乘以 5.13 后再除以 255,得到的结果赋值给 Acurrent,Acurrent 为浮点数类型。
												
如果电流转换后的电压值比 2.62 大。  //如果电流转换后的电压值超过 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 发送一个换行符,参数为 1 。
DelayMs 500;延时的作用是有助于保持稳定。
	}
}

详细完整的程序,可下载源码。

标签:
关于我们
海文博阅网,打造全方位的文化信息阅读平台,涵盖社会动态、历史人文、生活百科等广泛内容。我们为读者提供高质量的资讯和深度文章,让阅读成为获取知识、拓宽视野的桥梁。在这里,您可以随时随地畅游知识的海洋,感受阅读的魅力。
发文扫码联系站长微信
Copyright ©2021-2025 Comsenz Inc.Powered by©haiwenboyue 文章发布联系站长:dat818