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