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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2649|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

基于STC15W408AS單片機(jī)設(shè)計(jì)的一款4-20MA或者0-5V轉(zhuǎn)485數(shù)據(jù)變送器電路分享

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主















【聲明】此程序僅用于學(xué)習(xí)與參考!     
*********************************************************************/
/********************************************************************
                            宏定義
*********************************************************************/
#include<STC15W408AS.h>                 //庫文件
#include<intrins.h>
#define uchar unsigned char//宏定義無符號(hào)字符型
#define uint unsigned int  //宏定義無符號(hào)整型
#define ADC_POWER   0x80            //ADC 電源控制位
#define ADC_FLAG    0x10            //ADC 轉(zhuǎn)換結(jié)束標(biāo)志位
#define ADC_START   0x08            //ADC 開始轉(zhuǎn)換控制位
#define ADC_SPEEDLL 0x00            //210 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
#define ADC_SPEEDL  0x20            //420 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
#define ADC_SPEEDH  0x40            //630 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
#define ADC_SPEEDHH 0x60            //840 個(gè)時(shí)鐘周期轉(zhuǎn)換一次

typedef unsigned char  INT8U;
typedef unsigned int   INT16U;
#define ENABLE_ISP 0x82 //系統(tǒng)工作時(shí)鐘<20MHz 時(shí),對IAP_CONTR 寄存器設(shè)置此值
#define WD1        0x5a        //使用STC11xx系列單片機(jī)時(shí),先寫入0x5a,然寫入0xa5
#define WD2        0xa5
char IAPAddr=0;
/********************************************************************
                            初始定義
*********************************************************************/
code uchar seg7code[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //顯示段碼 數(shù)碼管字跟
/********************************************************************
                            I/O定義
*********************************************************************/
bit z=0,ba=0,k=0,zs=0,kk=0,sd=0,sd1=0;
uchar y=0,smg2=0,s1=0,s2=0,ii=0,dat3=0,dat4=0,dat5=0,h_1=0,l_1=0;
uint s=0,bai=0,shi=0,ge=0,js=0,js1=0,js2=0,js3=0,dat=0,dat1=0,dat2=0,h_2=0,l_2=0;
sbit aj1=P3^1;
sbit aj2=P3^0;
sbit out=P3^4;
sbit L1=P3^5;//數(shù)碼管位控制
sbit L2=P3^6;//數(shù)碼管位控制
sbit L3=P3^7;//數(shù)碼管位控制
sbit dp=P3^3;//小數(shù)點(diǎn)
sbit btv_1=P5^4;
sbit btv_2=P5^5;
sbit zc=P3^2;

bit kt=0,kt_1=0,bz=0,bz2=0;bz3=0;//超設(shè)定值發(fā)送標(biāo)志位,bz2數(shù)碼管閃爍標(biāo)志位
bit bb_1=0,bb_2=0,bb_3=0,bb_4=0;//調(diào)整波特率標(biāo)志位
uchar ss=0,hz=0,lz=0;
uchar trg=0,trg_1=0,cont=0,cont_1=0;
uchar ReadData=0,ReadData_1=0;

bit flagOnceTxd = 0;  //單次發(fā)送完成標(biāo)志,即發(fā)送完一個(gè)字節(jié)
bit cmdArrived = 0;   //命令到達(dá)標(biāo)志,即接收到上位機(jī)下發(fā)的命令
unsigned char cntRxd = 0;
unsigned char pdata bufRxd[30]; //串口接收緩沖區(qū)
void UartDriver();
unsigned char UartRead(unsigned char *buf, unsigned char len);
void UartWrite(unsigned char *buf, unsigned char len);
void UartRxMonitor(unsigned char ms);
/********************************************************************
                            16進(jìn)制轉(zhuǎn)10進(jìn)制函數(shù)
*********************************************************************/
void HexToDec(uchar redat)
{
h_1 = redat>>4;
l_1 = redat&0x0f;
switch(h_1)
{
case 0:h_1=0;break;
case 1:h_1=1;break;
case 2:h_1=2;break;
case 3:h_1=3;break;
case 4:h_1=4;break;
case 5:h_1=5;break;
case 6:h_1=6;break;
case 7:h_1=7;break;
case 8:h_1=8;break;
case 9:h_1=9;break;
default:break;
}
switch(l_1)
{
case 0:l_1=0;break;
case 1:l_1=1;break;
case 2:l_1=2;break;
case 3:l_1=3;break;
case 4:l_1=4;break;
case 5:l_1=5;break;
case 6:l_1=6;break;
case 7:l_1=7;break;
case 8:l_1=8;break;
case 9:l_1=9;break;
default:break;
}

}
/********************************************************************
                            10進(jìn)制轉(zhuǎn)10進(jìn)制函數(shù)
*********************************************************************/
void HexToHex(uchar redat)
{
h_2 = redat/10;
l_2 = redat%10;
switch(h_2)
{
case 0:h_2=0x00;break;
case 1:h_2=0x10;break;
case 2:h_2=0x20;break;
case 3:h_2=0x30;break;
case 4:h_2=0x40;break;
case 5:h_2=0x50;break;
case 6:h_2=0x60;break;
case 7:h_2=0x70;break;
case 8:h_2=0x80;break;
case 9:h_2=0x90;break;
default:break;
}
switch(l_2)
{
case 0:l_2=0x00;break;
case 1:l_2=0x01;break;
case 2:l_2=0x02;break;
case 3:l_2=0x03;break;
case 4:l_2=0x04;break;
case 5:l_2=0x05;break;
case 6:l_2=0x06;break;
case 7:l_2=0x07;break;
case 8:l_2=0x08;break;
case 9:l_2=0x09;break;
default:break;
}

}
/********************************************************************
                            E2P函數(shù)
*********************************************************************/
union union_temp16
{
    INT16U un_temp16;
    INT8U  un_temp8[2];
}my_unTemp16;

INT8U Byte_Read(INT16U add);              //讀一字節(jié),調(diào)用前需打開IAP 功能
void Byte_Program(INT16U add, INT8U ch);  //字節(jié)編程,調(diào)用前需打開IAP 功能
void Sector_Erase(INT16U add);            //擦除扇區(qū)
void IAP_Disable();                       //關(guān)閉IAP 功能
/********************************************************************
                         AD轉(zhuǎn)換初始化程序
*********************************************************************/
void InitADC()
{
   P1ASF = 0x80;          //設(shè)置P1.7口AD轉(zhuǎn)換,必須加
   P1M0=0X80;
   P1M1=0X80;        //設(shè)置P1.7口為開漏模式,使用AD功能
    ADC_RES = 0;                   //AD數(shù)據(jù)寄存器清空
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//打開AD電源,轉(zhuǎn)換周期210
    _nop_();                        //延時(shí)一個(gè)機(jī)器周期
    _nop_();
        _nop_();                        //延時(shí)一個(gè)機(jī)器周期
}
/********************************************************************
                         AD轉(zhuǎn)換控制程序
*********************************************************************/
uchar ADCRead(uchar px)          //轉(zhuǎn)換輸出的數(shù)據(jù) (PX為通道口)
{
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL |px| ADC_START;//開始轉(zhuǎn)換
    _nop_();                        //延時(shí)一個(gè)機(jī)器周期
    _nop_();                                                //延時(shí)一個(gè)機(jī)器周期
    _nop_();                                                //延時(shí)一個(gè)機(jī)器周期
    _nop_();                                                //延時(shí)一個(gè)機(jī)器周期
    while (!(ADC_CONTR & ADC_FLAG));//等待轉(zhuǎn)換結(jié)束
    ADC_CONTR &= ~ADC_FLAG;         //關(guān)閉AD轉(zhuǎn)換
    return ADC_RES;                //返回?cái)?shù)據(jù)
}
/*******************************************************************
*                        讀取按鍵狀態(tài)
********************************************************************/
void KeyRead()//讀取按鍵IO口函數(shù)
{
     ReadData = aj1^0xff;  // 讀取按鍵狀態(tài)取反后賦值給ReadData
     trg = ReadData & (ReadData ^ cont);  //trg短按,每按下按鍵trg=1;抬手后為trg=0,長按為trg=0
     cont = ReadData;   //cont長按,長按cont=1,抬手后cont=0

         ReadData_1 = aj2^0xff;  // 讀取按鍵狀態(tài)取反后賦值給ReadData
     trg_1 = ReadData_1 & (ReadData_1 ^ cont_1);  //trg短按,每按下按鍵trg=1;抬手后為trg=0,長按為trg=0
    cont_1 = ReadData_1;   //cont長按,長按cont=1,抬手后cont=0
}
/*******************************************************************
*                        按鍵
********************************************************************/
void key_1()
{          
  if(trg & 0x01) //短按
  {       
     kt_1=0;
         kt=1; //這是短按標(biāo)志位,kt=1說明短按了
  }
  if((aj1!=0)&&(kt==1))//判斷
        {
         z=1; // 選位標(biāo)志位
         y++; //選位
         out=1;
         if(y==4)
          {
           z=0;
           k=1;
           y=0;
//           s=s1+s2+s3;
          }
         kt=0;
    }           // 短按

}

void key_2()
{          
  if(trg_1 & 0x01) //短按
  {       
     kt=0;
         kt_1=1; //這是短按標(biāo)志位,kt=1說明短按了
  }
  if((aj2!=0)&&(kt_1==1))//判斷
        {
         if(y==1)
          {
           s1++;
           if(s1>9)
            {
                 s1=0;
                }
          }
         if(y==2)
          {
           s2+=10;
           if(s2>20)
            {
                 s2=0;
                }
          }
         s=s1+s2;
         kt_1=0;
    }           // 短按
}
/*******************************************************************
*                       串口驅(qū)動(dòng)
********************************************************************/
void UartDriver() //串口驅(qū)動(dòng)函數(shù),檢測接收到的命令并執(zhí)行相應(yīng)動(dòng)作
{
    unsigned char len;
    xdata unsigned char buf[30];
    if (cmdArrived) //有命令到達(dá)時(shí),讀取處理該命令
    {
        cmdArrived = 0;
        len = UartRead(buf, sizeof(buf)); //將接收到的命令讀取到緩沖區(qū)中

                if ((buf[0] == 0xAA)&&(buf[1] == ss)&&(buf[2] == 0x01)&&(buf[4] == 0xBB)&&(len == 5))  //修改板子地址
                {
                   ss=buf[3];k=1;
                   buf[0] = 0xAA;
                   buf[1] = ss;
                   buf[2] = 0x01;
                   buf[3] = 0x01;
                   buf[4] = 0xBB;
                   len = 5;
                   UartWrite(buf, len);
                }

                if((buf[0] == 0xAA)&&(buf[1] == ss)&&(buf[2] == 0x06)&&(buf[3] == 0x01)&&(buf[4] == 0xBB)&&(len == 5)) //查詢溫度
                {
                     HexToDec(dat1);
                         dat3 = h_1*16+l_1;         //轉(zhuǎn)換為10進(jìn)制
                         h_1=0;l_1=0;
                         HexToHex(dat3);         //10進(jìn)制轉(zhuǎn)換為16進(jìn)制
                         dat4 = h_2|l_2;
                         h_2=0;l_2=0;
                          buf[0] = 0xAA;
                         buf[1] = ss;
                         buf[2] = 0x06;
                         buf[3] = dat4;
                         buf[4] = 0xBB;
                         len = 5;
                         UartWrite(buf,len);

                }

                if ((buf[0] == 0xAA)&&(buf[1] == 0x00)&&(buf[2] == 0x00)&&(buf[3] == 0x00)&&(buf[4] == 0xBB)&&(len == 5))  //查詢板子地址
                {
                   buf[0] = 0xAA;
                   buf[1] = ss;
                   buf[2] = 0x00;
                   buf[3] = 0x00;
                   buf[4] = 0xBB;
                   len = 5;
                   UartWrite(buf, len);
                }
    }
}
/*******************************************************************
*                        定時(shí)器配置
********************************************************************/
void ConfigTimer0(){
        TMOD=0x01;//將定時(shí)器0,1都設(shè)置為模式1
    TH0=0XFC;//1ms
    TL0=0X66;
        TR0=1;//開啟定時(shí)器0
        ET0=1;//開定時(shí)器0的中斷
        EA=1;//開總中斷
}

/*******************************************************************
*                        串口配置
********************************************************************/
void ConfigUART()  //串口配置函數(shù),baud為波特率
{
        SCON = 0x50;                //8位數(shù)據(jù),可變波特率
        AUXR |= 0x01;                //串口1選擇定時(shí)器2為波特率發(fā)生器
        AUXR |= 0x04;                //定時(shí)器2時(shí)鐘為Fosc,即1T
        T2L = lz;                //設(shè)定定時(shí)初值
        T2H = hz;                //設(shè)定定時(shí)初值
        AUXR |= 0x10;                //啟動(dòng)定時(shí)器2
    ES  = 1;       //使能串口中斷
}
/*******************************************************************
*                         顯示
********************************************************************/
void led(uint date)
{
bai=date/100;
shi=date%100/10;
ge=date%10;
}
/*******************************************************************
*                         t0定時(shí)器
********************************************************************/
void timer0() interrupt 1
{
    TH0=0XFC;//1ms
    TL0=0X66;
        UartRxMonitor(1);  //串口接收監(jiān)控
        KeyRead(); //按鍵掃描
        js++;
        if(js==200){ba=1;js=0;}        //200ms采集一次溫度數(shù)據(jù)
        if(sd==1){js1++;if(js1==2000){js1=0;kk=1;}}//主動(dòng)模式發(fā)送模式2s發(fā)送一次溫度數(shù)據(jù)
        if(sd1==1){js2++;if(js2==1000){js2=0;kk=1;}}//超設(shè)定值發(fā)送模式1s發(fā)送一次溫度數(shù)據(jù)
        if(bz2==1){js3++;if(js3==300){z=1;smg2=5;bz3=1;}if(js3==600){z=0;smg2=0;js3=0;}}//數(shù)碼管閃爍         
    if(z==0)
          {
           smg2++;
           }else{
                 smg2=y;//讓逐個(gè)顯示位
           }

             switch(smg2){                 //數(shù)碼管掃描
        /**************數(shù)碼管-開始*****************/
          case 1:  P1=seg7code[ge];L3=1;L2=1;L1=0;dp=0;break;//從P2進(jìn)P0出
          case 2:  P1=seg7code[shi];L3=1;L2=0;L1=1;dp=0;break;
          case 3:  P1=seg7code[bai]; L3=0;L2=1;L1=1;dp=0;break;       
        /**************數(shù)碼管-結(jié)束*****************/       
          default: smg2=0; L3=1;L2=1;L1=1; break;
         }
}
/********************************************************************
                            主函數(shù)
*********************************************************************/
void main()
{
   hz=0xFE;lz=0xE0;        //9600
  ConfigTimer0();        //定時(shí)器初始化
  ConfigUART();
    InitADC();           //AD初始化
    P1M0 = 0xff;   //設(shè)置強(qiáng)推挽和開漏模式
    P1M1 = 0x80;
        P3M0 = 0x08;   //小數(shù)點(diǎn)使用
        P3M1 = 0x00;
        if(Byte_Read(0X0001)==0xff){ss=0;s1=0;s2=0;}//首次讀取,如果讀到0xFF說明沒有存過數(shù)據(jù),直接付給00值
        else
        {
         ss=Byte_Read(0X0001);//板子地址
         s1=Byte_Read(0X0002);//按鍵設(shè)定值
         s2=Byte_Read(0X0003);//按鍵設(shè)定值
        }
    s2=s2*10;
        s=s2+s1;  //按鍵設(shè)定值
   while(1)
    {
         if((btv_1 == 0)&&(btv_2 == 0)&&(bb_1 == 0)){hz=0xFF;lz=0x70;ConfigUART();bb_1=1;bb_2=0;bb_3=0;bb_4=0;}  //波特率設(shè)置兩個(gè)撥碼開關(guān)撥上去19200
         if((btv_1 == 0)&&(btv_2 == 1)&&(bb_2 == 0)){hz=0xFB;lz=0x80;ConfigUART();bb_1=0;bb_2=1;bb_3=0;bb_4=0;}  //波特率設(shè)置2400
         if((btv_1 == 1)&&(btv_2 == 0)&&(bb_3 == 0)){hz=0xFD;lz=0xC0;ConfigUART();bb_1=0;bb_2=0;bb_3=1;bb_4=0;}  //波特率設(shè)置4800
         if((btv_1 == 1)&&(btv_2 == 1)&&(bb_4 == 0)){hz=0xFE;lz=0xE0;ConfigUART();bb_1=0;bb_2=0;bb_3=0;bb_4=1;} //波特率設(shè)置都不撥 9600

         if(ba==1){dat=((ADCRead(7)*51)/255);dat1=dat*100/249;ba=0;} //51是單片機(jī)的工作電壓,單片機(jī)的工作電壓是多少這個(gè)就是多少
             
          if((y==0)&&(z==0)){led(dat1);} //zs標(biāo)志位控制小數(shù)點(diǎn)
          if(y==1){zs=0;led(s1);}
          if(y==2){zs=0;led(s2);}
          if(y==3){zs=0;z=0;led(s);} //顯示設(shè)定時(shí)間
          if(dat1>s){sd1=1;bz=1;bz2=1;}else{sd1=0;bz=0;bz2=0;}//當(dāng)溫度超過設(shè)定溫度時(shí)主動(dòng)發(fā)送電流數(shù)據(jù)
          if((bz2==0)&&(bz3==1)){z=0;bz3=0;} //bz3防止數(shù)碼閃爍后變黑不亮標(biāo)志位
          if((zc==0)&&(bz==0)){sd=1;}else{sd=0;} //主從模式
          key_1();
          key_2();
          UartDriver();
          if(kk==1)
          {
                   unsigned char len;
        xdata unsigned char buf[10];
                HexToDec(dat1);        //16進(jìn)制轉(zhuǎn)10進(jìn)制
                dat3 = h_1*16+l_1;
                h_1=0;l_1=0;
                HexToHex(dat3);
                dat4 = h_2|l_2;//10進(jìn)制轉(zhuǎn)16進(jìn)制
            h_2=0;l_2=0;
                buf[0]=0xAA;  //起始位
                buf[1]=ss;          //地址位
                buf[2]=0x06;  //功能位
                buf[3]=dat4;  //電流值
                buf[4]=0xBB;  //結(jié)束位
                len=5;
                UartWrite(buf,len);
                kk=0;
          }
          if(k==1)         //存儲(chǔ)板子地址
          {
             Sector_Erase(0);
                 Byte_Program(0x0001,ss);  //寫入扇區(qū)
                 Byte_Program(0x0002,s1);  //寫入扇區(qū)
                 Byte_Program(0x0003,(s2/10));  //寫入扇區(qū)
                 k=0;
          }
        }

}

/*******************************************************************
*                        串口讀,寫
********************************************************************/
void InterruptUART() interrupt 4  //UART中斷服務(wù)函數(shù)
{
            if (RI)  //接收到字節(jié)
    {
        RI = 0;   //手動(dòng)清零接收中斷標(biāo)志位
        if (cntRxd < sizeof(bufRxd)) //接收緩沖區(qū)尚未用完時(shí),
        {
            bufRxd[cntRxd++] = SBUF; //保存接收字節(jié),并遞增計(jì)數(shù)器
        }
            }
            if (TI)  //字節(jié)發(fā)送完畢
    {
                TI = 0;   //手動(dòng)清零發(fā)送中斷標(biāo)志位
        flagOnceTxd = 1;  //設(shè)置單次發(fā)送完成標(biāo)志
    }
}

unsigned char UartRead(unsigned char *buf, unsigned char len) //串口數(shù)據(jù)讀取函數(shù),數(shù)據(jù)接收指針buf,讀取數(shù)據(jù)長度len,返回值為實(shí)際讀取到的數(shù)據(jù)長度
{
    unsigned char i=0;

    if (len > cntRxd) //讀取長度大于接收到的數(shù)據(jù)長度時(shí),
    {
        len = cntRxd; //讀取長度設(shè)置為實(shí)際接收到的數(shù)據(jù)長度
    }
    for (i=0; i<len; i++) //拷貝接收到的數(shù)據(jù)
    {
        *buf = bufRxd[ i];
        buf++;
    }
    cntRxd = 0;  //清零接收計(jì)數(shù)器

    return len;  //返回實(shí)際讀取長度
}

void UartWrite(unsigned char *buf, unsigned char len) //串口數(shù)據(jù)寫入函數(shù),即串口發(fā)送函數(shù),待發(fā)送數(shù)據(jù)指針buf,數(shù)據(jù)長度len
{
    while (len--)   //發(fā)送數(shù)據(jù)
    {
        flagOnceTxd = 0;
        SBUF = *buf;
        buf++;
        while (!flagOnceTxd);
    }
}

void UartRxMonitor(unsigned char ms)  //串口接收監(jiān)控函數(shù)
{
    static unsigned char cntbkp = 0;
    static unsigned char idletmr = 0;
    if (cntRxd > 0)  //接收計(jì)數(shù)器大于零時(shí),監(jiān)控總線空閑時(shí)間
    {
        if (cntbkp != cntRxd)  //接收計(jì)數(shù)器改變,即剛接收到數(shù)據(jù)時(shí),清零空閑計(jì)時(shí)
        {
            cntbkp = cntRxd;
            idletmr = 0;
        }
        else
        {
            if (idletmr < 5)  //接收計(jì)數(shù)器未改變,即總線空閑時(shí),累積空閑時(shí)間
            {
                idletmr += ms;
                if (idletmr >= 5)  //空閑時(shí)間超過4個(gè)字節(jié)傳輸時(shí)間即認(rèn)為一幀命令接收完畢
                {
                    cmdArrived = 1; //設(shè)置命令到達(dá)標(biāo)志
                }
            }
        }
    }
    else
    {
        cntbkp = 0;
    }
}
//讀一字節(jié),調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址,返回:A = 讀出字節(jié)
INT8U Byte_Read(INT16U add)
{
    IAP_DATA = 0x00;
    IAP_CONTR = ENABLE_ISP;         //打開IAP 功能, 設(shè)置Flash 操作等待時(shí)間
    IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字節(jié)讀命令

    my_unTemp16.un_temp16 = add;
    IAP_ADDRH = my_unTemp16.un_temp8[0];    //設(shè)置目標(biāo)單元地址的高8 位地址
    IAP_ADDRL = my_unTemp16.un_temp8[1];    //設(shè)置目標(biāo)單元地址的低8 位地址

    //EA = 0;
    IAP_TRIG = WD1;   //先送 WD1,再送WD2 到ISP/IAP 觸發(fā)寄存器,每次都需如此
    IAP_TRIG = WD2;   //送完WD2 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)
    _nop_();
    //EA = 1;
    IAP_Disable();  //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
                    //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
    return (IAP_DATA);
}
/*********************************************************************************************/
//字節(jié)編程,調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址, A= 須編程字節(jié)的數(shù)據(jù)
void Byte_Program(INT16U add, INT8U ch)
{
    IAP_CONTR = ENABLE_ISP;         //打開 IAP 功能, 設(shè)置Flash 操作等待時(shí)間
    IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字節(jié)編程命令

    my_unTemp16.un_temp16 = add;
    IAP_ADDRH = my_unTemp16.un_temp8[0];    //設(shè)置目標(biāo)單元地址的高8 位地址
    IAP_ADDRL = my_unTemp16.un_temp8[1];    //設(shè)置目標(biāo)單元地址的低8 位地址

    IAP_DATA = ch;                  //要編程的數(shù)據(jù)先送進(jìn)IAP_DATA 寄存器
    //EA = 0;
    IAP_TRIG = WD1;   //先送 WD1,再送WD2 到ISP/IAP 觸發(fā)寄存器,每次都需如此
    IAP_TRIG = WD2;   //送完WD2 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)
    _nop_();
    //EA = 1;
    IAP_Disable();  //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
                    //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
}
/*********************************************************************************************
//擦除扇區(qū), 入口:DPTR = 扇區(qū)地址 */
void Sector_Erase(uint addr)
{
    IAP_CONTR = ENABLE_ISP;         //打開IAP 功能, 設(shè)置Flash 操作等待時(shí)間
    IAP_CMD = 3;                 //IAP/ISP/EEPROM 扇區(qū)擦除命令

//    my_unTemp16.un_temp16 = add;
    IAP_ADDRH = addr>>8;    //設(shè)置目標(biāo)單元地址的高8 位地址
    IAP_ADDRL = addr;    //設(shè)置目標(biāo)單元地址的低8 位地址

    IAP_TRIG = 0x5a;   //先送 WD1,再送WD2 到ISP/IAP 觸發(fā)寄存器,每次都需如此
    IAP_TRIG = 0xa5;   //送完WD2 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)
    _nop_();
    //EA = 1;
    IAP_Disable();  //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
                    //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
}
/*********************************************************************************************/
void IAP_Disable()
{
    //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
    //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
    IAP_CONTR = 0;      //關(guān)閉IAP 功能
    IAP_CMD   = 0;      //清命令寄存器,使命令寄存器無命令,此句可不用
    IAP_TRIG  = 0;      //清命令觸發(fā)寄存器,使命令觸發(fā)寄存器無觸發(fā),此句可不用
    IAP_ADDRH = 0x80;
    IAP_ADDRL = 0;
}
/*********************************************************************************************/


GYJ-0310 NTC測溫程序.zip

85.83 KB, 下載次數(shù): 70, 下載積分: 黑幣 -5

GYJ-0310 4~20MA電流程序.zip

80.24 KB, 下載次數(shù): 79, 下載積分: 黑幣 -5

GYJ-0310 0~10V電壓程序.zip

79.86 KB, 下載次數(shù): 73, 下載積分: 黑幣 -5

GYJ-301_4~20mA電流輸入485輸出原理圖及PCB圖.pdf

388.35 KB, 下載次數(shù): 79, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏17 分享淘帖 頂4 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:104472 發(fā)表于 2023-11-27 10:21 | 只看該作者
好文章,支持一下
回復(fù)

使用道具 舉報(bào)

板凳
ID:433219 發(fā)表于 2023-11-28 09:12 | 只看該作者
4-20mA 輸入,轉(zhuǎn) 485輸出?
回復(fù)

使用道具 舉報(bào)

地板
ID:462629 發(fā)表于 2024-3-14 11:08 | 只看該作者
這個(gè)實(shí)際使用情況怎么樣?
回復(fù)

使用道具 舉報(bào)

5#
ID:921339 發(fā)表于 2024-4-9 18:09 | 只看該作者
不錯(cuò)!
回復(fù)

使用道具 舉報(bào)

6#
ID:90212 發(fā)表于 2024-4-15 08:50 | 只看該作者
LM1是什么降壓芯片?
回復(fù)

使用道具 舉報(bào)

7#
ID:1067504 發(fā)表于 2024-9-4 11:50 來自手機(jī) | 只看該作者
gongzhu 發(fā)表于 2024-4-15 08:50
LM1是什么降壓芯片?

沒猜錯(cuò)的話,應(yīng)該是LM317
回復(fù)

使用道具 舉報(bào)

8#
ID:1037819 發(fā)表于 2025-4-11 18:56 | 只看該作者
分不夠了,合成一個(gè)文件比較好
回復(fù)

使用道具 舉報(bào)

9#
ID:433219 發(fā)表于 2025-4-15 15:01 | 只看該作者
4·20mA輸入mcu采集,再485輸出,
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧美日韩中文字幕一区二区三区 | 国产精品免费大片 | 欧美涩 | 日本三级电影在线观看视频 | 武道仙尊动漫在线观看 | www.婷婷| caoporn国产精品免费公开 | aaa一区| 亚洲精品国产第一综合99久久 | 日日操日日干 | 欧美日韩一区二区三区四区 | 国产精品美女一区二区三区 | 久久99网站| 日本成人免费网站 | 久久国产精99精产国高潮 | 美女在线观看国产 | 五月婷婷丁香 | av喷水 | 欧美日韩在线观看视频 | 黄色一级视频 | av网站免费 | 亚洲视频免费 | 成人在线观 | 久久av一区 | 一本色道精品久久一区二区三区 | 国产精品日韩在线 | 日韩视频一区二区 | 中文字幕一区二区三区日韩精品 | 色呦呦网站 | 亚洲自拍偷拍欧美 | 午夜资源 | 中文在线а√在线8 | 午夜天堂 | 亚洲国产网站 | 在线国产一区 | 日韩在线小视频 | 国产黄色av网站 | 久草在线视频中文 | 亚洲最大看片网站 | 狠狠干狠狠操 | 欧美不卡一区二区 |