首页 > 编程知识 正文

stc单片机(单片机ad检测电压电路)

时间:2023-05-04 21:25:27 阅读:75155 作者:4607

硬件设计(附件末尾) ) ) )。

系统功能设计51单片机锂电池电压电流容量检测仪液晶显示66

本系统由STC89C52单片机、分压、A/D芯片PCF8591、ACS712电流检测、LCD1602液晶显示及电源组成。

1、51单片机驱动pcf8591采集分压值,计算获取实际电压值,ACS712获取当前电流转换的电压值,计算获取电流值。

2 .单片机驱动LCD1602液晶显示锂电池的电压、放电电流和当前容量。

3、为了便于电流采集,可以在负载上连接电阻作为负载。

原理图:STC89C52RC是STC公司生产的低功耗、高性能CMOS8位微控制器,拥有8K字节系统的可编程闪存。 STC89C52使用经典的MCS-51内核,但为了使芯片具有传统的51单片机所没有的功能,进行了许多改进。 通过在单芯片上配备灵巧的8位CPU和系统可编程的Flash,STC89C52为许多嵌入式控制APP应用系统提供了高灵活性和超高效的解决方案。 8k字节闪存、512字节RAM、32位I/O端口线路、看门狗计时器、集成4KB EEPROM、MAX810复位电路、三个16位计时器/计数器、四个外部中断、一个STC89C52还可以降低到0.0hz的静态逻辑操作,并且支持两种软件以选择省电模式。 在空闲模式下,CPU停止工作,允许RAM、计时器/计数器、串行和中断继续工作。 掉电保护方式会保存RAM的内容,冻结振荡器,停止单片机的所有动作,直到下一个中断或硬件复位。 最大工作频率35MHz、6T/12T选项。

本系统选择PCF8591作为A/D采样芯片。 PCF8591是单片集成、单独供电、低功耗、8位CMOS数据获取器件。 PCF8591有四个模拟输入、一个模拟输出和一个串行IC总线接口。 PCF8591的三个地址引脚A0、A1和A2可用于硬件地址编程,在同一I2C总线上连接八个PCF8591设备,而无需额外的硬件。 输入输出到PCF8591设备的地址、控制、数据信号通过双线双向I2C总线串行传输。

一.芯片特性

)1)单独供电

(2) PCF8591的工作电压范围为2.5V-6V

)3)低待机电流

(4)基于I2C总线的串行输入输出

)5) PCF8591通过三个硬件地址管脚寻址

(6) PCF8591的采样率由I2C总线率决定

(7)个模拟输入可编程为单端型或差动输入

)8)自动增量通道选择

)9) PCF8591的模拟电压范围从VSS到VDD

(10 ) PCF8591内置跟踪保持电路

) 11 ) 8位逐次逼近A/D转换器

ACS712电流传感器模块电路设计

该传感器使用的芯片为ACS712-05A,可以检测5A范围内的直流电流。 ACS712芯片专用于电流检测芯片,高度集成的制作技术和专业的电流检测技术可为各种交流直流电流检测提供经济准确的解决方案。 此设备包很容易由客户实施。 ACS712芯片的典型应用有开关式电源设备和过电流故障保护、负载检测与管理系统、电机控制系统等。

ACS712芯片使用精确、低偏置的线性霍尔传感器电路,其电流路径抗电流路径的阻抗,任天堂路径接近晶片表面时测量精度提高。

经由该通知的电流路径施加电流是因为在芯片内部产生磁场,磁场进入集成在内部的霍尔元件,转换成一定比例的电压值。 该电压值经过AD转换后被微处理器获取,在精加工处理后显示,该期间在出厂时进行了精度的校正。

如果芯片内部的电流路径(从针脚1和针脚2到针脚3和针脚4 )的电流持续上升,则设备的输出属于正斜率(VIout(q ) ) )。 该ACS712电流传感器集成电路可用于要求电绝缘但未使用光电绝缘体和其他昂贵绝缘技术的APP应用。

一、传感器模块功能特点

(1)低噪声模拟信号通路。

)2)通过专用滤波器引脚设置设备的滤波器带宽。

(3) 5s输出的上升时间对应于步进输入电流。

)4)带宽80千赫兹。

)5)总输出误差为1.5%(ta=25c时)。

)6)采用小型低厚度SOIC8封装。

)7) 1.2 m内传导电阻。

)8)引脚之间有2.1k VRMS以上的绝缘电压。

)9) 5.0伏,单电源操作。

(10 )输出灵敏度从66 )达到185 mV/A。

(11 )输出电压值与测得的交直流电流成正比关系。

) 12 )出厂精度校准。

(13 )极稳定的输出偏压。

) 14 )接近零的滞后。

二、使用说明

)1)模块可以测量5A的电流。

)2)电源电压的比例输出与模拟输出: ) 185mv/a相对应。

)3)没有检测电流时的输出电压为VCC/2。

(4)因为ACS712基于霍尔检测原理,所以使用时要小心避免磁场。 对此的影响。

三.模块接口说明

(1) ) ) )。

VCC 接5V
(2)GND 接GND
(3)OUT 模拟信号输出。
(4)J2端子2孔 接输入电流检测线

程序设计 #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<stdio.h>#include "1602.h"#include "delay.h"#include "i2c.h"char dis0[16]; //打印数组初始化unsigned long time_20ms=0xaaaaaaaa; //定时器计数unsigned char count =0; //采集次数计数float Volt=0.0; //检测电压xdata float sumVolt,midV; //用于滤波 中间变量float Acurrent=0.0; //检测电流xdata float sumAcur,midA;//用于滤波 中间变量float BatCap=80; //容量初始化void Init_Timer0(void);void uartSendStr(unsigned char *s,unsigned char length);void UART_Init(void);void uartSendByte(unsigned char dat);void main (void){ Init_Timer0(); //定时器0初始化UART_Init(); LCD_Init(); //初始化液晶DelayMs(20); //延时有助于稳定LCD_Clear(); uartSendStr("reday ok!!",10);while (1) //主循环{midV=(float)ReadADC(1)*5.13/255*2;//计算出电压 *2表示分压值DelayMs(2); //延时有助于稳定Acurrent=(float)ReadADC(0)*5.13/255;//计算出电流if(Acurrent>2.6) //如果电流转换后的电压值超过2.6{midA=(Acurrent-2.6)/0.185;} //电流模块 电压转换计算else{midA=0;}if(midA < 0.1) midA = 0; //防止参考电压变化造成影响sumAcur = sumAcur + midA;//多次测量求平均sumVolt = sumVolt + midV;//多次测量求平均count++;//采集次数if(count >= 5){ count = 0;Acurrent = sumAcur/5; //Q求平均if(Acurrent < 0.1) Acurrent= 0;//滤波微小波动sumAcur = 0;Volt = sumVolt/5;//求平均if(Volt<1)Volt=0;//滤除小波动sumVolt =0;if(Volt>4.15)//电压值对比{BatCap = 0.99;}//容量else if(Volt<3.4){BatCap =0;}else{BatCap = (Volt-3.4)/(4.15-3.4);}//正常情况下计算比例 sprintf(dis0,"The BatCap: %2.0f%%",BatCap*100);//打印电池容量值LCD_Write_String(0,0,dis0);//显示第一行sprintf(dis0,"V:%3.2fv A:%3.2fA",Volt,Acurrent);//打印电压电流值LCD_Write_String(0,1,dis0);//显示第二行}DelayMs(40); //延时有助于稳定}}void Init_Timer0(void){//**All notes can be deleted and modified**// TMOD |= 0x10; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 TH0=(65536-20000)/256; //重新赋值 20msTL0=(65536-20000)%256;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}void Timer0_isr(void) interrupt 1 {TH0=(65536-20000)/256; //重新赋值 20msTL0=(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.0592MHzTL1 = TH1; TR1 = 1; // TR1: timer 1 打开 EA = 1; //打开总中断 ES = 1; //打开串口中断}

.

文件仅供参考:
链接:https://pan.baidu.com/s/1OsGF0mKd5jlUe4TV7MRXJg
提取码:a35g

.

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。