×
单片机 > 单片机程序设计 > 详情

检测0~20MA电流传感器报警控制程序

发布时间:2020-06-17 发布时间:
|

功能如下:

1、24VDC供电,输入端可识别4-20mA信号输入,可以根据用户任意设定电流值,进行继电器报警输出,输出形式常开+常闭;


2、用来实现高于某电流值继电器断开,当低于设定电流值继电器闭合,进而导通回路。

//#include

#include                 //库文件

#include

#define uchar unsigned char //宏定义字符型变量

#define uint  unsigned int        //宏定义整型变量                                                                                                                                                                                                t


/*声明 SFR 相关 与 的 IAP*/

sfr IAP_DATA = 0xE2; 

sfr IAP_ADDRH = 0xE3;

sfr IAP_ADDRL = 0xE4;

sfr IAP_CMD = 0xE5;

sfr IAP_TRIG = 0xE6;

sfr IAP_CONTR = 0xE7;



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

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

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

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

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

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

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


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

                             IO口定义

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

uchar s1=0;

bit  write=0;

uint txian;

uint ADdate;

uchar txian1,dxian1;

uchar T0RH=0,T0RL=0;

uint ms=0;

uchar A1,A2,A3,A4;

uchar B1,B2;

uchar C1,C2,C3,C4;


bit bz=0;

sbit P10=P1^0;//数码管段

sbit P11=P1^1;//数码管段

sbit P12=P1^2;//数码管段

sbit P13=P1^3;//数码管段

sbit P14=P1^4;//数码管段

sbit P15=P1^5;//数码管段

sbit P16=P1^6;//数码管段

sbit P17=P1^7;//AD信号输入


sbit P30=P3^0;//按键输入

sbit P31=P3^1;//按键输入

sbit P32=P3^2;//数码管位

sbit P33=P3^3;//数码管位

sbit P34=P3^4;//数码管位

sbit P35=P3^5;//数码管位

sbit P37=P3^7; //继电器输出

bit ts=0;


bit bz1=0;

bit bz2=0;

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

                            定义 ISP/IAP/EEPROM 命令

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

#define CMD_IDLE 0

#define CMD_READ 1

#define CMD_PROGRAM 2

#define CMD_ERASE 3


#define ENABLE_IAP 0x83//SYSCLK<12MH

#define IAP_ADDRESS 0x0000        //存储地址



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

禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态

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

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_();

   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_();

   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_();

   IapIdle();

}


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

                            初始定义

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

code uchar seg7code[10]={ 0x84,0xf6,0x8a,0xa2,0xf0,0xa1,0x81,0xb6,0x80,0}; //显示段码 数码管字跟


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

                            延时函数

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

void delay(uchar t)

{

  uchar i,j;

   for(i=0;i

   {

            for(j=130;j>0;j--);

         { ;

         }

   }

}

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

                            显示函数 接通时间

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

//void tong(uchar tdate) //显示函数

void tong() //显示函数

{

          C3=txian%100/10;

          C4=txian%10;         

      P32=0;P33=0;P34=0;P35=0;

          P1=seg7code[0];

          P32=1;P33=0;P34=0;P35=0;

          delay(80);

          P32=0;P33=0;P34=0;P35=0;  

      P1=seg7code[0];

          P32=0;P33=1;P34=0;P35=0;

          delay(80);

          P32=0;P33=0;P34=0;P35=0;  

             P1=seg7code[C3];

          P32=0;P33=0;P34=0;P35=1;

          delay(80);

          P32=0;P33=0;P34=0;P35=0;  

             P1=seg7code[C4];

          P32=0;P33=0;P34=1;P35=0;

          delay(80);

          P32=0;P33=0;P34=0;P35=0;  

}

void tong1() //显示函数

{

          C3=A1%100/10;

          C4=A1%10;         

      P32=0;P33=0;P34=0;P35=0;

          P1=seg7code[0];

          P32=1;P33=0;P34=0;P35=0;

          delay(80);

          P32=0;P33=0;P34=0;P35=0;  

      P1=seg7code[0];

          P32=0;P33=1;P34=0;P35=0;

          delay(80);

          P32=0;P33=0;P34=0;P35=0;  

             P1=seg7code[C3];

          P32=0;P33=0;P34=0;P35=1;

          delay(80);

          P32=0;P33=0;P34=0;P35=0;  

             P1=seg7code[C4];

          P32=0;P33=0;P34=1;P35=0;

          delay(80);

          P32=0;P33=0;P34=0;P35=0;  

}


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

                         AD转换初始化程序

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


void InitADC()

{

    P1 = P1M0 = P1M1 = 0xFf;        //设置P1口为开漏模式,使用AD功能

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

    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//打开AD电源,转换周期210

    delay(80);                       //延时

}


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

                         AD转换控制程序

***************************



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项