基于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   }

猜你喜欢

转载自www.cnblogs.com/AChenWeiqiangA/p/12770484.html