找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12536|回复: 12
收起左侧

HLW8032芯片单相电能计量模块单片机程序-UART接口

  [复制链接]
ID:600684 发表于 2019-8-16 10:49 | 显示全部楼层 |阅读模式
L91-01是基于HLW8032的单相交流电能计量模块(以下简称模块),该模块包含一路交流电压和一路交流电流的采集,通过串口的形式送到单片机,模块可以测量电压,电流,功率,电量以及功率因数,例程中仅给出了测量电压,电流,功率,通过四位数码管显示。
适用:
Ø 单片机学习、DIY等。
2.jpg 1.jpg

附件包含原理图,51单片机的驱动例程,和芯片的Datasheet。

单片机源程序如下:
  1. #include "Config.H"
  2. //数码管0-9显示代码                    0         1          2           3        4    5    6           7        8    9       
  3. u8 DISPLAY_CODE[10]         = {        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };
  4. //数码管带点的0-9显示代码           0         1          2           3        4    5    6           7        8    9       
  5. u8 DISPLAY_Point_CODE[10]         = {        0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef };
  6. //数码管位数                                 1         2    3           4
  7. u8 DIG_BIT_CODE[4]          = {        0x68,0x6a,0x6c,0x6e };
  8. //8段显示亮度等级                           1         2          3           4        5         6    7           8                       
  9. u8 Light_Level_CODE[8]        = {        0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x01 };

  10. void I2CStart(void)//开始信号
  11. {
  12.         CLK_H;
  13.         DIO_H;
  14.         Delay_us(5);
  15.         DIO_L;
  16. }

  17. void I2Cask(void) //ACK信号
  18. {
  19.         u8 timeout = 1;
  20.         CLK_H;
  21.         Delay_us(5);
  22.         CLK_L;
  23.         while((DIO)&&(timeout<=100))
  24.         {
  25.                 timeout++;
  26.         }
  27.         Delay_us(5);
  28.         CLK_L;
  29. }

  30. void I2CStop(void) //停止信号
  31. {
  32.         CLK_H;
  33.         DIO_L;
  34.         Delay_us(5);
  35.         DIO_H;
  36. }

  37. void I2CWrByte(u8 oneByte) //写一个字节高位在前,低位在后
  38. {
  39.         u8 i;
  40.         CLK_L;
  41.         Delay_us(1);
  42.         for(i=0;i<8;i++)
  43.         {
  44.                 oneByte = oneByte<<1;
  45.                 DIO = CY;
  46.                 CLK_L;
  47.                 Delay_us(5);
  48.                 CLK_H;
  49.                 Delay_us(5);
  50.                 CLK_L;
  51.         }
  52. }

  53. void AiP650_Set(u8 add,u8 dat) //数码管显示
  54. {
  55.         //写显存必须从高地址开始写
  56.         I2CStart();
  57.         I2CWrByte(add); //第一个显存地址
  58.         I2Cask();
  59.         I2CWrByte(dat);
  60.         I2Cask();
  61.         I2CStop();
  62. }

  63. void AiP650_DisPlay(u8 DIG_Bit, u8 Display_num)                //显示一位数字
  64. {
  65.         AiP650_Set(DIG_BIT_CODE[DIG_Bit-1],DISPLAY_CODE[Display_num]);
  66. }

  67. void AiP650_CLR()                                                                   //清屏
  68. {
  69.         u8 i;
  70.         for(i=0;i<4;i++)
  71.         {
  72.                 AiP650_Set(DIG_BIT_CODE[i],0x00);               
  73.         }
  74. }

  75. void AiP650_DisPlayFourNum(u16 Display_num)                //显示一个四位数 (0-9999)
  76. {
  77.         u8 One,Two,Three,Four;
  78.         One   = Display_num/1000;
  79.         Two   = Display_num%1000/100;
  80.         Three = Display_num%100/10;
  81.         Four  = Display_num%10;
  82.         if(One == 0)
  83.         {
  84.                 AiP650_Set(DIG_BIT_CODE[0],0x00);       
  85.                 if(Two == 0)
  86.                 {
  87.                         AiP650_Set(DIG_BIT_CODE[1],0x00);
  88.                         if(Three == 0)
  89.                         {
  90.                                 AiP650_Set(DIG_BIT_CODE[2],0x00);
  91.                         }
  92.                         else
  93.                         {
  94.                                 AiP650_DisPlay(3,Three);
  95.                         }
  96.                         AiP650_DisPlay(4,Four);
  97.                 }
  98.                 else
  99.                 {
  100.                         AiP650_DisPlay(2,Two);
  101.                         AiP650_DisPlay(3,Three);
  102.                         AiP650_DisPlay(4,Four);       
  103.                 }
  104.         }
  105.         else  
  106.         {
  107.                 AiP650_DisPlay(1,One);
  108.                 AiP650_DisPlay(2,Two);
  109.                 AiP650_DisPlay(3,Three);
  110.                 AiP650_DisPlay(4,Four);
  111.         }                       
  112. }
  113. void AiP650_DisPlayOnePointNum(u16 Display_num)                //显示带一位小数
  114. {
  115.         u8 One,Two,Three,Four;
  116.         One   = Display_num/1000;
  117.         Two   = Display_num%1000/100;
  118.         Three = Display_num%100/10;
  119.         Four  = Display_num%10;
  120.         if(One == 0)
  121.         {
  122.                 AiP650_Set(DIG_BIT_CODE[0],0x00);       
  123.                 if(Two == 0)
  124.                 {
  125.                         AiP650_Set(DIG_BIT_CODE[1],0x00);
  126.                         AiP650_Set(DIG_BIT_CODE[2],DISPLAY_Point_CODE[Three]);
  127.                         AiP650_DisPlay(4,Four);
  128.                 }
  129.                 else
  130.                 {
  131.                         AiP650_DisPlay(2,Two);
  132.                         AiP650_Set(DIG_BIT_CODE[2],DISPLAY_Point_CODE[Three]);
  133.                         AiP650_DisPlay(4,Four);       
  134.                 }
  135.         }
  136.         else  
  137.         {
  138.                 AiP650_DisPlay(1,One);
  139.                 AiP650_DisPlay(2,Two);
  140.                 AiP650_Set(DIG_BIT_CODE[2],DISPLAY_Point_CODE[Three]);
  141.                 AiP650_DisPlay(4,Four);
  142.         }                       
  143. }
  144. void AiP650_DisPlayTwoPointNum(u16 Display_num)                //显示带两位小数
  145. {
  146.         u8 One,Two,Three,Four;
  147.         One   = Display_num/1000;
  148.         Two   = Display_num%1000/100;
  149.         Three = Display_num%100/10;
  150.         Four  = Display_num%10;
  151.         if(One == 0)
  152.         {
  153.                 AiP650_Set(DIG_BIT_CODE[0],0x00);       
  154.                 AiP650_Set(DIG_BIT_CODE[1],DISPLAY_Point_CODE[Two]);
  155.                 AiP650_DisPlay(3,Three);
  156.                 AiP650_DisPlay(4,Four);
  157.         }
  158.         else  
  159.         {
  160.                 AiP650_DisPlay(1,One);
  161.                 AiP650_Set(DIG_BIT_CODE[1],DISPLAY_Point_CODE[Two]);
  162.                 AiP650_DisPlay(3,Three);
  163.                 AiP650_DisPlay(4,Four);
  164.         }                       
  165. }
  166. void Light_Level_Set(u8 Level)                                           //设置亮度等级 1-8级
  167. {
  168.         AiP650_Set(0x48,Light_Level_CODE[Level-1]);
  169. }
  170. ……………………

  171. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
【实用电子小模块】单相电能计量模块-UART接口-HLW8032芯片.rar (1.91 MB, 下载次数: 526)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:600684 发表于 2019-8-19 14:14 | 显示全部楼层
第一次做,程序会持续优化,欢迎大家交流。
回复

使用道具 举报

ID:202599 发表于 2019-10-12 09:31 | 显示全部楼层
谢谢楼主,辛苦了。
回复

使用道具 举报

ID:59423 发表于 2019-10-12 13:50 | 显示全部楼层
计量芯片都是使用SPI接口居多。
回复

使用道具 举报

ID:79874 发表于 2019-11-4 15:10 来自手机 | 显示全部楼层
楼主能否提供下PCB设计源文件
回复

使用道具 举报

ID:65956 发表于 2019-11-5 09:53 | 显示全部楼层
这个我以前也作过,但效果不是很好,可能跟当时需求部门要求有一定的难度造成的,所以后来没有继续,现在下载你的下来参考一下
回复

使用道具 举报

ID:250660 发表于 2019-12-27 21:43 | 显示全部楼层
你的 CUR_Flag==0 注释了是为什么
回复

使用道具 举报

ID:55115 发表于 2020-7-28 13:25 | 显示全部楼层
不能知道和HLW8110通用不?下载来看看吧!
回复

使用道具 举报

ID:721297 发表于 2020-9-25 21:02 | 显示全部楼层
在帮别人写个测交流电压电流程序,用的HLW8110,没想到这个片子只有SOP8封装而且只支持串口9600bps通讯,网上想找个程序好难啊
回复

使用道具 举报

ID:824001 发表于 2020-9-27 21:17 来自手机 | 显示全部楼层
这个模块要校准吗
回复

使用道具 举报

ID:588044 发表于 2021-10-28 10:17 | 显示全部楼层
下来学习下,谢谢楼主分享!
回复

使用道具 举报

ID:1013669 发表于 2022-3-28 13:52 | 显示全部楼层
电量图不全啊。单片机电路在哪里?
回复

使用道具 举报

ID:373 发表于 2022-8-12 11:35 | 显示全部楼层
学习下,希望有用,有用我再来回帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表