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

📄 子机.c

📁 利用AD7705与热敏电阻来检测实际的温度
💻 C
📖 第 1 页 / 共 3 页
字号:
**********************************处理显示**********************************************
***************************************************************************************/
void xianshi()
{
  if(cnt==0)
  {
   aa=wendu.word;
   xianshiwd();
  }
   if(cnt==1)                            //显示时钟
    {
     sd595hc();
     LIGHT1=1;                           //熄灭小灯
     LIGHT2=1;                        //加上点显示
     sendhc[2]=sendhc[2]&0xfd;
     sd595();                        //正常无点显示
    }
   if(cnt==2)                          //显示温度上限值
   {
     aa=shangx.word*10;
     xianshiwd();
     xhflag=1;
   }
   if(cnt==3)                          //显示温度下限值
   {
     aa=xiax.word*10;
     xianshiwd();
     xhflag=1;
   }
}
/***************************************************************************************
*******************************************按键函数区*************************************
***************************************************************************************/
void anjian()
{
    //检测状态按键
  if(TA==0)
    {
     delay20ms();
     while(TA==0);
     delay20ms();
     cnt++;
     cnt7=25;            //智能跳转计数
     if(cnt==4)         //两个状态
     {
       cnt=0;
       xhflag=0;
     }
     xianshi();
    }
}
/**************************************************************************************
===================================检测温度函数========================================
**************************************************************************************/
jiance()
{
    uchar data i,j;
    for(j=0;j<2;j++)
    {
     for(i=0;i<5;i++)
     {
      jzrref[i]=0;
      jzvref[i]=0;
     }
    for(i=0;i<5;i++)
    {
     v=ad_pro(1);
     anjian();
     vrl=ad_pro(2);
     anjian();
     v1=vref.word;
     rt1=rref.word;					/*存储时扩大了100倍,这里还原*/
     rt1=rt1/100;
     r=rt1*(v-2*vrl)/(v1-v);				/*计算出热电阻当前值*/
     t=(r-100)/0.36;					/*按照500度量程线形估计当前温度*/
     do		 				        /*采用试差法,刚才的t做初始值*/
       {
       if(r<100)					/*零度以下处理*/
      {
       v=0.00000000042735;

      }
       else						/*零度以下处理*/
       {
         v=0;
        }
      rt1=100+t*(0.390802-0.00005802*t-v*(t-100)*t*t);
      t=t+(r-rt1)/0.36;
      anjian();
       }
      while(((r-rt1)>0.005)||(rt1-r)>0.005);         /*计算余差小于0.005欧,试差法计算温度*/
      jzvref[4]=jzvref[3];
      jzvref[3]=jzvref[2];
      jzvref[2]=jzvref[1];
      jzvref[1]=jzvref[0];
      jzvref[0]=t;
      jzvref[0]=(jzvref[0]+jzvref[1]+jzvref[2]+jzvref[3]+jzvref[4])/(i+1);
      t=jzvref[0];
     }
     }
      wendu.word=10*t+0.5;
      t=10*t+0.5;
    return t;
}
/********************************首次上电初始化函数区***********************************
****************************************************************************************
***************************************************************************************/
void chushi()
{
  write_word(3,0xaa,1);                   //写入标志字头
  write_word(0,0,0);                   //时间是00:00:00
  write_word(1,0,0);
  write_word(2,0,0);
  range_zero.word=0.1;
  range_full.word=0;
  rref.word=198984;
  vref.word=519050;
  shangx.word=450;
  xiax.word=-50;
  write_word(4,shangx.byte.hhi,1);
  write_word(5,shangx.byte.hi,1);
  write_word(6,shangx.byte.lo,1);
  write_word(7,shangx.byte.llo,1);       //1302的第4个到第7个RAM区存放上限
  write_word(8,xiax.byte.hhi,1);
  write_word(9,xiax.byte.hi,1);
  write_word(10,xiax.byte.lo,1);
  write_word(11,xiax.byte.llo,1);       //1302的第8个到第11个RAM区存放下限
  write_word(12,range_zero.byte.hhi,1);
  write_word(13,range_zero.byte.hi,1);
  write_word(14,range_zero.byte.lo,1);
  write_word(15,range_zero.byte.llo,1);       //1302的第12个到第15个RAM区存放零点误差
  write_word(16,range_full.byte.hhi,1);
  write_word(17,range_full.byte.hi,1);
  write_word(18,range_full.byte.lo,1);
  write_word(19,range_full.byte.llo,1);       //1302的第16个到第19个RAM区存放满度误差
  write_word(20,rref.byte.hhi,1);          //1302的RAM区20-23放的是校准后的电阻
  write_word(21,rref.byte.hi,1);
  write_word(22,rref.byte.lo,1);
  write_word(23,rref.byte.llo,1);
  write_word(24,vref.byte.hhi,1);          //1302的RAM区24-27放的是校准后的电压
  write_word(25,vref.byte.hi,1);
  write_word(26,vref.byte.lo,1);
  write_word(27,vref.byte.llo,1);
}
/******************************非首次上电初始化函数区***********************************
****************************************************************************************
***************************************************************************************/
void chushi1()
{
  dizhi=read_word(2,1);
  shangx.byte.hhi=read_word(4,1);                   //把1302中存的上限值读出来
  shangx.byte.hi=read_word(5,1);
  shangx.byte.lo=read_word(6,1);
  shangx.byte.llo=read_word(7,1);
  xiax.byte.hhi=read_word(8,1);                    //把1302中存的下限值读出来
  xiax.byte.hi=read_word(9,1);
  xiax.byte.lo=read_word(10,1);
  xiax.byte.llo=read_word(11,1);
  range_zero.byte.hhi=read_word(12,1);              //把1302中存的零点误差值读出来
  range_zero.byte.hi=read_word(13,1);
  range_zero.byte.lo=read_word(14,1);
  range_zero.byte.llo=read_word(15,1);
  range_full.byte.hhi=read_word(16,1);              //把1302中存的满度误差值读出来
  range_full.byte.hi=read_word(17,1);
  range_full.byte.lo=read_word(18,1);
  range_full.byte.llo=read_word(19,1);
  rref.byte.hhi=read_word(20,1);                     //读出电阻基准值
  rref.byte.hi=read_word(21,1);
  rref.byte.lo=read_word(22,1);
  rref.byte.llo=read_word(23,1);
  vref.byte.hhi=read_word(24,1);                     //读出电压基准值
  vref.byte.hi=read_word(25,1);
  vref.byte.lo=read_word(26,1);
  vref.byte.llo=read_word(27,1);
}
/****************************************主函数区***************************************
****************************************************************************************
***************************************************************************************/
main()
{
  uchar data i,b;
    for(i=0;i<=9;i++)
       {                  //硬件初始化延时
          delay20ms();
       }
     SCON=0x50;                                         //串口初始化方式1
     TMOD=0x21;                                         //定时器T1为方式2,T0方式1
     TH1=0xfd;                                          //定义9600波特率
     TL1=0xfd;
     TH0=15549/256;        //中断初始化
     TL0=15549;
     TR1=1;
     TR0=1;
     RI=0;
     ET0=1;                                             //允许串口接收数据
     EA=1;                                              //CPU开中断
     ES=1;                                              //串口中断
     LIGHT1=1;
     LIGHT2=1;
     fmq=1;
     trx=0;
     for(i=0;i<5;i++)                                   //上电时保证两个灯和蜂鸣器工作
      {
        LIGHT1=0;
        LIGHT2=1;
        fmq=0;
        delay20ms();
      }
     for(i=0;i<5;i++)
      {
        LIGHT1=1;
        LIGHT2=0;
        fmq=1;
        delay20ms();
      }
     for(i=0;i<20;i++)
      {
        LIGHT1=1;
        LIGHT2=1;
        huanchong[1]=88;
        huanchong[2]=88;
        sd595hc();
        sd595();
        fmq=0;
        delay20ms();
      }
     LIGHT1=1;
     LIGHT2=1;
     fmq=11;
     ad_cs=0;
     ad_reset=0;					/*复位AD转换器*/
     dealy(2000);
     ad_reset=1;
     ad_cs=0;
     ad_write(0x20);            /*写通讯寄存器,选择通道1,并建立下一个操作为写时钟寄存器*/
     ad_write(0x04);            /*写时钟寄存器,设时钟信号位于使用的主时钟信号(2.4576MHz)*/
     ad_write(0x10);            /*写通讯寄存器,选择通道1,并建立下一个操作为写设置寄存器*/
     ad_write(0x5c);            /*写设置寄存器,清除FSYNC,建立增益为8,信号为单极性条件,并*/
                                /*初始化被选通道自校准模式,不加缓冲器,被选通道的更新速率为50Hz*/
    write_word(7,0,0);          //允许读写标志打开2
    //write_word(3,0,1);
   //rref.word=198984;
   //vref.word=519050;
    b=read_word(3,1);           //读第一次操作标志
    if(b!=0xaa)                 //判断标志对不对
      chushi();                 //调用初始化函数
    if(b==0xaa)
      chushi1();
    dizhi=read_word(2,1);
  while(1)
  {
  /*******************************************************/
     if(jsflag==0)
     {
      anjian();
      dsz1302();                               //读时钟
  /******************************************************/
      aa=jiance();                             //温度取出来时都经过*10处理(为了好显示)
      xianshi();
     }                               //显示处理
/****************************************************************/
     if(jsflag==1)                       /*校准小量程,然后必须校准大量程!!!*/
     {
      for(i=0;i<5;i++)
       {
        jzrref[i]=0;
        jzvref[i]=0;
       }
       for(i=0;i<5;i++)
        {
          jsflag=3;
          jzh_flag=1;			/*设置基准标志,避免与运算程序公用变量*/
          v1=ad_pro(1);		/*Rvr1=100;校准电阻=100欧*/
          v=ad_pro(1);
	  v1=(v1+v)/2;
	  vrl1=ad_pro(2);			/*导线压降*/
	  r=ad_pro(2);
	  vrl1=(vrl1+r)/2;
	  rl=vrl1*Rvr1/(v1-2*vrl1);
          jzrref[4]=jzrref[3];
          jzrref[3]=jzrref[2];
          jzrref[2]=jzrref[1];
          jzrref[1]=jzrref[0];
          jzrref[0]=rl;
          jzrref[0]=(jzrref[0]+jzrref[1]+jzrref[2]+jzrref[3]+jzrref[4])/(i+1);
          jzvref[4]=jzvref[3];
          jzvref[3]=jzvref[2];
          jzvref[2]=jzvref[1];
          jzvref[1]=jzvref[0];
          jzvref[0]=vrl1;
          jzvref[0]=(jzvref[0]+jzvref[1]+jzvref[2]+jzvref[3]+jzvref[4])/(i+1);
          vrl1=jzvref[0];
          rl=jzrref[0];
        }
        jshc[0]=0x55;
        jshc[1]=dizhi;
        jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
        send();
     }
    if(jsflag==2)
     {

      for(i=0;i<5;i++)
       {
        jzrref[i]=0;
        jzvref[i]=0;
       }
      for(i=0;i<5;i++)
       {
         v2=ad_pro(1);				/*Rvr2=250;校准电阻=250欧*/
         v=ad_pro(1);
         v2=(v2+v)/2;
         vrl2=ad_pro(2);
         r=ad_pro(2);
         vrl2=(vrl2+r)/2;
         r=(vrl1*(Rvr2+2*rl)*(Rvr1+2*rl)-rl*v2*(Rvr2+2*rl))/(rl*v2-vrl1*(Rvr2+2*rl));
         v=v1*(r+Rvr1+2*rl)/(Rvr1+2*rl);
         jzrref[4]=jzrref[3];
         jzrref[3]=jzrref[2];
         jzrref[2]=jzrref[1];
         jzrref[1]=jzrref[0];
         jzrref[0]=r;
         jzrref[0]=(jzrref[0]+jzrref[1]+jzrref[2]+jzrref[3]+jzrref[4])/(i+1);
         jzvref[4]=jzvref[3];
         jzvref[3]=jzvref[2];
         jzvref[2]=jzvref[1];
         jzvref[1]=jzvref[0];
         jzvref[0]=v;
         jzvref[0]=(jzvref[0]+jzvref[1]+jzvref[2]+jzvref[3]+jzvref[4])/(i+1);
         r=jzrref[0];
         v=jzvref[0];
        }
        rref.word=100*r;			/*考虑到小数因素扩大100倍存储*/
        vref.word=v;
        write_word(20,rref.byte.hhi,1);          //1302的RAM区20-23放的是校准后的电阻
        write_word(21,rref.byte.hi,1);
        write_word(22,rref.byte.lo,1);
        write_word(23,rref.byte.llo,1);
        write_word(24,vref.byte.hhi,1);          //1302的RAM区24-27放的是校准后的电压
        write_word(25,vref.byte.hi,1);
        write_word(26,vref.byte.lo,1);
        write_word(27,vref.byte.llo,1);
        ES=1;
        jshc[0]=0x55;
        jshc[1]=dizhi;
        jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
        send();
        jsflag=0;
      }

  }
}

⌨️ 快捷键说明

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