一、前言

毕设采用了艾锐达公司的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. C/C++ 恨透了 double free or corruption

    *以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/IwSVImp5cOB3gZbaf0YiPw 写过 C/C++ 的都 ...

  2. C++类的构造函数、析构函数、拷贝构造函数、赋值函数和移动构造函数详细总结

    目录 1. 五种函数介绍 2. 左值&右值怎么区分?怎么看? 3. 匿名对象的3种使用情况 4. 代码详细验证每个函数调用情况 4.1 测试 f_1 函数(函数形参测试 -- 值传递) 4.2 ...

  3. React的组件化/工程化开发(脚手架)

    脚手架: create-react-app 安装脚手架: $ npm i create-react-app -g 检查安装: $ npm create-react-app --version 新建项目 ...

  4. 在 Vue 中控制表单输入

    Vue中v-model的思路很简单.定义一个可响应式的text(通常是一个ref),然后用v-model="text"将这个值绑定到一个input上.这就创造了一个双向的数据流: ...

  5. Alchemy Nft黑客松任务(第一周)

    Alchemy是什么项目? 2019年12月,Alchemy完成1500万美元A轮融资,资方为Pantera Capital,斯坦福大学,Coinbase,三星等. 2021年4月,Alchemy以5 ...

  6. 五月十四号java基础知识点

    class Person{ private String name; private int age; public Person(String name,int age){ this.name = ...

  7. JQuery日期选择控件-兼容手机端

    在项目中经常使用到日期时间控件. 用的时候总是临时去找,现在记录下,以备下次使用. 官网http://www.bootcss.com/p/bootstrap-datetimepicker/ 需要引用一 ...

  8. python过滤列表元素

    li = [1, 2, 3, 4, 5, 6] def fun(item, num): if item == num: return 1 else: return 0 def fun1(item, n ...

  9. Terraform 系列-Terraform Cloud 比 Terraform OSS 有哪些增强?

    系列文章 Terraform 系列文章 前言 最近在使用 Terraform Cloud 来置备 OCI 的 Always Free Tier, 发现它非常好用,相比 Terraform OSS, 用 ...

  10. 关于Java中代码的执行顺序

    结论 注意 只有显式的加载类 JVM才会加载到内存中 先加载父类的静态代码块 然后执行子类静态代码块 当前类存在类静态变量注意引用类型没进行赋值操作初始化为null 并不会显式的加载类又存在静态代码块 ...