打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

ACS712电流检测与报警模块系统的外观:

 

ACS712电路原理图:



ACS712单片机源程序如下:

实现功能:检测电流,数码管显示电流值

使用芯片:STC12C2054AD  

产品模块编号:kzs1211-75150k (双路输入,继电器单路输出,三个按键,四位数码管模块)

晶振:片内晶振

#include                 //库文件

#include

#define uchar unsigned char//宏定义无符号字符型

#define uint unsigned int  //宏定义无符号整型

#define FOSC 11059200L

#define BAUD  9600

#define ADC_POWER   0x80            //ADC 电源控制位

#define ADC_FLAG    0x10            //ADC 转换结束标志位

#define ADC_START   0x08            //ADC 开始转换控制位

#define ADC_SPEEDLL 0x00            //1080个时钟周期转换一次

#define ADC_SPEEDL  0x20            //810 个时钟周期转换一次

#define ADC_SPEEDH  0x40            //540个时钟周期转换一次

#define ADC_SPEEDHH 0x60            //270个时钟周期转换一次

sfr ADC_DATA=0xc6;           //70个时钟周期转换一次

void display(void);                  //显示函数

void t_to_dis(uint num);

#define DUAN P2                   //P0口控制段

#define WEI  P1                   //P2口控制位

/********************************************************************

                            初始定义

*********************************************************************/

//数码管显示段码 

code uchar seg7code[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF};

//数码管位控制端

sbit wei1=P1^0;

sbit wei2=P1^1;

sbit wei3=P1^2;

sbit wei4=P1^3;  

//继电器输出控制端                            

sbit OUT=P3^7;

//按键输入控制端

sbit key1=P3^2;

sbit key2=P3^3;

sbit key3=P3^4;

//两路输入控制端可做ad采样

sbit IN1=P1^6;

sbit IN2=P1^5;

sbit IC=P1^7;

uchar numb[4];              //定义字符串用于数值转换

uint tcnt;

uchar cnt,times,date;

uint ad,ad2;

float ad1;

/********************************************************************

                            命令定义

*********************************************************************/

#define CMD_IDLE     0         //EEPROM无操作

#define CMD_READ     1         //读取字节

#define CMD_PROGRAM  2         //写入字节

#define CMD_ERASE    3         //擦除字节

/********************************************************************

                       编程周期由晶振决定

*********************************************************************/

#define ENABLE_IAP 0X83         //编程周期由晶振决定(如果<12MHZ选用此项)

#define IAP_ADDRESS 0X0000                      //内部EEPROM地址

/********************************************************************

                            操作函数

*********************************************************************/

void IapIdle()

{

        IAP_CONTR=0;

        IAP_CMD=0;

        IAP_TRIG=0;

        IAP_ADDRH=0X80;

        IAP_ADDRL=0;

}

/********************************************************************

                            读取一个字节函数

*********************************************************************/

uchar IapReadByte(uint addr)

{

        uchar dat;  

        IAP_CONTR=ENABLE_IAP;

        IAP_CMD=CMD_READ;

        IAP_ADDRL=addr;

        IAP_ADDRH=addr>>8;

        IAP_TRIG=0X46;

        IAP_TRIG=0XB9;

        _nop_();

        _nop_();

        _nop_();

        dat=IAP_DATA;

        IapIdle();

        return dat;

}

/********************************************************************

                            写入一个字节函数

*********************************************************************/

void IapProgramByte(uint addr,uchar dat)

{

        IAP_CONTR=ENABLE_IAP;

        IAP_CMD=CMD_PROGRAM;

        IAP_ADDRL=addr;

        IAP_ADDRH=addr>>8;

        IAP_DATA=dat;

        IAP_TRIG=0X46;

        IAP_TRIG=0XB9;

        _nop_();

        _nop_();

        _nop_();

        IapIdle();

}

/********************************************************************

                            擦除一个字节函数

*********************************************************************/

void IapEraseSector(uint addr)

{

        IAP_CONTR=ENABLE_IAP;

        IAP_CMD=CMD_ERASE;

        IAP_ADDRL=addr;

        IAP_ADDRH=addr>>8;

        IAP_TRIG=0X46;

        IAP_TRIG=0XB9;

        _nop_();

        _nop_();

        _nop_();

        IapIdle();

}

/********************************************************************

                            延时函数

*********************************************************************/

void delay(uint x)//延时程序 0.1秒

{

        uint m,n,s;

        for(m=x;m>0;m--)

        for(n=20;n>0;n--)

        for(s=248;s>0;s--);

}

/********************************************************************

                         AD转换初始化程序

*********************************************************************/

void InitADC()

{

    P1=P1M0|=0xf0;

        P1M1=0x00;

        ADC_DATA=0;        //AD数据寄存器清空

    ADC_CONTR=ADC_POWER|ADC_SPEEDHH|ADC_START;//打开AD电源,转换周期XX

    delay(10);                //延时

}

/********************************************************************

                         AD转换控制程序

*********************************************************************/

uint GetADCResult(uchar px)          //转换输出的数据 (PX为通道口)

{

    uint t;

        ADC_CONTR=ADC_POWER | ADC_SPEEDHH | px | ADC_START;//开始转换

    _nop_();                        //延时一个机器周期

    _nop_();                                                //延时一个机器周期

    _nop_();                                                //延时一个机器周期

    _nop_();                                                //延时一个机器周期

        while (!(ADC_CONTR & ADC_FLAG));//等待转换结束

        ADC_CONTR &= ~ADC_FLAG;       //关闭AD转换

        t=(ADC_DATA<<2)|ADC_LOW2;

        return t;

}                   

/********************************************************************

                           IO口初始化函数

*********************************************************************/    

void init_all(void)

{                

    P2M1=0;

        P2M0=0xff;

        P1M1=0x80;

        P1M0=0x0f;

        P3M1&=0x7f;

        P3M0|=0x80;

/********************************************************************

                           定时器T1初始化

*********************************************************************/

void timer0init(void)

         TMOD=0X01;                  //设定定时器工作方式

         TH0 =(655336-1000)/256;

     TL0 =(655336-1000)%256;

         ET0=1;

         TR0=1;

         EA=1;

}

/********************************************************************

                            主函数

*********************************************************************/

void main()

{         

   

    init_all();         //初始化IO

        timer0init();//定时器初始化

   // InitADC();  //AD初始化

          date=IapReadByte(0);

         

        while(1)

        {  

[1] [2]
关键字:ACS712  单片机  电流检测  报警 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic481659.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
STC12C5A60S2单片机的内置EEPROM的使用
stc89le52rc内部EEPROM的C51读写程序
基于51单片机设计的智能温控风扇(程序 电路图)
山寨T12焊台温控器,单片机、数码管显示、按键调温
HT1621的驱动演示
谁有STC 的 EEPROM C程序
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服