一、前言
毕设采用了艾锐达公司的IM1281B电量计能模块,找了一圈没发现具体的51单片机的例程,现在写个能使用的C语言例程,方便以后的开发者们。
二、事前准备
引脚定义:
引脚 | 功能说明 |
---|---|
V+ | 供电正极(可引主控板5v) |
V- | 供电负极(可引主控板Gnd) |
RX | -串口通讯(接主控板TX)- |
TX | 串口通讯(接主控板RX) |
PF | 脉冲输出引脚,检测电能精度(不需要可悬空) |
VL | 用电器火线接口 |
VN | 用电器零线接口 |
接线示意图“
补充:该模块只能测交流。。。
三、例程
注意:此文件并不是一个完整的工程,但是函数基本都可以使用,可以参考。
/***************************************/
/***** Some funtion for send data*****/
/***************************************/
#define _IM1281B_C
typedef unsigned char uint8;
typedef unsigned short int uint16;
typedef unsigned long int uint32;
bit uart_busy = 0;
uint8 Tx_Buffer[8]; // 发送读取数据指令缓冲数组
uint8 Rx_Buffer[37];//接受到的数据
uint8 MeterUsedBuff[8] = {"000.000k"};
/*这个字符数组存放的电能数据,可以通过LCD1602打印出来,也可以通过串口发送*/
uint32 Energy_data;
/*延时5ms*/
void delay5ms() {
unsigned char a,b;
for(b=101;b>0;b--)
for(a=147;a>0;a--);
}
/****************************************************/
/************ 电能计量模块相关 **************/
/****************************************************/
/*电能数据刷新时调用此函数*/
void clear_data(void)
{
uint8 i = 0;
Tx_Buffer[0]=0x01; //这部分数据可以在艾锐达提供的上位机里边读到
Tx_Buffer[1]=0x03;
Tx_Buffer[2]=0x00;
Tx_Buffer[3]=0x48;
Tx_Buffer[4]=0x00;
Tx_Buffer[5]=0x08;
Tx_Buffer[6]=0xC4;
Tx_Buffer[7]=0x1A;
for(i=0;i<8;i++){
Uart_SendByteData(Tx_Buffer[i]); //最好单个字符发送,发送字符串的话00会被认为结束符
}
}
/*接收数据放到数组*/
//
void Analysis_data()
{
//电能数据的接收,其他数据也是类似
Energy_data=(((uint32)(RX_Buffer[15]))<<24)|(((uint32)(RX_Buffer[16]))<<16)|(((uint32)(RX_Buffer[17]))<<8)|RX_Buffer[18];
}
/*对接收的数据进行一个转化*/
void TransMeterData(uint32 meterdata){
//example:电能数据
uint16 data6=0,data5=0,data4=0,data3=0,data2=0,data1=0;
data6 = meterdata/1000000;
data5 = meterdata%1000000/100000;
data4 = meterdata%100000/10000;
data3 = meterdata%10000/1000;
data2 = meterdata%1000/100;
data1 = meterdata%100/10;
MeterUsedBuff[0] = data6 + '0';
MeterUsedBuff[1] = data5 + '0';
MeterUsedBuff[2] = data4 + '0';
MeterUsedBuff[3] = '.';
MeterUsedBuff[4] = data3 + '0';
MeterUsedBuff[5] = data2 + '0';
MeterUsedBuff[6] = data1 + '0';
}
void ReadMeterData(){ //这个函数在主函数里面调用即可
clear_data();
delay5ms();
Uart_SendStrData("read data ...\r\n");
Analysis_data();
TransMeterData(Energy_data);
}
/****************************************************/
/************ 串口收发数据相关 **************/
/****************************************************/
/*串口发送数据*/
void Uart_SendByteData(uint8 msg){
while(uart_busy);
SBUF = msg;
uart_busy = 1;
}
void Uart_SendStrData(uint8 *msg){
while(*msg){
Uart_SendByteData(*msg++);
}
}
/* 51单片机UART1中断服务函数 */
void InterruptUART() interrupt 4
{
uint8 rec;
if (RI) //接收到字节
{
if(rflag){
Rx_Buffer[i++] = SBUF;
if(i==37){
i=1;
rflag = 0;
}
}
else{
rec = SBUF;
if(rec == 0x01){ //
rflag = 1;
Rx_Buffer[0] = rec;
}
}
RI = 0;//手动清零接收中断标志位
}
if (TI) //字节发送完毕
{
TI = 0; //手动清零发送中断标志位
uart_busy = 0;
}
}
仅供参考,觉得有用的话给我点个赞把~
不会的也可以留言,我看到会尽力帮忙解答。