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

一、前言

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

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

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

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

在这里插入图片描述

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

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

   1 #include<reg52.h>//声明51单片机内部寄存器头文件
   2 #define uchar unsigned char //自定义uchar为unsigned char(即无符号字符型数据,数据范围:0到255。)
   3 #define uint unsigned int//自定义uint为unsigned int(即无符号整数型数据,数据范围:0到65535。)
   4 sbit RS=P0^7;//位定义LCD1602字符型液晶显示器的数据/命令选择引脚                 
   5 sbit RW=P0^6;//位定义LCD1602字符型液晶显示器的读写引脚                        
   6 sbit EN=P0^5; //位定义LCD1602字符型液晶显示器的使能引脚
   7 sbit DQ=P1^6;//位定义DS18B20温度传感器数据端口
   8 sbit FengNingQi=P3^1;//位定义蜂鸣器口
   9 sbit S=P3^2;//位定义启停按键S
  10 sbit S0=P3^3;//位定义设时按键S0
  11 sbit S1=P3^4;//位定义设温按键S1
  12 sbit S2=P3^5;//位定义调时按键S2
  13 sbit S3=P3^6;//位定义增加按键S3
  14 sbit S4=P3^7;//位定义减少按键S4
  15 uchar count,Snum,S0num,S1num,S2num,S3numflag,S4numflag,TR0flag,setsecondflag,setminutanflag,sethourflag,miaoflag,fenflag,shiflag,settemperatureflag;//定时器0中断次数变量、启停按键按下次数变量、设时按键按下次数变量、设温按键下次数变量、调时按键按下次数变量、增加键标志位变量、减少键标志位变量、定时器0标志位变量、设时秒钟标志位变量、设时分钟标志位变量、设时时钟标志位变量、秒钟标志位变量、分钟标志位变量、时钟标志位变量、设温标志位变量
  16 uchar miao,fen,shi;//走时秒钟变量、走时分钟变量、走时时钟变量
  17 uchar setsecond,setminutan,sethour;//设时秒钟变量、设时分钟变量、设时时钟变量
  18 uchar setsecondge,setsecondshi;//设时秒钟个位变量、设时秒钟十位变量
  19 uchar setminutange,setminutanshi;//设时分钟个位变量、设时分钟十位变量
  20 uchar sethourge,sethourshi;//设时时钟个位变量、设时时钟十位变量
  21 uchar secondge,secondshi; //调时秒钟个位变量、调时秒钟十位变量
  22 uchar minutange,minutanshi;//调时分钟个位变量、调时分钟十位变量
  23 uchar hourge,hourshi;//调时时钟个位变量、调时时钟十位变量
  24 uchar qitingflag,temperaturedisplayflag,lcd1602displaytimeflag,settimedisplayflag,settemperaturedisplayflag,tiaotimedisplayflag,timebaojingflag,temperatruebaojingflag;//启停键标志位变量、温度显示标志位变量、液晶显示器显示时间标志位变量、设时显示标志位变量、设温显示标志位变量、调时显示标志位变量、时间报警标志位变量、温度报警标志位变量
  25 uint temperature,t;//读温度变量
  26 uint temperatureflag;//负温度标志位变量
  27 uint wendu,wenduxiaoshu,xiaoshudian,wenduge,wendushi,wendubai,fuhaowei,setwendu,setwenduxiaoshu,setwenduge,setwendushi,setwendubai,settemperature;//测温变量、测温小数变量、测温小数点变量、测温个位变量、测温十位变量、测温百位变量、温度符号位变量、设温变量、设温小数变量、设温个位变量、设温十位变量、设温百位变量、总设温变量
  28 //uchar table0[]="00:00:00";//LCD1602字符型液晶显示器第一行初始显示
  29 uchar table1[]="00:00:00";//LCD1602字符型液晶显示器显示第二行走时初始化数组变量
  30   void Delay(uint z)//毫秒延时程序
  31 {
  32    uint x,y;
  33    for(x=z;x>0;x--)
  34     for(y=110;y>0;y--);
  35  }
  36   void DS18B20_Delay(uint i)//DS18B20温度传感器微妙延时函数
  37 {
  38    while(i--);
  39  }
  40   void LCD1602WriteCommand(uchar command)//LCD1602字符型液晶显示器写指令函数
  41 {
  42    RS=0;//LCD1602字符型液晶显示器指令寄存器命令选择引脚置低电平
  43    RW=0;//LCD1602字符型液晶显示器写指令操作写引脚置低电平
  44    P2=command;//LCD1602字符型液晶显示器写指令函数写指令到单片机P2组端口,再输送到LCD1602字符型液晶显示器指令寄存器中执行。
  45    Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
  46    EN=1;//LCD1602字符型液晶显示器使能端引脚置高电平  
  47    Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
  48    EN=0;//LCD1602字符型液晶显示器使能端引脚置低电平
  49  }
  50   void LCD1602WriteData(uchar information)//LCD1602字符型液晶显示器写数据函数
  51 {  
  52    RS=1;//LCD1602字符型液晶显示器数据寄存器数据选择引脚置高电平
  53    RW=0;//LCD1602字符型液晶显示器写数据操作写引脚置低电平
  54    P2=information;//LCD1602字符型液晶显示器写数据函数写数据到单片机P2组端口,再输送到LCD1602字符型液晶显示器上显示。
  55    Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
  56    EN=1;//LCD1602字符型液晶显示器使能端引脚置高电平 
  57    Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
  58    EN=0;//LCD1602字符型液晶显示器使能端引脚置低电平
  59  }
  60   void LCD1602Init()//LCD1602字符型液晶显示器初始化函数
  61 {
  62    LCD1602WriteCommand(0x38);//设置LCD1602字符型液晶显示器16x2显示,5*7或5*8点阵,8位数据并口,简称显模。
  63    LCD1602WriteCommand(0x08);//设置LCD1602字符型液晶显示器显示开,简称亮屏。
  64    LCD1602WriteCommand(0x01);//设置清除LCD1602字符型液晶显示器屏上所有内容,并让光标复位到LCD1602字符型液晶显示器屏左上角,简称清屏。
  65    LCD1602WriteCommand(0x06);//设置开光标(或字符)地址指针自增1,光标右移动一个字符位,整屏显示不移动。
  66    LCD1602WriteCommand(0x0c);//设置开LCD1602字符型液晶显示器显示,关光标,关光标(字符)闪烁。
  67  }
  68   void LCD1602DisplayInitTime()//LCD1602字符型液晶显示器显示初始化时间函数
  69 {
  70    uchar j;//j表示数组元素个数变量
  71 //   WriteCommand(0x80+0x00);//LCD1602字符型液晶显示器第一行第一个位置显示
  72 //   for(j=0;j<8;j++)//有10个字符,要循环10次。
  73 //  {
  74 //    WriteData(table0[j]);//显示字符串
  75 //    Delay(5);
  76 //   }
  77    LCD1602WriteCommand(0x80+0x40);//LCD1602字符型液晶显示器第二行第一个位置显示
  78    for(j=0;j<8;j++)//有8个字符,要循环8次。
  79   { 
  80     LCD1602WriteData(table1[j]);//显示走时
  81     Delay(5);//毫秒延时
  82    }
  83  }
  84   void LCD1602DisplayTimeFenJie(uchar address,uchar num)//LCD1602字符型液晶显示器显示走时时间两位数分解函数
  85 {
  86    uchar ge,shi;//声明走时时间个位变量、走时时间十位变量
  87    ge=num%10;//走时时间个位变量分解
  88    shi=num/10;//走时时间十位变量分解
  89    LCD1602WriteCommand(0x80+0x40+address);//LCD1602字符型液晶显示器第二行某个显示位
  90    LCD1602WriteData(0x30+shi);//0x30表示字符库的数字0,整个代码表示走时时间十位变量可显示0到9的数字。
  91    LCD1602WriteData(0x30+ge);//0x30表示字符库的数字0,整个代码表示走时时间个位变量可显示0到9的数字。
  92  }
  93   void LCD1602DisplayGeDigitResolve(uchar address,uchar num)//LCD1602字符型液晶显示器显示调时时间个位数分解函数
  94 {
  95    uchar ge;//调时时间个位变量
  96    ge=num%10;//调时时间个位变量分解
  97    LCD1602WriteCommand(0x80+0x40+address);//LCD1602字符型液晶显示器第二行某个显示位
  98    LCD1602WriteData(0x30+ge);//0x30表示字符库的数字0,整个代码表示调时时间个位变量可显示0到9的数字。
  99  }
 100   void LCD1602DisplayShiDigitResolve(uchar address,uchar num)//LCD1602字符型液晶显示器显示调时时间十位变量分解函数
 101 {
 102    uchar shi;//调时时间十位变量
 103    shi=num%10;//调时时间十位变量分解
 104    LCD1602WriteCommand(0x80+0x40+address);//LCD1602字符型液晶显示器第二行某个显示位
 105    LCD1602WriteData(0x30+shi);//0x30表示字符库的数字0,整个代码表示调时时间十位变量可显示0到9的数字。
 106  }
 107   bit DS18B20Init()//DS18B20温度传感器初始化函数
 108 {
 109    uchar x=0;//声明一个表示低电平变量
 110    DQ = 1;//单片机将DS18B20通信端口DQ拉高复位  
 111    DS18B20_Delay(8);//稍做DS18B20温度传感器延时
 112    DQ = 0;//单片机将DS18B20通信端口DQ拉低 
 113    DS18B20_Delay(80);//DS18B20温度传感器延时在480us与960us之间
 114    DQ = 1;//单片机将DS18B20通信端口DQ拉高
 115    DS18B20_Delay(4);//DS18B20温度传感器延时在15us与60us之间
 116    x=DQ;//稍做延时后,如果x=0,则初始化成功,若x=1则初始化失败。
 117    DS18B20_Delay(20);//DS18B20温度传感器延时在60us与240us之间
 118    return x;//返回低电平变量
 119  }
 120   void DS18B20_WriteOneByte(uchar j)//DS18B20温度传感器写一个字节函数
 121 {
 122    uchar i=0;//声明一个循环变量
 123    for (i=8; i>0; i--)//单片机向DS18B20温度传感器写入数据
 124   {
 125     DQ = 0;//单片机将DS18B20温度传感器通信端口DQ从高电平拉至低电平时,单片机向DS18B20温度传感器写数据开始。
 126     DQ = j&0x01;//单片机按将字节低位写入DS18B20温度传感器
 127     DS18B20_Delay(5);//DS18B20温度传感器延时在60us与120us之间
 128     DQ = 1;//单片机将DS18B20温度传感器通信端口DQ拉高 
 129     j>>=1;//变量j右移一位,最高位补零。例如当j=1,换成二进制是0000 0001,右移一位就是0000 000。扩展:单片机无符号或有符号数左移几位,高位就依次补几位0,低位也依次去掉几位,让左移几位依次代替低位去掉的几位。单片机有符号数,如果是正数,右移几位,先是确定最高位用0,低位也依次去掉几位,让右移几位依次代替低位去掉的几位,如果是负数,右移几位,先是确定最高位用1,低位也依次去掉几位,让右移几位依次代替低位去掉的几位。       
 130    }
 131  }
 132   uchar DS18B20_ReadOneByte()//DS18B20温度传感器读一个字节函数
 133 {
 134    uchar i=0;//声明一个循环变量
 135    uchar j = 0;//声明一个移位变量
 136    for (i=8;i>0;i--)//单片机读取DS18B20温度传感器采集的温度数值转换成一个字节
 137   {
 138     DQ = 0;//单片机将DS18B20温度传感器通信端口DQ从高电平拉成低电平时,单片机读取DS18B20温度传感器所采集到温度数值开始。
 139     j>>=1;//变量j右移一位,最高位补零。例如当j=1,换成二进制是0000 0001,右移一位就是0000 000。扩展:单片机无符号或有符号数左移几位,高位就依次补几位0,低位也依次去掉几位,让左移几位依次代替低位去掉的几位。单片机有符号数,如果是正数,右移几位,先是确定最高位用0,低位也依次去掉几位,让右移几位依次代替低位去掉的几位,如果是负数,右移几位,先是确定最高位用1,低位也依次去掉几位,让右移几位依次代替低位去掉的几位。
 140     DQ = 1;//单片机将DS18B20温度传感器通信端口DQ拉高
 141     if(DQ)//判断DS18B20温度传感器数据端口DQ是否等于1
 142     j|=0x80;//若DQ=1,则让当前j最高位为1,在下次循环中移位至次高位,最后达到从低位到高位接收的目的;若DQ=0,则可跳过此语句,直接在下次循环对byte进行移位补0。  
 143     DS18B20_Delay(4);//稍做DS18B20温度传感器延时
 144   }
 145    return j;
 146 }
 147   uint DS18B20_ReadTemperature()//单片机读取DS18B20温度传感器温度函数
 148 {
 149    uchar L=0;//定义低8位温度变量值
 150    uchar H=0;//定义高8位温度变量值    
 151    DS18B20Init( );//DS18B20温度传感器初始化函数
 152    DS18B20_WriteOneByte(0xcc);//单片机只连一个DS18B20温度传感器时,可写该段代码,表示单片机向DS18B20温度传感器写入跳过读DS18B20温度传感器序列号指令。
 153    DS18B20_WriteOneByte(0x44);//单片机向DS18B20温度传感器九字节暂存器(包括两个字节储温温度寄存器、一字节高温触发器、一字节低温触发器、一字节温度精度转换配置寄存器、三个字节的保留位、一字节DS18B20温度传感器的64位ROM前56位编码校验CRC发生器)中前两个字节温度寄存器写入启动DS18B20温度传感器温度转换指令
 154 //   DS18B20_Delay(100);//稍作延时
 155    DS18B20Init( );//DS18B20温度传感器初始化函数
 156    DS18B20_WriteOneByte(0xcc);//单片机只连一个DS18B20温度传感器时,可写该段代码,表示单片机向DS18B20温度传感器写入跳过读DS18B20温度传感器序列号指令。
 157    DS18B20_WriteOneByte(0xbe);//单片机向DS18B20温度传感器九字节暂存器(包括两个字节储温温度寄存器、一字节高温触发器、一字节低温触发器、一字节温度精度转换配置寄存器、三个字节的保留位、一字节DS18B20温度传感器的64位ROM前56位编码校验CRC发生器)中前两个字节温度寄存器写入DS18B20温度传感器读取温度的指令
 158 //   DS18B20_Delay(100);//稍作延时
 159    L=DS18B20_ReadOneByte( );//单片机向DS18B20温度传感器发送读取温度值低8位指令,把读到的温度值低8位赋给低8位温度变量值
 160    H=DS18B20_ReadOneByte( );//单片机向DS18B20温度传感器发送读取温度值高8位指令,把读到的温度值高8位赋给高8位温度变量值
 161    temperature = H;//DS18B20温度传感器读到的高8位温度变量值赋给温度变量值,变成高8位温度变量值,此时其还不是一个温度变量值,由于一个温度变量值是由高8位低8位共16位组成。
 162    temperature = temperature << 8;//温度变量值高8位左移8位,就可以变成一个只有高8位低8位全0的温度变量值。
 163    temperature = temperature | L;//只有高8位低8位全0的温度变量值与温度变量值低8位或运算后就变成一个真正有高8位低8位共16位的温度变量值 
 164    if(temperature>0x0fff)//判断表示温度寄存器16位二进制数的温度变量值是否大于表示温度寄存器16位二进制数的正温度值,假若大于且当表示温度寄存器16位二进制数的温度变量值的前5位二进制数全为1时,该温度变量值表示负温度值。
 165   {
 166     temperature = ~temperature+2;//负温度变量值
 167     temperatureflag=1;//负温度标志变量置1
 168    }
 169    else
 170   {      
 171     temperatureflag=0;//负温度标志变量等于0
 172    }
 173    temperature = temperature*0.0625*10;//扩大10倍的温度变量数值
 174    return temperature;//返回扩大10倍的温度变量数值   
 175  }
 176   void SetTimeInit()//设时初始化函数
 177 {
 178    LCD1602WriteCommand(0x80+0x00);//LCD1602字符型液晶显示器第一行第0个(从第零开始数)显示位
 179    LCD1602WriteData(0x30+sethourshi);//0x30表示字符库的数字0,整个代码表示设时时钟十位变量可显示0到9的数字。
 180    LCD1602WriteData(0x30+sethourge);//0x30表示字符库的数字0,整个代码表示设时时钟个位变量可显示0到9的数字。
 181    LCD1602WriteData(0x3a);//0x3a表示字符库中冒号
 182    LCD1602WriteData(0x30+setminutanshi);//0x30表示字符库的数字0,整个代码表示设时分钟十位变量可显示0到9的数字。
 183    LCD1602WriteData(0x30+setminutange);//0x30表示字符库的数字0,整个代码表示设时分钟个位变量可显示0到9的数字。
 184    LCD1602WriteData(0x3a);//0x3a表示字符库中冒号
 185    LCD1602WriteData(0x30+setsecondshi);//0x30表示字符库的数字0,整个代码表示设时秒钟十位变量可显示0到9的数字。
 186    LCD1602WriteData(0x30+setsecondge);//0x30表示字符库的数字0,整个代码表示设时秒钟个位变量可显示0到9的数字。     
 187   }
 188   void SetTimeKeyScan()//设时按键扫描函数
 189 {
 190    if(S0==0)//判断设时按键是否按下
 191   {
 192       Delay(5);//毫秒延时
 193     if(S0==0)//再次判断设时按键是否按下
 194    {
 195      settemperatureflag=0;//设温标志位变量置0,在温度报警函数执行后但不报警的情况下,温度报警函数里边余留settemperatureflag==1和TR0=1,当操作设时按键扫描函数时,计时依然在执行,导致计时不恰当,因此在设时按键扫描函数里边添加settemperatureflag=0和TR0=0,执行设时按键扫描函数后,温度报警函数里边settemperatureflag==1和TR0=1被置换成settemperatureflag=0和TR0=0,很好地解决了在操作设时按键扫描函数时,计时依然在执行,导致计时不恰当的问题。
 196      S0num++;//设时按键按下次数变量加加
 197      while(!S0);//等待设时按键弹起
 198      switch(S0num)//设时按键按下次数变量选择位
 199     {
 200       case 1://设时按键第一次按下
 201              TR0=0;//关定时器0
 202              TR0flag=0;//定时器0标志位变量置0,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留TR0flag==1,当再次操作设时按键扫描函数设时时,会发生在设时过程中触发设时报警条件而报警,因此在设时按键扫描函数里边添加TR0flag=0,再次执行设时按键扫描函数后,温度报警函数里边TR0flag==1被置换成TR0flag=0,很好地解决了再次操作设时按键扫描函数设时时,在设时过程中触发设时报警条件而报警的问题。
 203              tiaotimedisplayflag=1;//调时显示标志位变量置1,在操作设时按键扫描函数的情况下,不能操作调时按键扫描函数。
 204              settemperaturedisplayflag=1;//设温显示标志位变量置1,在操作设时按键扫描函数的情况下,不能操作设温按键扫描函数。
 205              lcd1602displaytimeflag=1;//液晶显示器显示时间标志位变量置1,在操作设时按键扫描函数的情况下,不受时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数影响。
 206              temperaturedisplayflag=1;//温度显示标志位变量置1,在操作设时按键扫描函数的情况下,不受温度分解函数和温度显示函数影响。
 207              LCD1602WriteCommand(0x80+0x00+0x07);//LCD1602字符型液晶显示器第一行第7个(从第0开始数)位置的显示位
 208              LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
 209              break;
 210       case 2://设时按键第二次按下 
 211              LCD1602WriteCommand(0x80+0x00+0x06);//LCD1602字符型液晶显示器第一行第6个(从第0开始数)个位置的显示位
 212              LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
 213              break;
 214       case 3://设时按键第三次按下
 215              LCD1602WriteCommand(0x80+0x00+0x04);//LCD1602字符型液晶显示器第一行第4个(从第0开始数)位置的显示位
 216              LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
 217              break;
 218       case 4://设时按键第四次按下
 219              LCD1602WriteCommand(0x80+0x00+0x03);//LCD1602字符型液晶显示器第一行第3个(从第0开始数)位置的显示位
 220              LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
 221              break;
 222       case 5://设时按键第五次按下
 223              LCD1602WriteCommand(0x80+0x00+0x01);//LCD1602字符型液晶显示器第一行第1个(从第0开始数)位置的显示位
 224              LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
 225              break;
 226       case 6://设时按键第六次按下
 227              LCD1602WriteCommand(0x80+0x00+0x00);//LCD1602字符型液晶显示器第一行第0个(从第0开始数)位置的显示位
 228              LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
 229              break;
 230       case 7://设时按键第七次按下
 231              LCD1602WriteCommand(0x80+0x00+0x07);//LCD1602字符型液晶显示器第一行第7个(从第0开始数)位置的显示位
 232              LCD1602WriteCommand(0x0c);//LCD1602字符型液晶显示器关光标(或字符)闪烁。
 233              TR0=1;//开定时器0
 234              TR0flag=1;//定时器0标志位变量置1,为了在操作设时按键扫描函数进行设时后,可以执行时间报警函数。
 235              S0num=0;//设时按键按下次数变量清零,可以反复操作设时按键。
 236              settemperaturedisplayflag=0;//设温显示标志位变量置0,让设时按键扫描函数执行后,可允许设温按键扫描函数执行。
 237              tiaotimedisplayflag=0;//调时显示标志位变量置0,让设时按键扫描函数执行后,可允许调时按键扫描函数执行。
 238              lcd1602displaytimeflag=0;//液晶显示器显示时间标志位变量等于0,让设时按键扫描函数执行后,可允许时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数执行。
 239              temperaturedisplayflag=0;//温度显示标志位变量等于0,让设时按键扫描函数执行后,可允许温度分解函数和温度显示函数执行。
 240              break;
 241      default:
 242              S0num=0;//设温按键按下次数变量清零,可以反复操作设时按键。
 243              break;  
 244       }
 245      }
 246     }
 247     if(S0num!=0)//判断设时按键按下次数变量是否不为0
 248   {
 249      if(S3==0)//判断增加按键是否按下
 250     {
 251       Delay(5);//毫秒延时
 252       if(S3==0)//再次判断增加按键是否按下
 253      {
 254        S3numflag=1;//增加键标志位变量置1,可以在时间报警函数内进行设时报警。
 255        while(!S3);//等待增加按键弹起
 256        switch(S0num)//设时按键按下次数变量选择位
 257       {
 258         case 1://设时按键第一次按下
 259                setsecondflag=1;//设时秒钟标志位变量置1,表示设时秒钟变量数值修改。
 260                setsecondge++;//设时秒钟个位变量加加
 261                if(setsecondge==10)//判断设时秒钟个位变量是否达到10
 262                setsecondge=0;//设时秒钟个位变量置零
 263                LCD1602WriteCommand(0x80+0x00+0x07);//写入LCD1602字符型液晶显示器第一行第7个(从第0个开始数)位置的设时秒钟个位变量显示位
 264                LCD1602WriteData(0x30+setsecondge);//0x30表示字符库的数字0,整个代码表示设时秒钟个位变量可显示0到9的数字。
 265                LCD1602WriteCommand(0x80+0x00+0x07);//写入LCD1602字符型液晶显示器第一行第7个(从第0个开始数)位置的设时秒钟个位变量显示位
 266                setsecond=setsecondshi*10+setsecondge;//设时秒钟变量求和表达式
 267                break;
 268         case 2://设时按键第二次按下
 269                setsecondflag=1;//设时秒钟标志位变量置1,表示设时秒钟变量数值修改。
 270                setsecondshi++;//设时秒钟十位变量加加
 271                if(setsecondshi==6)//判断设时秒钟十位变量是否达到6
 272                setsecondshi=0;//设时秒钟十位变量置零
 273                LCD1602WriteCommand(0x80+0x00+0x06);//写入LCD1602字符型液晶显示器第一行第6个(从第0个开始数)位置的设时秒钟十位变量显示位
 274                LCD1602WriteData(0x30+setsecondshi);//0x30表示字符库的数字0,整个代码表示设时秒钟十位变量变量可显示0到9的数字。
 275                LCD1602WriteCommand(0x80+0x00+0x06);//写入LCD1602字符型液晶显示器第一行第6个(从第0个开始数)位置的设时秒钟十位变量显示位
 276                setsecond=setsecondshi*10+setsecondge;//设时秒钟变量求和表达式
 277                break;
 278            case 3://设时按键第三次按下
 279                setminutanflag=1;//设时分钟标志位变量置1,表示设时分钟变量数值修改。
 280                setminutange++;//设时分钟个位变量加加
 281                if(setminutange==10)//判断设时分钟个位变量是否达到10
 282                setminutange=0;//设时分钟个位变量置零
 283                LCD1602WriteCommand(0x80+0x00+0x04);//写入LCD1602字符型液晶显示器第一行第4个(从第0个开始数)位置的设时分钟个位变量显示位
 284                LCD1602WriteData(0x30+setminutange);//0x30表示字符库的数字0,整个代码表示设时分钟个位变量可显示0到9的数字。
 285                LCD1602WriteCommand(0x80+0x00+0x04);//写入LCD1602字符型液晶显示器第一行第4个(从第0个开始数)位置的设时分钟个位变量显示位
 286                setminutan=setminutanshi*10+setminutange;//设时分钟变量求和表达式
 287                break;
 288         case 4://设时按键第四次按下
 289                setminutanflag=1;//设时分钟标志位变量置1,表示设时分钟变量数值修改。
 290                setminutanshi++;//设时分钟十位变量加加
 291                if(setminutanshi==6)//判断设时分钟十位变量设定值是否达到6
 292                setminutanshi=0;//设时分钟十位变量置零
 293                LCD1602WriteCommand(0x80+0x00+0x03);//写入LCD1602字符型液晶显示器第一行第3个(从第0个开始数)位置的设时分钟十位变量显示位
 294                LCD1602WriteData(0x30+setminutanshi);//0x30表示字符库的数字0,整个代码表示设时分钟十位变量可显示0到9的数字。
 295                LCD1602WriteCommand(0x80+0x00+0x03);//写入LCD1602字符型液晶显示器第一行第3个(从第0个开始数)位置的设时分钟十位变量显示位
 296                setminutan=setminutanshi*10+setminutange;//设时分钟变量求和表达式
 297                break;
 298            case 5://设时按键第五次按下
 299                sethourflag=1;//设时时钟标志位变量置1,表示设时时钟变量数值修改。
 300                sethourge++;//设时时钟个位变量加加
 301                if(sethourge==4)//判断设时时钟个位变量是否达到4
 302                sethourge=0;//设时时钟个位变量置零
 303                LCD1602WriteCommand(0x80+0x00+0x01);//写入LCD1602字符型液晶显示器第一行第1个(从第0个开始数)位置的设时时钟个位变量显示位
 304                LCD1602WriteData(0x30+sethourge);//0x30表示字符库的数字0,整个代码表示设时时钟个位变量可显示0到9的数字。
 305                LCD1602WriteCommand(0x80+0x00+0x01);//写入LCD1602字符型液晶显示器第一行第1个(从第0个开始数)位置的设时时钟个位变量显示位
 306                sethour=sethourshi*10+sethourge;//设时时钟变量求和表达式
 307                break;
 308         case 6://设时按键第六次按下
 309                sethourflag=1;//设时时钟标志位变量置1,表示设时时钟变量数值修改。
 310                sethourshi++;//设时时钟十位变量加加
 311                if(sethourshi==3)//判断设时时钟十位是否达到3
 312                sethourshi=0;//设时时钟十位变量置零
 313                LCD1602WriteCommand(0x80+0x00+0x00);//写入LCD1602字符型液晶显示器第一行第0个(从第0个开始数)位置的设时时钟十位变量显示位
 314                LCD1602WriteData(0x30+sethourshi);//0x30表示字符库的数字0,整个代码表示设时时钟十位变量可显示0到9的数字。
 315                LCD1602WriteCommand(0x80+0x00+0x00);//写入LCD1602字符型液晶显示器第一行第0个(从第0个开始数)位置的设时时钟十位变量显示位
 316                sethour=sethourshi*10+sethourshi;//设时时钟变量求和表达式
 317                break;
 318        }
 319       }
 320      }
 321     }
 322     if(S0num!=0)//判断设时按键按下次数变量是否不为0
 323   {
 324      if(S4==0)//判断减少按键是否按下
 325     {
 326       Delay(5);//延时
 327       if(S4==0)//再次判断减少按键是否按下
 328      {
 329        S4numflag=1;//减少键标志位变量,可以在时间报警函数内进行设时报警。
 330        while(!S4);//等待减少按键弹起
 331        switch(S0num)//设时按键按下次数变量选择位
 332       {
 333         case 1://设时按键第一次按下
 334                setsecondflag=1;//设时秒钟标志位变量置1,表示设时秒钟变量数值修改。
 335                setsecondge--;//设时秒钟个位变量减减
 336                if(setsecondge==-1)//判断设时秒钟个位变量是否达到-1
 337                setsecondge=9;//设时秒钟个位变量置9
 338                LCD1602WriteCommand(0x80+0x00+0x07);//写入LCD1602字符型液晶显示器第一行第7个(从第0个开始数)位置的设时秒钟个位变量显示位
 339                LCD1602WriteData(0x30+setsecondge);//0x30表示字符库的数字0,整个代码表示设时秒钟个位变量可显示0到9的数字。
 340                LCD1602WriteCommand(0x80+0x00+0x07);//写入LCD1602字符型液晶显示器第一行第7个(从第0个开始数)位置的设时秒钟个位变量显示位
 341                setsecond=setsecondshi*10+setsecondge;//设时秒钟变量求和表达式
 342                break;
 343         case 2://设时按键第二次按下
 344                setsecondflag=1;//设时秒钟标志位变量置1,表示设时秒钟数值修改。
 345                setsecondshi--;//设时秒钟十位变量减减
 346                if(setsecondshi==-1)//判断设时秒钟十位变量是否达到-1
 347                setsecondshi=5;//设时秒钟十位变量数置5
 348                LCD1602WriteCommand(0x80+0x00+0x06);//写入LCD1602字符型液晶显示器第一行第6个(从第0个开始数)位置的设时秒钟十位变量显示位
 349                LCD1602WriteData(0x30+setsecondshi);//0x30表示字符库的数字0,整个代码表示设时秒钟十位变量变量可显示0到9的数字。
 350                LCD1602WriteCommand(0x80+0x00+0x06);//写入LCD1602字符型液晶显示器第一行第6个(从第0个开始数)位置的设时秒钟十位变量显示位
 351                setsecond=setsecondshi*10+setsecondge;//设时秒钟变量求和表达式
 352                break;
 353            case 3://设时按键第三次按下
 354                setminutanflag=1;//设时分钟标志位变量置1,表示设时分钟变量数值修改。
 355                setminutange--;//设时分钟个位变量减减
 356                if(setminutange==-1)//判断设时分钟个位变量是否达到-1
 357                setminutange=9;//设时分钟个位变量置9
 358                LCD1602WriteCommand(0x80+0x00+0x04);//写入LCD1602字符型液晶显示器第一行第4个(从第0个开始数)位置的设时分钟个位变量显示位
 359                LCD1602WriteData(0x30+setminutange);//0x30表示字符库的数字0,整个代码表示设时分钟个位变量可显示0到9的数字。
 360                LCD1602WriteCommand(0x80+0x00+0x04);//写入LCD1602字符型液晶显示器第一行第4个(从第0个开始数)位置的设时分钟个位变量显示位
 361                setminutan=setminutanshi*10+setminutange;//设时分钟变量求和表达式
 362                break;
 363         case 4://设时按键第四次按下
 364                setminutanflag=1;//设时分钟标志位变量置1,表示设时分钟变量数值修改。
 365                setminutanshi--;//设时分钟十位变量减减
 366                if(setminutanshi==-1)//判断设时分钟十位变量是否达到-1
 367                setminutanshi=5;//设时分钟十位变量置9
 368                LCD1602WriteCommand(0x80+0x00+0x03);//写入LCD1602字符型液晶显示器第一行第3个(从第0个开始数)位置的设时分钟十位变量显示位
 369                LCD1602WriteData(0x30+setminutanshi);//0x30表示字符库的数字0,整个代码表示设时分钟十位变量可显示0到9的数字。
 370                LCD1602WriteCommand(0x80+0x00+0x03);//写入LCD1602字符型液晶显示器第一行第3个(从第0个开始数)位置的设时分钟十位变量显示位
 371                setminutan=setminutanshi*10+setminutange;//设时分钟变量求和表达式
 372                break;
 373            case 5://设时按键第五次按下
 374                sethourflag=1;//设时时钟标志位变量置1,表示设时时钟变量数值修改。
 375                sethourge--;//设时时钟个位变量减减
 376                if(sethourge==-1)//判断设时时钟个位变量是否达到-1
 377                sethourge=3;//设时时钟个位变量置3
 378                LCD1602WriteCommand(0x80+0x00+0x01);//写入LCD1602字符型液晶显示器第一行第1个(从第0个开始数)位置的设时时钟个位变量显示位
 379                LCD1602WriteData(0x30+sethourge);//0x30表示字符库的数字0,整个代码表示设时时钟个位变量可显示0到9的数字。
 380                LCD1602WriteCommand(0x80+0x00+0x01);//写入LCD1602字符型液晶显示器第一行第1个(从第0个开始数)位置的设时时钟个位变量显示位
 381                sethour=sethourshi*10+sethourge;//设时时钟变量求和表达式
 382                break;
 383         case 6://设时按键第六次按下
 384                sethourflag=1;//设时时钟标志位变量置1,表示设时时钟变量数值修改。
 385                sethourshi--;//设时时钟十位变量减减
 386                if(sethourshi==-1)//判断设时时钟十位变量是否达到-1
 387                sethourshi=2;//设时时钟十位变量置2
 388                LCD1602WriteCommand(0x80+0x00+0x00);//写入LCD1602字符型液晶显示器第一行第0个(从第0个开始数)位置的设时时钟十位变量显示位
 389                LCD1602WriteData(0x30+sethourshi);//0x30表示字符库的数字0,整个代码表示设时时钟十位变量可显示0到9的数字。
 390                LCD1602WriteCommand(0x80+0x00+0x00);//写入LCD1602字符型液晶显示器第一行第0个(从第0个开始数)位置的设时时钟十位变量显示位
 391                sethour=sethourshi*10+sethourge;//设时时钟变量求和表达式
 392                break;
 393        }
 394       }
 395      }
 396     }
 397   } 
 398   void SetTemperatrueInit()//设温初始化函数
 399 {
 400    LCD1602WriteCommand(0x80+0x08);//LCD1602字符型液晶显示器第一行第九个(从第零开始数)显示位
 401    LCD1602WriteData(fuhaowei);//符号位显示。
 402    LCD1602WriteData(0x30+setwendubai);//0x30表示字符库的数字0,整个代码表示设温百位变量可显示0到9的数字。
 403    LCD1602WriteData(0x30+setwendushi);//0x30表示字符库的数字0,整个代码表示设温十位变量可显示0到9的数字。
 404    LCD1602WriteData(0x30+setwenduge);//0x30表示字符库的数字0,整个代码表示设温个位变量可显示0到9的数字。
 405    LCD1602WriteData(0x2e);//小数点
 406    LCD1602WriteData(0x30+setwenduxiaoshu);//0x30表示字符库的数字0,整个代码表示设温小数位变量可显示0到9的数字。
 407    LCD1602WriteData(0xdf);//0xdf表示字符库中摄氏度左上角的符号
 408    LCD1602WriteData(0x43);//0x43表示字符库中大写字母C
 409   }
 410   void TemperatureFenJie()//温度分解函数   
 411 {
 412    wendu=DS18B20_ReadTemperature();//DS18B20读到的温度值赋给温度值变量
 413    if(temperatureflag==1)//判断负温度标志变量是否等于1
 414   {    
 415     fuhaowei=0x2d;//负符号
 416     wendubai=wendu/1000;//温度百位变量分解
 417     wendushi=wendu%1000/100;//温度十位变量分解
 418     wenduge=wendu%100/10;//温度个位变量分解
 419     xiaoshudian=0x2e;//小数点
 420     wenduxiaoshu=wendu%10;//温度小数位变量分解
 421    }
 422    else
 423   {
 424      fuhaowei=0x2b;//正符号
 425     if(wendu==0)//判断温度变量是否等于0
 426    {
 427         fuhaowei=0x20;//无符号
 428     }
 429     wendubai=wendu/1000;//温度百位变量分解
 430     wendushi=wendu%1000/100;//温度十位变量分解
 431     wenduge=wendu%100/10;//温度个位变量分解
 432     xiaoshudian=0x2e;//小数点
 433     wenduxiaoshu=wendu%10;//温度小数位变量分解
 434    }         
 435  }
 436   void TemperatureDisplay()//温度显示函数   
 437 { 
 438    LCD1602WriteCommand(0x80+0x48);//LCD1602字符型液晶显示器第二行第九个(从第零开始数)显示位
 439    LCD1602WriteData(fuhaowei);//符号位显示。
 440    LCD1602WriteData(0x30+wendubai);//0x30表示字符库的数字0,整个代码表示温度百位变量可显示0到9的数字。
 441    LCD1602WriteData(0x30+wendushi);//0x30表示字符库的数字0,整个代码表示温度十位变量可显示0到9的数字。
 442    LCD1602WriteData(0x30+wenduge);//0x30表示字符库的数字0,整个代码表示温度个位变量可显示0到9的数字。
 443    LCD1602WriteData(xiaoshudian);//小数点
 444    LCD1602WriteData(0x30+wenduxiaoshu);//0x30表示字符库的数字0,整个代码表示小数位变量可显示0到9的数字。
 445    LCD1602WriteData(0xdf);//0xdf表示字符库中摄氏度左上角的符号
 446    LCD1602WriteData(0x43);//0x43表示字符库中大写字母C    
 447  }   
 448   void SetTemperatureKeyScan()//设温按键扫描函数
 449 {
 450    if(S1==0)//判断设温按键是否按下
 451   {
 452       Delay(5);//毫秒延时
 453     if(S1==0)//再次判断设温按键是否按下
 454    {
 455      settemperatureflag=0;//设温标志位变量置0,在温度报警函数执行后但不报警的情况下,余留settemperatureflag==1,当再次操作设温按键扫描函数设温时,会发生在设温过程中触发设温报警条件而报警,因此在设温按键扫描函数里边添加settemperatureflag=0,再次执行设温按键扫描函数后,温度报警函数里边settemperatureflag==1被置换成settemperatureflag=0,很好地解决了再次操作设温按键扫描函数设温时,在设温过程中触发设温报警条件而报警的问题。
 456      TR0flag=0;//定时器0标志位变量置0,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留TR0flag==1,假若时间报警函数里边存在TR0=1,当操作设温按键扫描函数时,计时依然在执行,导致计时不恰当,因此在设温按键扫描函数里边添加TR0flag=0,执行设温按键扫描函数后,时间报警函数里边TR0flag==1被置换成TR0flag=1,很好地解决了在操作设温按键扫描函数时,计时依然在执行,导致计时不恰当的问题
 457      setsecondflag=0;//设时秒钟标志位变量置0,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留setsecondflag==1,假若时间报警函数里边存在TR0=1,当操作设温按键扫描函数时,计时依然在执行,导致计时不恰当,因此在设温按键扫描函数里边添加setsecondflag=0,执行设温按键扫描函数后,时间报警函数里边setsecondflag==1被置换成setsecondflag=0,很好地解决了在操作设温按键扫描函数时,计时依然在执行,导致计时不恰当的问题。
 458      setminutanflag=0;//设时分钟标志位变量置0,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留setminutanflag==1,假若时间报警函数里边存在TR0=1,当操作设温按键扫描函数时,计时依然在执行,导致计时不恰当,因此在设温按键扫描函数里边添加setminutanflag=0,执行设温按键扫描函数后,时间报警函数里边setminutanflag==1被置换成setminutanflag=0,很好地解决了在操作设温按键扫描函数时,计时依然在执行,导致计时不恰当的问题。
 459      sethourflag=0;//设时时钟标志位变量置0,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留sethourflag==1,假若时间报警函数里边存在TR0=1,当操作设温按键扫描函数时,计时依然在执行,导致计时不恰当,因此在设温按键扫描函数里边添加sethourflag=0,执行设温按键扫描函数后,时间报警函数里边sethourflag==1被置换成sethourflag=0,很好地解决了在操作设温按键扫描函数时,计时依然在执行,导致计时不恰当的问题。
 460      S1num++;//设温按键按下次数变量加加
 461      while(!S1);//等待设温按键弹起
 462      switch(S1num)//设温按键按下次数变量选择位
 463     {
 464       case 1://设温按键第一次按下
 465              TR0=0;//关定时器0
 466              settimedisplayflag=1;//设时显示标志位变量置1,在操作设温按键扫描函数的情况下,不能操作设时按键扫描函数。
 467              tiaotimedisplayflag=1;//调时显示标志位变量置1,在操作设温按键扫描函数的情况下,不能操作调时按键扫描函数。
 468              lcd1602displaytimeflag=1;//液晶显示器显示时间标志位变量置1,在操作设温按键扫描函数的情况下,不受时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数影响。
 469              temperaturedisplayflag=1;//温度显示标志位变量置1,在操作设温按键扫描函数的情况下,不受温度分解函数和温度显示函数影响。
 470              LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶显示器第一行第13个(从第0开始数)位置的显示位
 471              LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
 472              break;
 473       case 2://设温按键第二次按下 
 474              LCD1602WriteCommand(0x80+0x00+0x0b);//LCD1602字符型液晶显示器第一行第11个(从第0开始数)个位置的显示位
 475              LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
 476              break;
 477       case 3://设温按键第三次按下
 478              LCD1602WriteCommand(0x80+0x00+0x0a);//LCD1602字符型液晶显示器第一行第10个(从第0开始数)位置的显示位
 479              LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
 480              break;
 481       case 4://设温按键第四次按下
 482              LCD1602WriteCommand(0x80+0x00+0x09);//LCD1602字符型液晶显示器第一行第9个(从第0开始数)位置的显示位
 483              LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
 484              break;
 485       case 5://设温按键第五次按下
 486              LCD1602WriteCommand(0x80+0x00+0x08);//LCD1602字符型液晶显示器第一行第8个(从第0开始数)位置的显示位
 487              LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
 488              break;
 489       case 6://设温按键第六次按下
 490              LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶显示器第一行第13个(从第0开始数)位置的显示位
 491              LCD1602WriteCommand(0x0c);//LCD1602字符型液晶显示器关光标(或字符)闪烁。
 492              TR0=1;//开定时器0
 493              S1num=0;//设温按键按下次数变量清零,可以反复操作设温按键。
 494              settimedisplayflag=0;//设时显示标志位变量置0,让设温按键扫描函数执行后,可允许设时按键扫描函数执行。
 495              tiaotimedisplayflag=0;//调时显示标志位变量置0,让设温按键扫描函数执行后,可允许调时按键扫描函数执行。
 496              lcd1602displaytimeflag=0;//液晶显示器显示时间标志位变量置0,让设温按键扫描函数执行后,可允许时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数执行。
 497              temperaturedisplayflag=0;//温度显示标志位变量置0,让设温按键扫描函数执行后,可允许温度分解函数和温度显示函数执行。
 498              settemperatureflag=1;//设温标志位变量置1,为了在操作设温按键扫描函数进行设温后,可以执行温度报警函数。
 499              break;
 500      default:
 501              S1num=0;//设温按键按下次数变量清零,可以反复操作设温按键。
 502              break;
 503                
 504      }
 505     }
 506    }
 507     if(S1num!=0)//判断设温按键按下次数变量是否不为0
 508   {
 509      if(S3==0)//判断增加按键是否按下
 510     {
 511       Delay(5);//毫秒延时
 512       if(S3==0)//再次判断增加按键是否按下
 513      {
 514        S3numflag=1;//增加键标志位变量置1,可以在温度报警函数内进行设报警。
 515        while(!S3);//等待增加按键弹起
 516        switch(S1num)//设温按键按下次数变量选择位
 517       {
 518         case 1://设温按键第一次按下
 519                setwenduxiaoshu++;//设温小数位变量加加
 520                if(setwenduxiaoshu==10)//判断设温小数位变量是否达到10
 521                setwenduxiaoshu=0;//设温小数位变量置零
 522                LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶显示器第一行第13个(从第0个开始数)位置的显示位
 523                LCD1602WriteData(0x30+setwenduxiaoshu);//0x30表示字符库的数字0,整个代码表示设温小数位变量可显示0到9的数字。
 524                LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶显示器第一行第13个(从第0个开始数)位置的设温小数位变量显示位
 525                settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//总设温变量求和表达式
 526                break;
 527         case 2://设温按键第二次按下
 528                setwenduge++;//设温个位变量加加
 529                if(setwenduge==6)//判断设温个位变量是否达到6
 530                setwenduge=0;//设温个位变量数置零
 531                LCD1602WriteCommand(0x80+0x00+0x0b);//LCD1602字符型液晶显示器第一行第11个(从第0个开始数)位置的显示位
 532                LCD1602WriteData(0x30+setwenduge);//0x30表示字符库的数字0,整个代码表示设温个位可显示0到9的数字。
 533                LCD1602WriteCommand(0x80+0x00+0x0b);//LCD1602字符型液晶显示器第一行第11个(从第0个开始数)位置的显示位
 534                settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//总设温变量求和表达式
 535                break;
 536            case 3://设温按键第三次按下
 537                setwendushi++;//设温十位变量加加
 538                if(setwendushi==3)//判断设温十位变量是否达到3
 539                setwendushi=0;//设温十位变量置零
 540                LCD1602WriteCommand(0x80+0x00+0x0a);//LCD1602字符型液晶显示器第一行第10个(从第0个开始数)位置的显示位
 541                LCD1602WriteData(0x30+setwendushi);//0x30表示字符库的数字0,整个代码表示设温十位变量可显示0到9的数字。
 542                LCD1602WriteCommand(0x80+0x00+0x0a);//LCD1602字符型液晶显示器第一行第10个(从第0个开始数)位置的显示位
 543                settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//总设温变量求和表达式
 544                break;
 545         case 4://设温按键第四次按下
 546                setwendubai++;//设温百位变量加加
 547                if(setwendubai==2)//判断设温百位变量是否达到2
 548                setwendubai=0;//设温百位变量置零
 549                LCD1602WriteCommand(0x80+0x00+0x09);//LCD1602字符型液晶显示器第一行第9个(从第0个开始数)位置的显示位
 550                LCD1602WriteData(0x30+setwendubai);//0x30表示字符库的数字0,整个代码表示设温百位变量可显示0到9的数字。
 551                LCD1602WriteCommand(0x80+0x00+0x09);//LCD1602字符型液晶显示器第一行第9个(从第0个开始数)位置的显示位
 552                settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//总设温变量求和表达式
 553                break;
 554            case 5://设温按键第五次按下
 555                LCD1602WriteCommand(0x80+0x00+0x08);//LCD1602字符型液晶显示器第一行第8个(从第0个开始数)位置的显示位
 556                LCD1602WriteData(0x2b);//0x2d表示字符库的正符号
 557                LCD1602WriteCommand(0x80+0x00+0x08);//LCD1602字符型液晶显示器第一行第8个(从第0个开始数)个位置的显示位
 558                break;
 559        }
 560       }
 561      }
 562     }
 563     if(S1num!=0)//判断设温按键按下次数变量是否不为0
 564   {
 565      if(S4==0)//判断减少按键是否按下
 566     {
 567       Delay(5);//毫秒延时
 568       if(S4==0)//再次判断减少按键是否按下
 569      {
 570        S4numflag=1;//减少键标志位变量置1,可以在温度报警函数内进行设报警。
 571        while(!S4);//等待减少按键弹起
 572        switch(S1num)//设温按键按下次数变量选择位
 573       {
 574         case 1://设温按键第一次按下
 575                setwenduxiaoshu--;//设温小数位变量减减
 576                if(setwenduxiaoshu==-1)//判断设温小数位变量是否达到-1
 577                setwenduxiaoshu=9;//设温小数位变量置9
 578                LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶显示器第一行第13个(从第0个开始数)位置的显示位
 579                LCD1602WriteData(0x30+setwenduxiaoshu);//0x30表示字符库的数字0,整个代码表示设温小数位变量可显示0到9的数字。
 580                LCD1602WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶显示器第一行第13个(从第0个开始数)位置的显示位
 581                settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//总设温变量求和表达式
 582                break;
 583         case 2://设温按键第二次按下
 584                setwenduge--;//设温个位变量减减
 585                if(setwenduge==-1)//判断设温个位变量是否达到-1
 586                setwenduge=5;//设温个位变量数置5
 587                LCD1602WriteCommand(0x80+0x00+0x0b);//LCD1602字符型液晶显示器第一行第11个(从第0个开始数)位置的显示位
 588                LCD1602WriteData(0x30+setwenduge);//0x30表示字符库的数字0,整个代码表示设温个位变量可显示0到9的数字。
 589                LCD1602WriteCommand(0x80+0x00+0x0b);//LCD1602字符型液晶显示器第一行第11个(从第0个开始数)位置的显示位
 590                settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//总设温变量求和表达式
 591                break;
 592            case 3://设温按键第三次按下
 593                setwendushi--;//设温十位变量减减
 594                if(setwendushi==-1)//判断设温十位变量是否达到-1
 595                setwendushi=2;//设温十位变量置2
 596                LCD1602WriteCommand(0x80+0x00+0x0a);//LCD1602字符型液晶显示器第一行第10个(从第0个开始数)位置的显示位
 597                LCD1602WriteData(0x30+setwendushi);//0x30表示字符库的数字0,整个代码表示设温十位变量可显示0到9的数字。
 598                LCD1602WriteCommand(0x80+0x00+0x0a);//LCD1602字符型液晶显示器第一行第10个(从第0个开始数)位置的显示位
 599                settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//总设温变量求和表达式
 600                break;
 601         case 4://设温按键第四次按下
 602                setwendubai--;//设温百位变量减减
 603                if(setwendubai==-1)//判断设温百位变量是否达到-1
 604                setwendubai=1;//设温百位变量置1
 605                LCD1602WriteCommand(0x80+0x00+0x09);//LCD1602字符型液晶显示器第一行第9个(从第0个开始数)位置的显示位
 606                LCD1602WriteData(0x30+setwendubai);//0x30表示字符库的数字0,整个代码表示设温百位变量可显示0到9的数字。
 607                LCD1602WriteCommand(0x80+0x00+0x09);//LCD1602字符型液晶显示器第一行第9个(从第0个开始数)位置的显示位
 608                settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//总设温变量求和表达式
 609                break;
 610            case 5://设温按键第五次按下
 611                LCD1602WriteCommand(0x80+0x00+0x08);//LCD1602字符型液晶显示器第一行第8个(从第0个开始数)位置的显示位
 612                LCD1602WriteData(0x2d);//0x2d表示字符库的负符号
 613                LCD1602WriteCommand(0x80+0x00+0x08);//LCD1602字符型液晶显示器第一行第8个(从第0个开始数)个位置的显示位
 614                break;
 615        }
 616       }
 617      }
 618     }
 619    } 
 620   void TiaoTimeKeyScan()//调时按键扫描函数
 621 {
 622    if(S2==0)//判断调时按键是否按下                       
 623   {
 624     Delay(5);//毫秒延时
 625     if(S2==0)//再次判断调时按键是否按下
 626    {    
 627      settemperatureflag=0;//设温标志位变量置0,在温度报警函数执行后但不报警的情况下,温度报警函数里边余留settemperatureflag==1和TR0=1,当操作调时按键扫描函数时,计时依然在执行,导致计时不恰当,因此在调时按键扫描函数里边添加settemperatureflag=0和TR0=0,执行调时按键扫描函数后,温度报警函数里边settemperatureflag==1和TR0=1被置换成settemperatureflag=0和TR0=0,很好地解决了在操作调时按键扫描函数时,计时依然在执行,导致计时不恰当的问题。
 628      S2num++;//调时按键按下次数变量加加
 629      while(!S2);//等待调时按键弹起
 630      switch(S2num)//调时按键按下次数变量选择位
 631     {
 632       case 1://调时按键第一次按下
 633              TR0=0;//关定时器0
 634              settimedisplayflag=1;//设时显示标志位变量置1,在操作调时按键扫描函数的情况下,不能操作设时按键扫描函数。
 635              settemperaturedisplayflag=1;//设温显示标志位变量置1,在操作调时按键扫描函数的情况下,不能操作设温按键扫描函数。
 636              lcd1602displaytimeflag=1;//液晶显示器显示时间标志位变量等于1,在操作调时按键扫描函数的情况下,不受时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数影响。
 637              temperaturedisplayflag=1;//温度显示标志位变量等于1,在操作调时按键扫描函数的情况下,不受温度分解函数和温度显示函数影响。
 638              secondge=miao%10;//关掉定时器0定时后,把走时秒钟变量取余赋给调时秒钟个位变量。 
 639              secondshi=miao/10;//关掉定时器0定时后,把走时秒钟变量取除赋给调时秒钟十位变量。
 640              LCD1602WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶显示器第二行第7个(从第0个开始数)位置的显示位
 641              LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
 642              break;
 643       case 2://调时按键第二次按下
 644              secondshi=secondshi;//关掉定时器0定时后,把走时秒钟变量取除后得到的调时秒钟十位变量再赋给调时秒钟十位变量。
 645              LCD1602WriteCommand(0x80+0x40+0x06);//LCD1602字符型液晶显示器第二行第6个(从第0个开始数)位置的显示位
 646              LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
 647              break;
 648       case 3://调时按键第三次按下
 649              minutange=fen%10;//关掉定时器0定时后,把走时分钟变量取余赋给调时分钟个位变量。
 650              minutanshi=fen/10;//关掉定时器0定时后,把走时分钟变量取除赋给调时分钟十位变量。
 651              LCD1602WriteCommand(0x80+0x40+0x04);//LCD1602字符型液晶显示器第二行第4个(从第0个开始数)位置的显示位
 652              LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
 653              break;
 654       case 4://调时按键第四次按下
 655              minutanshi=minutanshi;//关掉定时器0定时后,把走时分钟变量取除后得到调时分钟十位变量再赋给调时分钟十位变量。
 656              LCD1602WriteCommand(0x80+0x40+0x03);//LCD1602字符型液晶显示器第二行第3个(从第0个开始数)位置的显示位
 657              LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
 658              break;
 659       case 5://调时按键第五次按下
 660              hourge=shi%10;//关掉定时器0定时后,把走时时钟变量取余赋给调时时钟个位显示位。
 661              hourshi=shi/10;//关掉定时器0定时后,把走时时钟变量取除赋给调时时钟十位显示位。
 662              LCD1602WriteCommand(0x80+0x40+0x01);//LCD1602字符型液晶显示器第二行第1个(从第0个开始数)位置的显示位
 663              LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
 664              break;
 665       case 6://调时按键第六次按下
 666              hourshi=hourshi;//关掉定时器0定时后,把走时时钟变量取除后得到调时时钟十位变量再赋给调时时钟十位变量。
 667              LCD1602WriteCommand(0x80+0x40+0x00);//LCD1602字符型液晶显示器第二行第0个(从第0个开始数)位置的显示位
 668              LCD1602WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
 669              break;
 670       case 7://调时按键第七次按下
 671              LCD1602WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶显示器第二行第7个位置的显示位
 672              LCD1602WriteCommand(0x0c);//LCD1602字符型液晶显示器关光标(或字符)闪烁。
 673              TR0=1;//开定时器0
 674              S2num=0;//调时按键按下次数变量清零,可以反复操作调时按键。
 675              settimedisplayflag=0;//设时显示标志位变量置0,让调时按键扫描函数执行后,可允许设时按键扫描函数执行。
 676              settemperaturedisplayflag=0;//设温显示标志位变量置0,让调时按键扫描函数执行后,可允许设温按键扫描函数执行。
 677              lcd1602displaytimeflag=0;//液晶显示器显示时间标志位变量等于0,让调时按键扫描函数执行后,可允许时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数执行。
 678              temperaturedisplayflag=0;//温度显示标志位变量等于0,让调时按键扫描函数执行后,可允许温度分解函数和温度显示函数执行。
 679              miaoflag=0;//秒钟标志位变量置0,在操作调时按键扫描函数进行调时后,调时按键扫描函数里边余留miaoflag==1,不解除会导致时间报警函数不能启动报警判别,因此在调时按键扫描函数里边添加miaoflag=0,执行调时按键扫描函数后,时间报警函数就可以做出相应时间报警。
 680              fenflag=0;//分钟标志位变量置0,在操作调时按键扫描函数进行调时后,调时按键扫描函数里边余留fenflag==1,不解除会导致时间报警函数不能启动报警判别,因此在调时按键扫描函数里边添加fenflag=0,执行调时按键扫描函数后,时间报警函数就可以做出相应时间报警。
 681              shiflag=0;//时钟标志位变量置0,在操作调时按键扫描函数进行调时后,调时按键扫描函数里边余留shiflag==1,不解除会导致时间报警函数不能启动报警判别,因此在调时按键扫描函数里边添加shiflag=0,执行调时按键扫描函数后,时间报警函数就可以做出相应时间报警。
 682              break;
 683      default:
 684              S2num=0;//调时按键按下次数变量清零,可以反复操作调时按键。
 685              break;
 686      }
 687     }
 688    }
 689     if(S2num!=0)//判断调时按键按下次数变量是否不为0
 690    {
 691      if(S3==0)//判断增加按键是否按下
 692     {
 693       Delay(5);//毫秒延时
 694       if(S3==0)//再次判断增加按键是否按下
 695      {
 696        while(!S3);//等待增加按键弹起
 697        switch(S2num)//调时按键按键按下次数变量选择位
 698       {
 699         case 1://调时按键第一次按下
 700                miaoflag=1;//秒钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留miaoflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加miaoflag=1,时间报警函数里边miaoflag==0被置换成miaoflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
 701                secondge++;//调时秒钟个位变量加加
 702                if(secondge==10)//判断调时秒钟个位变量是否达到10
 703                secondge=0;//调时秒钟个位变量置零
 704                LCD1602DisplayGeDigitResolve(0x07,secondge);//LCD1602字符型液晶显示器第二行第7个(从第0个开始数)位置的调时秒钟个位变量显示位
 705                LCD1602WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶显示器第二行第7个(从第0个开始数)位置的调时秒钟个位变量显示位
 706                miao=secondshi*10+secondge;//走时秒钟变量求和表达式,由于移位修改走时秒钟个位变量数值后,需要通过调时秒钟十位变量数值加上调时秒钟个位变量数值之和赋给走时秒钟变量,才能在修改走时秒钟个位变量数值或走时秒钟十位变量数值后重新计时。(原因:走时秒钟个位变量数值或走时秒钟十位变量数值是在走时秒钟变量数值上分解得来,当走时秒钟个位变量数值或走时秒钟十位变量数值发生变化后,走时秒钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
 707                break;
 708         case 2://调时按键第二次按下
 709                miaoflag=1;//秒钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留miaoflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加miaoflag=1,时间报警函数里边miaoflag==0被置换成miaoflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
 710                secondshi++;//调时秒钟十位变量加加
 711                if(secondshi==6)//判断调时秒钟十位变量是否达到6
 712                secondshi=0;//调时秒钟十位变量置零
 713                LCD1602DisplayShiDigitResolve(0x06,secondshi);//LCD1602字符型液晶显示器第二行第6个(从第0个开始数)位置的调时秒钟十位变量显示位
 714                LCD1602WriteCommand(0x80+0x40+0x06);//LCD1602字符型液晶显示器第二行第6个(从第0个开始数)位置的调时秒钟十位变量显示位
 715                miao=secondshi*10+secondge;//走时秒钟变量求和表达式,由于移位修改走时秒钟十位变量数值后,需要通过调时秒钟十位变量数值加上秒钟个位变量数值之和赋给走时秒钟变量,才能在修改走时秒钟个位变量数值或走时秒钟十位变量数值后重新计时。(原因:走时秒钟个位变量数值或走时秒钟十位变量数值是在走时秒钟变量数值上分解得来,当走时秒钟个位变量数值或走时秒钟十位变量数值发生变化后,走时秒钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
 716                break;
 717         case 3://调时按键第三次按下
 718                fenflag=1;//分钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留fenflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加fenflag=1,时间报警函数里边fenflag==0被置换成fenflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
 719                minutange++;//调时分钟个位变量加加
 720                if(minutange==10)//判断调时分钟个位变量是否达到10
 721                minutange=0;//调时分钟个位变量置零
 722                LCD1602DisplayGeDigitResolve(0x04,minutange);//LCD1602字符型液晶显示器第二行第4个(从第0个开始数)位置的调时分钟个位变量显示位
 723                LCD1602WriteCommand(0x80+0x40+0x04);//LCD1602字符型液晶显示器第二行第4个(从第0个开始数)位置的调时分钟个位变量显示位
 724                fen=minutanshi*10+minutange;//走时分钟变量求和表达式,由于移位修改走时分钟个位变量数值后,需要通过调时分钟十位变量数值加上调时分钟个位变量数值之和赋给走时分钟变量,才能在修改走时分钟个位变量数值或走时分钟十位变量数值后重新计时。(原因:走时分钟个位变量数值或走时分钟十位变量数值是在走时分钟变量数值上分解得来,当走时分钟个位变量数值或走时分钟十位变量数值发生变化后,走时分钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
 725                break;
 726         case 4://调时按键第四次按下
 727                fenflag=1;//分钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留fenflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加fenflag-=1,时间报警函数里边fenflag==0被置换成fenflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
 728                minutanshi++;//调时分钟十位变量加加
 729                if(minutanshi==6)//判断调时分钟十位变量是否达到6
 730                minutanshi=0;//调时分钟十位变量置零
 731                LCD1602DisplayShiDigitResolve(0x03,minutanshi);//LCD1602字符型液晶显示器第二行第3个(从第0个开始数)位置的调时分钟十位变量显示位
 732                LCD1602WriteCommand(0x80+0x40+0x03);//写入LCD1602字符型液晶显示器第二行第3个(从第0个开始数)位置的调时分钟十位变量显示位
 733                fen=minutanshi*10+minutange;//走时分钟变量求和表达式,由于移位修改走时分钟十位变量数值后,需要通过调时分钟十位变量数值加上调时分钟个位变量数值之和赋给走时分钟变量,才能在修改走时分钟个位变量数值或走时分钟十位变量数值后重新计时。(原因:走时分钟个位变量数值或走时分钟十位变量数值是在走时分钟变量数值上分解得来,当走时分钟个位变量数值或走时分钟十位变量数值发生变化后,走时分钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
 734                break;
 735         case 5://调时按键第五次按下
 736                shiflag=1;//时钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留shiflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加shiflag=1,时间报警函数里边shiflag==0被置换成shiflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
 737                hourge++;//调时时钟个位变量加加
 738                if(hourge==4)//判断调时时钟个位变量是否达到4
 739                hourge=0;//调时时钟个位变量置零
 740                LCD1602DisplayGeDigitResolve(0x01,hourge);//LCD1602字符型液晶显示器第二行第1个(从第0个开始数)位置的调时时钟个位变量显示位
 741                LCD1602WriteCommand(0x80+0x40+0x01);//写入LCD1602字符型液晶显示器第二行第1个(从第0个开始数)位置的调时时钟个位变量显示位
 742                shi=hourshi*10+hourge;//走时时钟变量求和表达式,由于移位修改走时时钟个位变量数值后,需要通过调时时钟十位变量数值加上调时时钟个位变量数值之和赋给走时时钟变量,才能在修改走时时钟个位变量数值或走时时钟十位变量数值后重新计时。(原因:走时时钟个位变量数值或走时时钟十位变量数值是在走时时钟变量数值上分解得来,当走时时钟个位变量数值或走时时钟十位变量数值发生变化后,走时时钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
 743                break;
 744         case 6://调时按键第六次按下
 745                shiflag=1;//时钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留shiflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加shiflag=1,时间报警函数里边shiflag==0被置换成shiflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
 746                hourshi++;//调时时钟十位变量加加
 747                if(hourshi==3)//判断调时时钟十位变量是否达到3
 748                hourshi=0;//调时时钟十位变量置零
 749                LCD1602DisplayShiDigitResolve(0x00,hourshi);//LCD1602字符型液晶显示器第二行第0个(从第0个开始数)位置的调时时钟十位变量显示位
 750                LCD1602WriteCommand(0x80+0x40+0x00);//LCD1602第二行第0个(从第0个开始数)位置的调时时钟十位变量显示位
 751                shi=hourshi*10+hourge;//走时时钟变量求和表达式,由于移位修改走时时钟十位变量数值后,需要通过调时时钟十位变量数值加上调时时钟个位变量数值之和赋给走时时钟变量,才能在修改走时时钟个位变量数值或走时时钟十位变量数值后重新计时。(原因:走时时钟个位变量数值或走时时钟十位变量数值是在走时时钟变量数值上分解得来,当走时时钟个位变量数值或走时时钟十位变量数值发生变化后,走时时钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
 752                break;
 753        default:
 754                S2num=0;//调时按键按下次数变量清零,可以反复操作调时按键。
 755                break; 
 756        }
 757       }
 758      }
 759     }
 760     if(S2num!=0)//判断调时按键按下次数变量是否不为0
 761   {     
 762      if(S4==0)//判断减少按键是否按下
 763    {
 764       Delay(5);//毫秒延时
 765       if(S4==0)//再次判断减少按键是否按下
 766      {
 767        while(!S4);//等待减少按键弹起
 768        switch(S2num)//调时按键按下次数变量选择位
 769       {
 770         case 1://调时按键按键第一次按下
 771                miaoflag=1;//秒钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留miaoflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加miaoflag=1,时间报警函数里边miaoflag==0被置换成miaoflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
 772                secondge--;//调时秒钟变量数值减减
 773                if(secondge==-1)//判断调时秒钟个位变量是否达到-1
 774                secondge=9;//调时秒钟个位变量置9
 775                LCD1602DisplayGeDigitResolve(0x07,secondge);//LCD1602字符型液晶显示器第二行第7个(从第0个开始数)位置的调时秒钟个位变量显示位
 776                LCD1602WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶显示器第二行第7个(从第0个开始数)位置的调时秒钟个位变量显示位
 777                miao=secondshi*10+secondge;//走时秒钟变量求和表达式,由于移位修改走时秒钟个位变量数值后,需要通过调时秒钟十位变量数值加上调时秒钟个位变量数值之和赋给走时秒钟变量,才能在修改走时秒钟个位变量数值或走时秒钟十位变量数值后重新计时。(原因:走时秒钟个位变量数值或走时秒钟十位变量数值是在走时秒钟变量数值上分解得来,当走时秒钟个位变量数值或走时秒钟十位变量数值发生变化后,走时秒钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
 778                break;
 779         case 2://调时按键按键第二次按下
 780                miaoflag=1;//秒钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留miaoflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加miaoflag=1,时间报警函数里边miaoflag==0被置换成miaoflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
 781                secondshi--;//调时秒钟十位变量减减
 782                if(secondshi==-1)//判断调时秒钟十位变量是否达到-1
 783                secondshi=5;//调时秒钟十位变量置5
 784                LCD1602DisplayShiDigitResolve(0x06,secondshi);//LCD1602字符型液晶显示器第二行第6个(从第0个开始数)位置的调时秒钟十位变量显示位
 785                LCD1602WriteCommand(0x80+0x40+0x06);//LCD1602字符型液晶显示器第二行第6个(从第0个开始数)位置的调时秒钟十位变量显示位
 786                miao=secondshi*10+secondge;//走时秒钟变量求和表达式,由于移位修改走时秒钟十位变量数值后,需要通过调时秒钟十位变量数值加上调时秒钟个位变量数值之和赋给走时秒钟变量,才能在修改走时秒钟个位变量数值或走时秒钟十位变量数值后重新计时。(原因:走时秒钟个位变量数值或走时秒钟十位变量数值是在走时秒钟变量数值上分解得来,当走时秒钟个位变量数值或走时秒钟十位变量数值发生变化后,走时秒钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
 787                break;
 788         case 3://调时按键按键第三次按下
 789                fenflag=1;//分钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留fenflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加fenflag=1,时间报警函数里边fenflag==0被置换成fenflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
 790                minutange--;//调时分钟个位变量减减
 791                if(minutange==-1)//判断调时分钟个位变量是否达到-1
 792                minutange=9;//调时分钟个位变量置9
 793                LCD1602DisplayGeDigitResolve(0x04,minutange);//LCD1602字符型液晶显示器第二行第4个(从第0个开始数)位置的调时分钟个位变量显示位
 794                LCD1602WriteCommand(0x80+0x40+0x04);//LCD1602字符型液晶显示器第二行第4个(从第0个开始数)位置的调时分钟个位变量显示位
 795                fen=minutanshi*10+minutange;//走时秒钟变量求和表达式,由于移位修改走时分钟个位变量数值后,需要通过调时分钟十位变量数值加上调时分钟个位变量数值之和赋给走时分钟变量,才能在修改走时分钟个位变量数值或走时分钟十位变量数值后重新计时。(原因:走时分钟个位变量数值或走时分钟十位变量数值是在走时分钟变量数值上分解得来,当走时分钟个位变量数值或走时分钟十位变量数值发生变化后,走时分钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
 796                break;
 797         case 4://调时按键按键第四次按下
 798                fenflag=1;//分钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留fenflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加fenflag=1,时间报警函数里边fenflag==0被置换成fenflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
 799                minutanshi--;//走时分钟十位变量减减
 800                if(minutanshi==-1)//判断走时分钟十位变量是否达到6
 801                minutanshi=5;//走时分钟十位变量归5
 802                LCD1602DisplayShiDigitResolve(0x03,minutanshi);//LCD1602字符型液晶显示器第二行第3个(从第0个开始数)位置的调时分钟个位变量显示位
 803                LCD1602WriteCommand(0x80+0x40+0x03);//LCD1602字符型液晶显示器第二行第3个(从第0个开始数)位置的调时分钟十位变量显示位
 804                fen=minutanshi*10+minutange;//走时秒钟变量求和表达式,由于移位修改走时分钟十位变量数值后,需要通过调时分钟十位变量数值加上分钟个位变量数值之和赋给走时分钟变量,才能在修改走时分钟个位变量数值或走时分钟十位变量数值后重新计时。(原因:走时分钟个位变量数值或走时分钟十位变量数值是在走时分钟变量数值上分解得来,当走时分钟个位变量数值或走时分钟十位变量数值发生变化后,走时分钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
 805                break;
 806         case 5://调时按键按键第五次按下
 807                shiflag=1;//时钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留shiflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加shiflag=1,时间报警函数里边shiflag==0被置换成shiflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
 808                hourge--;//调时时钟个位变量减减
 809                if(hourge==-1)//判断调时时钟个位变量是否达到-1
 810                hourge=3;//调时时钟个位变量置3
 811                LCD1602DisplayGeDigitResolve(0x01,hourge);//LCD1602字符型液晶显示器第二行第1个(从第0个开始数)位置的调时时钟个位变量数值
 812                LCD1602WriteCommand(0x80+0x40+0x01);//LCD1602字符型液晶显示器第二行第1个(从第0个开始数)位置的调时时钟个位变量显示位
 813                shi=hourshi*10+hourge;//走时秒钟变量求和表达式,由于移位修改走时时钟个位变量数值后,需要通过调时时钟十位变量数值加上调时时钟个位变量数值之和赋给走时时钟变量,才能在修改走时时钟个位变量数值或走时时钟十位变量数值后重新计时。(原因:走时时钟个位变量数值或走时时钟十位变量数值是在走时时钟变量数值上分解得来,当走时时钟个位变量数值或走时时钟十位变量数值发生变化后,走时时钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
 814                break;
 815         case 6://调时按键按键第六次按下
 816                shiflag=1;//时钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留shiflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加shiflag=1,时间报警函数里边shiflag==0被置换成shiflag=1,很好地解决了在操作调时按键扫描函数调时时,因触发时间报警条件而报警的问题。
 817                hourshi--;//调时时钟十位变量减减
 818                if(hourshi==-1)//判断调时时钟十位变量是否达到-1
 819                hourshi=2;//调时时钟十位变量置2
 820                LCD1602DisplayShiDigitResolve(0x00,hourshi);//LCD1602字符型液晶显示器显示第二行第0个(从第0个开始数)位置的调时时钟十位变量显示位
 821                LCD1602WriteCommand(0x80+0x40+0x00);//LCD1602字符型液晶显示器显示第二行第0个(从第0个开始数)位置的调时时钟十位变量显示位
 822                shi=hourshi*10+hourge;//走时秒钟变量求和表达式,由于移位修改走时时钟十位变量数值后,需要通过调时时钟十位变量数值加上调时时钟个位变量数值之和赋给走时时钟变量,才能在修改走时时钟个位变量数值或走时时钟十位变量数值后重新计时。(原因:走时时钟个位变量数值或走时时钟十位变量数值是在走时时钟变量数值上分解得来,当走时时钟个位变量数值或走时时钟十位变量数值发生变化后,走时时钟变量数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
 823                break;
 824        default:
 825                S2num=0;//调时按键按下次数变量清零,可以反复操作调时按键。
 826                break; 
 827        }
 828       }
 829      }
 830     }
 831    }
 832   void Timer0Init()//定时器0初始化函数
 833 {
 834    TMOD=0x01;//设定定时器类型为定时器0,工作模式为模式1。
 835    TH0=(65536-50000)/256;//TH0装初值
 836    TL0=(65536-50000)%256;//TL0装初值
 837    EA=1;//开启定时器总中断
 838    ET0=1;//开启定时器0中断开关
 839    TR0=0;//启动定时器0
 840  }
 841   void Timer0() interrupt 1//定时器0中断函数
 842 {
 843    TH0=(65536-50000)/256;//TH0重新装值
 844    TL0=(65536-50000)%256;//TL0重新装值
 845    count++;//定时器0中断次数变量加加
 846    if(count==18)//判断定时器0中断次数变量是否为18次
 847   {
 848     count=0;//定时器0中断次数变量归零
 849     miao++;//走时秒钟变量加加
 850     if(miao==60)//判断走时秒钟变量是否达到60秒
 851    {
 852      miao=0;//走时秒钟变量置零
 853      fen++;//走时分钟变量加加
 854      if(fen==60)//判断走时分钟变量是否达到60分
 855     {
 856       fen=0;//走时分钟变量置零
 857       shi++;//走时时钟变量加加
 858       if(shi==24)//判断走时时钟变量是否达到24时
 859      {
 860        shi=0;//走时时钟变量置零
 861       }
 862 //      LCD1602DisplayTimeFenJie(0x00,shi);//LCD1602液晶显示器显示时间两位数分解函数显示时钟两位数
 863      }
 864 //      LCD1602DisplayTimeFenJie(0x03,fen);//LCD1602液晶显示器显示时间两位数分解函数显示分钟两位数
 865      }
 866 //     LCD1602DisplayTimeFenJie(0x06,miao);//LCD1602液晶显示器显示时间两位数分解函数显示秒钟两位数         
 867     }    
 868    }
 869   void FengNingQi_Alarm(uint t)//蜂鸣器报警函数
 870 {
 871    uint x,y;
 872    for(x=0;x<t;x++)
 873   {
 874     for(y=0;y<50;y++);
 875     FengNingQi=~FengNingQi ;//蜂鸣器按位取反FengNingQi
 876    }
 877  }
 878 //  void SetAlarmTemperatrueFenJie(uint alarmwendu)
 879 //{
 880 //   fuhaowei=0x20;//无符号
 881 //   alarmwendubai=alarmwendu/1000;//温度值百位
 882 //   alarmwendushi=alarmwendu%1000/100;//温度值十位
 883 //   alarmwenduge=alarmwendu%100/10;//温度值个位
 884 //   alarmxiaoshu=alarmwendu%10;//小数位
 885 //  }         
 886   void TimeBaoJing()//时间报警函数
 887 {
 888    if(S3numflag==1||S4numflag==1)//判断增加键标志位变量是否为1或减少键标志位变量是否为1
 889   {  
 890     if(setsecondflag==1&&setminutanflag==0&&sethourflag==0&&setsecond>0&&TR0flag==1&&miaoflag==0)//判断设时秒钟标志位变量是否为1和设时分钟标志位变量是否为0和设时时钟标志位变量是否为0和设时秒钟变量是否大于0和定时器0标志位变量是否等于1和秒钟标志位变量置是否为0
 891    {
 892      if(miao==setsecond)//判断走时秒钟变量是否等于设时秒钟变量
 893     { 
 894       timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
 895       TR0=0;//关定时器0
 896      }
 897     }
 898     if(setminutanflag==1&&setsecondflag==0&&sethourflag==0&&setminutan>0&&TR0flag==1&&fenflag==0)//判断设时分钟标志位变量是否为1和设时秒钟标志位变量是否为0和设时时钟标志位变量是否为0和设时分钟变量是否大于0和定时器0标志位变量是否等于1和分钟标志位变量置是否为0
 899    {
 900         if(fen==setminutan)//判断走时分钟是否等于设时分钟变量
 901     {
 902       timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
 903       TR0=0;//关定时器0
 904      }
 905     }
 906     if(sethourflag==1&&setsecondflag==0&&setminutanflag==0&&sethour>0&&TR0flag==1&&shiflag==0)//判断设时时钟标志位变量是否为1和设时秒钟标志位变量是否为0和设时分钟标志位变量是否为0设时时钟变量是否大于0和定时器0标志位变量是否等于1和时钟标志位变量置是否为0
 907    {
 908         if(shi==sethour)//判断走时时钟是否等于设时时钟变量
 909     {
 910       timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
 911       TR0=0;//关定时器0
 912      }
 913     }
 914     if(setsecondflag==1&&setminutanflag==1&&setsecond>0&&setminutan>0&&TR0flag==1&&miaoflag==0&&fenflag==0)//判断设时秒钟标志位变量是否为1和设时分钟标志位变量是否为1和设时秒钟变量是否大于0和设时分钟变量是否大于0和定时器0标志位变量是否等于1和秒钟标志位变量置是否为0和分钟标志位变量是否为0
 915    {
 916      if(miao==setsecond&&fen==setminutan)//判断走时秒钟变量是否等于设时秒钟变量和走时分钟变量是否等于设时分钟变量
 917     { 
 918       timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
 919       TR0=0;//关定时器0
 920      }
 921     }
 922     if(setsecondflag==1&&sethourflag==1&&setsecond>0&&sethour>0&&TR0flag==1&&miaoflag==0&&shiflag==0)//判断设时秒钟标志位变量是否为1和设时时钟标志位变量是否为1和设时秒钟变量是否大于0和设时时钟变量是否大于0和定时器0标志位变量是否等于1和秒钟标志位变量是否为0和时钟标志位变量是否为0
 923    {
 924      if(miao==setsecond&&shi==sethour)//判断走时秒钟变量是否等于设时秒钟变量和走时时钟变量是否等于设时时钟变量
 925     { 
 926       timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
 927       TR0=0;//关定时器0
 928      }
 929     }
 930     if(setminutanflag==1&&sethourflag==1&&setminutan>0&&sethour>0&&TR0flag==1&&fenflag==0&&shiflag==0)//判断设时分钟标志位变量是否为1和设时时钟标志位变量是否为1和设时分钟变量是否大于0和设时时钟变量是否大于0和定时器0标志位变量是否等于1和分钟标志位变量是否为0和时钟标志位变量是否为0
 931    {
 932      if(fen==setminutan&&shi==sethour)//判断走时分钟变量是否等于设时分钟变量和走时时钟变量是否等于设时时钟变量
 933     { 
 934       timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
 935       TR0=0;//关定时器0
 936      }
 937     }
 938     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
 939    {
 940      if(miao==setsecond&&fen==setminutan&&shi==sethour)//判断走时秒钟变量是否等于设时秒钟变量和走时分钟变量是否等于设时分钟变量和走时时钟变量是否等于设时时钟变量
 941     { 
 942       timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
 943       TR0=0;//关定时器0
 944      }
 945     }
 946    }
 947   }
 948   void TemperatrueBaoJing()//温度报警函数
 949 {
 950    if(S3numflag==1||S4numflag==1)//判断增加键标志位变量是否为1或减少键标志位变量是否为1
 951   {  
 952     if(settemperatureflag==1)//判断设温标志位变量是否为1
 953    {
 954      if(wendu-10>settemperature)//判断温度变量减10后是否大于设温变量,其中的10分别表示设温个位数1与设温小数位0,实际上表示1摄氏度,相当于温差报警温度,这么做的原因是因为设温数值和温度数值都带有小数,通过数值取整运算,把设温数值和温度数值换算成整数来计算温差,这样便于处理设温数值与温度数值的温差值。
 955     { 
 956       temperatruebaojingflag=1;//温度报警标志位变量置1,进行温度报警。
 957       TR0=0;//关定时器0
 958      }
 959     }
 960      if(wendu<10&&settemperatureflag==1)//判断温度变量是否小于10和设温标志位变量是否为1,其中的10分别表示设温个位数1与设温小数位0,实际上表示1摄氏度,相当于温差报警温度,这么做的原因是因为设温数值和温度数值都带有小数,通过数值取整运算,把设温数值和温度数值换算成整数来计算温差,这样便于处理设温数值与温度数值的温差值。
 961     {
 962       temperatruebaojingflag=0;//温度报警标志位变量置0,不进行温度报警。
 963       TR0=1;//开定时器0
 964      }    
 965    }
 966   }
 967   void SumKeyScan()//总按键扫描函数
 968 {
 969    if(S==0)//判断启停按键是否按下
 970   {
 971     Delay(5);//毫秒延时
 972     if(S==0)//再次判断启停按键是否按下
 973    {
 974      Snum++;//启停按键按下次数变量加加
 975      while(!S);//等待启停按键弹起
 976      if(Snum==1)//判断启停按键是否第一次按下过
 977     {
 978       qitingflag=1;//启停标志位变量置1,用来启动时间报警函数和温度报警函数和设时按键扫描函数和设温按键扫描函数和调时按键扫描函数和LCD1602液晶显示器显示时间两位数分解函数显示秒钟两位数和LCD1602液晶显示器显示时间两位数分解函数显示分钟两位数和LCD1602液晶显示器显示时间两位数分解函数显示时钟两位数和温度分解函数和温度显示函数,相当于总开关。
 979       TR0=1;//启动定时器0
 980      }
 981      if(Snum==2&&settimedisplayflag==0&&settemperaturedisplayflag==0&&tiaotimedisplayflag==0&&timebaojingflag==0)//判断启停按键S是否第二次按下过及设时显示标志位变量是否为0和设温显示标志位变量是否为0和调时显示标志位变量是否为0和时间报警标志位变量是否为0,相当于第一次按下启停键启动后,在没有按其他按键的情况下,第二次按下启停键就停止。
 982     {
 983       qitingflag=1;//启停标志位变量置1,用来启动时间报警函数和温度报警函数和设时按键扫描函数和设温按键扫描函数和调时按键扫描函数和LCD1602液晶显示器显示时间两位数分解函数显示秒钟两位数和LCD1602液晶显示器显示时间两位数分解函数显示分钟两位数和LCD1602液晶显示器显示时间两位数分解函数显示时钟两位数和温度分解函数和温度显示函数,相当于总开关。
 984       TR0=0;//关定时器0
 985       Snum=0;//启停按键按下次数变量清零,可以反复操作启停按键。
 986       settimedisplayflag=1;//设时显示标志位变量置1,限制操作设时按键扫描函数。
 987       settemperaturedisplayflag=1;//设温显示标志位变量置1,限制操作设温按键扫描函数。
 988       tiaotimedisplayflag=1;//调时显示标志位变量置1,限制操作调时按键扫描函数。
 989      }
 990      if(Snum==1&&settimedisplayflag==1&&settemperaturedisplayflag==1&&tiaotimedisplayflag==1)//判断启停按键是否第一次按下过以及设时显示标志位变量为1及设温显示标志位变量是否为1和调时显示标志位变量是否为1,相当于第一次按下启停键启动后,第二次按下启停键停止后,在没有按其他按键的情况下,第三次按下启停键就启动。
 991     {
 992       qitingflag=1;//启停标志位变量置1,用来启动时间报警函数和温度报警函数和设时按键扫描函数和设温按键扫描函数和调时按键扫描函数和LCD1602液晶显示器显示时间两位数分解函数显示秒钟两位数和LCD1602液晶显示器显示时间两位数分解函数显示分钟两位数和LCD1602液晶显示器显示时间两位数分解函数显示时钟两位数和温度分解函数和温度显示函数,相当于总开关。
 993       TR0=1;//启动定时器0
 994       Snum=1;//启停按键按下次数变量置1,为下一次按下启停键实现停止做准备。
 995       settimedisplayflag=0;//设时显示标志位变量置0,可操作设时按键扫描函数。
 996       settemperaturedisplayflag=0;//设温显示标志位变量置0,可操作设温按键扫描函数。
 997       tiaotimedisplayflag=0;//调时显示标志位变量置0,可操作调时按键扫描函数。 
 998      }
 999      if(Snum==2&&timebaojingflag==1)//判断启停按键是否第二次按下过及时间报警标志位变量是否为1,相当于时间报警解除。
1000     {
1001       TR0=1;//开定时器0
1002       Snum=1;//启停按键按下次数变量置1,为下一次按下启停键实现停止做准备。
1003       timebaojingflag=0;//时间报警标志位变量置0,释放时间报警标志位。
1004       setsecondge=0;//设时秒钟个位变量置0,释放设时秒钟个位标志位。
1005       setsecondshi=0;//设时秒钟十位变量置0,释放设时秒钟十位标志位。
1006       setminutange=0;//设时分钟个位变量置0,释放设时分钟个位标志位。
1007       setminutanshi=0;//设时分钟十位变量置0,释放设时分钟十位标志位。
1008       sethourge=0;//设时时钟个位变量置0,释放设时时钟个位标志位。
1009       sethourshi=0;//设时时钟十位变量置0,释放设时时钟十位标志位。
1010       LCD1602WriteCommand(0x80+0x07);//LCD1602字符型液晶显示器第一行第7个(从第0开始数)显示位,即设时秒钟个位。
1011       LCD1602WriteData(0x30+setsecondge);//0x30表示字符库的数字0,整个代码表示设时秒钟个位变量显示0到9的数字。
1012       LCD1602WriteCommand(0x80+0x06);//LCD1602字符型液晶显示器第一行第6个(从第0开始数)显示位,即设时秒钟十位。
1013       LCD1602WriteData(0x30+setsecondshi);//0x30表示字符库的数字0,整个代码表示设时秒钟十位变量显示0到9的数字。
1014       LCD1602WriteCommand(0x80+0x04);//LCD1602字符型液晶显示器第一行第4个(从第0开始数)显示位,即设时分钟个位。
1015       LCD1602WriteData(0x30+setminutange);//0x30表示字符库的数字0,整个代码表示设时分钟个位变量显示0到9的数字。
1016       LCD1602WriteCommand(0x80+0x03);//LCD1602字符型液晶显示器第一行第3个(从第0开始数)显示位,即设时分钟十位。
1017       LCD1602WriteData(0x30+setminutanshi);//0x30表示字符库的数字0,整个代码表示设时分钟十位变量显示0到9的数字。
1018       LCD1602WriteCommand(0x80+0x01);//LCD1602字符型液晶显示器第一行第1个(从第0开始数)显示位,即设时时钟个位。
1019       LCD1602WriteData(0x30+sethourge);//0x30表示字符库的数字0,整个代码表示设时时钟个位变量显示0到9的数字。
1020       LCD1602WriteCommand(0x80+0x00);//LCD1602字符型液晶显示器第一行第0个(从第0开始数)显示位,即设时时钟十位。
1021       LCD1602WriteData(0x30+sethourshi);//0x30表示字符库的数字0,整个代码表示设时时钟十位变量显示0到9的数字。
1022       S3numflag=0;//增加键标志位变量置0,释放增加键标志位。
1023       S4numflag=0;//减少键标志位变量置0,释放减少键标志位。
1024       TR0flag=0;//定时器0标志位变量置0
1025       settimedisplayflag=0;//设时显示标志位变量置0,释放设时显示标志位。
1026       settemperaturedisplayflag=0;//设温显示标志位变量置0,释放设温显示标志位。
1027       tiaotimedisplayflag=0;//调时显示标志位变量置0,释放调时显示标志位。
1028       setsecondflag=0;//设时秒钟标志位变量置0,释放设时秒钟标志位。
1029       setminutanflag=0;//设时分钟标志位变量置0,释放设时分钟标志位。
1030       sethourflag=0;//设时时钟标志位变量置0,释放设时时钟标志位。
1031      }
1032      
1033      if(Snum==2&&temperatruebaojingflag==1)//判断启停按键是否第二次按下过及温度报警标志位变量是否为1,相当于温度报警解除。
1034     { 
1035       TR0=1;//开定时器0
1036       Snum=1;//启停按键按下次数变量置1,为下一次按下启停键实现停止做准备。
1037       temperatruebaojingflag=0;//温度报警标志位变量置0,释放温度报警标志位。
1038       setwenduxiaoshu=0;//设温小数位变量置0,释放设温小数位标志位。
1039       setwenduge=0;//设温个位变量置0,释放设温个位标志位。
1040       setwendushi=0;//设温十位变量置0,释放设温十位标志位。
1041       setwendubai=0;//设温百位变量置0,释放设温百位标志位。
1042       LCD1602WriteCommand(0x80+0x09);//LCD1602字符型液晶显示器第一行第9个(从第0开始数)显示位,即设温度百位。
1043       LCD1602WriteData(0x30+setwendubai);//0x30表示字符库的数字0,整个代码表示设温百位变量显示0到9的数字。
1044       LCD1602WriteCommand(0x80+0x0a);//LCD1602字符型液晶显示器第一行第10个(从第0开始数)显示位,即设温度十位。
1045       LCD1602WriteData(0x30+setwendushi);//0x30表示字符库的数字0,整个代码表示设温十位变量显示0到9的数字。
1046       LCD1602WriteCommand(0x80+0x0b);//LCD1602字符型液晶显示器第一行第11个(从第0开始数)显示位,即设温度个位。
1047       LCD1602WriteData(0x30+setwenduge);//0x30表示字符库的数字0,整个代码表示设温个位变量显示0到9的数字。
1048       LCD1602WriteCommand(0x80+0x0d);//LCD1602字符型液晶显示器第一行第12个(从第0开始数)显示位,即设温度小数位。
1049       LCD1602WriteData(0x30+setwenduxiaoshu);//0x30表示字符库的数字0,整个代码表示设温小数位变量显示0到9的数字。
1050       S3numflag=0;//增加键标志位变量置0,释放增加键标志位。
1051       S4numflag=0;//减少键标志位变量置0,释放减少键标志位。
1052       settemperatureflag=0;//设温标志位变量置0,释放设温标志位。
1053       settimedisplayflag=0;//设时显示标志位变量置0,释放设时显示标志位。
1054       settemperaturedisplayflag=0;//设温显示标志位变量置0,释放设温显示标志位。
1055       tiaotimedisplayflag=0;//调时显示标志位变量置0,释放调时显示标志位。
1056       temperaturedisplayflag=0;//温度显示标志位变量等于0,释放温度显示标志位。  
1057      }
1058      if(Snum>=2&&settemperaturedisplayflag==1&&tiaotimedisplayflag==1)//判断启停按键是否第二或二以上次按下过及设温显示标志位变量为1及调时显示标志位变量为1,相当于设时启动。
1059     {
1060       Snum=1;//启停按键按下次数变量置1,为下一次按下启停键实现停止做准备。
1061       S0num=0;//设时按键按下次数变量清零,可以反复操作设时按键。
1062       TR0=1;//启动定时器0
1063       TR0flag=1;//定时器0标志位变量置1,进入时间报警函数判断是否可执行时间报警。
1064       LCD1602WriteCommand(0x0c);//关LCD1602液晶显示器光标(或字符)闪烁
1065       settemperaturedisplayflag=0;//设温显示标志位变量置0,释放设温显示标志位。
1066       tiaotimedisplayflag=0;//调时显示标志位变量置0,释放调时显示标志位。
1067       lcd1602displaytimeflag=0;//LCD1602液晶显示器显示时间标志位变量置0,释放LCD1602液晶显示器显示时间标志位。
1068       temperaturedisplayflag=0;//温度显示标志位变量置0,释放温度显示标志位。
1069      }
1070      if(Snum>=2&&settimedisplayflag==1&&tiaotimedisplayflag==1)//判断启停按键是否第二或二以上次按下过及设时显示标志位变量为1及调时显示标志位变量为1,相当于设温启动。
1071     {
1072       Snum=1;//启停按键按下次数变量置1,为下一次按下启停键实现停止做准备。
1073       S1num=0;//设温按键按下次数变量清零,可以反复操作设温按键。
1074       TR0=1;//启动定时器0
1075       LCD1602WriteCommand(0x0c);//关LCD1602液晶显示器光标(或字符)闪烁
1076       settemperatureflag=1;//设温标志位变量置1,进入温度报警函数判断是否可执行温度报警。
1077       settimedisplayflag=0;//设时显示标志位变量置0,释放设时显示标志位。
1078       tiaotimedisplayflag=0;//调时显示标志位变量置0,释放调时显示标志位。
1079       lcd1602displaytimeflag=0;//LCD1602液晶显示器显示时间标志位变量等于0,释放LCD1602液晶显示器显示时间标志位。
1080       temperaturedisplayflag=0;//温度显示标志位变量置0,释放温度显示标志位。
1081      }
1082      if(Snum>=2&&settimedisplayflag==1&&settemperaturedisplayflag==1)//判断启停按键是否第二或二以上次按下过及设时显示标志位变量为1和设温显示标志位变量为1,相当于调时启动。
1083     {
1084       Snum=1;//启停按键按下次数变量置1,为下一次按下启停键实现停止做准备。
1085       S2num=0;//调时按键按下次数变量清零,可以反复操作调时按键。
1086       TR0=1;//启动定时器0
1087       LCD1602WriteCommand(0x0c);//关LCD1602液晶显示器光标(或字符)闪烁 
1088       settimedisplayflag=0;//设时显示标志位变量置0,释放设时显示标志位。
1089       settemperaturedisplayflag=0;//设温显示标志位变量置0,释放设温显示标志位。
1090       lcd1602displaytimeflag=0;//LCD1602液晶显示器显示时间标志位变量置0,释放LCD1602液晶显示器显示时间标志位。
1091       temperaturedisplayflag=0;//温度显示标志位变量置0,释放温度显示标志位。
1092       miaoflag=0;//秒钟标志位变量置0,释放秒钟标志位。
1093       fenflag=0;//分钟标志位变量置0,释放分钟标志位。
1094       shiflag=0;//时钟标志位变量置0,释放时钟显示标志位。
1095      }
1096     }
1097    }     
1098   }
1099   void main()//主函数
1100 {
1101    LCD1602Init();//LCD1602字符型液晶显示器初始化函数
1102    LCD1602DisplayInitTime();//LCD1602字符型液晶显示器显示初始化时间函数
1103    DS18B20Init();//DS18B20温度传感器初始化函数
1104    Timer0Init();//定时器0初始化函数 
1105    SetTimeInit();//设时初始化函数
1106    SetTemperatrueInit();//设温初始化函数    
1107    while(1)//固定循环
1108   {
1109     if(qitingflag==1)//判断启停标志位变量是否为1
1110    {
1111      //    SetAlarmTemperatrueFenJie(alarmwendu);
1112      if(lcd1602displaytimeflag==0)//判断LCD1602液晶显示器显示时间标志位变量是否等于0
1113     {    
1114       if(miao<=60)//判断走时秒钟变量是否小于等于60
1115       LCD1602DisplayTimeFenJie(0x06,miao);//LCD1602液晶显示器显示时间两位数分解函数显示秒钟两位数
1116       if(fen<=60)//判断走时分钟变量是否小于等于60
1117       LCD1602DisplayTimeFenJie(0x03,fen);//LCD1602液晶显示器显示时间两位数分解函数显示分钟两位数
1118       if(shi<=24)//判断走时时钟变量是否小于等于24
1119       LCD1602DisplayTimeFenJie(0x00,shi);//LCD1602液晶显示器显示时间两位数分解函数显示时钟两位数
1120      }
1121      if(temperaturedisplayflag==0)//判断温度显示标志位变量是否等于0
1122     {     
1123       TemperatureFenJie();//温度分解函数
1124       TemperatureDisplay();//温度显示函数 
1125      }
1126      if(settimedisplayflag==0)//判断设时显示标志位变量是否等于0
1127     {
1128       SetTimeKeyScan();//设时按键扫描函数
1129      }
1130      if(settemperaturedisplayflag==0)//判断设温标志位变量是否等于0
1131     {    
1132       SetTemperatureKeyScan();//设温按键扫描函数
1133      }
1134      if(tiaotimedisplayflag==0)//判断调时标志位变量是否等于0
1135     {
1136       TiaoTimeKeyScan();//调时按键扫描函数
1137      }
1138      TimeBaoJing();//时间报警函数 
1139      if(timebaojingflag==1)//判断时间报警标志位变量置是否为1
1140     {
1141       FengNingQi_Alarm(80);//蜂鸣器报警
1142       settimedisplayflag=1;//设时显示标志位变量置1,限制操作设时按键扫描函数。
1143       settemperaturedisplayflag=1;//设温显示标志位变量置1,限制操作设温按键扫描函数。
1144       tiaotimedisplayflag=1;//调时显示标志位变量置1,限制操作调时按键扫描函数。
1145      }
1146      TemperatrueBaoJing();//温度报警函数
1147      if(temperatruebaojingflag==1)//判断温度报警标志位变量是否为1
1148     {
1149       FengNingQi_Alarm(80);//蜂鸣器报警
1150       settimedisplayflag=1;//设时显示标志位变量置1,限制操作设时按键扫描函数。
1151       settemperaturedisplayflag=1;//设温显示标志位变量置1,限制操作设温按键扫描函数。
1152       tiaotimedisplayflag=1;//调时显示标志位变量置1,限制操作调时按键扫描函数。
1153       temperaturedisplayflag=1;//温度显示标志位变量置1,限制操作温度分解函数和温度显示函数。
1154      }
1155     }
1156     SumKeyScan();//总按键扫描函数
1157    }
1158   }

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

原文地址:https://www.cnblogs.com/AChenWeiqiangA/p/12267636.html