IM1281B电能计量模块_C语言例程
一、前言
毕设采用了艾锐达公司的IM1281B电量计能模块,找了一圈没发现具体的51单片机的例程,现在写个能使用的C语言例程,方便以后的开发者们。
二、事前准备
引脚定义:
引脚 | 功能说明 |
---|---|
V+ | 供电正极(可引主控板5v) |
V- | 供电负极(可引主控板Gnd) |
RX | 串口通讯(接主控板TX) |
TX | 串口通讯(接主控板RX) |
PF | 脉冲输出引脚,检测电能精度(不需要可悬空) |
VL | 用电器火线接口 |
VN | 用电器零线接口 |
接线示意图“
补充:该模块只能测交流。。。
三、例程
注意:此文件并不是一个完整的工程,但是函数基本都可以使用,可以参考。
1 /***************************************/ 2 /***** Some funtion for send data*****/ 3 /***************************************/ 4 5 6 #define _IM1281B_C 7 typedef unsigned char uint8; 8 typedef unsigned short int uint16; 9 typedef unsigned long int uint32; 10 11 bit uart_busy = 0; 12 uint8 Tx_Buffer[8]; // 发送读取数据指令缓冲数组 13 uint8 Rx_Buffer[37];//接受到的数据 14 uint8 MeterUsedBuff[8] = {"000.000k"}; 15 /*这个字符数组存放的电能数据,可以通过LCD1602打印出来,也可以通过串口发送*/ 16 17 uint32 Energy_data; 18 19 20 /*延时5ms*/ 21 void delay5ms() { 22 unsigned char a,b; 23 for(b=101;b>0;b--) 24 for(a=147;a>0;a--); 25 } 26 27 28 /****************************************************/ 29 /************ 电能计量模块相关 **************/ 30 /****************************************************/ 31 32 /*电能数据刷新时调用此函数*/ 33 void clear_data(void) 34 { 35 uint8 i = 0; 36 Tx_Buffer[0]=0x01; //这部分数据可以在艾锐达提供的上位机里边读到 37 Tx_Buffer[1]=0x03; 38 Tx_Buffer[2]=0x00; 39 Tx_Buffer[3]=0x48; 40 Tx_Buffer[4]=0x00; 41 Tx_Buffer[5]=0x08; 42 Tx_Buffer[6]=0xC4; 43 Tx_Buffer[7]=0x1A; 44 45 for(i=0;i<8;i++){ 46 Uart_SendByteData(Tx_Buffer[i]); //最好单个字符发送,发送字符串的话00会被认为结束符 47 } 48 49 } 50 51 /*接收数据放到数组*/ 52 // 53 void Analysis_data() 54 { 55 //电能数据的接收,其他数据也是类似 56 Energy_data=(((uint32)(RX_Buffer[15]))<<24)|(((uint32)(RX_Buffer[16]))<<16)|(((uint32)(RX_Buffer[17]))<<8)|RX_Buffer[18]; 57 } 58 59 /*对接收的数据进行一个转化*/ 60 void TransMeterData(uint32 meterdata){ 61 //example:电能数据 62 uint16 data6=0,data5=0,data4=0,data3=0,data2=0,data1=0; 63 data6 = meterdata/1000000; 64 data5 = meterdata%1000000/100000; 65 data4 = meterdata%100000/10000; 66 data3 = meterdata%10000/1000; 67 data2 = meterdata%1000/100; 68 data1 = meterdata%100/10; 69 MeterUsedBuff[0] = data6 + '0'; 70 MeterUsedBuff[1] = data5 + '0'; 71 MeterUsedBuff[2] = data4 + '0'; 72 MeterUsedBuff[3] = '.'; 73 MeterUsedBuff[4] = data3 + '0'; 74 MeterUsedBuff[5] = data2 + '0'; 75 MeterUsedBuff[6] = data1 + '0'; 76 } 77 78 void ReadMeterData(){ //这个函数在主函数里面调用即可 79 clear_data(); 80 delay5ms(); 81 Uart_SendStrData("read data ...\r\n"); 82 Analysis_data(); 83 TransMeterData(Energy_data); 84 } 85 86 /****************************************************/ 87 /************ 串口收发数据相关 **************/ 88 /****************************************************/ 89 90 /*串口发送数据*/ 91 void Uart_SendByteData(uint8 msg){ 92 while(uart_busy); 93 SBUF = msg; 94 uart_busy = 1; 95 } 96 void Uart_SendStrData(uint8 *msg){ 97 while(*msg){ 98 Uart_SendByteData(*msg++); 99 } 100 } 101 102 /* 51单片机UART1中断服务函数 */ 103 void InterruptUART() interrupt 4 104 { 105 uint8 rec; 106 if (RI) //接收到字节 107 { 108 if(rflag){ 109 Rx_Buffer[i++] = SBUF; 110 if(i==37){ 111 i=1; 112 rflag = 0; 113 } 114 } 115 else{ 116 rec = SBUF; 117 if(rec == 0x01){ //验证 118 119 rflag = 1; 120 Rx_Buffer[0] = rec; 121 } 122 } 123 RI = 0;//手动清零接收中断标志位 124 } 125 if (TI) //字节发送完毕 126 { 127 TI = 0; //手动清零发送中断标志位 128 uart_busy = 0; 129 } 130 }
仅供参考,觉得有用的话给我点个赞把~
不会的也可以留言,我看到会尽力帮忙解答。