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

📄 程序(若上面的工程文件打不开用这个).txt

📁 仓库温度检测适用于各种温度检测系统
💻 TXT
字号:
#include"reg52.h"

#define led P1                //宏定义P1口为数码管的数据口
sbit key1=P2^4;               //将P2^4口映射为变量key1
sbit key2=P2^5;               //将P2^3口映射为变量key2
sbit key3=P2^6;               //将P2^2口映射为变量key3
sbit key4=P2^7;               //将P2^1口映射为变量key4
sbit ch1=P2^3;                //通过三极管进行位选,,将P2^3口映射为变量ch1       
sbit ch2=P2^2;
sbit ch3=P2^1;
sbit ch4=P2^0;

sbit DQ=P0^2;                //DQ为ds18b12温度传感器的参数
sbit ji=P0^1;                //将P0^1口映射为变量ji,是用来驱动电机的三极管,低电平有效
sbit deng=P0^3;              //将P0^3口映射为变量deng,是用来驱动发光二极管,低电平有效
sbit feng=P0^0;              //将P0^0口映射为变量feng,是用来驱动蜂鸣器的三极管,低电平有效
 unsigned char code shu[]={0x88,0xf9,0xc4,0xe0,0xb1,0xa2,0x82,0xf8,0x80,0xa0};
   //在rom的code区定义数组shu[],长度为10,存放的是不带小数点的0-9数码管显示数据
 unsigned char code shu2[]={0x08,0x79,0x44,0x60,0x31,0x22,0x02,0x78,0x00,0x20};
   //在rom的code区定义数组shu2[],长度为10,存放的是有小数点的0-9数码管显示数据

void ms(unsigned int Delay)  //延时1毫秒的延时函数
{unsigned int a;
  for(;Delay>0;Delay--)
  {for(a=0;a<114;a++)
   {;}
  }
}
  
/***************************************************
功能函数:延时
入口参数:time
****************************************************/
//延时函数

void xdelay(unsigned int i)    //ds18b20 的延时函数
{
 while(i--);
}

/****************************************************
功能函数:DS18b20初始化
入口参数:
 ****************************************************/
void Init_DS18B20(void)
{
 unsigned char x=0;
 DQ = 1;    //DQ复位
 xdelay(8);  //稍做延时
 DQ = 0;    //单片机将DQ拉低
 xdelay(80); //精确延时 大于 480us
 DQ = 1;    //拉高总线
 xdelay(14);
 x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 xdelay(20);
}

/******************************************************
功能函数:向DS18b20读一字节数据
入口参数:
******************************************************/
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
 {
  DQ = 0;         // 给脉冲信号
  dat>>=1;
  DQ = 1;         // 给脉冲信号
  if(DQ)
   dat|=0x80;
  xdelay(4);
 }
 return(dat);
}

/******************************************************
功能函数:向DS18b20写一字节数据
入口参数:
******************************************************/
WriteOneChar(unsigned char dat)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
  xdelay(5);
  DQ = 1;
  dat>>=1;
 }

}

/******************************************************
功能函数:向DS18b20读温度值
入口参数:
出口参数:t
******************************************************/
unsigned  ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC);    // 跳过读序号列号的操作
WriteOneChar(0x44);    // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);    //跳过读序号列号的操作
WriteOneChar(0xBE);    //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5;          //放大10倍输出并四舍五入
return(t);
}

main()
{
  unsigned int k=0;
  int a,b,c,d;                //定义存放温度数值的变量a,b,c,d
  int w=0,x=2,y=8;

while(1)
 {
  while(1)                      //显示当前温度的死循环函数
   {   
    k=ReadTemperature();        //把ds18b20读出的值赋给变量m
    a=k/1000;                   //将温度的最高位赋给a
    b=k%1000/100;               //将温度的次高位赋给b
    c=k%100/10;                 //将温度的次次高位赋给c
    d=k%10;                     //将温度的最低位赋给d

     ch1=0;                     //通过每一位的三极管关断来控制该位是否亮灭,同时将
                                //温度传感器采回的数值分别发送到数码管上  
     led=shu[d];
     ms(1);
     ch1=1;

     ch2=0;
     led=shu2[c];
     ms(1);
     ch2=1;  

     ch3=0;
     led=shu[b];
     ms(1);
     ch3=1;

     ch4=0;
     led=shu[a];
     ms(1); 
     ch4=1;
   
     if(c>=y)                    //判断是否大于预置安全温度
 	  { 
	   if(b>=x)                  
         {
          deng=0;
          ji=0;
          feng=0;
         }
	   if(b<x)                    
	     {
          deng=1;
          ji=1;
          feng=1;
         }
	  }
     if(c<y)                     
      {
	   if(b>x)
	     {
		  deng=0;
          ji=0;
          feng=0;
	     }
       if(b<=x)
	     {
		  deng=1;
          ji=1;
          feng=1;
	     }
       }
	  if(key1==0) break;
    }

   while(1)                 //显示进入预设温度显示的死循环函数
    {
	  ch1=0;
      led=shu[0];
      ms(1);
      ch1=1;
    
      ch2=0;
      led=shu2[y];
      ms(1);
      ch2=1;
   
      ch3=0;
      led=shu[x];
      ms(1);
      ch3=1;

      ch4=0;
      led=shu[w];
      ms(1); 
      ch4=1;

	  if(key2==0)
	   {
		ms(500);		
	    y++;
		if(y>9)y=0;
	   }
	  if(key3==0)
	   {
		ms(500);
		x++;
		if(x>9)
		 {
		  w=1;
		  x=0;			   
		 }
		if(w>1)w=0;		 
		if(w==1)
		 {
		  if(x>2)
		   {
			x=2;
			y=5;
		   }
		 }		
		}
	   if(key4==0)
		{ 
		 ms(500);			
		 x--;
		 if(x<0)
		  {  
		   x=9;
		   w=0;
          }
		}
	   if(key1==0)break;
	 }
   }
}


⌨️ 快捷键说明

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