保温饭盒毕业设计程序

#include<reg52.h> //包括头文件,普通情况不须要修改。头文件包括特殊功能寄存器的定义
#define uchar unsigned char
#define uint  unsigned int
sbit LED0=P1^0;//定义按键位置
sbit LED1=P1^1;
sbit RELAY = P1^2; //定义继电器位置


code unsigned char  tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 
			         //共阴数码管 0-9
uchar smg[4];                 //定义缓冲区
void init_ds18b20(void) ;     //DS18B20初始化
void ds18b20write_byte(uchar dat);  //DS18B20写字节
uchar ds18b20read_byte(void);   //DS18B20读字节
uchar readtemperature(void)	;     //DS18B20读取温度
void delay(unsigned int i);   
sbit DQ=P3^7;  //ds18b20 port
void delayds18b20(uint t)
{
	while(t--);	
}
void delay(unsigned int cnt)
{
 while(--cnt);
}
 
void display(int b,int a)   //位分离
{
      smg[0]=tab[a/10];     
      smg[1]=tab[a%10];
      smg[2]=tab[b/10];     
      smg[3]=tab[b%10]; 
}
/*------------------------------------------------
              键盘扫描程序
------------------------------------------------*/
uchar keyscan(void)  //键盘扫描函数,使用行列反转扫描法
{
 uchar cord_h,cord_l;//行列值中间变量
 P3=0xf0;            //行线输出全为0
 P1=0xff;	  
 cord_h=P3&0xf0;     //读入列线值
 if(cord_h!=0x0f)    //先检測有无按键按下
	 {
	  delay(100);        //去抖
	  if(cord_h!=0x0f)
			  {			   	
			    cord_h=P3&0xf0;  //读入列线值
			    P3=cord_h|0x0f;  //输出当前列线值
			    cord_l=P3&0x0f;  //读入行线值			 
			    return(cord_h+cord_l);//键盘最后组合码值
			   }
	  }
  
}




void main()
{
    uint  key,i,a=0,b=0;
  	RELAY=0;
init_ds18b20()	;	
	key=keyscan();     //调用键盘扫描。
	for(i=0;i<4;i++)	 	   //显示函数
	   {
	   	 display(a,b);
	     P0=smg[i];
		 P2=i;
		 delay(100);
	   }
  if(key==0xe7)  
  while(1)
	   {
	   b=readtemperature();
       delay(100); 
	     key=keyscan();       
	   	 switch(key)
		   	 {
			  case 0x7e:a=0;break;//0 按下相应的键显示相相应的码值
			  case 0xbe:a=40;break; 
			  case 0xde:a=45;break;
			  case 0xee:a=55;break;	
	  
			  case 0x7d:a=65;break; 
		      case 0xbd:a=75;break; 
		      case 0xdd:a=85;break; 
		      case 0xed:a=95;break; 
		  
					 					   
		     }
			 display(b,a);
		  for(i=0;i<4;i++)	 	   //显示函数
		   {		   	
		     P0=smg[i];
			 P2=i;
			 delay(100);
		   }
  		  if(a>b)    //温度推断
		     { 
			   RELAY=1;    //继电器吸和
		       LED0=0;
			 }	  
		  else 
		   {
		    RELAY=0;   //继电器断开
			LED1=0;
			}
   }	   		 


}




void init_ds18b20(void)	    //   初始化     
{
	uchar n;
	DQ=1;		    //DQ复位
	delayds18b20(8);
	DQ=0;
	delayds18b20(80);		  //精确延时 大于 480us
	DQ=1;
	delayds18b20(10);
	n=DQ;
	delayds18b20(5);


}
void ds18b20write_byte(uchar dat)		  //   写一个字节  
{
	uchar i;
	for(i=0;i<8;i++)
	{
		DQ=0;
		DQ=dat&0x01;
		delayds18b20(5);
		DQ=1;
		dat>>=1;
	}
	delayds18b20(5);
}


uchar ds18b20read_byte(void)			//读一个字节  
{
	uchar i,value;
	for(i=0;i<8;i++)
	{
		DQ=0;		// 给脉冲信号
		value>>=1;
		DQ=1;		  // 给脉冲信号
		if(DQ)
		value|=0x80;
		delayds18b20(5);


	}
	return value;
}


uchar readtemperature(void)				  //  读取温度 
{
	uchar a,b;
	init_ds18b20();
	ds18b20write_byte(0xcc);	//跳过ROM
	ds18b20write_byte(0x44);	//启动温度測量
	delayds18b20(200);
	init_ds18b20();
	ds18b20write_byte(0xcc);
	ds18b20write_byte(0xbe);
	a=ds18b20read_byte();	  //低位
	b=ds18b20read_byte();	   //高位
   
    b<<=4;
	b+=(a&0xf0)>>4;
	return b;
}


原文地址:https://www.cnblogs.com/mengfanrong/p/5224515.html