微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助高手帮忙修改一下,单片机温度上下线为25度和30度

求助高手帮忙修改一下,单片机温度上下线为25度和30度

时间:10-02 整理:3721RD 点击:
//部分代码修改自网络   18B20数码管显示温度
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS1=P3^4;     
sbit DS2=P3^5;  
sbit DS3=P3^6;
sbit ledlk=P1^0;
sbit smglk=P1^1;
sbit smgbitlk=P1^2;
//****************************动态扫描多个管脚数据***************************************
#define DatCount        3               //管脚个数
uint     TMDAT[DatCount] = {1,2,3};                        //各个管脚的标志数据
uint     TMP[DatCount];                        //读取的所有测试点的温度
uchar    SIGN[DatCount];                       //结果是否为负温,“+”为正温,“-”负温。
uint set1820_ss=3;
uint set1820_sg=0;
uint set1820_xs=2;
uint temp;
uchar a,flag;
void delay(uint ms)
{
uint i,j;
for (j=0;j<ms;j++)
  for (i=0;i<120;i++);
}
void delayus(uint us)
{
uint i,j;
for (j=0;j<us;j++)
  for (i=0;i<12;i++);
}
void showsmg(uchar smg,uchar value)
{
uchar code tablesmg[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar code table[]={ 0x3f , 0x06 ,0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f  , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71 , 0x00,0x80};
  smglk=1;
  P2=tablesmg[smg];
  smglk=0;
  smgbitlk=1;
  P2=table[value];
  smgbitlk=0;
     delay(3);
}  
void dsreset1(uint flag)   
{
  switch (flag) {
case 1:
{
   DS1=0;
      delayus(10);
      DS1=1;
      delayus(10);      
};
case 2:
{
   DS2=0;
      delayus(10);
      DS2=1;
      delayus(10);      
};
case 3:
{
   DS3=0;
      delayus(10);
      DS3=1;
      delayus(10);      
};
//default:
}
  
  
}

bit tmpreadbit1(uint flag)  
{
  // uint i;
   bit dat;
   switch (flag) {
case 1:
{
    DS1=0;
       DS1=1;  
       dat=DS1;
       delayus(1);
       return (dat);
};
case 2:
{
     DS2=0;
        DS2=1;  
        dat=DS2;
       delayus(1);
        return (dat);
};
case 3:
{
    DS3=0;
       DS3=1;  
       dat=DS3;
      delayus(1);
       return (dat);
};
//default:
}
}

uchar tmpread1(uint flag)
{
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=tmpreadbit1(flag);
    dat=(j<<7)|(dat>>1);
  }
  return(dat);
}

void tmpwritebyte1(uchar dat,uint flag)
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
switch (flag) {
     case 1:
     {
       if(testb)  
          {
             DS1=0;
             i++;i++;
             DS1=1;
             i=8;while(i>0)i--;
          }
          else
          {
             DS1=0;
             i=8;while(i>0)i--;
             DS1=1;
             i++;
          //i++;
           }  
     };
     case 2:
     {
       if(testb)  
          {
             DS2=0;
             i++;i++;
             DS2=1;
             i=8;while(i>0)i--;
          }
          else
          {
             DS2=0;
             i=8;while(i>0)i--;
             DS2=1;
             i++;
          //i++;
           }     
     };
  case 3:
     {
       if(testb)  
          {
             DS3=0;
             i++;i++;
             DS3=1;
             i=8;while(i>0)i--;
          }
          else
          {
             DS3=0;
             i=8;while(i>0)i--;
             DS3=1;
             i++;
          //i++;
           }     
     };
     //default:
     }

   
  }
}

void tmpchange1(void)   
{
  
  uchar i;
    for(i=0;i<DatCount;i++)
{
  dsreset1(TMDAT);
        delay(1);
        tmpwritebyte1(0xcc,TMDAT);   
        tmpwritebyte1(0x44,TMDAT);
}
  }
void tmp1()            
{
  float tt;
  uchar a,b;
  uchar i;
  for(i=0;i<DatCount;i++)
  {
  dsreset1(TMDAT);
  delay(1);
  tmpwritebyte1(0xcc,TMDAT);
  tmpwritebyte1(0xbe,TMDAT);
  a=tmpread1(TMDAT);
  b=tmpread1(TMDAT);
  if((b & 0xF8) == 0xF8)
  {
    SIGN=0x2D;
    TMP=b;
    TMP<<=8;            
    TMP=TMP|a;
TMP=~TMP+1;
    tt=TMP*0.0625;
    TMP=tt*10+0.5;
  }
  else  if((b | 0x07) == 0x07)
  {
   SIGN=0x2B;
    TMP=b;
    TMP<<=8;            
    TMP=TMP|a;
    tt=TMP*0.0625;
    TMP=tt*10+0.5;
  }
  }
}
/********
void readrom1()         
{
  uchar sn1,sn2;
  dsreset1();
  delay(1);
  tmpwritebyte1(0x33);
  sn1=tmpread1();
  sn2=tmpread1();
}
void sx()
{
if(temp/100>set1820_ss)
{
  ledlk=1;
  P2=0xf0;
  //smglk=1;
  
  
  
// P2=0xff;
  //ledlk=0;
  
}
else if ((temp/100==set1820_ss)&&(temp%100/10>set1820_sg))
{
  ledlk=1;
  P2=0xf0;
  //smglk=1;
  
}
  else if ((temp/100==set1820_ss)&&(temp%100/10==set1820_sg)&&(temp%100%10>=set1820_xs))
{
  ledlk=1;
  P2=0xf0;
  //smglk=1;
  
}
else
{
P2=0xff;
//beep=1;
ledlk=0;
//smglk=0;

  }
}
*************************/
void main()
{
uint p;
uchar j;
// uchar  str[18] ;
ledlk=0;
TMOD=0x20;//设定定时器为方式2  可自动再装入的8位定时器
TH1=0xfd;//装入初值
TL1=0xfd;//装入初值
TR1=1;//设定定时器开始工作
SM0=0;//设定串口工作方式1  10位异步收发器   8位数据
SM1=1;//设定串口工作方式1  10位异步收发器   8位数据
REN=1;//允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
EA=1;//开始总中断
ES=1;//串行口中断允许位;(开启)
PCON=0x80;//设定串行口波特率
// ledlk=1;
  smgbitlk=0;
  smglk=0;
while(1)
{
    for (j=0;j<DatCount;j++)
    {
    tmpchange1();   
  tmp1();
   
      for(p=0;p<100;p++)
    {
  showsmg(0,TMP[j]/100);
  showsmg(1,TMP[j]%100/10);
  showsmg(1,17);//显示小数点
  showsmg(2,TMP[j]%100%10);
  showsmg(5,j+1);
  //sx();      
  }   
    }
   
}  
}
void serial() interrupt 4
{
    uchar RMgs,j,k,str[6*DatCount];
RMgs = SBUF;
    if (RMgs == 0x31)
{
     for(k=0;k<DatCount;k++)
    {
     str[k*6+0]=k+1;
     str[k*6+1]=SIGN[k];
     str[k*6+2]=TMP[k]/1000;
  str[k*6+3]=TMP[k]%1000/100;
  str[k*6+4]=TMP[k]%1000%100/10;
  str[k*6+5]=TMP[k]%1000%100%10;
    }
     ES=0;
     for (j=0;j<6*DatCount;j++)
     {
      SBUF=str[j];
      while(!TI);
      TI=0;
     }
     ES=1;
}
   RI=0;
}


已退回3积分

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top