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

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

 

posted @ 2020-04-24 21:53  吃不了就兜着走  阅读(723)  评论(0编辑  收藏  举报