分享

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

 共同成长888 2022-05-08 发布于广东省

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

ACS712电路原理图:
0.jpg


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./mcu/ic481659.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多