一、前言

毕设采用了艾锐达公司的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. Moho Pro - Mac 上一款专业的二维动画制作软件,强大的功能让你尽情发挥创意

    Moho,以前被称为动画工作室专业版,是最好的质量的2D动画软件之一.这个程序是理想的专业人士寻找一个更有效的替代方法来创建动画,没有繁琐的详细逐帧处理.具有直观的界面和现成的人物和附加对象(卡通对象 ...

  2. Jmix 如何将外部数据直接显示在界面?

    企业级应用中,通常一个业务系统并不是孤立存在的,而是需要与企业.部门或者是外部的已有系统进行集成.一般而言,系统集成的数据和接口交互方式通常有以下几种: 文件传输:通过文件传输的方式将数据传递给其他系 ...

  3. 四月十七日Java基础知识点

    1.默认构造方法:如果class前面有public修饰符,则默认的构造方法也会是public的.由于系统提供的默认构造方法往往不能满足需求,所以用户可以自己定义类的构造方法来满足需要,一旦用户为该类定 ...

  4. Seal AppManager发布:基于平台工程理念的全新应用部署管理体验

    4月12日,数澈软件Seal(以下简称"Seal")宣布推出新一代应用统一部署管理平台 Seal AppManager,采用平台工程的理念,降低基础设施操作的复杂度为研发和运维团队 ...

  5. AspectCore和MSDI 实现Name注册以及解析对象

    AspectCore 在注册服务这块比较简单,默认是无法根据Name去注册和解析对象,这边做一下这块的扩展 大致原理是根据自定义Name去生成对应的动态类型,然后使用委托或者对象的方式,进行注册 ti ...

  6. Java并发(三)----创建线程的三种方式及查看进程线程

    一.直接使用 Thread // 创建线程对象 Thread t = new Thread() {    public void run() {        // 要执行的任务   } }; // ...

  7. MapStruct实体映射转换

    1.MapStruct简介 MapStruct是一个代码生成器,它基于约定优于配置的方法,极大地简化了Java bean类型之间映射的实现.生成的映射代码使用简单的方法调用,快速.类型安全且易于理解. ...

  8. 继承 extends

    首先是基础的继承关系,用extend就可以继承. 再者是继承的东西,包括:变量(也包括类变量).全部非私有的属性和方法(除了父类的构造方法) 注:构造方法 class C{ public C() { ...

  9. Prism Sample 7 Module xaml

    这一节使用xaml标记甚为不解. 本节注册module 的方式同directory一节很类似.在那一节中,用工厂方法创建一模块目录: protected override IModuleCatalog ...

  10. HTML中meta标签的那些属性

    <meta> 标签是 HTML 中用于描述网页元信息的元素.它位于 <head> 部分,不会显示在页面内容中,但对于浏览器.搜索引擎等具有重要作用.主要作用有:定义文档的字符编 ...