久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 檢測0~20MA電流傳感器報警控制程序 [打印本頁]

作者: zhangxinchun    時間: 2019-11-17 22:08
標題: 檢測0~20MA電流傳感器報警控制程序
功能如下:
1、24VDC供電,輸入端可識別4-20mA信號輸入,可以根據用戶任意設定電流值,進行繼電器報警輸出,輸出形式常開+常閉;
2、用來實現高于某電流值繼電器斷開,當低于設定電流值繼電器閉合,進而導通回路。
//#include<reg52.h>
#include<STC12C2052AD.h>                 //庫文件
#include<intrins.h>
#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,0xa0}; //顯示段碼 數碼管字跟

/********************************************************************
                            延時函數
*********************************************************************/
void delay(uchar t)
{
  uchar i,j;
   for(i=0;i<t;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轉換控制程序
*********************************************************************/


uchar GetADCResult(uchar px)          //轉換輸出的數據 (PX為通道口)
{
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL |px| ADC_START;//開始轉換
    _nop_();                        //延時一個機器周期
    _nop_();                                                //延時一個機器周期
    _nop_();                                                //延時一個機器周期
    _nop_();                                                //延時一個機器周期
    while (!(ADC_CONTR & ADC_FLAG));//等待轉換結束
    ADC_CONTR &= ~ADC_FLAG;         //關閉AD轉換
    return ADC_DATA;                //返回數據
}
                  
void key()
{
if(P30==0){tong1();}else{tong();}
if((P31==0)&&(bz2==0)){delay(80);if(P31==0){bz2=1;A1++;if(A1>=21){A1=0;};}}if((P31==1)&&(bz2==1)){delay(80);if(P31==1){bz2=0;write=1;}}
}

//定時器0初始化
void t0_init(unsigned char ms0)           //ms0最大71
{
        /***********************************************
        一個機器周期=12*時鐘周期。
        11059200為時鐘周期,一共為11059200/12=921600,就是每秒為921600Hz,
    八位定時器 最大計時     0.2777778ms
        十六位定時器最大計時          71.111111ms
        11.0592MHz除12為921600Hz,就是一秒921600次機器周期,10ms=9216次機器周期。
  65536-9216=56320(dc00)
  TH0=0xdc,TL0=0x00
        ***********************************************/
         long tmp;  //臨時變量
     tmp = 11059200 / 12;
         tmp = (tmp * ms0) / 1000;
         tmp = 65536 - tmp;
         tmp = tmp + 3;
         T0RH = (unsigned char)(tmp>>8);
         T0RL = (unsigned char)tmp;                                          
     TMOD &=0XF0;
         TMOD |=0X01;  //方式一  一共四種方式   GATE0 C/T0  M0_1  M0_0         C/T0選擇時鐘計數還是外部計數  方式0是十三位定時器 ,方式1是十六位定時器,方式2是八位自動 方式4是兩個八位
         TH0=T0RH;
         TL0=T0RL;
         ET0=1;   //使能T0中斷
         EA=1;
         TR0=1;
}
/********************************************************************
                               主函數
*********************************************************************/
void main()

{   
    unsigned char flag=1,flag2=0;;
        B1 = IapReadByte(0x01);                //讀取0x01中的數據  并附給ca
    A1=B1;
        InitADC(); //AD轉換初始化
        P37=0;
        P1M0=0X80;
    P1M1=0XFF;
        P3M0=0X00;
    P3M1=0Xff;
        while(1)
        {
        txian=GetADCResult(7)/12;
    key();
   if(txian>=A1){P37=0;}else P37=1;
   if(write==1)
  {
   write=0;
   B1=A1;
   IapEraseSector(0);
   IapProgramByte(0x01,B1);

  }
        }                 
}


應用舉例接線.JPG (172.75 KB, 下載次數: 54)

應用舉例接線.JPG

檢測0~20MA電流傳感器報警控制.rar

41.92 KB, 下載次數: 53, 下載積分: 黑幣 -5

數字量顯示可編程模塊原理圖及PCB圖.rar

228.61 KB, 下載次數: 49, 下載積分: 黑幣 -5


作者: aking991    時間: 2019-11-18 08:17
謝謝分享,學習參考
作者: YBZYBZ    時間: 2019-11-18 12:23
能不能用AT89C2051直接代用
作者: qsgang    時間: 2019-11-19 18:12
做人要厚道




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 中文字幕一区二区三区日韩精品 | 伊人色综合久久久天天蜜桃 | 色网站视频 | 欧美日韩一 | 国产综合第一页 | 久久综合狠狠综合久久综合88 | www.色.com| 日韩精品专区在线影院重磅 | 久久精品福利视频 | 欧美日韩成人 | 夜夜爽99久久国产综合精品女不卡 | 一区二区三区四区国产 | 日韩一区不卡 | 久久人操 | 一区欧美| 亚洲精品电影网在线观看 | 二区久久 | 狠狠色综合久久婷婷 | 老牛影视av一区二区在线观看 | 日韩有码一区 | 精品综合 | 亚洲精品一区二区另类图片 | 精品国产欧美一区二区三区成人 | 一区二区日韩 | 久久国产精品网 | 在线免费看黄 | 日韩欧美在线视频 | 99热在线播放 | 欧美视频偷拍 | 国产欧美日韩精品一区 | 在线不卡一区 | 国产精品九九九 | 麻豆精品国产91久久久久久 | 午夜视频在线播放 | 91免费观看在线 | 麻豆精品久久久 | 久国产视频 | 秋霞a级毛片在线看 | www国产成人| 日韩欧美一区在线 | 精品影院|