⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 子机.c

📁 利用AD7705与热敏电阻来检测实际的温度
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************************
******************************************20MS延时*****************************************
******************************************************************************************/
void delay20ms()
{
  unsigned int data i=2500;
  while(i!=0)
   {
    i--;
   }
}

/**************************************************************************************
===================================计数器0中断函数============================================
**************************************************************************************/
void T0_srv () interrupt 1
{
   TR0=0;
   TH0=15549/256;            //给初始值
   TL0=15549;
   TR0=1;
   cnt4--;
   if(cnt4==0)
      {
         cnt4=5;
         cnt3--;
         if(cnt3==0)
           {
              cnt3=2;
              if(senflag==0)     //秒表标志改变
                {
                  senflag=1;
                }
              else
               senflag=0;
            }
         cnt7--;            //智能恢复标志发挥作用
         if(cnt7==0)
          {
            cnt=0;
            xhflag=0;
          }
      }
}
/******************************************************************************************
*****************************************串口中断服务程序*********************************
******************************************************************************************/
void server_chkou() interrupt 4
{
  uchar data err,k;
  uchar data i,mingl;
  ES=0;                                                         //进中断就不再允许中断
  RI=0;
  err=0;
  k=0;
  if((SBUF==0xaa)&&(TI==0))                                     //判断地址头是否正确
   {
      for(i=0;i<8;i++)                                  //接收其他的9位数据
        {
           k=0;
           RI=0;
           while((RI==0)&&(k<=200))                      //判断是否超时
            {
              k++;
              if(k>=200)
               {
                 err=1;
               }
            }
           RI=0;
           if(err==0)
            {
             jshc[i]=SBUF;
            }
           else
           break;
         }
  if(jshc[0]==0&&err==0)                             //主机发送来的广播命令地址位为00即:所有子机全部都接收
   {
        mingl=jshc[1];
        switch(mingl)
         {
         case 1:
          {
           dealy(550);
           write_word(2,jshc[2],1);
           dizhi=jshc[2];
           jshc[0]=0x55;
           jshc[1]=dizhi;
           jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
           send();
          }
         break;
         default:
         break;
        }
    }
  if(jshc[0]==dizhi&&err==0)                     //主机发送来的广播命令地址位为00即:所有子机全部都接收
   {
      mingl=jshc[1];
        switch(mingl)
        {
           case 1:                          //把上限写道1302中
           {
             dealy(550);
             shangx.byte.hhi=jshc[2];
             write_word(4,jshc[2],1);
             shangx.byte.hi=jshc[3];
             write_word(5,jshc[3],1);
             shangx.byte.lo=jshc[4];
             write_word(6,jshc[4],1);
             shangx.byte.llo=jshc[5];
             write_word(7,jshc[5],1);       //1302的第4个到第7个RAM区存放上限
             jshc[0]=0x55;
             jshc[1]=dizhi;
             jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
             send();
             ES=1;
           }
           break;
           case 2:                          //把下限写道1302中
           {
             dealy(550);
             xiax.byte.hhi=jshc[2];
             write_word(8,jshc[2],1);
             xiax.byte.hi=jshc[3];
             write_word(9,jshc[3],1);
             xiax.byte.lo=jshc[4];
             write_word(10,jshc[4],1);
             xiax.byte.llo=jshc[5];
             write_word(11,jshc[5],1);       //1302的第8个到第11个RAM区存放下限
             jshc[0]=0x55;
             jshc[1]=dizhi;
             jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
             send();
             ES=1;
           }
           break;
           case 3:                            //把1302中存的上限值读出来
           {
             dealy(550);
             shangx.byte.hhi=read_word(4,1);
             jshc[2]=shangx.byte.hhi;
             shangx.byte.hi=read_word(5,1);
             jshc[3]=shangx.byte.hi;
             shangx.byte.lo=read_word(6,1);
             jshc[4]=shangx.byte.lo;
             shangx.byte.llo=read_word(7,1);
             jshc[5]=shangx.byte.llo;
             jshc[0]=0x55;
             jshc[1]=dizhi;
             jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
             send();
             ES=1;
           }
           break;
           case 4:                            //把1302中存的下限值读出来
           {
             dealy(550);
             xiax.byte.hhi=read_word(8,1);
             jshc[2]=xiax.byte.hhi;
             xiax.byte.hi=read_word(9,1);
             jshc[3]=xiax.byte.hi;
             xiax.byte.lo=read_word(10,1);
             jshc[4]=xiax.byte.lo;
             xiax.byte.llo=read_word(11,1);
             jshc[5]=xiax.byte.llo;
             jshc[0]=0x55;
             jshc[1]=dizhi;
             jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
             send();
             ES=1;
           }
           break;
           case 5:                                           //读取本子机温度
           {
             dealy(550);
             jshc[0]=0x55;
             jshc[1]=dizhi;
             jshc[2]=wendu.byte.hhi;
             jshc[3]=wendu.byte.hi;
             jshc[4]=wendu.byte.lo;
             jshc[5]=wendu.byte.llo;
             jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
             send();
             ES=1;
           }
           break;
           case 7:
           {
             dealy(550);
             range_zero.byte.hhi=jshc[2];
             write_word(12,jshc[2],1);
             range_zero.byte.hi=jshc[3];
             write_word(13,jshc[3],1);
             range_zero.byte.lo=jshc[4];
             write_word(14,jshc[4],1);
             range_zero.byte.llo=jshc[5];
             write_word(15,jshc[5],1);       //1302的第12个到第15个RAM区存放零点误差
             jshc[0]=0x55;
             jshc[1]=dizhi;
             jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
             send();
             ES=1;
           }
           break;
           case 6:
           {
             dealy(550);
             range_full.byte.hhi=jshc[2];
             write_word(16,jshc[2],1);
             range_full.byte.hi=jshc[3];
             write_word(17,jshc[3],1);
             range_full.byte.lo=jshc[4];
             write_word(18,jshc[4],1);
             range_full.byte.llo=jshc[5];
             write_word(19,jshc[5],1);       //1302的第16个到第19个RAM区存放满度误差
             jshc[0]=0x55;
             jshc[1]=dizhi;
             jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
             send();
             ES=1;
           }
           break;
           case 9:                            //把1302中存的零点误差值读出来
           {
             dealy(550);
             range_zero.byte.hhi=read_word(12,1);
             jshc[2]=range_zero.byte.hhi;
             range_zero.byte.hi=read_word(13,1);
             jshc[3]=range_zero.byte.hi;
             range_zero.byte.lo=read_word(14,1);
             jshc[4]=range_zero.byte.lo;
             range_zero.byte.llo=read_word(15,1);
             jshc[5]=range_zero.byte.llo;
             jshc[0]=0x55;
             jshc[1]=dizhi;
             jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
             send();
             ES=1;
           }
           break;
           case 8:                            //把1302中存的满度误差值读出来
           {
             dealy(550);
             range_full.byte.hhi=read_word(16,1);
             jshc[2]=range_full.byte.hhi;
             range_full.byte.hi=read_word(17,1);
             jshc[3]=range_full.byte.hi;
             range_full.byte.lo=read_word(18,1);
             jshc[4]=range_full.byte.lo;
             range_full.byte.llo=read_word(19,1);
             jshc[5]=range_full.byte.llo;
             jshc[0]=0x55;
             jshc[1]=dizhi;
             jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
             send();
             ES=1;
           }
          break;
          case 10:
          {
           jsflag=1;
          }
          break;
          case 11:
          {
           jsflag=2;
          }
          break;
          case 12:
          {
            dealy(550);
            xsz1302();
            jshc[1]=dizhi;
            jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
            send();
            ES=1;
          }
          break;
          default:
          break;
         }
   }
   }
   ES=1;

}
/***************************************************************************************
**********************************处理温度显示******************************************
***************************************************************************************/
void xianshiwd()
{
    uchar data xx;
    if(xhflag==0)
     {
       if(aa==0)
        aa=(aa+range_zero.word*10);
       else
        aa=(aa-range_zero.word*10)*(1-(range_full.word-range_zero.word)/(400+(range_full.word-range_zero.word)));
     }
       zz=(int)aa;
       if(zz>=0)                              //如果温度是正值
       {
        if((zz>shangx.word*10))              //如果超过上限
         {
           jdq1=0;
           fmq=0;
           LIGHT1=0;
         }
        if(zz<(shangx.word*10-5))            //继电器滞缓
         {
           jdq1=1;
           fmq=1;
           LIGHT1=1;
         }
        wenduzhihc[1]=zz%100;
        wenduzhihc[2]=zz/100;
        sd595hc1();
        xx=sendhc[1];
        xx=xx&0xfd;                          //加上点显示
        sendhc[1]=xx;
       }
       if(zz<0)                             //如果温度是负值
       {
        if(zz<(xiax.word*10))               //如果下限超量程
         {
           jdq2=0;
           fmq=0;
           LIGHT2=0;
         }
        if(zz>(xiax.word*10+5))           //继电器滞缓
         {
           jdq2=1;
           fmq=1;
           LIGHT2=1;
         }
        zz=zz*(-1);
        wenduzhihc[1]=zz%100;
        wenduzhihc[2]=zz/100;
        sd595hc1();
        xx=sendhc[1];
        xx=xx&0xfd;                //加上点显示
        sendhc[1]=xx;
        xx=sendhc[3];
        xx=xx&0xbf;                //加上负号显示
        sendhc[3]=xx;
        if((zz*(-1))>(-1000))
        sendhc[3]=0xbf;
       }
       sd595();
}
/***************************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -