馮:
基于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;
}
致謝:覃學長、思怡
作者:杏林潔白
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/275538.html
標籤:其他
上一篇:模電——半導體基礎知識
下一篇:TimeLine的使用
