找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5972|回复: 7
收起左侧

单片机+ACS712电流采样检测监控开发工控板源码等资料下载

  [复制链接]
ID:280979 发表于 2018-2-24 13:32 | 显示全部楼层 |阅读模式
【ACS712简介】
ACS712具有精确的低偏置线性霍尔传感器电路,且其铜制的电流路径靠近晶片的表面。通过该铜制电流路径施加的电流能够生成可被集成霍尔IC感应并转化为成比例电压的磁场。通过将磁性信号靠近霍尔传感器,实现器件精确度优化。精确的成比例电压由稳定斩波型低偏置BiCMOS霍尔IC提供,该IC出厂时已进行精确度编程。
当通过用作电流感测通路的主要铜制电流路径(从引脚1和2,到3和4)的电流不断上升时,器件的输出具有正斜率(>VIOUT(Q))。该传导通路的内电阻通常是1.2 mΩ,具有较低的功耗。铜线的粗细允许器件在可达5×的过电流条件下运行。传导通路的接线端与传感器引脚(引脚5到8)是电气绝缘的。这让ACS712电流传感器可用于那些要求电气绝缘却未使用光电绝缘器或其它昂贵绝缘技术的应用。
ACS712采用小型的表面安装SOIC8封装。引脚架镀采用100%雾锡电镀,可与标准无铅(Pb)印刷电路板装配流程兼容。在内部,该器件为无铅产品,倒装法使用当前豁免于RoHS的高温含铅焊球除外。器件在出厂装运前已完全校准。

0.png

包含以下单片机控制源码:
0.png

电流检测MODBUS协议:
l  串口波特率:1位起始位、8位数据位1位停止位、无效验
l  默认地址:0x01
l  通讯接口:RS485
l  通信协议:MODBUS-RTU模式
l  读取下位机检测电流值:
l  上位机发送:
  地址
  
  功能
  
  寄存器地址
  
  读取数据个数
  
  CRC校验
  
  0x01
  
  0x03
  
  高:0x00
  
  低:0x01
  
  高:0x00
  
  低:0x01
  
  0xD5
  
  0x CA
  








l  下位机返回:
  地址
  
  功能
  
  字节数
  
  电流值
  
  CRC校验
  
  0x01
  
  0x03
  
  0x02
  
  高:0x00
  
  低:0x00
  
  0xB8
  
  0x44
  








读取下位机设定值:
上位机发送:
  地址
  
  功能
  
  寄存器地址
  
  读取数据个数
  
  CRC校验
  
  0x01
  
  0x03
  
  高:0x00
  
  低:0x02
  
  高:0x00
  
  低:0x01
  
  0x25
  
  0x CA
  








下位机返回:
  地址
  
  功能
  
  字节数
  
  温度值
  
  CRC校验
  
  0x01
  
  0x03
  
  0x02
  
  高:0x00
  
  低:0x00
  
  0xB8
  
  0x44
  










l  控制继电器打开
l  上位机发送
  地址
  
  功能
  
  寄存器地址
  
  读取数据个数
  
  CRC校验
  
  0x01
  
  0x05
  
  高:0x00
  
  低:0x00
  
  高:0xff
  
  低:0x00
  
  0x8C
  
  0x 3A
  








l  下位机返回
  地址
  
  功能
  
  寄存器地址
  
  读取数据个数
  
  CRC校验
  
  0x01
  
  0x05
  
  高:0x00
  
  低:0x00
  
  高:0xff
  
  低:0x00
  
  0x8C
  
  0x 3A
  









l  控制继电器关闭
l  上位机发送
  地址
  
  功能
  
  寄存器地址
  
  读取数据个数
  
  CRC校验
  
  0x01
  
  0x05
  
  高:0x00
  
  低:0x00
  
  高:0x00
  
  低:0x00
  
  0xCD
  
  0x CA
  








l  下位机返回
  地址
  
  功能
  
  寄存器地址
  
  读取数据个数
  
  CRC校验
  
  0x01
  
  0x05
  
  高:0x00
  
  低:0x00
  
  高:0x00
  
  低:0x00
  
  0xCD
  
  0x CA
  










设定电流报警值
上位机发送
  地址
  
  功能
  
  寄存器地址
  
  设定10A
  
  CRC校验
  
  0x01
  
  0x06
  
  高:0x00
  
  低:0x02
  
  高:0x00
  
  低:0x0A
  
  0XA8
  
  0x 0D
  








下位机返回
  地址
  
  功能
  
  寄存器地址
  
  返回设定2A
  
  CRC校验
  
  0x01
  
  0x06
  
  高:0x00
  
  低:0x02
  
  高:0x00
  
  低:0x0A
  
  0Xca8
  
  0x 0D
  










数码管正常交流电流带MOUDBUS -(0到5A量程)无加倍共阴单片机源程序如下:
  1.     /********************************************************************
  2. ********************************************************************/
  3. #include "hader\\main.h"
  4. #include<math.h>
  5. #define uchar unsigned char//宏定义无符号字符型
  6. #define uint unsigned int  //宏定义无符号整型
  7. #define FOSC 11059200L
  8. #define BAUD  9600

  9. #define ADC_POWER   0x80            //ADC 电源控制位
  10. #define ADC_FLAG    0x10            //ADC 转换结束标志位
  11. #define ADC_START   0x08            //ADC 开始转换控制位
  12. #define ADC_SPEEDHH 0x60            //270个时钟周期转换一次

  13. sfr ADC_DATA=0xc6;           //70个时钟周期转换一次
  14. void display(void);         //显示函数
  15. void t_to_dis(uint num);

  16. #define DUAN P2                   //P0口控制段
  17. #define WEI  P1                   //P2口控制位
  18. /********************************************************************
  19.                             初始定义
  20. *********************************************************************/
  21. //数码管显示段码
  22. code uchar seg7code[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF};
  23. uchar numb[4];              //定义字符串用于数值转换
  24. uint cnt=0,times=0;
  25. uint ad,ad2=0,ad3=0,ad22=0;
  26. float ad1=0;
  27. bit flag,write;        //定时标志位
  28. uint16 idata setcurent,setcurent1;
  29. uchar  idata keystat[3];

  30. uint ii=0;jj=0;
  31. uint  adcj[200];
  32. uint adcj2[13];

  33. bit bt1ms,flag,flag1;        //定时标志位
  34. uint8        idata sendBuf[32],receBuf[16]; //发送接收缓冲区
  35. uint8        idata receTimeOut;                //接收超时
  36. uint16 idata setcurent;
  37. // 串行中断程序
  38. void initInt(void)
  39. {
  40.     SCON = 0x50;
  41.         TMOD = 0x21;
  42.          PCON = 0;
  43.         TH0 =(655336-1000)/256;
  44.     TL0 =(655336-1000)%256;
  45.         TH1=  0xfd;       
  46.         TL1 = 0xfd;                             //波特率 9600
  47.         TR0 = 1;
  48.         TR1=1;                       
  49.     ET0 = 1;
  50.         ES = 1;
  51.         EA = 1;               
  52. }
  53. //初始化
  54. void initProg(void)
  55. {       
  56.     P2M1=0;
  57.         P2M0=0xff;
  58.         P1M1=0x80;
  59.         P1M0=0x0f;
  60.         P3M1&=0x7f;
  61.         P3M0|=0x80;
  62.         initInt(); //初始化定时器
  63. }

  64. /********************************************************************
  65.                             超时处理
  66. *********************************************************************/
  67. void timeProc(void)
  68. {       
  69.         if(bt1ms)        //如果1ms到
  70.         {
  71.                 bt1ms = 0;
  72.         if(receTimeOut>0)        //如果接收超时值>0
  73.         {
  74.             receTimeOut--;        //接收超时-1(1ms减1次)
  75.             if(receTimeOut==0 && receCount>0)   //判断通讯接收是否超时
  76.             {
  77.                 receCount = 0;      //将接收地址偏移寄存器清零
  78.                                 checkoutError = 0;
  79.             }
  80.         }
  81.         }
  82. }   // void TimerProc(void)
  83. /********************************************************************
  84.                             延时函数
  85. *********************************************************************/
  86. void delay(uint x)//延时程序 0.1秒
  87. {
  88.         uint m,n,s;
  89.         for(m=x;m>0;m--)
  90.         for(n=20;n>0;n--)
  91.         for(s=248;s>0;s--);
  92. }
  93. void xs(uchar);
  94. /********************************************************************
  95.                          AD转换初始化程序
  96. *********************************************************************/
  97. void InitADC()
  98. {
  99.     P1=P1M0|=0xf0;
  100.         P1M1=0x00;
  101.         ADC_DATA=0;        //AD数据寄存器清空
  102.     ADC_CONTR=ADC_POWER|ADC_SPEEDHH|ADC_START;//打开AD电源,转换周期XX
  103.     delay(10);                //延时
  104. }
  105. /********************************************************************
  106.                          AD转换控制程序
  107. *********************************************************************/
  108. uint GetADCResult(uchar px)          //转换输出的数据 (PX为通道口)
  109. {
  110.     uint t;
  111.         ADC_CONTR=ADC_POWER | ADC_SPEEDHH | px | ADC_START;//开始转换
  112.     _nop_();                        //延时一个机器周期
  113.     _nop_();                                                //延时一个机器周期
  114.     _nop_();                                                //延时一个机器周期
  115.     _nop_();                                                //延时一个机器周期
  116.         _nop_();                        //延时一个机器周期
  117.         while (!(ADC_CONTR & ADC_FLAG));//等待转换结束
  118.         ADC_CONTR &= ~ADC_FLAG;       //关闭AD转换
  119.         t=(ADC_DATA<<2)|ADC_LOW2;
  120.         return t;
  121. }                  
  122. /********************************************************************
  123.                             按键扫描
  124. *********************************************************************/
  125. void key_scan(void)
  126. {
  127.   if(key1==0) //功能按键,显示调整和实测值
  128.   {
  129.     if(++keystat[0]>=30)
  130.     {
  131.       keystat[0] = 1;
  132.     }
  133.   }
  134.    else
  135.    if((key1)&&(keystat[0]))
  136.    {
  137.             keystat[0] = 0;
  138.          flag1=!flag1;
  139.    }
  140.   if(flag1==1)
  141.   {
  142.       //增加设定电流值
  143.           if(key2==0) //增加设定电流值
  144.           {
  145.                   if(++keystat[1]>=80)
  146.                   {
  147.                            keystat[1]=1;
  148.                         setcurent=setcurent+5 ;  
  149.                         if(setcurent>3000)
  150.                           setcurent=5;
  151.                         write = 1;
  152.                    }                                                 
  153.           }
  154.          else if((key2)&&(keystat[1]))
  155.                  {
  156.                          keystat[1] = 0;
  157.          }

  158.           //减小设定电流值
  159.           if(key3==0) //减小设定电流值
  160.           {
  161.                    if(++keystat[2]>=80)
  162.                    {
  163.                                    keystat[2] = 1;
  164.                                 setcurent = setcurent-5;  
  165.                                 if(setcurent<=5)
  166.                                   setcurent=3000;
  167.                                 write = 1;
  168.                    }
  169.           }
  170.           else if((key3)&&(keystat[2]))
  171.                    {
  172.                          keystat[2] = 0;
  173.                    }
  174.   }
  175. }

  176. void Selectsort(uint A[],uchar n)
  177. {
  178.      uchar i,j,min;
  179.          uint temp;
  180.      for(i=0;i<n;i++)
  181.      {
  182.           min=i;
  183.           for(j=i+1;j<=n;j++)  /* 从j往前的数据都是排好的,所以从j开始往下找剩下的元素中最小的 */
  184.           {
  185.                if(A[min]>A[j])  /* 把剩下元素中最小的那个放到A[i]中 */
  186.                {
  187.                 temp=A[i];
  188.                 A[i]=A[j];
  189.                 A[j]=temp;
  190.                }
  191.           }
  192.     }  
  193. }
  194. /********************************************************************
  195.                             主函数
  196. *********************************************************************/
  197. void main()
  198. {       
  199.     uint i;
  200.         uchar j,t;
  201.     initProg();
  202.     InitADC();  //AD初始化
  203.         setcurent=IapReadByte(0);
  204.         setcurent=setcurent*255+IapReadByte(1);
  205.         while(1)
  206.         {         
  207.               if(flag1)                     //显示设定值
  208.                    t_to_dis(setcurent);   //数值变换
  209.                   else           //否则显示实测值
  210.                     t_to_dis(ad2);   //数值变换
  211.                  if(flag==0)
  212.                  {
  213.                   if(ad2>=setcurent)  //判断是否大于设定电流值
  214.                     OUT=0;
  215.                    else
  216.                     OUT=1;
  217.                  }
  218.                  if(write)
  219.                  {
  220.                     write=0;
  221.                         IapEraseSector(0);
  222.                         IapProgramByte(0,setcurent/255);
  223.                         IapProgramByte(1,setcurent%255);
  224.                   }
  225.                  timeProc();
  226.                   checkComm0Modbus();
  227.             ad=GetADCResult(7);
  228.                 i=ad*10;
  229.                 if(i>=5120&&i<=7020)
  230.                 {
  231.                   adcj[j++]=i;
  232.                 }
  233.                 if(j>20)
  234.                 {
  235.                   j=0;
  236.                   Selectsort(adcj,20);
  237.                   adcj2[t++]=adcj[20];
  238.                   if(t>3)
  239.                    {
  240.                     t=0;
  241.                         Selectsort(adcj2,3);
  242.                     ad1 = 25*((adcj2[3]-5120)/10240.0)/0.185;
  243.                         ad1=ad1*0.707*3;
  244.                  ad2=abs(ad1);
  245.                   }
  246.                 }
  247.         }
  248. }
  249. /********************************************************************
  250.                             求值函数
  251. *********************************************************************/
  252. void t_to_dis(uint num)
  253. {       
  254.         numb[0]=num/1000;        ;            //显示千位
  255.         numb[1]=num/100%10;                //显示百位;                //显示百位
  256.         numb[2]=num/10%10;                    //显示十位
  257.         numb[3]=num%10;             //显示个位
  258. }
  259. /********************************************************************
  260.                            定时器T0中断函数
  261. *********************************************************************/
  262. void timer0(void)interrupt 1  
  263. {          
  264.      TH0=(65536-800)/256;
  265.          TL0=(65536-800)%256;
  266.      cnt++;
  267.          ii++;
  268.          if(ii==1000)
  269.          {
  270.            jj=2;
  271.          }
  272.          if(cnt>4)
  273.           {
  274.             cnt=1;
  275.             bt1ms=1;       
  276.          }
  277.      switch(cnt)
  278.          {
  279.     case 1: WEI&=0XF0; DUAN=seg7code[numb[2]]; wei2=1; break; //分十位
  280.           case 2: WEI&=0XF0; DUAN=seg7code[numb[1]]&0x7f; wei3=1; break;//分个位&0x7f
  281.           case 3: WEI&=0XF0; DUAN=seg7code[numb[0]]; wei4=1; break;//秒十位
  282.           default:  cnt=0;break;
  283.         }
  284.      key_scan();//按键扫描
  285. }
  286. /********************************************************************
  287.                           串口中断函数
  288. *********************************************************************/
  289. void commIntProc() interrupt 4
  290. {

  291.         if(TI)
  292.         {
  293.                 TI = 0;
  294.                 if(sendPosi < sendCount) //如果发送位置小于发送计数,那么继续发送
  295.                 {
  296.                         sendPosi++;
  297.                         SBUF = sendBuf[sendPosi];
  298.                 }
  299.                 else //否则发送完毕,置接收状态
  300.                 {
  301.                         receCount = 0;   //清接收地址偏移寄存器
  302.                         checkoutError = 0;
  303.                 }
  304.         }
  305.         else if(RI)
  306.         {
  307.                 RI = 0;
  308.                 receTimeOut = 10;    //通讯超时值
  309.                 receBuf[receCount] = SBUF;
  310.                 receCount++;          //接收地址偏移寄存器加1
  311.                 receCount &= 0x0f;    //最多一次只能接收16个字节
  312.         }
  313. }
  314. /********************************************************************
  315.                               结束
  316. *********************************************************************/
复制代码


一、【简要说明】
1、 尺寸:长72cmX宽67cmX高2cm
2、 主要芯片:STC12C5604AD
3、 工作电压:直流12伏(板上有LM7805稳压芯片);
4、 特点:

    可编程(通过下载排针可下载程序)
    具有两路信号输入端(也可检测两路模拟量)
    三个按键输入            
    一路继电器输出,可控制两路交流220V/10A一下设备
    一路电流检测输入(ACS712电流传感器)
    板子带有防反接二极管
    标准的11.0592晶振
    板子晶振11.0592,有uart接口,可以方便连接uart转485模块
    有复位按键
    带四位数码管显示

5、可以根据顾客提出要求实现想要实现的功能
注:模块有三种功能,顾客购买时,请联系客服,详细说明所需功能,
功能一:按键设定电流值(无通信)
功能二:读取电流设定报警值
功能三:可根据顾客需要定制功能,详细功能介绍,请看下文

全部资料51hei下载地址:
相关资料.rar (212.33 KB, 下载次数: 85)

评分

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

查看全部评分

回复

使用道具 举报

ID:286869 发表于 2018-3-2 10:55 | 显示全部楼层
您这是什么单片机??有51单片机 和acs712的程序吗?    求教!!!! 急!!!
回复

使用道具 举报

ID:145887 发表于 2018-6-12 15:25 | 显示全部楼层
图纸?
回复

使用道具 举报

ID:377614 发表于 2018-7-23 00:00 | 显示全部楼层
本人想要购买,请楼主留下联系方式,我记着做毕业论文哦,万分感谢呢
回复

使用道具 举报

ID:140085 发表于 2018-11-12 09:58 | 显示全部楼层
我想问下有没有modbus通讯的模拟量输入输出模块
回复

使用道具 举报

ID:382454 发表于 2018-11-12 21:02 来自手机 | 显示全部楼层
淘宝一堆这样的模块
回复

使用道具 举报

ID:90212 发表于 2024-3-12 12:12 | 显示全部楼层
能直接测220V交流的电流吗?
回复

使用道具 举报

ID:149642 发表于 2024-3-12 17:16 | 显示全部楼层
主力前线 发表于 2018-7-23 00:00
本人想要购买,请楼主留下联系方式,我记着做毕业论文哦,万分感谢呢

弄个这样的出来就可以硕士毕业了?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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