一、前言

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

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

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

IM1281B电能计量模块_C语言例程的更多相关文章

  1. 【书籍下载链接】_1_第一轮_C语言书籍

    各位朋友,如果您觉得下载的电子书,看的还可以,请购买纸质版的图书,如果您觉得 您下载的书,不值得一看请在下载后直接删除. Windows汇编:http://dl.vmall.com/c0jk1v970 ...

  2. 选择排序_C语言_数组

    选择排序_C语言_数组 #include <stdio.h> void select_sort(int *); int main(int argc, const char * argv[] ...

  3. 插入排序_C语言_数组

    插入排序_C语言_数组 #include <stdio.h> void insertSort(int *); int main(int argc, const char * argv[]) ...

  4. 快速排序_C语言_数组

    快速排序_C语言_数组 #include <stdio.h> void quickSort(int *, int, int); int searchPos(int *, int, int) ...

  5. 冒泡排序_C语言_数组

    冒泡排序_C语言_数组 #include <stdio.h> //冒泡排序 小->大 void sort(int * pArray, int len); int main(int a ...

  6. 探索 OpenStack 之(16):计量模块 Ceilometer 介绍及优化

    0. 背景 0.1 为什么要有 Ceilometer? 通常云,特别是公有云在计费方面有三个层次: 计量 (Metering): 收集资源的使用数据,其数据信息主要包括:使用对象(what), 使用者 ...

  7. C Primer Plus_第二章_C语言概述_复习题与编程练习

    REVIEW 1.如何称呼C程序的基本模块? ans 它们被称为函数 2.什么是语法错误?给出一个英语例子和一个C语言例子 me C的语法错误是指把正确的C符号放在了错误的位置 likes codin ...

  8. python中的future,你见过可以使用未来版本模块的语言吗?

    import xxx from yy.xxx import xx from yy.xxx import xx as x python最常见的导包导模块语句 yy为包名,包就是文件夹,模块就是xxx.p ...

  9. C++_系列自学课程_第_9_课_C语言风格字符串_《C++ Primer 第四版》

    前面说了写关于数组和指针的内容,这次在这里讨论一下字符串,讨论一下C语言风格的字符串. 在C语言里面我们利用字符数组来对字符串进行处理, 在C++里面我们前面说过一种类类型string可以对字符串进行 ...

  10. 探索 OpenStack 之(17):计量模块 Ceilometer 中的数据收集机制

    本文将阐述 Ceilometer 中的数据收集机制.Ceilometer 使用三种机制来收集数据: Notifications:Ceilometer 接收 OpenStack 其它服务发出的 noti ...

随机推荐

  1. 教你如何通过CodeArts IDE插件调用API,高效合成语音

    摘要:本实验基于华为云自研CodeArts IDE,指导用户通过使用华为云API,来实现一个文字合成语音的应用. 本文分享自华为云社区<通过CodeArts IDE插件调用API,高效合成语音! ...

  2. String API(全)

    类型 名称 char charAt(int index)返回 char指定索引处的值. int codePointAt(int index)返回指定索引处的字符(Unicode代码点). int co ...

  3. 创建用户认证授权的 kubeconfig 文件

    创建用户认证授权的 kubeconfig 文件 当我们安装好集群后,如果想要把 kubectl 命令交给用户使用,就不得不对用户的身份进行认证和对其权限做出限制. 下面以创建一个 cby 用户并将其绑 ...

  4. [Linux]网络检测工具之iperf

    1 安装网络检测工具 iperf step1.0 iperf的简介 [摘] iperf是一种命令行工具,用于通过测量服务器可以处理的最大网络吞吐量来诊断网络速度问题.它在遇到网络速度问题时特别有用,通 ...

  5. 面向对象编程(python)和部分面向对象高级编程

    1.类和对象 在python中定义类 class 类名(首字母最好大写)Student (Object(父类)): def __init__(self): self.属性 1= 参数1 self.属性 ...

  6. VMWare无法从主机向虚拟机复制粘贴

    VMWare无法从主机向虚拟机复制粘贴 问题描述 无法在本机和虚拟机之间实现复制粘贴和文件拖到功能. 系统环境 本机 Windows10 虚拟机 Centos7 解决方法 多次尝试重新安装VMware ...

  7. FormData收集表单信息&并且转化为Json格式进行提交验证

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. Qt5.9 UI设计(七)——统一样式设计

    前言 前面已经将UI设计部分实现,各页面也做了最简单的设计,本章介绍一下qss样式的使用.样式设计最终的显示效果如下图: 操作步骤 将stylesheet.qss 样式文件添加进工程 styleshe ...

  9. PaddlePaddle-快速入门

    PaddlePaddle-快速入门 终于进入到新手入门第四课啦~在最后一门课中我会给大家讲解如何快速入门PaddlePaddle,并让大家跑通一个小demo来熟悉PaddlePaddle的基本命令. ...

  10. [Pytorch框架] 2.5 循环神经网络

    文章目录 2.5 循环神经网络 2.5.1 RNN简介 RNN的起因 为什么需要RNN RNN都能做什么 2.5.2 RNN的网络结构及原理 RNN LSTM GRU 2.5.3 循环网络的向后传播( ...