您当前的位置:五五电子网电子知识单片机-工控设备义隆单片机EM78P468 NTC lcd测温设计C语言源代码 正文
EM78P468 NTC lcd测温设计C语言源代码

EM78P468 NTC lcd测温设计C语言源代码

点击数:7709 次   录入时间:03-04 12:00:35   整理:http://www.55dianzi.com   义隆单片机
    return(temp);
}
 

//停止信号
void i2cstop(void)
{   SCL_L; DELAY_us;
    SDA_L; DELAY_us;
    SCL_H; DELAY_us;
    SDA_H;
}


uchar wt24c(uchar *p, uchar ad, uchar n)
{ uchar t=0;
 
 i2cstart();     //发送起始信号
 
 if(i2cwt(W_ADD_COM))  //发送写字节命令及器件地址
 {
  i2cwt(ad);    //ad_dst的低位到器件
  
  for(;n>0;n--)   //发送要写入的数据
  {   i2cwt(*p);
   p++;
  }
 }
// else syserr=I2C_ERR;  //写字节命令及器件地址错
 
 i2cstop();
    tms(6);      //延时6ms
 
 return(*p);
}

//从24cxx读出数据
//参数: *p_dst要读入数据的主机内存地址指针; ad_rsc要输出数据的i2c的地址(整形); num数据个数(整形)
//参数条件:  ad_dst+(num-1)不能大于器件的最高地址; num必须>0;
void rd24c(uchar *p_dst, uchar ad_rsc, uchar num)
{
    uchar t=0;
 i2cstart();     //发送起始信号
 
 if(i2cwt(W_ADD_COM))  //发送写字节命令及器件地址
 {
  i2cwt(ad_rsc);   //ad_rsc的低位
   
  i2cstart();    //再发送起始信号
  i2cwt(R_ADD_COM);  //发送SLA_R, 读命令字节及器件地址
   
  for(;num>0;num--)
  {   *p_dst=i2crd();  //从器件读出一个字节
   p_dst++;
  }
 }
// else syserr=I2C_ERR;  //写字节命令及器件地址错或对方无应答
 
 i2cstop();

}

/***************************************************************************/
unsigned char Bin1toBcd(unsigned char Xbin1)
{
 unsigned short xBCD=0;
 do
 {
  //if(Xbin1>=100)
  //{
  // Xbin1-=100;
  // xBCD+=0x100;
  //}
  //else
  //{
   if(Xbin1>=10)
   {
    Xbin1-=10;
    xBCD+=0x10;
   }
   else
   {
    xBCD+=Xbin1;
    break;
   }
  //}
 }while(1);
 return xBCD;
}

unsigned char test_temperature(void)

    uchar tamp=0;
    Ttmp=0;
 RC_num=0;
 do
 {
  P6CR&=0xfc;
  Rp_TO_OUT;
  Rm=0;
  Rc=0;
  Rp=0;
  for(dly=0xa00;dly;dly--)
  {
   WDTC();
  }
 
  Rm_t=0;
  P6CR|=0x02;
  Rp_TO_IN;
  Rm=1;      //用基准电阻充电
  while(1)
  {
   if(Rp)
   {
    break;
   }
   Rm_t++;
  }
  WDTC();
  test_temp[RC_num]=Rm_t;
  RC_num++;
 }while(RC_num<6);
 
 RC_num=0; 
 Rmin_p=0;
 Rmax_p=5;
 Rmin_t=test_temp[0];
 Rmax_t=test_temp[5];
 do
 {
  if(test_temp[RC_num+1]<Rmin_t)
  {
   Rmin_t=test_temp[RC_num+1];
   Rmin_p=RC_num+1;
  }
  if(test_temp[4-RC_num]>Rmax_t)
  {
   Rmax_t=test_temp[4-RC_num];
   Rmax_p=4-RC_num;
  }
  RC_num++;
 }while(RC_num<5);
 
 RC_num=0;
 Rm_t=0;
 do
 {
  if(RC_num!=Rmin_p)
  {
   if(RC_num!=Rmax_p)
   {
    Rm_t+=test_temp[RC_num];
   }
  }
  RC_num++;
 }while(RC_num<6);//去max,min,取平均值
 Rm_t>>=2;

 RC_num=0;
 do
 {
  P6CR&=0xfc;
  Rp_TO_OUT;
  Rm=0;
  Rc=0;
  Rp=0;
  for(dly=0xa00;dly;dly--)
  {
   WDTC();
  }
 
  Rc_t=0;
  P6CR|=0x01;//用NTC充电
  Rp_TO_IN;
  Rc=1;
  while(1)
  {
   if(Rp)
   {
    break;
   }
   Rc_t++;
  }
  WDTC();
  test_temp[RC_num]=Rc_t;
  RC_num++;
 }while(RC_num<6);
 
 RC_num=0; 
 Rmin_p=0;
 Rmax_p=5;
 Rmin_t=test_temp[0];
 Rmax_t=test_temp[5];
 do
 {
  if(test_temp[RC_num+1]<Rmin_t)
  {
   Rmin_t=test_temp[RC_num+1];
   Rmin_p=RC_num+1;
  }
  if(test_temp[4-RC_num]>Rmax_t)
  {
   Rmax_t=test_temp[4-RC_num];
   Rmax_p=4-RC_num;
  }
  RC_num++;
 }while(RC_num<5);
 
 RC_num=0;
 Rc_t=0;
 do
 {
  if(RC_num!=Rmin_p)
  {
   if(RC_num!=Rmax_p)
   {
    Rc_t+=test_temp[RC_num];
   }
  }
  RC_num++;
 }while(RC_num<6);//去max,min,取平均值
 Rc_t>>=2;
 
 Ttmp=(unsigned long)Rc_t*9950;
 Ttmp=Ttmp/Rm_t;//求ntc值
 
 if(Ttmp>=32960)
 {
  return 0;
 }
 if(Ttmp<=3588)
 {
  return 0x50;
 }
 
 RC_num=0;
 Rm_t=Ttmp;

 do
 {
  if(Rm_t>=table[RC_num+1])//查表微调
  {
   /*Rm_t-=table[RC_num+1];
   Rc_t=table[RC_num]-table[RC_num+1];
   Rm_t*=10;
   Rm_t=Rm_t/Rc_t;
//   RC_num++;*/
   break;
  }
  RC_num++;
 }while(RC_num<48);

 tamp=Bin1toBcd(RC_num);
 //Rc_t<<=4;
 //Rm_t|=Rc_t;
 P6CR&=0xfC;
 PORT6&=0xfC;

 return tamp;
}

void display(uchar v,uchar tamp_v,uchar set_tmp)
{     
        uchar real_dep,tmp1;
      
        LCD_ADDR=6;
        LCD_DB=0x08;
        //风速+冷热
        LCD_ADDR=0;
        LCD_DB=tamp_v;
        LCD_ADDR=23;
      _asm
  {
   swap %tamp_v
  }
     LCD_DB=tamp_v;
     //当时温度
     real_dep=v;
     v>>=4;
 
     real_dep&=0x0f;
  LCD_ADDR=4;
  tmp1=lcd_ram[real_dep];
  tmp1&=0xf7;
  LCD_DB=tmp1;
 
  LCD_ADDR=3;
  _asm
  {
   swap %tmp1
  }
  LCD_DB=tmp1; 
 
  tmp1=v&0x0f;
  LCD_ADDR=2;
  tmp1=lcd_ram[tmp1];
  LCD_DB=tmp1;
  LCD_ADDR=1;
  _asm
  {
   swap %tmp1
  }
  LCD_DB=tmp1;
  //设置温度
  real_dep=set_tmp;
     set_tmp>>=4;
 
     real_dep&=0x0f;
  LCD_ADDR=10;
  tmp1=lcd_ram[real_dep];
  LCD_DB=tmp1;
 
  LCD_ADDR=9;
  _asm
  {
   swap %tmp1

上一页  [1] [2] [3] [4] [5]  下一页


本文关键字:C语言  源代码  义隆单片机单片机-工控设备 - 义隆单片机