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 }