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

📄 温度.c

📁 温度传感器按键设置上下温度1602的应用
💻 C
字号:
////////温度测量报警系统,设置20~29度为安全范围
#include<reg52.h>
#define uchar unsigned char 
#define uint unsigned int
sbit ds=P2^7;
sbit bemp=P3^7;
sbit lcden=P2^2;
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit sh_zeng=P1^7;
sbit sh_jian=P1^6;
sbit xia_zeng=P1^5;
sbit xia_jian=P1^4;
uchar code table1[]="temp:";
uchar code table2[]="up:";
uchar code table3[]="down:";
uchar code table4[]="0123456789.-";
uchar bai,shi,ge,flag,num,shi_sh,shi_xia,ge_sh,ge_xia;
int temp;
int warn_sh=29;	  //温度上限值
int warn_xia=20;//温度下限值
 
void delayms(uint z)
{
   uint x,y;
   for(x=z;z>0;z--)
     for(y=110;y>0;y--);
}
void dsreset()  //DS18B20初始化
{
   uint i;
   ds=0;
   i=103;
   while(i>0)i--;
   ds=1;
   i=1;
   while(i>0)i--;
}
bit tempreadbit(void)  //读一位数据函数
{
   uint i;
   bit dat;
   ds=0;i++;   //延时
   ds=1;i++;i++;
   dat=ds;
   i=8;while(i>0)i--;
   return(dat);
}
uchar tempread(void)
{
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
     j=tempreadbit();
     dat=(j<<7)|(dat>>1);//将位转换为字节
  }
  return(dat);
}
void tempwrite(uchar dat)//向DS18B20写一个字节数据函数
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)
    {
      ds=0;
      i++;i++;
      ds=1;
      i=8;while(i>0)i--;
    }
    else
    {
      ds=0;
      i=8;while(i>0)i--;
      ds=1;
      i++;i++;
    }
  }
}
void tempchange() //DS18B20开始获取温度并转换
{
  dsreset();
  delayms(1);
  tempwrite(0xcc);//写跳过读ROM指令
  tempwrite(0x44);//写温度转换指令
}
void get_temp()  //读取寄存器中存储的温度数据
{
   uchar a,b;
   dsreset();
   delayms(1);
   tempwrite(0xcc);
   tempwrite(0xbe);
   a=tempread();
   b=tempread();
   temp=b;
   temp<<=8;
   temp=temp|a;
   if(!(b&0xf8))
   temp=temp*0.625;//温度在寄存器中为12为,分辨率为0.0625,加0.5是为了四舍五入
   else
   {
      temp=(~temp+1)*0.625;
      flag=1;
   }
}
 void write_com(uchar com)
{
   lcdrs=0;
   P0=com;
   delayms(5);
   lcden=1;
   delayms(5);
   lcden=0;
}
void write_date(uchar date)
{
  lcdrs=1;
  P0=date;
  delayms(5);
  lcden=1;
  delayms(5);
  lcden=0;
}
void init_1602()
{
 
}
void display(uint ch) //显示正温度数据
{
   write_com(0x80);
   for(num=0;num<5;num++)
   {
      write_date(table1[num]);
   }
   write_date(table4[ch]);
   write_date(table4[bai]);
   write_date(table4[shi]);
   write_date(table4[10]);
   write_date(table4[ge]);
   write_com(0x80+0x40);
   for(num=0;num<3;num++)
   {
     write_date(table2[num]);
   }
   write_date(table4[shi_sh]);
   write_date(table4[ge_sh]);
   write_com(0x80+0x40+0x07);
    for(num=0;num<5;num++)
   {
     write_date(table3[num]);
   }
   write_date(table4[shi_xia]);
   write_date(table4[ge_xia]);	 
}
void warn(uchar s,uchar led,uint ch)//温度报警
{
   uchar i,j;
   i=s;
   j=s/2;
   P1=~led;
   while(i--)
   {
      bemp=0;
      display(ch); 
   }
   P1=0xff;
   while(j--)
   {
      display(ch);
      bemp=1;
   }
}
void deal(int t)
{
   if(t>warn_sh*10)
   {
      warn(2,0x01,12);
   }
   else if((t<warn_xia*10)&&(t>=0))
   {
       warn(2,0x02,12);
   }
   else if(t<0)
   {
       warn(2,0x02,11);
   }
   else	
   display(12);
}
void key()  //按键扫描函数
{
   if(sh_zeng==0)
   {
      delayms(5);
      if(sh_zeng==0)
      {
          warn_sh++;
          if(warn_sh==100)
          warn_sh=99;
      }
      while(!sh_zeng);
   }
   if(sh_jian==0)
   {
      delayms(5);
      if(sh_jian==0)
      {
          warn_sh--;
          if(warn_sh==-55)
          warn_sh=-54;
      while(!sh_jian);
	  }
   }
   if(xia_zeng==0)
   {
      delayms(5);
      if(xia_zeng==0)
      {
          warn_xia++;
          if(warn_xia==100)
          warn_sh=99;
      }
      while(!xia_zeng);
   }
   if(xia_jian==0)
   {
      delayms(5);
      if(xia_jian==0)
      {
          warn_xia--;
          if(warn_xia==-55)
          warn_xia=-54;
           while(!xia_jian);
	  }
   }
}
void init()
{
  lcden=0;
  P2=0;
  flag=0;
  P0=0xff;
  P1=0xff;
  write_com(0x38); 
  write_com(0x0c);
  write_com(0x06);
  write_com(0x01); 
}
void main()
{
   init(); 
   while(1)
   {  
      key();
      tempchange();
      get_temp();
	  bai=temp/100;
      shi=temp%100/10;
      ge=temp%10;
	  shi_sh=warn_sh%100/10;
      ge_sh=warn_sh%10;
	  shi_xia=warn_xia%100/10;
      ge_xia=warn_xia%10;
      if(flag==0)
      {
         deal(temp);
		 display(12);
      }
      else
      {
        flag=0;
		display(11);
        warn(2,0x02,11);
      }
   }
} 

⌨️ 快捷键说明

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