IM1281B电量计能模块

一、前言

毕设采用了艾锐达公司的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;
    }
}

仅供参考,觉得有用的话给我点个赞把~

不会的也可以留言,我看到会尽力帮忙解答。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值