单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12034|回复: 20
收起左侧

ACS712+单片机实现电流检测与报警的电路原理图与源码

  [复制链接]
love16811187 发表于 2018-3-24 11:18 | 显示全部楼层 |阅读模式
ACS712电流检测与报警模块系统的外观:
0.jpg

ACS712电路原理图:
0.jpg


ACS712单片机源程序如下:
  1. 实现功能:检测电流,数码管显示电流值
  2. 使用芯片:STC12C2054AD  
  3. 产品模块编号:kzs1211-75150k (双路输入,继电器单路输出,三个按键,四位数码管模块)
  4. 晶振:片内晶振

  5. #include<STC12C56.h>                 //库文件
  6. #include <intrins.h>
  7. #define uchar unsigned char//宏定义无符号字符型
  8. #define uint unsigned int  //宏定义无符号整型
  9. #define FOSC 11059200L
  10. #define BAUD  9600

  11. #define ADC_POWER   0x80            //ADC 电源控制位
  12. #define ADC_FLAG    0x10            //ADC 转换结束标志位
  13. #define ADC_START   0x08            //ADC 开始转换控制位
  14. #define ADC_SPEEDLL 0x00            //1080个时钟周期转换一次
  15. #define ADC_SPEEDL  0x20            //810 个时钟周期转换一次
  16. #define ADC_SPEEDH  0x40            //540个时钟周期转换一次
  17. #define ADC_SPEEDHH 0x60            //270个时钟周期转换一次

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

  21. #define DUAN P2                   //P0口控制段
  22. #define WEI  P1                   //P2口控制位
  23. /********************************************************************
  24.                             初始定义
  25. *********************************************************************/
  26. //数码管显示段码
  27. code uchar seg7code[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF};
  28. //数码管位控制端
  29. sbit wei1=P1^0;
  30. sbit wei2=P1^1;
  31. sbit wei3=P1^2;
  32. sbit wei4=P1^3;  
  33. //继电器输出控制端                           
  34. sbit OUT=P3^7;
  35. //按键输入控制端
  36. sbit key1=P3^2;
  37. sbit key2=P3^3;
  38. sbit key3=P3^4;
  39. //两路输入控制端可做ad采样
  40. sbit IN1=P1^6;
  41. sbit IN2=P1^5;
  42. sbit IC=P1^7;
  43. uchar numb[4];              //定义字符串用于数值转换
  44. uint tcnt;
  45. uchar cnt,times,date;
  46. uint ad,ad2;
  47. float ad1;
  48. /********************************************************************
  49.                             命令定义
  50. *********************************************************************/
  51. #define CMD_IDLE     0         //EEPROM无操作
  52. #define CMD_READ     1         //读取字节
  53. #define CMD_PROGRAM  2         //写入字节
  54. #define CMD_ERASE    3         //擦除字节
  55. /********************************************************************
  56.                        编程周期由晶振决定
  57. *********************************************************************/
  58. #define ENABLE_IAP 0X83         //编程周期由晶振决定(如果<12MHZ选用此项)
  59. #define IAP_ADDRESS 0X0000                      //内部EEPROM地址

  60. /********************************************************************
  61.                             操作函数
  62. *********************************************************************/
  63. void IapIdle()
  64. {
  65.         IAP_CONTR=0;
  66.         IAP_CMD=0;
  67.         IAP_TRIG=0;
  68.         IAP_ADDRH=0X80;
  69.         IAP_ADDRL=0;
  70. }
  71. /********************************************************************
  72.                             读取一个字节函数
  73. *********************************************************************/
  74. uchar IapReadByte(uint addr)
  75. {
  76.         uchar dat;  
  77.         IAP_CONTR=ENABLE_IAP;
  78.         IAP_CMD=CMD_READ;
  79.         IAP_ADDRL=addr;
  80.         IAP_ADDRH=addr>>8;
  81.         IAP_TRIG=0X46;
  82.         IAP_TRIG=0XB9;
  83.         _nop_();
  84.         _nop_();
  85.         _nop_();
  86.         dat=IAP_DATA;
  87.         IapIdle();
  88.         return dat;
  89. }
  90. /********************************************************************
  91.                             写入一个字节函数
  92. *********************************************************************/
  93. void IapProgramByte(uint addr,uchar dat)
  94. {
  95.         IAP_CONTR=ENABLE_IAP;
  96.         IAP_CMD=CMD_PROGRAM;
  97.         IAP_ADDRL=addr;
  98.         IAP_ADDRH=addr>>8;
  99.         IAP_DATA=dat;
  100.         IAP_TRIG=0X46;
  101.         IAP_TRIG=0XB9;
  102.         _nop_();
  103.         _nop_();
  104.         _nop_();
  105.         IapIdle();
  106. }
  107. /********************************************************************
  108.                             擦除一个字节函数
  109. *********************************************************************/
  110. void IapEraseSector(uint addr)
  111. {
  112.         IAP_CONTR=ENABLE_IAP;
  113.         IAP_CMD=CMD_ERASE;
  114.         IAP_ADDRL=addr;
  115.         IAP_ADDRH=addr>>8;
  116.         IAP_TRIG=0X46;
  117.         IAP_TRIG=0XB9;
  118.         _nop_();
  119.         _nop_();
  120.         _nop_();
  121.         IapIdle();
  122. }
  123. /********************************************************************
  124.                             延时函数
  125. *********************************************************************/
  126. void delay(uint x)//延时程序 0.1秒
  127. {
  128.         uint m,n,s;
  129.         for(m=x;m>0;m--)
  130.         for(n=20;n>0;n--)
  131.         for(s=248;s>0;s--);
  132. }
  133. /********************************************************************
  134.                          AD转换初始化程序
  135. *********************************************************************/
  136. void InitADC()
  137. {
  138.     P1=P1M0|=0xf0;
  139.         P1M1=0x00;
  140.         ADC_DATA=0;        //AD数据寄存器清空
  141.     ADC_CONTR=ADC_POWER|ADC_SPEEDHH|ADC_START;//打开AD电源,转换周期XX
  142.     delay(10);                //延时
  143. }
  144. /********************************************************************
  145.                          AD转换控制程序
  146. *********************************************************************/
  147. uint GetADCResult(uchar px)          //转换输出的数据 (PX为通道口)
  148. {
  149.     uint t;
  150.         ADC_CONTR=ADC_POWER | ADC_SPEEDHH | px | ADC_START;//开始转换
  151.     _nop_();                        //延时一个机器周期
  152.     _nop_();                                                //延时一个机器周期
  153.     _nop_();                                                //延时一个机器周期
  154.     _nop_();                                                //延时一个机器周期
  155.         while (!(ADC_CONTR & ADC_FLAG));//等待转换结束
  156.         ADC_CONTR &= ~ADC_FLAG;       //关闭AD转换
  157.         t=(ADC_DATA<<2)|ADC_LOW2;
  158.         return t;
  159. }                  
  160. /********************************************************************
  161.                            IO口初始化函数
  162. *********************************************************************/   
  163. void init_all(void)
  164. {               
  165.     P2M1=0;
  166.         P2M0=0xff;
  167.         P1M1=0x80;
  168.         P1M0=0x0f;
  169.         P3M1&=0x7f;
  170.         P3M0|=0x80;
  171. }
  172. /********************************************************************
  173.                            定时器T1初始化
  174. *********************************************************************/
  175. void timer0init(void)
  176. {
  177.          TMOD=0X01;                  //设定定时器工作方式
  178.          TH0 =(655336-1000)/256;
  179.      TL0 =(655336-1000)%256;
  180.          ET0=1;
  181.          TR0=1;
  182.          EA=1;
  183. }
  184. /********************************************************************
  185.                             主函数
  186. *********************************************************************/
  187. void main()
  188. {         
  189.    
  190.     init_all();         //初始化IO
  191.         timer0init();//定时器初始化
  192.    // InitADC();  //AD初始化
  193.           date=IapReadByte(0);
  194.          
  195.         while(1)
  196.         {  
  197.              if(key1==0)
  198.                  {
  199.                    delay(20);
  200.                    if(key1==0)
  201.                    {
  202.                             while(!key1);
  203.                          date++;
  204.                          if(date>=25)
  205.                            date=25;
  206.                          IapEraseSector(0);
  207.                          IapProgramByte(0,date);
  208.                    }
  209.                  }
  210.                   if(key2==0)
  211.                  {
  212.                    delay(20);
  213.                    if(key2==0)
  214.                    {
  215.                             while(!key2);
  216.                          date--;
  217.                          if(date<=2)
  218.                            date=2;
  219.                          IapEraseSector(0);
  220.                          IapProgramByte(0,date);
  221.                    }
  222.                  }
  223.                   t_to_dis(date);   //数值变换
  224. //                 ad=GetADCResult(7);
  225. //                 if(times>=250)
  226. //                 {
  227. //                    times=0;
  228. //                        ad=ad-2;
  229. //                    ad1=(ad*50.0)/1024-25;
  230. //                    ad1=ad1*100;
  231. //                    t_to_dis(ad1);   //数值变换
  232. //                 }
  233.     }
  234. }
  235. /********************************************************************
  236. ……………………

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

所有资料51hei提供下载:
电流报警模块资料.rar (2.37 MB, 下载次数: 316)

评分

参与人数 2黑币 +10 收起 理由
shadeb + 5 很给力!
LIUXue12345634 + 5 赞一个!

查看全部评分

回复

使用道具 举报

道神伤 发表于 2018-7-20 09:57 | 显示全部楼层
看看,,,,,
回复

使用道具 举报

YZM168 发表于 2018-7-20 16:49 | 显示全部楼层
XUEXI学习了
回复

使用道具 举报

主力前线 发表于 2018-7-22 22:59 | 显示全部楼层
这个可以作为商业用途吗?我感觉蛮好的
回复

使用道具 举报

viqudb 发表于 2018-9-6 13:31 | 显示全部楼层
学习了!!!
回复

使用道具 举报

syp999 发表于 2018-9-18 13:46 | 显示全部楼层
这个能测最低多少瓦的负载?感性负载测量测量准确么
回复

使用道具 举报

吾乃李逵 发表于 2018-10-26 18:41 | 显示全部楼层
请教版主    板子链接有吗 我搜不到
回复

使用道具 举报

hhh77 发表于 2018-11-12 19:51 | 显示全部楼层
        很给力!
回复

使用道具 举报

hhh77 发表于 2018-11-12 19:52 | 显示全部楼层

XUEXI学习了哈哈哈
回复

使用道具 举报

thematic971 发表于 2019-1-9 16:05 | 显示全部楼层
感谢分享  学习了
回复

使用道具 举报

thematic971 发表于 2019-1-10 10:02 | 显示全部楼层
这个很有用 真是太及时了
回复

使用道具 举报

nieqijuen 发表于 2019-1-21 19:33 | 显示全部楼层
正好在找这一块的资料。 谢谢大佬,仔细阅读肯定有长进~
回复

使用道具 举报

pengyongnet 发表于 2019-1-22 14:31 | 显示全部楼层
能提供画的PCB啊
回复

使用道具 举报

90houyidai 发表于 2019-3-7 11:02 | 显示全部楼层
过来看看
回复

使用道具 举报

hardy.xiang 发表于 2019-3-29 14:04 | 显示全部楼层
非常不错的
回复

使用道具 举报

众星电子 发表于 2019-4-11 16:46 | 显示全部楼层
感谢分享,学习了
回复

使用道具 举报

众星电子 发表于 2019-4-11 16:50 | 显示全部楼层
值得学习,研究研究这个算法
回复

使用道具 举报

青龙书生 发表于 2019-4-17 14:21 | 显示全部楼层
已下载,学习啦,谢谢
回复

使用道具 举报

CYLwinnie 发表于 2019-5-14 16:10 | 显示全部楼层
学习了学习了
回复

使用道具 举报

wang490701 发表于 2019-5-27 10:18 | 显示全部楼层
刚好有用到,学习学习
回复

使用道具 举报

382601350@qq.co 发表于 2019-7-8 01:07 | 显示全部楼层
主要学习下交流电流的检测算法
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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