一、前言

毕设采用了艾锐达公司的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. 设计模式(二十九)----综合应用-自定义Spring框架-Spring IOC相关接口分析

    1 BeanFactory解析 Spring中Bean的创建是典型的工厂模式,这一系列的Bean工厂,即IoC容器,为开发者管理对象之间的依赖关系提供了很多便利和基础服务,在Spring中有许多IoC ...

  2. 全网最详细中英文ChatGPT-GPT-4示例文档-事实性回答应用从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

    目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示 ...

  3. JQ的尺寸类

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 什么时候需要使用try-catch

    代码执行预料不到的情况,或出错的可能性很大时,使用try-catch语句 构造一个文件输入流(上传文件时,线上环境的内存情况不确定)出错的可能性很大 文件上传写入, 数据库事务的提交,还有摄像头和打印 ...

  5. C#自定义事件(简单版本)

    C#中的事件分为两种:一种是厂商微软在VS中已经内置,以供用户使用:另一种是有用户自己定义的事件: 先简单回顾下第一种: [场景1]一个Form上一个Textbox控件和Button控件,当用户按下B ...

  6. 经GitHub将kubernetes镜像推送到阿里云

    背景 在安装kubernetes时会出现无法访问镜像站的情况,通过GitHub将kubernetes镜像推送到阿里云之后,即可使用阿里云地址引用所需镜像,现已同步镜像5000+,当前还在陆续同步.仓库 ...

  7. Moebius数据库多活集群

    背景 数据库是信息化的基石,支撑着整个业务系统,发挥着非常重要的作用,被喻为"IT的心脏".因此,让数据库安全.稳定.高效地运行已经成为IT管理者必须要面对的问题.数据库在底层架构 ...

  8. 关于取消DevTools listening on ws://127.0.0.1…提示的方法

    Python代码写好之后,通过任务计划程序定期执行.py文件,但总会有命令窗口,虽然不影响程序执行,但每次需要手动叉掉比较烦.于是我网上搜索了一些方法. 网上的方法并没有直接解决我的问题,但我借助搜索 ...

  9. 面试题:JS如何最快的执行垃圾回收机制

    因为没看见答案,所以也不知道对不对. JavaScript 的垃圾回收机制是由 JavaScript 引擎自动管理的,通常情况下我们无法控制垃圾回收机制的执行时间和频率. 然而,我们可以采取一些优化策 ...

  10. Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】

    一.VsCode 常见的配置 1.取消更新 把插件的更新也一起取消了 2.设置编码为utf-8:默认就是了,不用设置了 3.设置常用的开发字体:Consolas, 默认就是了,不用设置了 字体对开发也 ...