基于51单片机DS18B20测温LCD1602显示可设时设温调时的项目

一、前言

1、基于51单片机DS18B20测温LCD1602显示可设时设温调时的项目包括用Keil软件编写单片机C语言程序和用Proteus软件仿真单片机外围电路

2、基于51单片机DS18B20测温LCD1602显示可设时设温调时的项目构思

(1)、声明程序变量思维导图

在这里插入图片描述

(2)、程序子函数思维导图

在这里插入图片描述

(3)、程序主函数思维导图

在这里插入图片描述

二、基于51单片机DS18B20测温LCD1602显示可设时设温调时的项目的Keil软件编写的单片机C语言程序

#include<reg52.h>//声明51单片机内部寄存器头文件
#define uchar unsigned char //自定义uchar为unsigned char(即无符号字符型数据,数据范围:0到255。)
#define uint unsigned int//自定义uint为unsigned int(即无符号整数型数据,数据范围:0到65535。)
sbit RS=P0^7;//位定义LCD1602字符型液晶显示器的数据/命令选择引脚                 
sbit RW=P0^6;//位定义LCD1602字符型液晶显示器的读写引脚                        
sbit EN=P0^5; //位定义LCD1602字符型液晶显示器的使能引脚
sbit DQ=P1^6;//位定义DS18B20温度传感器数据端口
sbit FengNingQi=P3^1;//位定义蜂鸣器口
sbit S=P3^2;//位定义启停按键S
sbit S0=P3^3;//位定义设时按键S0
sbit S1=P3^4;//位定义设温按键S1
sbit S2=P3^5;//位定义调时按键S2
sbit S3=P3^6;//位定义增加按键S3
sbit S4=P3^7;//位定义减少按键S4
uchar count,Snum,S0num,S1num,S2num,S3numflag,S4numflag,TR0flag,setsecondflag,setminutanflag,sethourflag,miaoflag,fenflag,shiflag,settemperatureflag;//定时器0中断次数变量、启停按键按下次数变量、设时按键按下次数变量、设温按键下次数变量、调时按键按下次数变量、增加键标志位变量、减少键标志位变量、定时器0标志位变量、设时秒钟标志位变量、设时分钟标志位变量、设时时钟标志位变量、秒钟标志位变量、分钟标志位变量、时钟标志位变量、设温标志位变量
uchar miao,fen,shi;//走时秒钟变量、走时分钟变量、走时时钟变量
uchar setsecond,setminutan,sethour;//设时秒钟变量、设时分钟变量、设时时钟变量
uchar setsecondge,setsecondshi;//设时秒钟个位变量、设时秒钟十位变量
uchar setminutange,setminutanshi;//设时分钟个位变量、设时分钟十位变量
uchar sethourge,sethourshi;//设时时钟个位变量、设时时钟十位变量
uchar secondge,secondshi; //调时秒钟个位变量、调时秒钟十位变量
uchar minutange,minutanshi;//调时分钟个位变量、调时分钟十位变量
uchar hourge,hourshi;//调时时钟个位变量、调时时钟十位变量
uchar qitingflag,temperaturedisplayflag,lcd1602displaytimeflag,settimedisplayflag,settemperaturedisplayflag,tiaotimedisplayflag,timebaojingflag,temperatruebaojingflag;//启停键标志位变量、温度显示标志位变量、液晶显示器显示时间标志位变量、设时显示标志位变量、设温显示标志位变量、调时显示标志位变量、时间报警标志位变量、温度报警标志位变量
uint temperature,t;//读温度变量
uint temperatureflag;//负温度标志位变量
uint wendu,wenduxiaoshu,xiaoshudian,wenduge,wendushi,wendubai,fuhaowei,setwendu,setwenduxiaoshu,setwenduge,setwendushi,setwendubai,settemperature;//测温变量、测温小数变量、测温小数点变量、测温个位变量、测温十位变量、测温百位变量、温度符号位变量、设温变量、设温小数变量、设温个位变量、设温十位变量、设温百位变量、总设温变量
//uchar table0[]="00:00:00";//LCD1602字符型液晶显示器第一行初始显示
uchar table1[]="00:00:00";//LCD1602字符型液晶显示器显示第二行走时初始化数组变量
  void Delay(uint z)//毫秒延时程序
{
   uint x,y;
   for(x=z;x>0;x--)
	for(y=110;y>0;y--);
 }
  void DS18B20_Delay(uint i)//DS18B20温度传感器微妙延时函数
{
   while(i--);
 }
  void LCD1602WriteCommand(uchar command)//LCD1602字符型液晶显示器写指令函数
{
   RS=0;//LCD1602字符型液晶显示器指令寄存器命令选择引脚置低电平
   RW=0;//LCD1602字符型液晶显示器写指令操作写引脚置低电平
   P2=command;//LCD1602字符型液晶显示器写指令函数写指令到单片机P2组端口,再输送到LCD1602字符型液晶显示器指令寄存器中执行。
   Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
   EN=1;//LCD1602字符型液晶显示器使能端引脚置高电平  
   Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
   EN=0;//LCD1602字符型液晶显示器使能端引脚置低电平
 }
  void LCD1602WriteData(uchar information)//LCD1602字符型液晶显示器写数据函数
{  
   RS=1;//LCD1602字符型液晶显示器数据寄存器数据选择引脚置高电平
   RW=0;//LCD1602字符型液晶显示器写数据操作写引脚置低电平
   P2=information;//LCD1602字符型液晶显示器写数据函数写数据到单片机P2组端口,再输送到LCD1602字符型液晶显示器上显示。
   Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
   EN=1;//LCD1602字符型液晶显示器使能端引脚置高电平 
   Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
   EN=0;//LCD1602字符型液晶显示器使能端引脚置低电平
 }
  void LCD1602Init()//LCD1602字符型液晶显示器初始化函数
{
   LCD1602WriteCommand(0x38);//设置LCD1602字符型液晶显示器16x2显示,5*7或5*8点阵,8位数据并口,简称显模。
   LCD1602WriteCommand(0x08);//设置LCD1602字符型液晶显示器显示开,简称亮屏。
   LCD1602WriteCommand(0x01);//设置清除LCD1602字符型液晶显示器屏上所有内容,并让光标复位到LCD1602字符型液晶显示器屏左上角,简称清屏。
   LCD1602WriteCommand(0x06);//设置开光标(或字符)地址指针自增1,光标右移动一个字符位,整屏显示不移动。
   LCD1602WriteCommand(0x0c);//设置开LCD1602字符型液晶显示器显示,关光标,关光标(字符)闪烁。
 }
  void LCD1602DisplayInitTime()//LCD1602字符型液晶显示器显示初始化时间函数
{
   uchar j;//j表示数组元素个数变量
//   WriteCommand(0x80+0x00);//LCD1602字符型液晶显示器第一行第一个位置显示
//   for(j=0;j<8;j++)//有10个字符,要循环10次。
//  {
//    WriteData(table0[j]);//显示字符串
//    Delay(5);
//   }
   LCD1602WriteCommand(0x80+0x40);//LCD1602字符型液晶显示器第二行第一个位置显示
   for(j=0;j<8;j++)//有8个字符,要循环8次。
  { 
    LCD1602WriteData(table1[j]);//显示走时
    Delay(5);//毫秒延时
   }
 }
  void LCD1602DisplayTimeFenJie(uchar address,uchar num)//LCD1602字符型液晶显示器显示走时时间两位数分解函数
{
   uchar ge,shi;//声明走时时间个位变量、走时时间十位变量
   ge=num%10;//走时时间个位变量分解
   shi=num/10;//走时时间十位变量分解
   LCD1602WriteCommand(0x80+0x40+address);//LCD1602字符型液晶显示器第二行某个显示位
   LCD1602WriteData(0x30+shi);//0x30表示字符库的数字0,整个代码表示走时时间十位变量可显示0到9的数字。
   LCD1602WriteData(0x30+ge);//0x30表示字符库的数字0,整个代码表示走时时间个位变量可显示0到9的数字。 
 }
  void LCD1602DisplayGeDigitResolve(uchar address,uchar num)//LCD1602字符型液晶显示器显示调时时间个位数分解函数
{
   uchar ge;//调时时间个位变量
   ge=num%10;//调时时间个位变量分解
   LCD1602WriteCommand(0x80+0x40+address);//LCD1602字符型液晶显示器第二行某个显示位
   LCD1602WriteData(0x30+ge);//0x30表示字符库的数字0,整个代码表示调时时间个位变量可显示0到9的数字。
 }
  void LCD1602DisplayShiDigitResolve(uchar address,uchar num)//LCD1602字符型液晶显示器显示调时时间十位变量分解函数
{
   uchar shi;//调时时间十位变量
   shi=num%10;//调时时间十位变量分解
   LCD1602WriteCommand(0x80+0x40+address);//LCD1602字符型液晶显示器第二行某个显示位
   LCD1602WriteData(0x30+shi);//0x30表示字符库的数字0,整个代码表示调时时间十位变量可显示0到9的数字。
 }
  bit DS18B20Init()//DS18B20温度传感器初始化函数
{
   uchar x=0;//声明一个表示低电平变量
   DQ = 1;//单片机将DS18B20通信端口DQ拉高复位  
   DS18B20_Delay(8);//稍做DS18B20温度传感器延时
   DQ = 0;//单片机将DS18B20通信端口DQ拉低 
   DS18B20_Delay(80);//DS18B20温度传感器延时在480us与960us之间
   DQ = 1;//单片机将DS18B20通信端口DQ拉高
   DS18B20_Delay(4);//DS18B20温度传感器延时在15us与60us之间
   x=DQ;//稍做延时后,如果x=0,则初始化成功,若x=1则初始化失败。
   DS18B20_Delay(20);//DS18B20温度传感器延时在60us与240us之间
   return x;//返回低电平变量
 }
  void DS18B20_WriteOneByte(uchar j)//DS18B20温度传感器写一个字节函数
{
   uchar i=0;//声明一个循环变量
   for (i=8; i>0; i--)//单片机向DS18B20温度传感器写入数据
  {
    DQ = 0;//单片机将DS18B20温度传感器通信端口DQ从高电平拉至低电平时,单片机向DS18B20温度传感器写数据开始。
	DQ = j&0x01;//单片机按将字节低位写入DS18B20温度传感器
    DS18B20_Delay(5);//DS18B20温度传感器延时在60us与120us之间
    DQ = 1;//单片机将DS18B20温度传感器通信端口DQ拉高 
	j>>=1;//变量j右移一位,最高位补零。例如当j=1,换成二进制是0000 0001,右移一位就是0000 000。扩展:单片机无符号或有符号数左移几位,高位就依次补几位0,低位也依次去掉几位,让左移几位依次代替低位去掉的几位。单片机有符号数,如果是正数,右移几位,先是确定最高位用0,低位也依次去掉几位,让右移几位依次代替低位去掉的几位,如果是负数,右移几位,先是确定最高位用1,低位也依次去掉几位,让右移几位依次代替低位去掉的几位。       
   }
 }
  uchar DS18B20_ReadOneByte()//DS18B20温度传感器读一个字节函数
{
   uchar i=0;//声明一个循环变量
   uchar j = 0;//声明一个移位变量
   for (i=8;i>0;i--)//单片机读取DS18B20温度传感器采集的温度数值转换成一个字节
  {
    DQ = 0;//单片机将DS18B20温度传感器通信端口DQ从高电平拉成低电平时,单片机读取DS18B20温度传感器所采集到温度数值开始。
    j>>=1;//变量j右移一位,最高位补零。例如当j=1,换成二进制是0000 0001,右移一位就是0000 000。扩展:单片机无符号或有符号数左移几位,高位就依次补几位0,低位也依次去掉几位,让左移几位依次代替低位去掉的几位。单片机有符号数,如果是正数,右移几位,先是确定最高位用0,低位也依次去掉几位,让右移几位依次代替低位去掉的几位,如果是负数,右移几位,先是确定最高位用1,低位也依次去掉几位,让右移几位依次代替低位去掉的几位。
    DQ = 1;//单片机将DS18B20温度传感器通信端口DQ拉高
    if(DQ)//判断DS18B20温度传感器数据端口DQ是否等于1
    j|=0x80;//若DQ=1,则让当前j最高位为1,在下次循环中移位至次高位,最后达到从低位到高位接收的目的;若DQ=0,则可跳过此语句,直接在下次循环对byte进行移位补0。  
    DS18B20_Delay(4);//稍做DS18B20温度传感器延时
  }
   return j;
}
  uint DS18B20_ReadTemperature()//单片机读取DS18B20温度传感器温度函数
{
   uchar L=0;//定义低8位温度变量值
   uchar H=0;//定义高8位温度变量值	
   DS18B20Init( );//DS18B20温度传感器初始化函数
   DS18B20_WriteOneByte(0xcc);//单片机只连一个DS18B20温度传感器时,可写该段代码,表示单片机向DS18B20温度传感器写入跳过读DS18B20温度传感器序列号指令。
   DS18B20_WriteOneByte(0x44);//单片机向DS18B20温度传感器九字节暂存器(包括两个字节储温温度寄存器、一字节高温触发器、一字节低温触发器、一字节温度精度转换配置寄存器、三个字节的保留位、一字节DS18B20温度传感器的64位ROM前56位编码校验CRC发生器)中前两个字节温度寄存器写入启动DS18B20温度传感器温度转换指令
//   DS18B20_Delay(100);//稍作延时
   DS18B20Init( );//DS18B20温度传感器初始化函数
   DS18B20_WriteOneByte(0xcc);//单片机只连一个DS18B20温度传感器时,可写该段代码,表示单片机向DS18B20温度传感器写入跳过读DS18B20温度传感器序列号指令。
   DS18B20_WriteOneByte(0xbe);//单片机向DS18B20温度传感器九字节暂存器(包括两个字节储温温度寄存器、一字节高温触发器、一字节低温触发器、一字节温度精度转换配置寄存器、三个字节的保留位、一字节DS18B20温度传感器的64位ROM前56位编码校验CRC发生器)中前两个字节温度寄存器写入DS18B20温度传感器读取温度的指令
//   DS18B20_Delay(100);//稍作延时
   L=DS18B20_ReadOneByte( );//单片机向DS18B20温度传感器发送读取温度值低8位指令,把读到的温度值低8位赋给低8位温度变量值
   H=DS18B20_ReadOneByte( );//单片机向DS18B20温度传感器发送读取温度值高8位指令,把读到的温度值高8位赋给高8位温度变量值
   temperature = H;//DS18B20温度传感器读到的高8位温度变量值赋给温度变量值,变成高8位温度变量值,此时其还不是一个温度变量值,由于一个温度变量值是由高8位低8位共16位组成。
   temperature = temperature << 8;//温度变量值高8位左移8位,就可以变成一个只有高8位低8位全0的温度变量值。
   temperature = temperature | L;//只有高8位低8位全0的温度变量值与温度变量值低8位或运算后就变成一个真正有高8位低8位共16位的温度变量值 
   if(temperature>0x0fff)//判断表示温度寄存器16位二进制数的温度变量值是否大于表示温度寄存器16位二进制数的正温度值,假若大于且当表示温度寄存器16位二进制数的温度变量值的前5位二进制数全为1时,该温度变量值表示负温度值。
  {
	temperature = ~temperature+2;//负温度变量值
	temperatureflag=1;//负温度标志变量置1
   }
   else
  {  	
	temperatureflag=0;//负温度标志变量等于0
   }
   temperature = temperature*0.0625*10;//扩大10倍的温度变量数值
   return temperature;//返回扩大10倍的温度变量数值   
 }
  void SetTimeInit()//设时初始化函数
{
   LCD1602WriteCommand(0x80+0x00);//LCD1602字符型液晶显示器第一行第0个(从第零开始数)显示位
   LCD1602WriteData(0x30+sethourshi);//0x30表示字符库的数字0,整个代码表示设时时钟十位变量可显示0到9的数字。
   LCD1602WriteData(0x30+sethourge);//0x30表示字符库的数字0,整个代码表示设时时钟个位变量可显示0到9的数字。
   LCD1602WriteData(0x3a);//0x3a表示字符库中冒号
   LCD1602WriteData(0x30+setminutanshi);//0x30表示字符库的数字0,整个代码表示设时分钟十位变量可显示0到9的数字。
   LCD1602WriteData(0x30+setminutange);//0x30表示字符库的数字0,整个代码表示设时分钟个位变量可显示0到9的数字。
   LCD1602WriteData(0x3a);//0x3a表示字符库中冒号
   LCD1602WriteData(0x30+setsecondshi);//0x30表示字符库的数字0,整个代码表示设时秒钟十位变量可显示0到9的数字。
   LCD1602WriteData(0x30+setsecondge);//0x30表示字符库的数字0,整个代码表示设时秒钟个位变量可显示0到9的数字。     
  }
  void SetTimeKeyScan()//设时按键扫描函数
{
   if(S0==0)//判断设时按键是否按下
  {
  	Delay(5);//毫秒延时
	if(S0==0)//再次判断设时按键是否按下
   {
	 settemperatureflag=0;//设温标志位变量置0,在温度报警函数执行后但不报警的情况下,温度报警函数里边余留settemperatureflag==1和TR0=1,当操作设时按键扫描函数时,计时依然在执行,导致计时不恰当,因此在设时按键扫描函数里边添加settemperatureflag=0和TR0=0,执行设时按键扫描函数后,温度报警函数里边settemperatureflag==1和TR0=1被置换成settemperatureflag=0和TR0=0,很好地解决了在操作设时按键扫描函数时,计时依然在执行,导致计时不恰当的问题。
	 S0num++;//设时按键按下次数变量加加
	 while(!S0);//等待设时按键弹起
	 switch(S0num)//设时按键按下次数变量选择位
	{
	  case 1://设时按键第一次按下
	         TR0=0;//关定时器0
			 TR0flag=0;//定时器0标志位变量置0,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留TR0flag==1,当再次操作设时按键扫描函数设时时,会发生在设时过程中触发设时报警条件而报警,因此在设时按键扫描函数里边添加TR0flag=0,再次执行设时按键扫描函数后,温度报警函数里边TR0flag==1被置换成TR0flag=0,很好地解决了再次操作设时按键扫描函数设时时,在设时过程中触发设时报警条件而报警的问题。
			 tiaotimedisplayflag=1;//调时显示标志位变量置1,在操作设时按键扫描函数的情况下,不能操作调时按键扫描函数。
			 settemperaturedisplayflag=1;//设温显示标志位变量置1,在操作设时按键扫描函数的情况下,不能操作设温按键扫描函数。
			 lcd1602displaytimeflag=1;//液晶显示器显示时间标志位变量置1,在操作设时按键扫描函数的情况下,不受时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数影响。
			 temperaturedisplayflag=1;//温度显示标志位变量置1,在操作设时按键扫描函数的情况下,不受温度分解函数和温度显示函数影响。
			 LCD1602WriteCommand(0x80+0x00+0x07);//LCD1602字符型液晶显示器第一行第7个(从第0开始数)位置的显示位
	         LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
			 break;
	  case 2://设时按键第二次按下 
			 LCD1602WriteCommand(0x80+0x00+0x06);//LCD1602字符型液晶显示器第一行第6个(从第0开始数)个位置的显示位
	         LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
			 break;
	  case 3://设时按键第三次按下
			 LCD1602WriteCommand(0x80+0x00+0x04);//LCD1602字符型液晶显示器第一行第4个(从第0开始数)位置的显示位
	         LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
			 break;
	  case 4://设时按键第四次按下
			 LCD1602WriteCommand(0x80+0x00+0x03);//LCD1602字符型液晶显示器第一行第3个(从第0开始数)位置的显示位
	         LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
			 break;
	  case 5://设时按键第五次按下
			 LCD1602WriteCommand(0x80+0x00+0x01);//LCD1602字符型液晶显示器第一行第1个(从第0开始数)位置的显示位
	         LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
			 break;
	  case 6://设时按键第六次按下
			 LCD1602WriteCommand(0x80+0x00+0x00);//LCD1602字符型液晶显示器第一行第0个(从第0开始数)位置的显示位
	         LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
			 break;
      case 7://设时按键第七次按下
			 LCD1602WriteCommand(0x80+0x00+0x07);//LCD1602字符型液晶显示器第一行第7个(从第0开始数)位置的显示位
	         LCD1602WriteCommand(0x0c);//LCD1602字符型液晶显示器关光标(或字符)闪烁。
			 TR0=1;//开定时器0
			 TR0flag=1;//定时器0标志位变量置1,为了在操作设时按键扫描函数进行设时后,可以执行时间报警函数。
			 S0num=0;//设时按键按下次数变量清零,可以反复操作设时按键。
			 settemperaturedisplayflag=0;//设温显示标志位变量置0,让设时按键扫描函数执行后,可允许设温按键扫描函数执行。
			 tiaotimedisplayflag=0;//调时显示标志位变量置0,让设时按键扫描函数执行后,可允许调时按键扫描函数执行。
			 lcd1602displaytimeflag=0;//液晶显示器显示时间标志位变量等于0,让设时按键扫描函数执行后,可允许时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数执行。
			 temperaturedisplayflag=0;//温度显示标志位变量等于0,让设时按键扫描函数执行后,可允许温度分解函数和温度显示函数执行。
			 break;
	 default:
	         S0num=0;//设温按键按下次数变量清零,可以反复操作设时按键。
			 break;  
	  }
	 }
	}
	if(S0num!=0)//判断设时按键按下次数变量是否不为0
  {
     if(S3==0)//判断增加按键是否按下
	{
	  Delay(5);//毫秒延时
	  if(S3==0)//再次判断增加按键是否按下
	 {
	   S3numflag=1;//增加键标志位变量置1,可以在时间报警函数内进行设时报警。
	   while(!S3);//等待增加按键弹起
       switch(S0num)//设时按键按下次数变量选择位
	  {
	    case 1://设时按键第一次按下
		       setsecondflag=1;//设时秒钟标志位变量置1,表示设时秒钟变量数值修改。
			   setsecondge++;//设时秒钟个位变量加加
		       if(setsecondge==10)//判断设时秒钟个位变量是否达到10
		       setsecondge=0;//设时秒钟个位变量置零
		       LCD1602WriteCommand(0x80+0x00+0x07);//写入LCD1602字符型液晶显示器第一行第7个(从第0个开始数)位置的设时秒钟个位变量显示位
			   LCD1602WriteData(0x30+setsecondge);//0x30表示字符库的数字0,整个代码表示设时秒钟个位变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x07);//写入LCD1602字符型液晶显示器第一行第7个(从第0个开始数)位置的设时秒钟个位变量显示位
			   setsecond=setsecondshi*10+setsecondge;//设时秒钟变量求和表达式
			   break;
		case 2://设时按键第二次按下
			   setsecondflag=1;//设时秒钟标志位变量置1,表示设时秒钟变量数值修改。
			   setsecondshi++;//设时秒钟十位变量加加
		       if(setsecondshi==6)//判断设时秒钟十位变量是否达到6
		       setsecondshi=0;//设时秒钟十位变量置零
			   LCD1602WriteCommand(0x80+0x00+0x06);//写入LCD1602字符型液晶显示器第一行第6个(从第0个开始数)位置的设时秒钟十位变量显示位
			   LCD1602WriteData(0x30+setsecondshi);//0x30表示字符库的数字0,整个代码表示设时秒钟十位变量变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x06);//写入LCD1602字符型液晶显示器第一行第6个(从第0个开始数)位置的设时秒钟十位变量显示位
			   setsecond=setsecondshi*10+setsecondge;//设时秒钟变量求和表达式
			   break;
	   	case 3://设时按键第三次按下
			   setminutanflag=1;//设时分钟标志位变量置1,表示设时分钟变量数值修改。
			   setminutange++;//设时分钟个位变量加加
		       if(setminutange==10)//判断设时分钟个位变量是否达到10
		       setminutange=0;//设时分钟个位变量置零
			   LCD1602WriteCommand(0x80+0x00+0x04);//写入LCD1602字符型液晶显示器第一行第4个(从第0个开始数)位置的设时分钟个位变量显示位
			   LCD1602WriteData(0x30+setminutange);//0x30表示字符库的数字0,整个代码表示设时分钟个位变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x04);//写入LCD1602字符型液晶显示器第一行第4个(从第0个开始数)位置的设时分钟个位变量显示位
			   setminutan=setminutanshi*10+setminutange;//设时分钟变量求和表达式
			   break;
		case 4://设时按键第四次按下
			   setminutanflag=1;//设时分钟标志位变量置1,表示设时分钟变量数值修改。
			   setminutanshi++;//设时分钟十位变量加加
		       if(setminutanshi==6)//判断设时分钟十位变量设定值是否达到6
		       setminutanshi=0;//设时分钟十位变量置零
			   LCD1602WriteCommand(0x80+0x00+0x03);//写入LCD1602字符型液晶显示器第一行第3个(从第0个开始数)位置的设时分钟十位变量显示位
			   LCD1602WriteData(0x30+setminutanshi);//0x30表示字符库的数字0,整个代码表示设时分钟十位变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x03);//写入LCD1602字符型液晶显示器第一行第3个(从第0个开始数)位置的设时分钟十位变量显示位
			   setminutan=setminutanshi*10+setminutange;//设时分钟变量求和表达式
			   break;
	   	case 5://设时按键第五次按下
		       sethourflag=1;//设时时钟标志位变量置1,表示设时时钟变量数值修改。
		       sethourge++;//设时时钟个位变量加加
		       if(sethourge==4)//判断设时时钟个位变量是否达到4
		       sethourge=0;//设时时钟个位变量置零
			   LCD1602WriteCommand(0x80+0x00+0x01);//写入LCD1602字符型液晶显示器第一行第1个(从第0个开始数)位置的设时时钟个位变量显示位
			   LCD1602WriteData(0x30+sethourge);//0x30表示字符库的数字0,整个代码表示设时时钟个位变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x01);//写入LCD1602字符型液晶显示器第一行第1个(从第0个开始数)位置的设时时钟个位变量显示位
			   sethour=sethourshi*10+sethourge;//设时时钟变量求和表达式
			   break;
		case 6://设时按键第六次按下
		       sethourflag=1;//设时时钟标志位变量置1,表示设时时钟变量数值修改。
			   sethourshi++;//设时时钟十位变量加加
		       if(sethourshi==3)//判断设时时钟十位是否达到3
		       sethourshi=0;//设时时钟十位变量置零
			   LCD1602WriteCommand(0x80+0x00+0x00);//写入LCD1602字符型液晶显示器第一行第0个(从第0个开始数)位置的设时时钟十位变量显示位
			   LCD1602WriteData(0x30+sethourshi);//0x30表示字符库的数字0,整个代码表示设时时钟十位变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x00);//写入LCD1602字符型液晶显示器第一行第0个(从第0个开始数)位置的设时时钟十位变量显示位
			   sethour=sethourshi*10+sethourshi;//设时时钟变量求和表达式
			   break;
	   }
      }
	 }
	}
	if(S0num!=0)//判断设时按键按下次数变量是否不为0
  {
     if(S4==0)//判断减少按键是否按下
	{
	  Delay(5);//延时
	  if(S4==0)//再次判断减少按键是否按下
	 {
	   S4numflag=1;//减少键标志位变量,可以在时间报警函数内进行设时报警。
	   while(!S4);//等待减少按键弹起
       switch(S0num)//设时按键按下次数变量选择位
	  {
	    case 1://设时按键第一次按下
			   setsecondflag=1;//设时秒钟标志位变量置1,表示设时秒钟变量数值修改。
			   setsecondge--;//设时秒钟个位变量减减
		       if(setsecondge==-1)//判断设时秒钟个位变量是否达到-1
		       setsecondge=9;//设时秒钟个位变量置9
			   LCD1602WriteCommand(0x80+0x00+0x07);//写入LCD1602字符型液晶显示器第一行第7个(从第0个开始数)位置的设时秒钟个位变量显示位
			   LCD1602WriteData(0x30+setsecondge);//0x30表示字符库的数字0,整个代码表示设时秒钟个位变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x07);//写入LCD1602字符型液晶显示器第一行第7个(从第0个开始数)位置的设时秒钟个位变量显示位
			   setsecond=setsecondshi*10+setsecondge;//设时秒钟变量求和表达式
			   break;
		case 2://设时按键第二次按下
			   setsecondflag=1;//设时秒钟标志位变量置1,表示设时秒钟数值修改。
			   setsecondshi--;//设时秒钟十位变量减减
		       if(setsecondshi==-1)//判断设时秒钟十位变量是否达到-1
		       setsecondshi=5;//设时秒钟十位变量数置5
			   LCD1602WriteCommand(0x80+0x00+0x06);//写入LCD1602字符型液晶显示器第一行第6个(从第0个开始数)位置的设时秒钟十位变量显示位
			   LCD1602WriteData(0x30+setsecondshi);//0x30表示字符库的数字0,整个代码表示设时秒钟十位变量变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x06);//写入LCD1602字符型液晶显示器第一行第6个(从第0个开始数)位置的设时秒钟十位变量显示位
			   setsecond=setsecondshi*10+setsecondge;//设时秒钟变量求和表达式
			   break;
	   	case 3://设时按键第三次按下
			   setminutanflag=1;//设时分钟标志位变量置1,表示设时分钟变量数值修改。
			   setminutange--;//设时分钟个位变量减减
		       if(setminutange==-1)//判断设时分钟个位变量是否达到-1
		       setminutange=9;//设时分钟个位变量置9
			   LCD1602WriteCommand(0x80+0x00+0x04);//写入LCD1602字符型液晶显示器第一行第4个(从第0个开始数)位置的设时分钟个位变量显示位
			   LCD1602WriteData(0x30+setminutange);//0x30表示字符库的数字0,整个代码表示设时分钟个位变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x04);//写入LCD1602字符型液晶显示器第一行第4个(从第0个开始数)位置的设时分钟个位变量显示位
			   setminutan=setminutanshi*10+setminutange;//设时分钟变量求和表达式
			   break;
		case 4://设时按键第四次按下
			   setminutanflag=1;//设时分钟标志位变量置1,表示设时分钟变量数值修改。
			   setminutanshi--;//设时分钟十位变量减减
		       if(setminutanshi==-1)//判断设时分钟十位变量是否达到-1
		       setminutanshi=5;//设时分钟十位变量置9
			   LCD1602WriteCommand(0x80+0x00+0x03);//写入LCD1602字符型液晶显示器第一行第3个(从第0个开始数)位置的设时分钟十位变量显示位
			   LCD1602WriteData(0x30+setminutanshi);//0x30表示字符库的数字0,整个代码表示设时分钟十位变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x03);//写入LCD1602字符型液晶显示器第一行第3个(从第0个开始数)位置的设时分钟十位变量显示位
			   setminutan=setminutanshi*10+setminutange;//设时分钟变量求和表达式
			   break;
	   	case 5://设时按键第五次按下
		       sethourflag=1;//设时时钟标志位变量置1,表示设时时钟变量数值修改。
			   sethourge--;//设时时钟个位变量减减
		       if(sethourge==-1)//判断设时时钟个位变量是否达到-1
		       sethourge=3;//设时时钟个位变量置3
			   LCD1602WriteCommand(0x80+0x00+0x01);//写入LCD1602字符型液晶显示器第一行第1个(从第0个开始数)位置的设时时钟个位变量显示位
			   LCD1602WriteData(0x30+sethourge);//0x30表示字符库的数字0,整个代码表示设时时钟个位变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x01);//写入LCD1602字符型液晶显示器第一行第1个(从第0个开始数)位置的设时时钟个位变量显示位
			   sethour=sethourshi*10+sethourge;//设时时钟变量求和表达式
			   break;
		case 6://设时按键第六次按下
		       sethourflag=1;//设时时钟标志位变量置1,表示设时时钟变量数值修改。
			   sethourshi--;//设时时钟十位变量减减
		       if(sethourshi==-1)//判断设时时钟十位变量是否达到-1
		       sethourshi=2;//设时时钟十位变量置2
			   LCD1602WriteCommand(0x80+0x00+0x00);//写入LCD1602字符型液晶显示器第一行第0个(从第0个开始数)位置的设时时钟十位变量显示位
			   LCD1602WriteData(0x30+sethourshi);//0x30表示字符库的数字0,整个代码表示设时时钟十位变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x00);//写入LCD1602字符型液晶显示器第一行第0个(从第0个开始数)位置的设时时钟十位变量显示位
			   sethour=sethourshi*10+sethourge;//设时时钟变量求和表达式
			   break;
	   }
      }
	 }
	}
  } 
  void SetTemperatrueInit()//设温初始化函数
{
   LCD1602WriteCommand(0x80+0x08);//LCD1602字符型液晶显示器第一行第九个(从第零开始数)显示位
   LCD1602WriteData(fuhaowei);//符号位显示。
   LCD1602WriteData(0x30+setwendubai);//0x30表示字符库的数字0,整个代码表示设温百位变量可显示0到9的数字。
   LCD1602WriteData(0x30+setwendushi);//0x30表示字符库的数字0,整个代码表示设温十位变量可显示0到9的数字。
   LCD1602WriteData(0x30+setwenduge);//0x30表示字符库的数字0,整个代码表示设温个位变量可显示0到9的数字。
   LCD1602WriteData(0x2e);//小数点
   LCD1602WriteData(0x30+setwenduxiaoshu);//0x30表示字符库的数字0,整个代码表示设温小数位变量可显示0到9的数字。
   LCD1602WriteData(0xdf);//0xdf表示字符库中摄氏度左上角的符号
   LCD1602WriteData(0x43);//0x43表示字符库中大写字母C
  }
  void TemperatureFenJie()//温度分解函数   
{
   wendu=DS18B20_ReadTemperature();//DS18B20读到的温度值赋给温度值变量
   if(temperatureflag==1)//判断负温度标志变量是否等于1
  {	
	fuhaowei=0x2d;//负符号
	wendubai=wendu/1000;//温度百位变量分解
    wendushi=wendu%1000/100;//温度十位变量分解
    wenduge=wendu%100/10;//温度个位变量分解
	xiaoshudian=0x2e;//小数点
	wenduxiaoshu=wendu%10;//温度小数位变量分解
   }
   else
  {
 	fuhaowei=0x2b;//正符号
	if(wendu==0)//判断温度变量是否等于0
   {
   	 fuhaowei=0x20;//无符号
    }
	wendubai=wendu/1000;//温度百位变量分解
    wendushi=wendu%1000/100;//温度十位变量分解
    wenduge=wendu%100/10;//温度个位变量分解
	xiaoshudian=0x2e;//小数点
	wenduxiaoshu=wendu%10;//温度小数位变量分解
   } 		
 }
  void TemperatureDisplay()//温度显示函数   
{ 
   LCD1602WriteCommand(0x80+0x48);//LCD1602字符型液晶显示器第二行第九个(从第零开始数)显示位
   LCD1602WriteData(fuhaowei);//符号位显示。
   LCD1602WriteData(0x30+wendubai);//0x30表示字符库的数字0,整个代码表示温度百位变量可显示0到9的数字。
   LCD1602WriteData(0x30+wendushi);//0x30表示字符库的数字0,整个代码表示温度十位变量可显示0到9的数字。
   LCD1602WriteData(0x30+wenduge);//0x30表示字符库的数字0,整个代码表示温度个位变量可显示0到9的数字。
   LCD1602WriteData(xiaoshudian);//小数点
   LCD1602WriteData(0x30+wenduxiaoshu);//0x30表示字符库的数字0,整个代码表示小数位变量可显示0到9的数字。
   LCD1602WriteData(0xdf);//0xdf表示字符库中摄氏度左上角的符号
   LCD1602WriteData(0x43);//0x43表示字符库中大写字母C	
 }   
  void SetTemperatureKeyScan()//设温按键扫描函数
{
   if(S1==0)//判断设温按键是否按下
  {
  	Delay(5);//毫秒延时
	if(S1==0)//再次判断设温按键是否按下
   {
	 settemperatureflag=0;//设温标志位变量置0,在温度报警函数执行后但不报警的情况下,余留settemperatureflag==1,当再次操作设温按键扫描函数设温时,会发生在设温过程中触发设温报警条件而报警,因此在设温按键扫描函数里边添加settemperatureflag=0,再次执行设温按键扫描函数后,温度报警函数里边settemperatureflag==1被置换成settemperatureflag=0,很好地解决了再次操作设温按键扫描函数设温时,在设温过程中触发设温报警条件而报警的问题。
	 TR0flag=0;//定时器0标志位变量置0,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留TR0flag==1,假若时间报警函数里边存在TR0=1,当操作设温按键扫描函数时,计时依然在执行,导致计时不恰当,因此在设温按键扫描函数里边添加TR0flag=0,执行设温按键扫描函数后,时间报警函数里边TR0flag==1被置换成TR0flag=1,很好地解决了在操作设温按键扫描函数时,计时依然在执行,导致计时不恰当的问题
	 setsecondflag=0;//设时秒钟标志位变量置0,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留setsecondflag==1,假若时间报警函数里边存在TR0=1,当操作设温按键扫描函数时,计时依然在执行,导致计时不恰当,因此在设温按键扫描函数里边添加setsecondflag=0,执行设温按键扫描函数后,时间报警函数里边setsecondflag==1被置换成setsecondflag=0,很好地解决了在操作设温按键扫描函数时,计时依然在执行,导致计时不恰当的问题。
	 setminutanflag=0;//设时分钟标志位变量置0,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留setminutanflag==1,假若时间报警函数里边存在TR0=1,当操作设温按键扫描函数时,计时依然在执行,导致计时不恰当,因此在设温按键扫描函数里边添加setminutanflag=0,执行设温按键扫描函数后,时间报警函数里边setminutanflag==1被置换成setminutanflag=0,很好地解决了在操作设温按键扫描函数时,计时依然在执行,导致计时不恰当的问题。
	 sethourflag=0;//设时时钟标志位变量置0,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留sethourflag==1,假若时间报警函数里边存在TR0=1,当操作设温按键扫描函数时,计时依然在执行,导致计时不恰当,因此在设温按键扫描函数里边添加sethourflag=0,执行设温按键扫描函数后,时间报警函数里边sethourflag==1被置换成sethourflag=0,很好地解决了在操作设温按键扫描函数时,计时依然在执行,导致计时不恰当的问题。
	 S1num++;//设温按键按下次数变量加加
	 while(!S1);//等待设温按键弹起
	 switch(S1num)//设温按键按下次数变量选择位
	{
	  case 1://设温按键第一次按下
	         TR0=0;//关定时器0
			 settimedisplayflag=1;//设时显示标志位变量置1,在操作设温按键扫描函数的情况下,不能操作设时按键扫描函数。
			 tiaotimedisplayflag=1;//调时显示标志位变量置1,在操作设温按键扫描函数的情况下,不能操作调时按键扫描函数。
			 lcd1602displaytimeflag=1;//液晶显示器显示时间标志位变量置1,在操作设温按键扫描函数的情况下,不受时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数影响。
			 temperaturedisplayflag=1;//温度显示标志位变量置1,在操作设温按键扫描函数的情况下,不受温度分解函数和温度显示函数影响。
			 LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶显示器第一行第13个(从第0开始数)位置的显示位
	         LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
			 break;
	  case 2://设温按键第二次按下 
			 LCD1602WriteCommand(0x80+0x00+0x0b);//LCD1602字符型液晶显示器第一行第11个(从第0开始数)个位置的显示位
	         LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
			 break;
	  case 3://设温按键第三次按下
			 LCD1602WriteCommand(0x80+0x00+0x0a);//LCD1602字符型液晶显示器第一行第10个(从第0开始数)位置的显示位
	         LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
			 break;
	  case 4://设温按键第四次按下
			 LCD1602WriteCommand(0x80+0x00+0x09);//LCD1602字符型液晶显示器第一行第9个(从第0开始数)位置的显示位
	         LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
			 break;
	  case 5://设温按键第五次按下
			 LCD1602WriteCommand(0x80+0x00+0x08);//LCD1602字符型液晶显示器第一行第8个(从第0开始数)位置的显示位
	         LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
			 break;
	  case 6://设温按键第六次按下
			 LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶显示器第一行第13个(从第0开始数)位置的显示位
	         LCD1602WriteCommand(0x0c);//LCD1602字符型液晶显示器关光标(或字符)闪烁。
			 TR0=1;//开定时器0
			 S1num=0;//设温按键按下次数变量清零,可以反复操作设温按键。
			 settimedisplayflag=0;//设时显示标志位变量置0,让设温按键扫描函数执行后,可允许设时按键扫描函数执行。
			 tiaotimedisplayflag=0;//调时显示标志位变量置0,让设温按键扫描函数执行后,可允许调时按键扫描函数执行。
			 lcd1602displaytimeflag=0;//液晶显示器显示时间标志位变量置0,让设温按键扫描函数执行后,可允许时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数执行。
			 temperaturedisplayflag=0;//温度显示标志位变量置0,让设温按键扫描函数执行后,可允许温度分解函数和温度显示函数执行。
			 settemperatureflag=1;//设温标志位变量置1,为了在操作设温按键扫描函数进行设温后,可以执行温度报警函数。
			 break;
	 default:
	         S1num=0;//设温按键按下次数变量清零,可以反复操作设温按键。
			 break;
	 		  
	 }
    }
   }
    if(S1num!=0)//判断设温按键按下次数变量是否不为0
  {
     if(S3==0)//判断增加按键是否按下
	{
	  Delay(5);//毫秒延时
	  if(S3==0)//再次判断增加按键是否按下
	 {
	   S3numflag=1;//增加键标志位变量置1,可以在温度报警函数内进行设报警。
	   while(!S3);//等待增加按键弹起
       switch(S1num)//设温按键按下次数变量选择位
	  {
	    case 1://设温按键第一次按下
			   setwenduxiaoshu++;//设温小数位变量加加
		       if(setwenduxiaoshu==10)//判断设温小数位变量是否达到10
		       setwenduxiaoshu=0;//设温小数位变量置零
		       LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶显示器第一行第13个(从第0个开始数)位置的显示位
			   LCD1602WriteData(0x30+setwenduxiaoshu);//0x30表示字符库的数字0,整个代码表示设温小数位变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶显示器第一行第13个(从第0个开始数)位置的设温小数位变量显示位
			   settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//总设温变量求和表达式
			   break;
		case 2://设温按键第二次按下
			   setwenduge++;//设温个位变量加加
		       if(setwenduge==6)//判断设温个位变量是否达到6
		       setwenduge=0;//设温个位变量数置零
		       LCD1602WriteCommand(0x80+0x00+0x0b);//LCD1602字符型液晶显示器第一行第11个(从第0个开始数)位置的显示位
			   LCD1602WriteData(0x30+setwenduge);//0x30表示字符库的数字0,整个代码表示设温个位可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x0b);//LCD1602字符型液晶显示器第一行第11个(从第0个开始数)位置的显示位
			   settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//总设温变量求和表达式
			   break;
	   	case 3://设温按键第三次按下
			   setwendushi++;//设温十位变量加加
		       if(setwendushi==3)//判断设温十位变量是否达到3
		       setwendushi=0;//设温十位变量置零
		       LCD1602WriteCommand(0x80+0x00+0x0a);//LCD1602字符型液晶显示器第一行第10个(从第0个开始数)位置的显示位
			   LCD1602WriteData(0x30+setwendushi);//0x30表示字符库的数字0,整个代码表示设温十位变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x0a);//LCD1602字符型液晶显示器第一行第10个(从第0个开始数)位置的显示位
			   settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//总设温变量求和表达式
			   break;
		case 4://设温按键第四次按下
			   setwendubai++;//设温百位变量加加
		       if(setwendubai==2)//判断设温百位变量是否达到2
		       setwendubai=0;//设温百位变量置零
		       LCD1602WriteCommand(0x80+0x00+0x09);//LCD1602字符型液晶显示器第一行第9个(从第0个开始数)位置的显示位
			   LCD1602WriteData(0x30+setwendubai);//0x30表示字符库的数字0,整个代码表示设温百位变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x09);//LCD1602字符型液晶显示器第一行第9个(从第0个开始数)位置的显示位
			   settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//总设温变量求和表达式
			   break;
	   	case 5://设温按键第五次按下
		       LCD1602WriteCommand(0x80+0x00+0x08);//LCD1602字符型液晶显示器第一行第8个(从第0个开始数)位置的显示位
			   LCD1602WriteData(0x2b);//0x2d表示字符库的正符号
			   LCD1602WriteCommand(0x80+0x00+0x08);//LCD1602字符型液晶显示器第一行第8个(从第0个开始数)个位置的显示位
			   break;
	   }
      }
	 }
	}
	if(S1num!=0)//判断设温按键按下次数变量是否不为0
  {
     if(S4==0)//判断减少按键是否按下
	{
	  Delay(5);//毫秒延时
	  if(S4==0)//再次判断减少按键是否按下
	 {
	   S4numflag=1;//减少键标志位变量置1,可以在温度报警函数内进行设报警。
	   while(!S4);//等待减少按键弹起
       switch(S1num)//设温按键按下次数变量选择位
	  {
	    case 1://设温按键第一次按下
			   setwenduxiaoshu--;//设温小数位变量减减
		       if(setwenduxiaoshu==-1)//判断设温小数位变量是否达到-1
		       setwenduxiaoshu=9;//设温小数位变量置9
		       LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶显示器第一行第13个(从第0个开始数)位置的显示位
			   LCD1602WriteData(0x30+setwenduxiaoshu);//0x30表示字符库的数字0,整个代码表示设温小数位变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶显示器第一行第13个(从第0个开始数)位置的显示位
			   settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//总设温变量求和表达式
			   break;
		case 2://设温按键第二次按下
			   setwenduge--;//设温个位变量减减
		       if(setwenduge==-1)//判断设温个位变量是否达到-1
		       setwenduge=5;//设温个位变量数置5
		       LCD1602WriteCommand(0x80+0x00+0x0b);//LCD1602字符型液晶显示器第一行第11个(从第0个开始数)位置的显示位
			   LCD1602WriteData(0x30+setwenduge);//0x30表示字符库的数字0,整个代码表示设温个位变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x0b);//LCD1602字符型液晶显示器第一行第11个(从第0个开始数)位置的显示位
			   settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//总设温变量求和表达式
			   break;
	   	case 3://设温按键第三次按下
			   setwendushi--;//设温十位变量减减
		       if(setwendushi==-1)//判断设温十位变量是否达到-1
		       setwendushi=2;//设温十位变量置2
		       LCD1602WriteCommand(0x80+0x00+0x0a);//LCD1602字符型液晶显示器第一行第10个(从第0个开始数)位置的显示位
			   LCD1602WriteData(0x30+setwendushi);//0x30表示字符库的数字0,整个代码表示设温十位变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x0a);//LCD1602字符型液晶显示器第一行第10个(从第0个开始数)位置的显示位
			   settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//总设温变量求和表达式
			   break;
		case 4://设温按键第四次按下
			   setwendubai--;//设温百位变量减减
		       if(setwendubai==-1)//判断设温百位变量是否达到-1
		       setwendubai=1;//设温百位变量置1
		       LCD1602WriteCommand(0x80+0x00+0x09);//LCD1602字符型液晶显示器第一行第9个(从第0个开始数)位置的显示位
			   LCD1602WriteData(0x30+setwendubai);//0x30表示字符库的数字0,整个代码表示设温百位变量可显示0到9的数字。
			   LCD1602WriteCommand(0x80+0x00+0x09);//LCD1602字符型液晶显示器第一行第9个(从第0个开始数)位置的显示位
			   settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//总设温变量求和表达式
			   break;
	   	case 5://设温按键第五次按下
		       LCD1602WriteCommand(0x80+0x00+0x08);//LCD1602字符型液晶显示器第一行第8个(从第0个开始数)位置的显示位
			   LCD1602WriteData(0x2d);//0x2d表示字符库的负符号
			   LCD1602WriteCommand(0x80+0x00+0x08);//LCD1602字符型液晶显示器第一行第8个(从第0个开始数)个位置的显示位
			   break;
	   }
      }
	 }
	}
   } 
  void TiaoTimeKeyScan()//调时按键扫描函数
{
   if(S2==0)//判断调时按键是否按下					   
  {
	Delay(5);//毫秒延时
	if(S2==0)//再次判断调时按键是否按下
   {	
	 settemperatureflag=0;//设温标志位变量置0,在温度报警函数执行后但不报警的情况下,温度报警函数里边余留settemperatureflag==1和TR0=1,当操作调时按键扫描函数时,计时依然在执行,导致计时不恰当,因此在调时按键扫描函数里边添加settemperatureflag=0和TR0=0,执行调时按键扫描函数后,温度报警函数里边settemperatureflag==1和TR0=1被置换成settemperatureflag=0和TR0=0,很好地解决了在操作调时按键扫描函数时,计时依然在执行,导致计时不恰当的问题。
	 S2num++;//调时按键按下次数变量加加
	 while(!S2);//等待调时按键弹起
	 switch(S2num)//调时按键按下次数变量选择位
	{
	  case 1://调时按键第一次按下
	         TR0=0;//关定时器0
			 settimedisplayflag=1;//设时显示标志位变量置1,在操作调时按键扫描函数的情况下,不能操作设时按键扫描函数。
			 settemperaturedisplayflag=1;//设温显示标志位变量置1,在操作调时按键扫描函数的情况下,不能操作设温按键扫描函数。
	         lcd1602displaytimeflag=1;//液晶显示器显示时间标志位变量等于1,在操作调时按键扫描函数的情况下,不受时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数影响。
			 temperaturedisplayflag=1;//温度显示标志位变量等于1,在操作调时按键扫描函数的情况下,不受温度分解函数和温度显示函数影响。
			 secondge=miao%10;//关掉定时器0定时后,把走时秒钟变量取余赋给调时秒钟个位变量。 
	         secondshi=miao/10;//关掉定时器0定时后,把走时秒钟变量取除赋给调时秒钟十位变量。
			 LCD1602WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶显示器第二行第7个(从第0个开始数)位置的显示位
	         LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
			 break;
	  case 2://调时按键第二次按下
	         secondshi=secondshi;//关掉定时器0定时后,把走时秒钟变量取除后得到的调时秒钟十位变量再赋给调时秒钟十位变量。
	         LCD1602WriteCommand(0x80+0x40+0x06);//LCD1602字符型液晶显示器第二行第6个(从第0个开始数)位置的显示位
	         LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
			 break;
	  case 3://调时按键第三次按下
	         minutange=fen%10;//关掉定时器0定时后,把走时分钟变量取余赋给调时分钟个位变量。
			 minutanshi=fen/10;//关掉定时器0定时后,把走时分钟变量取除赋给调时分钟十位变量。
	         LCD1602WriteCommand(0x80+0x40+0x04);//LCD1602字符型液晶显示器第二行第4个(从第0个开始数)位置的显示位
	         LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
			 break;
	  case 4://调时按键第四次按下
	         minutanshi=minutanshi;//关掉定时器0定时后,把走时分钟变量取除后得到调时分钟十位变量再赋给调时分钟十位变量。
	         LCD1602WriteCommand(0x80+0x40+0x03);//LCD1602字符型液晶显示器第二行第3个(从第0个开始数)位置的显示位
	         LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
			 break;
	  case 5://调时按键第五次按下
	         hourge=shi%10;//关掉定时器0定时后,把走时时钟变量取余赋给调时时钟个位显示位。
			 hourshi=shi/10;//关掉定时器0定时后,把走时时钟变量取除赋给调时时钟十位显示位。
	         LCD1602WriteCommand(0x80+0x40+0x01);//LCD1602字符型液晶显示器第二行第1个(从第0个开始数)位置的显示位
	         LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
			 break;
	  case 6://调时按键第六次按下
	         hourshi=hourshi;//关掉定时器0定时后,把走时时钟变量取除后得到调时时钟十位变量再赋给调时时钟十位变量。
	         LCD1602WriteCommand(0x80+0x40+0x00);//LCD1602字符型液晶显示器第二行第0个(从第0个开始数)位置的显示位
	         LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
			 break;
	  case 7://调时按键第七次按下
	         LCD1602WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶显示器第二行第7个位置的显示位
	         LCD1602WriteCommand(0x0c);//LCD1602字符型液晶显示器关光标(或字符)闪烁。
			 TR0=1;//开定时器0
			 S2num=0;//调时按键按下次数变量清零,可以反复操作调时按键。
			 settimedisplayflag=0;//设时显示标志位变量置0,让调时按键扫描函数执行后,可允许设时按键扫描函数执行。
			 settemperaturedisplayflag=0;//设温显示标志位变量置0,让调时按键扫描函数执行后,可允许设温按键扫描函数执行。
	         lcd1602displaytimeflag=0;//液晶显示器显示时间标志位变量等于0,让调时按键扫描函数执行后,可允许时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数执行。
			 temperaturedisplayflag=0;//温度显示标志位变量等于0,让调时按键扫描函数执行后,可允许温度分解函数和温度显示函数执行。
			 miaoflag=0;//秒钟标志位变量置0,在操作调时按键扫描函数进行调时后,调时按键扫描函数里边余留miaoflag==1,不解除会导致时间报警函数不能启动报警判别,因此在调时按键扫描函数里边添加miaoflag=0,执行调时按键扫描函数后,时间报警函数就可以做出相应时间报警。
	         fenflag=0;//分钟标志位变量置0,在操作调时按键扫描函数进行调时后,调时按键扫描函数里边余留fenflag==1,不解除会导致时间报警函数不能启动报警判别,因此在调时按键扫描函数里边添加fenflag=0,执行调时按键扫描函数后,时间报警函数就可以做出相应时间报警。
	         shiflag=0;//时钟标志位变量置0,在操作调时按键扫描函数进行调时后,调时按键扫描函数里边余留shiflag==1,不解除会导致时间报警函数不能启动报警判别,因此在调时按键扫描函数里边添加shiflag=0,执行调时按键扫描函数后,时间报警函数就可以做出相应时间报警。
			 break;
	 default:
	         S2num=0;//调时按键按下次数变量清零,可以反复操作调时按键。
			 break;
	 }
	}
   }
    if(S2num!=0)//判断调时按键按下次数变量是否不为0
   {
     if(S3==0)//判断增加按键是否按下
	{
	  Delay(5);//毫秒延时
	  if(S3==0)//再次判断增加按键是否按下
	 {
	   while(!S3);//等待增加按键弹起
       switch(S2num)//调时按键按键按下次数变量选择位
	  {
	    case 1://调时按键第一次按下
			   miaoflag=1;//秒钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留miaoflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加miaoflag=1,时间报警函数里边miaoflag==0被置换成miaoflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
			   secondge++;//调时秒钟个位变量加加
		       if(secondge==10)//判断调时秒钟个位变量是否达到10
		       secondge=0;//调时秒钟个位变量置零
		       LCD1602DisplayGeDigitResolve(0x07,secondge);//LCD1602字符型液晶显示器第二行第7个(从第0个开始数)位置的调时秒钟个位变量显示位
		       LCD1602WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶显示器第二行第7个(从第0个开始数)位置的调时秒钟个位变量显示位
			   miao=secondshi*10+secondge;//走时秒钟变量求和表达式,由于移位修改走时秒钟个位变量数值后,需要通过调时秒钟十位变量数值加上调时秒钟个位变量数值之和赋给走时秒钟变量,才能在修改走时秒钟个位变量数值或走时秒钟十位变量数值后重新计时。(原因:走时秒钟个位变量数值或走时秒钟十位变量数值是在走时秒钟变量数值上分解得来,当走时秒钟个位变量数值或走时秒钟十位变量数值发生变化后,走时秒钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
			   break;
		case 2://调时按键第二次按下
			   miaoflag=1;//秒钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留miaoflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加miaoflag=1,时间报警函数里边miaoflag==0被置换成miaoflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
			   secondshi++;//调时秒钟十位变量加加
		       if(secondshi==6)//判断调时秒钟十位变量是否达到6
		       secondshi=0;//调时秒钟十位变量置零
		       LCD1602DisplayShiDigitResolve(0x06,secondshi);//LCD1602字符型液晶显示器第二行第6个(从第0个开始数)位置的调时秒钟十位变量显示位
		       LCD1602WriteCommand(0x80+0x40+0x06);//LCD1602字符型液晶显示器第二行第6个(从第0个开始数)位置的调时秒钟十位变量显示位
			   miao=secondshi*10+secondge;//走时秒钟变量求和表达式,由于移位修改走时秒钟十位变量数值后,需要通过调时秒钟十位变量数值加上秒钟个位变量数值之和赋给走时秒钟变量,才能在修改走时秒钟个位变量数值或走时秒钟十位变量数值后重新计时。(原因:走时秒钟个位变量数值或走时秒钟十位变量数值是在走时秒钟变量数值上分解得来,当走时秒钟个位变量数值或走时秒钟十位变量数值发生变化后,走时秒钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
			   break;
        case 3://调时按键第三次按下
			   fenflag=1;//分钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留fenflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加fenflag=1,时间报警函数里边fenflag==0被置换成fenflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
			   minutange++;//调时分钟个位变量加加
		       if(minutange==10)//判断调时分钟个位变量是否达到10
		       minutange=0;//调时分钟个位变量置零
		       LCD1602DisplayGeDigitResolve(0x04,minutange);//LCD1602字符型液晶显示器第二行第4个(从第0个开始数)位置的调时分钟个位变量显示位
		       LCD1602WriteCommand(0x80+0x40+0x04);//LCD1602字符型液晶显示器第二行第4个(从第0个开始数)位置的调时分钟个位变量显示位
			   fen=minutanshi*10+minutange;//走时分钟变量求和表达式,由于移位修改走时分钟个位变量数值后,需要通过调时分钟十位变量数值加上调时分钟个位变量数值之和赋给走时分钟变量,才能在修改走时分钟个位变量数值或走时分钟十位变量数值后重新计时。(原因:走时分钟个位变量数值或走时分钟十位变量数值是在走时分钟变量数值上分解得来,当走时分钟个位变量数值或走时分钟十位变量数值发生变化后,走时分钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
			   break;
		case 4://调时按键第四次按下
			   fenflag=1;//分钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留fenflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加fenflag-=1,时间报警函数里边fenflag==0被置换成fenflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
			   minutanshi++;//调时分钟十位变量加加
		       if(minutanshi==6)//判断调时分钟十位变量是否达到6
		       minutanshi=0;//调时分钟十位变量置零
		       LCD1602DisplayShiDigitResolve(0x03,minutanshi);//LCD1602字符型液晶显示器第二行第3个(从第0个开始数)位置的调时分钟十位变量显示位
		       LCD1602WriteCommand(0x80+0x40+0x03);//写入LCD1602字符型液晶显示器第二行第3个(从第0个开始数)位置的调时分钟十位变量显示位
			   fen=minutanshi*10+minutange;//走时分钟变量求和表达式,由于移位修改走时分钟十位变量数值后,需要通过调时分钟十位变量数值加上调时分钟个位变量数值之和赋给走时分钟变量,才能在修改走时分钟个位变量数值或走时分钟十位变量数值后重新计时。(原因:走时分钟个位变量数值或走时分钟十位变量数值是在走时分钟变量数值上分解得来,当走时分钟个位变量数值或走时分钟十位变量数值发生变化后,走时分钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
			   break;
		case 5://调时按键第五次按下
			   shiflag=1;//时钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留shiflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加shiflag=1,时间报警函数里边shiflag==0被置换成shiflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
			   hourge++;//调时时钟个位变量加加
		       if(hourge==4)//判断调时时钟个位变量是否达到4
		       hourge=0;//调时时钟个位变量置零
		       LCD1602DisplayGeDigitResolve(0x01,hourge);//LCD1602字符型液晶显示器第二行第1个(从第0个开始数)位置的调时时钟个位变量显示位
		       LCD1602WriteCommand(0x80+0x40+0x01);//写入LCD1602字符型液晶显示器第二行第1个(从第0个开始数)位置的调时时钟个位变量显示位
			   shi=hourshi*10+hourge;//走时时钟变量求和表达式,由于移位修改走时时钟个位变量数值后,需要通过调时时钟十位变量数值加上调时时钟个位变量数值之和赋给走时时钟变量,才能在修改走时时钟个位变量数值或走时时钟十位变量数值后重新计时。(原因:走时时钟个位变量数值或走时时钟十位变量数值是在走时时钟变量数值上分解得来,当走时时钟个位变量数值或走时时钟十位变量数值发生变化后,走时时钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
			   break;
		case 6://调时按键第六次按下
			   shiflag=1;//时钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留shiflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加shiflag=1,时间报警函数里边shiflag==0被置换成shiflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
			   hourshi++;//调时时钟十位变量加加
		       if(hourshi==3)//判断调时时钟十位变量是否达到3
		       hourshi=0;//调时时钟十位变量置零
		       LCD1602DisplayShiDigitResolve(0x00,hourshi);//LCD1602字符型液晶显示器第二行第0个(从第0个开始数)位置的调时时钟十位变量显示位
		       LCD1602WriteCommand(0x80+0x40+0x00);//LCD1602第二行第0个(从第0个开始数)位置的调时时钟十位变量显示位
			   shi=hourshi*10+hourge;//走时时钟变量求和表达式,由于移位修改走时时钟十位变量数值后,需要通过调时时钟十位变量数值加上调时时钟个位变量数值之和赋给走时时钟变量,才能在修改走时时钟个位变量数值或走时时钟十位变量数值后重新计时。(原因:走时时钟个位变量数值或走时时钟十位变量数值是在走时时钟变量数值上分解得来,当走时时钟个位变量数值或走时时钟十位变量数值发生变化后,走时时钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
			   break;
	   default:
		       S2num=0;//调时按键按下次数变量清零,可以反复操作调时按键。
			   break; 
	   }
	  }
	 }
	}
    if(S2num!=0)//判断调时按键按下次数变量是否不为0
  {	 
	 if(S4==0)//判断减少按键是否按下
   {
	  Delay(5);//毫秒延时
	  if(S4==0)//再次判断减少按键是否按下
	 {
	   while(!S4);//等待减少按键弹起
	   switch(S2num)//调时按键按下次数变量选择位
	  {
	    case 1://调时按键按键第一次按下
			   miaoflag=1;//秒钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留miaoflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加miaoflag=1,时间报警函数里边miaoflag==0被置换成miaoflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
			   secondge--;//调时秒钟变量数值减减
		       if(secondge==-1)//判断调时秒钟个位变量是否达到-1
		       secondge=9;//调时秒钟个位变量置9
		       LCD1602DisplayGeDigitResolve(0x07,secondge);//LCD1602字符型液晶显示器第二行第7个(从第0个开始数)位置的调时秒钟个位变量显示位
		       LCD1602WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶显示器第二行第7个(从第0个开始数)位置的调时秒钟个位变量显示位
			   miao=secondshi*10+secondge;//走时秒钟变量求和表达式,由于移位修改走时秒钟个位变量数值后,需要通过调时秒钟十位变量数值加上调时秒钟个位变量数值之和赋给走时秒钟变量,才能在修改走时秒钟个位变量数值或走时秒钟十位变量数值后重新计时。(原因:走时秒钟个位变量数值或走时秒钟十位变量数值是在走时秒钟变量数值上分解得来,当走时秒钟个位变量数值或走时秒钟十位变量数值发生变化后,走时秒钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
			   break;
		case 2://调时按键按键第二次按下
			   miaoflag=1;//秒钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留miaoflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加miaoflag=1,时间报警函数里边miaoflag==0被置换成miaoflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
			   secondshi--;//调时秒钟十位变量减减
		       if(secondshi==-1)//判断调时秒钟十位变量是否达到-1
		       secondshi=5;//调时秒钟十位变量置5
		       LCD1602DisplayShiDigitResolve(0x06,secondshi);//LCD1602字符型液晶显示器第二行第6个(从第0个开始数)位置的调时秒钟十位变量显示位
		       LCD1602WriteCommand(0x80+0x40+0x06);//LCD1602字符型液晶显示器第二行第6个(从第0个开始数)位置的调时秒钟十位变量显示位
			   miao=secondshi*10+secondge;//走时秒钟变量求和表达式,由于移位修改走时秒钟十位变量数值后,需要通过调时秒钟十位变量数值加上调时秒钟个位变量数值之和赋给走时秒钟变量,才能在修改走时秒钟个位变量数值或走时秒钟十位变量数值后重新计时。(原因:走时秒钟个位变量数值或走时秒钟十位变量数值是在走时秒钟变量数值上分解得来,当走时秒钟个位变量数值或走时秒钟十位变量数值发生变化后,走时秒钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
			   break;
        case 3://调时按键按键第三次按下
			   fenflag=1;//分钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留fenflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加fenflag=1,时间报警函数里边fenflag==0被置换成fenflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
			   minutange--;//调时分钟个位变量减减
		       if(minutange==-1)//判断调时分钟个位变量是否达到-1
		       minutange=9;//调时分钟个位变量置9
		       LCD1602DisplayGeDigitResolve(0x04,minutange);//LCD1602字符型液晶显示器第二行第4个(从第0个开始数)位置的调时分钟个位变量显示位
		       LCD1602WriteCommand(0x80+0x40+0x04);//LCD1602字符型液晶显示器第二行第4个(从第0个开始数)位置的调时分钟个位变量显示位
			   fen=minutanshi*10+minutange;//走时秒钟变量求和表达式,由于移位修改走时分钟个位变量数值后,需要通过调时分钟十位变量数值加上调时分钟个位变量数值之和赋给走时分钟变量,才能在修改走时分钟个位变量数值或走时分钟十位变量数值后重新计时。(原因:走时分钟个位变量数值或走时分钟十位变量数值是在走时分钟变量数值上分解得来,当走时分钟个位变量数值或走时分钟十位变量数值发生变化后,走时分钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
			   break;
		case 4://调时按键按键第四次按下
			   fenflag=1;//分钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留fenflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加fenflag=1,时间报警函数里边fenflag==0被置换成fenflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
			   minutanshi--;//走时分钟十位变量减减
		       if(minutanshi==-1)//判断走时分钟十位变量是否达到6
		       minutanshi=5;//走时分钟十位变量归5
		       LCD1602DisplayShiDigitResolve(0x03,minutanshi);//LCD1602字符型液晶显示器第二行第3个(从第0个开始数)位置的调时分钟个位变量显示位
		       LCD1602WriteCommand(0x80+0x40+0x03);//LCD1602字符型液晶显示器第二行第3个(从第0个开始数)位置的调时分钟十位变量显示位
			   fen=minutanshi*10+minutange;//走时秒钟变量求和表达式,由于移位修改走时分钟十位变量数值后,需要通过调时分钟十位变量数值加上分钟个位变量数值之和赋给走时分钟变量,才能在修改走时分钟个位变量数值或走时分钟十位变量数值后重新计时。(原因:走时分钟个位变量数值或走时分钟十位变量数值是在走时分钟变量数值上分解得来,当走时分钟个位变量数值或走时分钟十位变量数值发生变化后,走时分钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
			   break;
		case 5://调时按键按键第五次按下
			   shiflag=1;//时钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留shiflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加shiflag=1,时间报警函数里边shiflag==0被置换成shiflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
			   hourge--;//调时时钟个位变量减减
		       if(hourge==-1)//判断调时时钟个位变量是否达到-1
		       hourge=3;//调时时钟个位变量置3
		       LCD1602DisplayGeDigitResolve(0x01,hourge);//LCD1602字符型液晶显示器第二行第1个(从第0个开始数)位置的调时时钟个位变量数值
		       LCD1602WriteCommand(0x80+0x40+0x01);//LCD1602字符型液晶显示器第二行第1个(从第0个开始数)位置的调时时钟个位变量显示位
			   shi=hourshi*10+hourge;//走时秒钟变量求和表达式,由于移位修改走时时钟个位变量数值后,需要通过调时时钟十位变量数值加上调时时钟个位变量数值之和赋给走时时钟变量,才能在修改走时时钟个位变量数值或走时时钟十位变量数值后重新计时。(原因:走时时钟个位变量数值或走时时钟十位变量数值是在走时时钟变量数值上分解得来,当走时时钟个位变量数值或走时时钟十位变量数值发生变化后,走时时钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
			   break;
		case 6://调时按键按键第六次按下
			   shiflag=1;//时钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留shiflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加shiflag=1,时间报警函数里边shiflag==0被置换成shiflag=1,很好地解决了在操作调时按键扫描函数调时时,因触发时间报警条件而报警的问题。
			   hourshi--;//调时时钟十位变量减减
		       if(hourshi==-1)//判断调时时钟十位变量是否达到-1
		       hourshi=2;//调时时钟十位变量置2
		       LCD1602DisplayShiDigitResolve(0x00,hourshi);//LCD1602字符型液晶显示器显示第二行第0个(从第0个开始数)位置的调时时钟十位变量显示位
		       LCD1602WriteCommand(0x80+0x40+0x00);//LCD1602字符型液晶显示器显示第二行第0个(从第0个开始数)位置的调时时钟十位变量显示位
			   shi=hourshi*10+hourge;//走时秒钟变量求和表达式,由于移位修改走时时钟十位变量数值后,需要通过调时时钟十位变量数值加上调时时钟个位变量数值之和赋给走时时钟变量,才能在修改走时时钟个位变量数值或走时时钟十位变量数值后重新计时。(原因:走时时钟个位变量数值或走时时钟十位变量数值是在走时时钟变量数值上分解得来,当走时时钟个位变量数值或走时时钟十位变量数值发生变化后,走时时钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
			   break;
	   default:
		       S2num=0;//调时按键按下次数变量清零,可以反复操作调时按键。
			   break; 
	   }
	  }
	 }
	}
   }
  void Timer0Init()//定时器0初始化函数
{
   TMOD=0x01;//设定定时器类型为定时器0,工作模式为模式1。
   TH0=(65536-50000)/256;//TH0装初值
   TL0=(65536-50000)%256;//TL0装初值
   EA=1;//开启定时器总中断
   ET0=1;//开启定时器0中断开关
   TR0=0;//启动定时器0
 }
  void Timer0() interrupt 1//定时器0中断函数
{
   TH0=(65536-50000)/256;//TH0重新装值
   TL0=(65536-50000)%256;//TL0重新装值
   count++;//定时器0中断次数变量加加
   if(count==18)//判断定时器0中断次数变量是否为18次
  {
	count=0;//定时器0中断次数变量归零
	miao++;//走时秒钟变量加加
	if(miao==60)//判断走时秒钟变量是否达到60秒
   {
	 miao=0;//走时秒钟变量置零
	 fen++;//走时分钟变量加加
	 if(fen==60)//判断走时分钟变量是否达到60分
	{
	  fen=0;//走时分钟变量置零
	  shi++;//走时时钟变量加加
	  if(shi==24)//判断走时时钟变量是否达到24时
	 {
	   shi=0;//走时时钟变量置零
	  }
//	  LCD1602DisplayTimeFenJie(0x00,shi);//LCD1602液晶显示器显示时间两位数分解函数显示时钟两位数
	 }
//	  LCD1602DisplayTimeFenJie(0x03,fen);//LCD1602液晶显示器显示时间两位数分解函数显示分钟两位数
	 }
//	 LCD1602DisplayTimeFenJie(0x06,miao);//LCD1602液晶显示器显示时间两位数分解函数显示秒钟两位数 		
	}	
   }
  void FengNingQi_Alarm(uint t)//蜂鸣器报警函数
{
   uint x,y;
   for(x=0;x<t;x++)
  {
    for(y=0;y<50;y++);
    FengNingQi=~FengNingQi ;//蜂鸣器按位取反FengNingQi
   }
 }
//  void SetAlarmTemperatrueFenJie(uint alarmwendu)
//{
//   fuhaowei=0x20;//无符号
//   alarmwendubai=alarmwendu/1000;//温度值百位
//   alarmwendushi=alarmwendu%1000/100;//温度值十位
//   alarmwenduge=alarmwendu%100/10;//温度值个位
//   alarmxiaoshu=alarmwendu%10;//小数位
//  } 		
  void TimeBaoJing()//时间报警函数
{
   if(S3numflag==1||S4numflag==1)//判断增加键标志位变量是否为1或减少键标志位变量是否为1
  {  
	if(setsecondflag==1&&setminutanflag==0&&sethourflag==0&&setsecond>0&&TR0flag==1&&miaoflag==0)//判断设时秒钟标志位变量是否为1和设时分钟标志位变量是否为0和设时时钟标志位变量是否为0和设时秒钟变量是否大于0和定时器0标志位变量是否等于1和秒钟标志位变量置是否为0
   {
	 if(miao==setsecond)//判断走时秒钟变量是否等于设时秒钟变量
    { 
	  timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
	  TR0=0;//关定时器0
	 }
	}
    if(setminutanflag==1&&setsecondflag==0&&sethourflag==0&&setminutan>0&&TR0flag==1&&fenflag==0)//判断设时分钟标志位变量是否为1和设时秒钟标志位变量是否为0和设时时钟标志位变量是否为0和设时分钟变量是否大于0和定时器0标志位变量是否等于1和分钟标志位变量置是否为0
   {
   	 if(fen==setminutan)//判断走时分钟是否等于设时分钟变量
	{
	  timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
	  TR0=0;//关定时器0
	 }
    }
	if(sethourflag==1&&setsecondflag==0&&setminutanflag==0&&sethour>0&&TR0flag==1&&shiflag==0)//判断设时时钟标志位变量是否为1和设时秒钟标志位变量是否为0和设时分钟标志位变量是否为0设时时钟变量是否大于0和定时器0标志位变量是否等于1和时钟标志位变量置是否为0
   {
   	 if(shi==sethour)//判断走时时钟是否等于设时时钟变量
	{
	  timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
	  TR0=0;//关定时器0
	 }
    }
	if(setsecondflag==1&&setminutanflag==1&&setsecond>0&&setminutan>0&&TR0flag==1&&miaoflag==0&&fenflag==0)//判断设时秒钟标志位变量是否为1和设时分钟标志位变量是否为1和设时秒钟变量是否大于0和设时分钟变量是否大于0和定时器0标志位变量是否等于1和秒钟标志位变量置是否为0和分钟标志位变量是否为0
   {
	 if(miao==setsecond&&fen==setminutan)//判断走时秒钟变量是否等于设时秒钟变量和走时分钟变量是否等于设时分钟变量
    { 
	  timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
	  TR0=0;//关定时器0
	 }
	}
	if(setsecondflag==1&&sethourflag==1&&setsecond>0&&sethour>0&&TR0flag==1&&miaoflag==0&&shiflag==0)//判断设时秒钟标志位变量是否为1和设时时钟标志位变量是否为1和设时秒钟变量是否大于0和设时时钟变量是否大于0和定时器0标志位变量是否等于1和秒钟标志位变量是否为0和时钟标志位变量是否为0
   {
	 if(miao==setsecond&&shi==sethour)//判断走时秒钟变量是否等于设时秒钟变量和走时时钟变量是否等于设时时钟变量
    { 
	  timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
	  TR0=0;//关定时器0
	 }
	}
	if(setminutanflag==1&&sethourflag==1&&setminutan>0&&sethour>0&&TR0flag==1&&fenflag==0&&shiflag==0)//判断设时分钟标志位变量是否为1和设时时钟标志位变量是否为1和设时分钟变量是否大于0和设时时钟变量是否大于0和定时器0标志位变量是否等于1和分钟标志位变量是否为0和时钟标志位变量是否为0
   {
	 if(fen==setminutan&&shi==sethour)//判断走时分钟变量是否等于设时分钟变量和走时时钟变量是否等于设时时钟变量
    { 
	  timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
	  TR0=0;//关定时器0
	 }
	}
	if(setsecondflag==1&&setminutanflag==1&&sethourflag==1&&setsecond>0&&setminutan>0&&sethour>0&&TR0flag==1&&miaoflag==0&&fenflag==0&&shiflag==0)//判断设时秒钟标志位变量是否为1和设时分钟标志位变量是否为1和设时时钟标志位变量是否为1和设时秒钟变量是否大于0和设时分钟变量是否大于0和设时时钟变量是否大于0和定时器0标志位变量是否等于1和秒钟标志位变量是否为0和分钟标志位变量是否为0和时钟标志位变量是否为0
   {
	 if(miao==setsecond&&fen==setminutan&&shi==sethour)//判断走时秒钟变量是否等于设时秒钟变量和走时分钟变量是否等于设时分钟变量和走时时钟变量是否等于设时时钟变量
    { 
	  timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
	  TR0=0;//关定时器0
	 }
	}
   }
  }
  void TemperatrueBaoJing()//温度报警函数
{
   if(S3numflag==1||S4numflag==1)//判断增加键标志位变量是否为1或减少键标志位变量是否为1
  {  
	if(settemperatureflag==1)//判断设温标志位变量是否为1
   {
	 if(wendu-10>settemperature)//判断温度变量减10后是否大于设温变量,其中的10分别表示设温个位数1与设温小数位0,实际上表示1摄氏度,相当于温差报警温度,这么做的原因是因为设温数值和温度数值都带有小数,通过数值取整运算,把设温数值和温度数值换算成整数来计算温差,这样便于处理设温数值与温度数值的温差值。
    { 
	  temperatruebaojingflag=1;//温度报警标志位变量置1,进行温度报警。
	  TR0=0;//关定时器0
	 }
	}
	 if(wendu<10&&settemperatureflag==1)//判断温度变量是否小于10和设温标志位变量是否为1,其中的10分别表示设温个位数1与设温小数位0,实际上表示1摄氏度,相当于温差报警温度,这么做的原因是因为设温数值和温度数值都带有小数,通过数值取整运算,把设温数值和温度数值换算成整数来计算温差,这样便于处理设温数值与温度数值的温差值。
    {
	  temperatruebaojingflag=0;//温度报警标志位变量置0,不进行温度报警。
	  TR0=1;//开定时器0
     }	
   }
  }
  void SumKeyScan()//总按键扫描函数
{
   if(S==0)//判断启停按键是否按下
  {
	Delay(5);//毫秒延时
	if(S==0)//再次判断启停按键是否按下
   {
	 Snum++;//启停按键按下次数变量加加
	 while(!S);//等待启停按键弹起
	 if(Snum==1)//判断启停按键是否第一次按下过
	{
	  qitingflag=1;//启停标志位变量置1,用来启动时间报警函数和温度报警函数和设时按键扫描函数和设温按键扫描函数和调时按键扫描函数和LCD1602液晶显示器显示时间两位数分解函数显示秒钟两位数和LCD1602液晶显示器显示时间两位数分解函数显示分钟两位数和LCD1602液晶显示器显示时间两位数分解函数显示时钟两位数和温度分解函数和温度显示函数,相当于总开关。
	  TR0=1;//启动定时器0
	 }
	 if(Snum==2&&settimedisplayflag==0&&settemperaturedisplayflag==0&&tiaotimedisplayflag==0&&timebaojingflag==0)//判断启停按键S是否第二次按下过及设时显示标志位变量是否为0和设温显示标志位变量是否为0和调时显示标志位变量是否为0和时间报警标志位变量是否为0,相当于第一次按下启停键启动后,在没有按其他按键的情况下,第二次按下启停键就停止。
	{
	  qitingflag=1;//启停标志位变量置1,用来启动时间报警函数和温度报警函数和设时按键扫描函数和设温按键扫描函数和调时按键扫描函数和LCD1602液晶显示器显示时间两位数分解函数显示秒钟两位数和LCD1602液晶显示器显示时间两位数分解函数显示分钟两位数和LCD1602液晶显示器显示时间两位数分解函数显示时钟两位数和温度分解函数和温度显示函数,相当于总开关。
	  TR0=0;//关定时器0
	  Snum=0;//启停按键按下次数变量清零,可以反复操作启停按键。
	  settimedisplayflag=1;//设时显示标志位变量置1,限制操作设时按键扫描函数。
	  settemperaturedisplayflag=1;//设温显示标志位变量置1,限制操作设温按键扫描函数。
	  tiaotimedisplayflag=1;//调时显示标志位变量置1,限制操作调时按键扫描函数。
	 }
	 if(Snum==1&&settimedisplayflag==1&&settemperaturedisplayflag==1&&tiaotimedisplayflag==1)//判断启停按键是否第一次按下过以及设时显示标志位变量为1及设温显示标志位变量是否为1和调时显示标志位变量是否为1,相当于第一次按下启停键启动后,第二次按下启停键停止后,在没有按其他按键的情况下,第三次按下启停键就启动。
	{
	  qitingflag=1;//启停标志位变量置1,用来启动时间报警函数和温度报警函数和设时按键扫描函数和设温按键扫描函数和调时按键扫描函数和LCD1602液晶显示器显示时间两位数分解函数显示秒钟两位数和LCD1602液晶显示器显示时间两位数分解函数显示分钟两位数和LCD1602液晶显示器显示时间两位数分解函数显示时钟两位数和温度分解函数和温度显示函数,相当于总开关。
	  TR0=1;//启动定时器0
	  Snum=1;//启停按键按下次数变量置1,为下一次按下启停键实现停止做准备。
	  settimedisplayflag=0;//设时显示标志位变量置0,可操作设时按键扫描函数。
	  settemperaturedisplayflag=0;//设温显示标志位变量置0,可操作设温按键扫描函数。
	  tiaotimedisplayflag=0;//调时显示标志位变量置0,可操作调时按键扫描函数。 
	 }
	 if(Snum==2&&timebaojingflag==1)//判断启停按键是否第二次按下过及时间报警标志位变量是否为1,相当于时间报警解除。
	{
	  TR0=1;//开定时器0
	  Snum=1;//启停按键按下次数变量置1,为下一次按下启停键实现停止做准备。
	  timebaojingflag=0;//时间报警标志位变量置0,释放时间报警标志位。
	  setsecondge=0;//设时秒钟个位变量置0,释放设时秒钟个位标志位。
	  setsecondshi=0;//设时秒钟十位变量置0,释放设时秒钟十位标志位。
	  setminutange=0;//设时分钟个位变量置0,释放设时分钟个位标志位。
	  setminutanshi=0;//设时分钟十位变量置0,释放设时分钟十位标志位。
	  sethourge=0;//设时时钟个位变量置0,释放设时时钟个位标志位。
	  sethourshi=0;//设时时钟十位变量置0,释放设时时钟十位标志位。
	  LCD1602WriteCommand(0x80+0x07);//LCD1602字符型液晶显示器第一行第7个(从第0开始数)显示位,即设时秒钟个位。
      LCD1602WriteData(0x30+setsecondge);//0x30表示字符库的数字0,整个代码表示设时秒钟个位变量显示0到9的数字。
	  LCD1602WriteCommand(0x80+0x06);//LCD1602字符型液晶显示器第一行第6个(从第0开始数)显示位,即设时秒钟十位。
      LCD1602WriteData(0x30+setsecondshi);//0x30表示字符库的数字0,整个代码表示设时秒钟十位变量显示0到9的数字。
	  LCD1602WriteCommand(0x80+0x04);//LCD1602字符型液晶显示器第一行第4个(从第0开始数)显示位,即设时分钟个位。
      LCD1602WriteData(0x30+setminutange);//0x30表示字符库的数字0,整个代码表示设时分钟个位变量显示0到9的数字。
	  LCD1602WriteCommand(0x80+0x03);//LCD1602字符型液晶显示器第一行第3个(从第0开始数)显示位,即设时分钟十位。
      LCD1602WriteData(0x30+setminutanshi);//0x30表示字符库的数字0,整个代码表示设时分钟十位变量显示0到9的数字。
	  LCD1602WriteCommand(0x80+0x01);//LCD1602字符型液晶显示器第一行第1个(从第0开始数)显示位,即设时时钟个位。
      LCD1602WriteData(0x30+sethourge);//0x30表示字符库的数字0,整个代码表示设时时钟个位变量显示0到9的数字。
	  LCD1602WriteCommand(0x80+0x00);//LCD1602字符型液晶显示器第一行第0个(从第0开始数)显示位,即设时时钟十位。
      LCD1602WriteData(0x30+sethourshi);//0x30表示字符库的数字0,整个代码表示设时时钟十位变量显示0到9的数字。
	  S3numflag=0;//增加键标志位变量置0,释放增加键标志位。
	  S4numflag=0;//减少键标志位变量置0,释放减少键标志位。
	  TR0flag=0;//定时器0标志位变量置0
	  settimedisplayflag=0;//设时显示标志位变量置0,释放设时显示标志位。
	  settemperaturedisplayflag=0;//设温显示标志位变量置0,释放设温显示标志位。
	  tiaotimedisplayflag=0;//调时显示标志位变量置0,释放调时显示标志位。
	  setsecondflag=0;//设时秒钟标志位变量置0,释放设时秒钟标志位。
	  setminutanflag=0;//设时分钟标志位变量置0,释放设时分钟标志位。
	  sethourflag=0;//设时时钟标志位变量置0,释放设时时钟标志位。
	 }
	 
	 if(Snum==2&&temperatruebaojingflag==1)//判断启停按键是否第二次按下过及温度报警标志位变量是否为1,相当于温度报警解除。
	{ 
	  TR0=1;//开定时器0
	  Snum=1;//启停按键按下次数变量置1,为下一次按下启停键实现停止做准备。
	  temperatruebaojingflag=0;//温度报警标志位变量置0,释放温度报警标志位。
	  setwenduxiaoshu=0;//设温小数位变量置0,释放设温小数位标志位。
	  setwenduge=0;//设温个位变量置0,释放设温个位标志位。
	  setwendushi=0;//设温十位变量置0,释放设温十位标志位。
	  setwendubai=0;//设温百位变量置0,释放设温百位标志位。
	  LCD1602WriteCommand(0x80+0x09);//LCD1602字符型液晶显示器第一行第9个(从第0开始数)显示位,即设温度百位。
      LCD1602WriteData(0x30+setwendubai);//0x30表示字符库的数字0,整个代码表示设温百位变量显示0到9的数字。
	  LCD1602WriteCommand(0x80+0x0a);//LCD1602字符型液晶显示器第一行第10个(从第0开始数)显示位,即设温度十位。
      LCD1602WriteData(0x30+setwendushi);//0x30表示字符库的数字0,整个代码表示设温十位变量显示0到9的数字。
	  LCD1602WriteCommand(0x80+0x0b);//LCD1602字符型液晶显示器第一行第11个(从第0开始数)显示位,即设温度个位。
      LCD1602WriteData(0x30+setwenduge);//0x30表示字符库的数字0,整个代码表示设温个位变量显示0到9的数字。
	  LCD1602WriteCommand(0x80+0x0d);//LCD1602字符型液晶显示器第一行第12个(从第0开始数)显示位,即设温度小数位。
	  LCD1602WriteData(0x30+setwenduxiaoshu);//0x30表示字符库的数字0,整个代码表示设温小数位变量显示0到9的数字。
	  S3numflag=0;//增加键标志位变量置0,释放增加键标志位。
	  S4numflag=0;//减少键标志位变量置0,释放减少键标志位。
	  settemperatureflag=0;//设温标志位变量置0,释放设温标志位。
	  settimedisplayflag=0;//设时显示标志位变量置0,释放设时显示标志位。
	  settemperaturedisplayflag=0;//设温显示标志位变量置0,释放设温显示标志位。
	  tiaotimedisplayflag=0;//调时显示标志位变量置0,释放调时显示标志位。
	  temperaturedisplayflag=0;//温度显示标志位变量等于0,释放温度显示标志位。  
	 }
	 if(Snum>=2&&settemperaturedisplayflag==1&&tiaotimedisplayflag==1)//判断启停按键是否第二或二以上次按下过及设温显示标志位变量为1及调时显示标志位变量为1,相当于设时启动。
	{
	  Snum=1;//启停按键按下次数变量置1,为下一次按下启停键实现停止做准备。
	  S0num=0;//设时按键按下次数变量清零,可以反复操作设时按键。
	  TR0=1;//启动定时器0
	  TR0flag=1;//定时器0标志位变量置1,进入时间报警函数判断是否可执行时间报警。
	  LCD1602WriteCommand(0x0c);//关LCD1602液晶显示器光标(或字符)闪烁
	  settemperaturedisplayflag=0;//设温显示标志位变量置0,释放设温显示标志位。
	  tiaotimedisplayflag=0;//调时显示标志位变量置0,释放调时显示标志位。
	  lcd1602displaytimeflag=0;//LCD1602液晶显示器显示时间标志位变量置0,释放LCD1602液晶显示器显示时间标志位。
	  temperaturedisplayflag=0;//温度显示标志位变量置0,释放温度显示标志位。
	 }
	 if(Snum>=2&&settimedisplayflag==1&&tiaotimedisplayflag==1)//判断启停按键是否第二或二以上次按下过及设时显示标志位变量为1及调时显示标志位变量为1,相当于设温启动。
	{
	  Snum=1;//启停按键按下次数变量置1,为下一次按下启停键实现停止做准备。
	  S1num=0;//设温按键按下次数变量清零,可以反复操作设温按键。
	  TR0=1;//启动定时器0
	  LCD1602WriteCommand(0x0c);//关LCD1602液晶显示器光标(或字符)闪烁
	  settemperatureflag=1;//设温标志位变量置1,进入温度报警函数判断是否可执行温度报警。
	  settimedisplayflag=0;//设时显示标志位变量置0,释放设时显示标志位。
	  tiaotimedisplayflag=0;//调时显示标志位变量置0,释放调时显示标志位。
	  lcd1602displaytimeflag=0;//LCD1602液晶显示器显示时间标志位变量等于0,释放LCD1602液晶显示器显示时间标志位。
	  temperaturedisplayflag=0;//温度显示标志位变量置0,释放温度显示标志位。
	 }
	 if(Snum>=2&&settimedisplayflag==1&&settemperaturedisplayflag==1)//判断启停按键是否第二或二以上次按下过及设时显示标志位变量为1和设温显示标志位变量为1,相当于调时启动。
	{
	  Snum=1;//启停按键按下次数变量置1,为下一次按下启停键实现停止做准备。
      S2num=0;//调时按键按下次数变量清零,可以反复操作调时按键。
	  TR0=1;//启动定时器0
	  LCD1602WriteCommand(0x0c);//关LCD1602液晶显示器光标(或字符)闪烁 
	  settimedisplayflag=0;//设时显示标志位变量置0,释放设时显示标志位。
	  settemperaturedisplayflag=0;//设温显示标志位变量置0,释放设温显示标志位。
	  lcd1602displaytimeflag=0;//LCD1602液晶显示器显示时间标志位变量置0,释放LCD1602液晶显示器显示时间标志位。
	  temperaturedisplayflag=0;//温度显示标志位变量置0,释放温度显示标志位。
	  miaoflag=0;//秒钟标志位变量置0,释放秒钟标志位。
	  fenflag=0;//分钟标志位变量置0,释放分钟标志位。
	  shiflag=0;//时钟标志位变量置0,释放时钟显示标志位。
	 }
	}
   }     
  }
  void main()//主函数
{
   LCD1602Init();//LCD1602字符型液晶显示器初始化函数
   LCD1602DisplayInitTime();//LCD1602字符型液晶显示器显示初始化时间函数
   DS18B20Init();//DS18B20温度传感器初始化函数
   Timer0Init();//定时器0初始化函数 
   SetTimeInit();//设时初始化函数
   SetTemperatrueInit();//设温初始化函数	
   while(1)//固定循环
  {
    if(qitingflag==1)//判断启停标志位变量是否为1
   {
	 //	SetAlarmTemperatrueFenJie(alarmwendu);
	 if(lcd1602displaytimeflag==0)//判断LCD1602液晶显示器显示时间标志位变量是否等于0
    {	
      if(miao<=60)//判断走时秒钟变量是否小于等于60
	  LCD1602DisplayTimeFenJie(0x06,miao);//LCD1602液晶显示器显示时间两位数分解函数显示秒钟两位数
	  if(fen<=60)//判断走时分钟变量是否小于等于60
	  LCD1602DisplayTimeFenJie(0x03,fen);//LCD1602液晶显示器显示时间两位数分解函数显示分钟两位数
	  if(shi<=24)//判断走时时钟变量是否小于等于24
	  LCD1602DisplayTimeFenJie(0x00,shi);//LCD1602液晶显示器显示时间两位数分解函数显示时钟两位数
     }
	 if(temperaturedisplayflag==0)//判断温度显示标志位变量是否等于0
    {	 
	  TemperatureFenJie();//温度分解函数
	  TemperatureDisplay();//温度显示函数 
     }
	 if(settimedisplayflag==0)//判断设时显示标志位变量是否等于0
	{
	  SetTimeKeyScan();//设时按键扫描函数
	 }
	 if(settemperaturedisplayflag==0)//判断设温标志位变量是否等于0
    {	
      SetTemperatureKeyScan();//设温按键扫描函数
     }
	 if(tiaotimedisplayflag==0)//判断调时标志位变量是否等于0
    {
	  TiaoTimeKeyScan();//调时按键扫描函数
	 }
	 TimeBaoJing();//时间报警函数 
	 if(timebaojingflag==1)//判断时间报警标志位变量置是否为1
	{
	  FengNingQi_Alarm(80);//蜂鸣器报警
	  settimedisplayflag=1;//设时显示标志位变量置1,限制操作设时按键扫描函数。
	  settemperaturedisplayflag=1;//设温显示标志位变量置1,限制操作设温按键扫描函数。
	  tiaotimedisplayflag=1;//调时显示标志位变量置1,限制操作调时按键扫描函数。
	 }
	 TemperatrueBaoJing();//温度报警函数
	 if(temperatruebaojingflag==1)//判断温度报警标志位变量是否为1
	{
	  FengNingQi_Alarm(80);//蜂鸣器报警
	  settimedisplayflag=1;//设时显示标志位变量置1,限制操作设时按键扫描函数。
	  settemperaturedisplayflag=1;//设温显示标志位变量置1,限制操作设温按键扫描函数。
	  tiaotimedisplayflag=1;//调时显示标志位变量置1,限制操作调时按键扫描函数。
	  temperaturedisplayflag=1;//温度显示标志位变量置1,限制操作温度分解函数和温度显示函数。
	 }
    }
    SumKeyScan();//总按键扫描函数
   }
  }

三、基于51单片机DS18B20测温LCD1602显示可设时设温调时的项目Proteus软件仿真单片机外围电路

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值