冯:
基于IM1253B交直流电能计量模块(艾锐达光电)设计的测量电压、电流、功率测量物
该模块质量不错,价格便宜,使用简单,容易上手,测量电压范围大,可测交流,直流,功率等。
如果想要资料或者源码的话,关注私信我。
IM1253B交直流电能计量模块
- 模块图片
- 模块读取数据命令
- 模块数据刷新命令
- 接线
- 尺寸图
- 数据显示图片
- 主函数:
模块图片
模块读取命令和数据刷新命令是用商家提供的软件得来----发送数据那一行
模块读取数据命令
00 03 00 01 00 04 14 18------16进制
模块数据刷新命令
03 00 48 00 08 D1 C4------16进制
接线
尺寸图
数据显示图片
提供主函数的话基本就可以实现,其他的配置可以参考正点原子的来配置,我也是参考正点原子来配置的串口,IO口之类的
主函数:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "key.h"
#include "oled.h"
#include "timer.h"
unsigned char Tx_Buffer[8];
unsigned long Voltage_data,Current_data,Power_data,Energy_data,Pf_data,CO2_data;
void read_data(void);//读取数据-只用初始化
void Analysis_data(void);//分析数据-将发送的16进制转为10进制
void clear_data(void);//数据刷新-用来更新数据
int main(void)
{
delay_init(); //延时函数初始化-系统时钟
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
uart_init(4800); //串口初始化为4800
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //按键初始化
OLED_Init(); //OLED初始化
OLED_Clear(); //清屏
TIM3_Int_Init(4999,7199);//初始化定时器3 500ms
read_data(); //发送读取数据命令
while(1)
{
delay_ms(800);
clear_data();
delay_ms(800);
Analysis_data();
//显示信息--电压:
OLED_ShowCHinese(0,0,0);//x,y
OLED_ShowCHinese(20,0,1);//x,y
OLED_ShowCHinese(40,0,2);//x,y
//OLED_ShowNum(48,0,Voltage_data,6,16);
//显示数据
OLED_ShowNum(48,0,Voltage_data/100000,1,16);
OLED_ShowNum(56,0,Voltage_data/10000%10,1,16);
OLED_ShowChar(64,1,'.',12);
OLED_ShowNum(72,0,Voltage_data/1000%10,1,16);
OLED_ShowNum(80,0,Voltage_data/100%10,1,16);
OLED_ShowChar(91,0,'V',16);
//显示信息--电流:
OLED_ShowCHinese(0,2,3);//x,y
OLED_ShowCHinese(20,2,4);//x,y
OLED_ShowCHinese(40,2,5);//x,y
//显示数据
OLED_ShowNum(48,2,Current_data/10000%10,1,16);
OLED_ShowChar(56,3,'.',12);
OLED_ShowNum(64,2,Current_data/1000%10,1,16);
OLED_ShowNum(72,2,Current_data/100%10,1,16);
OLED_ShowNum(80,2,Current_data/10%10,1,16);
OLED_ShowNum(88,2,Current_data%10,1,16);
OLED_ShowChar(99,2,'A',16);
//显示信息--功率:
OLED_ShowCHinese(0,5,6);//x,y
OLED_ShowCHinese(20,5,7);//x,y
OLED_ShowCHinese(40,5,8);//x,y
//显示数据
OLED_ShowNum(48,5,Current_data*Voltage_data/100/1000000%10,1,16);
OLED_ShowChar(56,6,'.',12);
OLED_ShowNum(64,5,Current_data*Voltage_data/100/100000%10,1,16);
OLED_ShowNum(72,5,Current_data*Voltage_data/100/10000%10,1,16);
OLED_ShowNum(80,5,Current_data*Voltage_data/100/1000%10,1,16);
OLED_ShowNum(88,5,Current_data*Voltage_data/100/100%10,1,16);
OLED_ShowChar(99,5,'W',16);
}
}
//读取数据-只用初始化
void read_data(void)
{
int i=0;
//TX[8]:00 03 00 01 00 04 14 18--读取命令可能每个模块都不太一样根据商家提供的软件来看
// FF 03 00 48 00 08 D1 C4--数据刷新同上
Tx_Buffer[0]=0x01;
Tx_Buffer[1]=0x03;
Tx_Buffer[2]=0x00;
Tx_Buffer[3]=0x48;
Tx_Buffer[4]=0x00;
Tx_Buffer[5]=0x04;
Tx_Buffer[6]=0x14;
Tx_Buffer[7]=0x18;
for(i=0; i<8; i++)
{
USART_SendData(USART1,Tx_Buffer[i]); //发送命令
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//发送完数据
}
USART_RX_STA=0;
}
//分析数据-将发送的16进制转为10进制
void Analysis_data(void)
{
//解析数据(16转10)--商家提供的
Voltage_data=(((unsigned long)(USART_RX_BUF[3]))<<24)|(((unsigned
long)(USART_RX_BUF[4]))<<16)|(((unsigned long)(USART_RX_BUF[5]))<<8)|USART_RX_BUF[6];
Current_data=(((unsigned long)(USART_RX_BUF[7]))<<24)|(((unsigned
long)(USART_RX_BUF[8]))<<16)|(((unsigned long)(USART_RX_BUF[9]))<<8)|USART_RX_BUF[10];
Power_data=(((unsigned long)(USART_RX_BUF[11]))<<24)|(((unsigned
long)(USART_RX_BUF[12]))<<16)|(((unsigned long)(USART_RX_BUF[13]))<<8)|USART_RX_BUF[14];
Energy_data=(((unsigned long)(USART_RX_BUF[15]))<<24)|(((unsigned
long)(USART_RX_BUF[16]))<<16)|(((unsigned long)(USART_RX_BUF[17]))<<8)|USART_RX_BUF[18];
Pf_data=(((unsigned long)(USART_RX_BUF[19]))<<24)|(((unsigned
long)(USART_RX_BUF[20]))<<16)|(((unsigned long)(USART_RX_BUF[21]))<<8)|USART_RX_BUF[22];
CO2_data=(((unsigned long)(USART_RX_BUF[23]))<<24)|(((unsigned
long)(USART_RX_BUF[24]))<<16)|(((unsigned long)(USART_RX_BUF[25]))<<8)|USART_RX_BUF[26];
}
//数据刷新-用来更新数据
void clear_data(void)
{
int i=0;
//TX[8]:00 03 00 01 00 04 14 18--读取命令可能每个模块都不太一样根据商家提供的软件来看
// FF 03 00 48 00 08 D1 C4--数据刷新同上
Tx_Buffer[0]=0xFF;
Tx_Buffer[1]=0x03;
Tx_Buffer[2]=0x00;
Tx_Buffer[3]=0x48;
Tx_Buffer[4]=0x00;
Tx_Buffer[5]=0x08;
Tx_Buffer[6]=0xD1;
Tx_Buffer[7]=0xC4;
for(i=0; i<8; i++)
{
USART_SendData(USART1,Tx_Buffer[i]);//向串口一发送命令
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//发送完数据
}
USART_RX_STA=0;
}
致谢:覃学长、思怡
作者:杏林洁白