本帖最后由 51黑电子会员 于 2020-4-24 22:28 编辑
- #include<reg52.h>//包含51单片机内部寄存器头文件
- #define uchar unsigned char // 自定义uchar为unsigned char(即无符号字符型数据,数据范围:0到255。)
- #define uint unsigned int//自定义uint为unsigned int(即无符号字符整数型数据,数据范围:0到6355。)
- sbit RS=P0^7;//位定义LCD1602字符型液晶显示器的数据/命令选择引脚
- sbit RW=P0^6;//位定义LCD1602字符型液晶显示器的读写引脚
- sbit EN=P0^5; //位定义LCD1602字符型液晶显示器的使能引脚
- sbit DQ=P1^6;//位定义DS18B20数据端口
- sbit S=P3^7;//设时按键S
- sbit S0=P3^6;//设温按键S0
- sbit S1=P3^5;//调时按键S1
- sbit S2=P3^4;//增加按键S2
- sbit S3=P3^3;//减少按键S3
- sbit S4=P3^2;//启停按键S4
- sbit FengNingQi=P3^1;//位定义蜂鸣器口
- uchar count,Snum,S0num,S1num,S4num,S2numflag,S3numflag,TR0flag,setsecondflag,setminutanflag,sethourflag,miaoflag,fenflag,shiflag,settemperatureflag;//定时器0中断次数变量、设时按键S按键按下次数变量、设温按键S0按键按下次数变量、调时按键S1按下次数变量、启停按键S4按下次数标志位变量、增加键标志位变量、减少键标志位变量、定时器0标志位变量、设时秒钟标志位变量、设时分钟标志位变量、设时时钟标志位变量、秒钟标志位变量、分钟标志位变量、时钟标志位变量、设温标志位变量、
- uchar sethour,setminutan,setsecond;//设时时钟变量、设时分钟变量
- uchar setsecondge,setsecondshi;//设时秒钟个位变量、设时秒钟十位变量
- uchar setminutange,setminutanshi;//设时分钟个位变量、设时分钟十位变量
- uchar sethourge,sethourshi;//设时时钟个位变量、设时时钟十位变量
- uchar shi,fen,miao;//时钟变量、分钟变量、秒钟变量
- uchar secondge,secondshi; //秒钟个位变量、秒钟十位变量
- uchar minutange,minutanshi;//分钟个位变量、分钟十位变量
- uchar hourge,hourshi;//时钟个位变量、时钟十位变量
- uchar qitingflag,temperaturedisplayflag,lcd1602displaytimeflag,settimedisplayflag,settemperaturedisplayflag,tiaotimedisplayflag,timebaojingflag,temperatruebaojingflag;//启停键标志位变量、温度显示标志位变量、液晶显示器显示时间标志位变量、设时显示标志位变量、设温显示标志位变量、调时显示标志位变量、时间报警标志位变量、温度报警标志位变量
- uint temperature,t;//读温度值变量
- uint temperatureflag;//负温度标志位变量
- uint wendu,wendubai,wendushi,wenduge,xiaoshudian,wenduxiaoshu,fuhaowei,setwendu,setwendubai,setwendushi,setwenduge,setwenduxiaoshu,settemperature;//温度值变量、温度百位变量、温度十位变量、温度个位变量、小数点变量、小数变量、符号位变量、设温变量、设温百位变量、设温十位变量、设温个位变量、设温小数变量、设温变量
- //uchar table0[]="00:00:00";//LCD1602第一行初始显示
- uchar table1[]="00:00:00";//LCD1602第二行初始显示
- void Delay(uint z)//延时程序
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void WriteCommand(uchar command)//LCD1602字符型液晶显示器写指令函数
- {
- RS=0;//LCD1602字符型液晶显示器指令寄存器低电平
- RW=0;//LCD1602字符型液晶显示器写指令操作低电平
- P2=command;//LCD1602字符型液晶显示器写指令函数写指令到单片机P2组端口,再输送到LCD1602字符型液晶显示器指令寄存器中执行。
- Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
- EN=1;//LCD1602字符型液晶显示器使能端高电平
- Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
- EN=0;//LCD1602字符型液晶显示器使能端低电平
- }
- void WriteData(uchar information)//LCD1602字符型液晶显示器写数据函数
- {
- RS=1;//LCD1602字符型液晶显示器数据寄存器高电平
- RW=0;//LCD1602字符型液晶显示器写数据操作低电平
- P2=information;//LCD1602字符型液晶显示器写数据函数写数据到单片机P2组端口,再输送到LCD1602字符型液晶显示器上显示。
- Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
- EN=1;//LCD1602字符型液晶显示器使能端高电平
- Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
- EN=0;//LCD1602字符型液晶显示器使能端低电平
- }
- void LCD1602Init()//LCD1602初始化函数
- {
- WriteCommand(0x38);//设置LCD1602字符型液晶显示器16x2显示,5*7或5*8点阵,8位数据并口,简称显模。
- WriteCommand(0x08);//设置LCD1602字符型液晶显示器显示开,简称亮屏。
- WriteCommand(0x01);//设置清除LCD1602字符型液晶显示器屏上所有内容,并让光标复位到LCD1602字符型液晶显示器屏左上角,简称清屏。
- WriteCommand(0x06);//设置开光标(或字符)地址指针自增1,光标右移动一个字符位,整屏显示不移动。
- WriteCommand(0x0c);//设置开LCD1602字符型液晶显示器显示,关光标,关光标(字符)闪烁。
- }
- void Timer0Init()//定时器0初始化函数
- {
- TMOD=0x01;//设定定时器0工作模式为模式1
- TH0=(65536-50000)/256;//TH0装初值
- TL0=(65536-50000)%256;//TL0装初值
- EA=1;//开启定时器总中断
- ET0=1;//开启定时器0中断开关
- TR0=0;//启动定时器0
- }
- void LCD1602Display()//LCD1602字符型液晶显示器显示函数
- {
- uchar j;//j表示数组元素个数变量
- // WriteCommand(0x80+0x00);//LCD1602字符型液晶显示器第一行第一个位置显示
- // for(j=0;j<8;j++)//有10个字符,要循环10次。
- // {
- // WriteData(table0[j]);//显示字符串
- // Delay(5);
- // }
- WriteCommand(0x80+0x40);//LCD1602字符型液晶显示器第二行第一个位置显示
- for(j=0;j<8;j++)//有8个字符,要循环8次。
- {
- WriteData(table1[j]);//显示字符串
- Delay(5);
- }
- }
- void LCD1602DisplayTime(uchar address,uchar num)//LCD1602显示时间两位数分解函数
- {
- uchar shi,ge;//十位、个位的变量
- shi=num/10;//十位数
- ge=num%10;//个位数
- WriteCommand(0x80+0x40+address);//LCD1602字符型液晶显示器第二行某个显示位
- WriteData(0x30+shi);//0x30表示字符库的数字0,整个代码表示十位可显示0到9的数字。
- WriteData(0x30+ge);//0x30表示字符库的数字0,整个代码表示个位可显示0到9的数字。
- }
- void LCD1602DisplayGeDigitResolve(uchar address,uchar num)//LCD1602字符型液晶显示器显示修改时间个位数分解函数
- {
- uchar ge;//个位的变量
- ge=num%10;//个位数
- WriteCommand(0x80+0x40+address);//LCD1602字符型液晶显示器第二行某个显示位
- WriteData(0x30+ge);//0x30表示字符库的数字0,整个代码表示个位可显示0到9的数字。
- }
- void LCD1602DisplayShiDigitResolve(uchar address,uchar num)//LCD1602字符型液晶显示器修改时间十位数分解函数
- {
- uchar shi;//十位变量
- shi=num%10;//十位数
- WriteCommand(0x80+0x40+address);//LCD1602字符型液晶显示器第二行某个显示位
- WriteData(0x30+shi);//0x30表示字符库的数字0,整个代码表示十位可显示0到9的数字。
- }
- void SetTimeKeyScan()//设时按键扫描函数
- {
- if(S==0)//判断设时按键S是否按下
- {
- Delay(5);//延时
- if(S==0)//再次判断设时按键S是否按下
- {
- settemperatureflag=0;//设温标志位变量置0,在温度报警函数执行后但不报警的情况下,温度报警函数里边余留settemperatureflag==1和TR0=1,当操作设时按键扫描函数时,计时依然在执行,导致计时不恰当,因此在设时按键扫描函数里边添加settemperatureflag=0和TR0=0,执行设时按键扫描函数后,温度报警函数里边settemperatureflag==1和TR0=1被置换成settemperatureflag=0和TR0=0,很好地解决了在操作设时按键扫描函数时,计时依然在执行,导致计时不恰当的问题。
- Snum++;//设时按键S按键次数变量先赋值再自加
- while(!S);//等待设时按键S弹起
- switch(Snum)//设时按键S按键按下次数变量选择位
- {
- case 1://设时按键S按键第一次按下
- TR0=0;//关定时器0
- TR0flag=0;//定时器0标志位变量置0,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留TR0flag==1,当再次操作设时按键扫描函数设时时,会发生在设时过程中触发设时报警条件而报警,因此在设时按键扫描函数里边添加TR0flag=0,再次执行设时按键扫描函数后,温度报警函数里边TR0flag==1被置换成TR0flag=0,很好地解决了再次操作设时按键扫描函数设时时,在设时过程中触发设时报警条件而报警的问题。
- tiaotimedisplayflag=1;//调时显示标志位变量置1,在操作设时按键扫描函数的情况下,不能操作调时按键扫描函数。
- settemperaturedisplayflag=1;//设温显示标志位变量置1,在操作设时按键扫描函数的情况下,不能操作设温按键扫描函数。
- lcd1602displaytimeflag=1;//液晶显示器显示时间标志位变量置1,在操作设时按键扫描函数的情况下,不受时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数影响。
- temperaturedisplayflag=1;//温度显示标志位变量置1,在操作设时按键扫描函数的情况下,不受温度分解函数和温度显示函数影响。
- WriteCommand(0x80+0x00+0x07);//LCD1602字符型液晶显示器第一行第7个(从第0开始数)位置的显示位
- WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
- break;
- case 2://设时按键S按键第二次按下
- WriteCommand(0x80+0x00+0x06);//LCD1602字符型液晶显示器第一行第6个(从第0开始数)个位置的显示位
- WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
- break;
- case 3://设时按键S按键第三次按下
- WriteCommand(0x80+0x00+0x04);//LCD1602字符型液晶显示器第一行第4个(从第0开始数)位置的显示位
- WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
- break;
- case 4://设时按键S按键第四次按下
- WriteCommand(0x80+0x00+0x03);//LCD1602字符型液晶显示器第一行第3个(从第0开始数)位置的显示位
- WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
- break;
- case 5://设时按键S按键第五次按下
- WriteCommand(0x80+0x00+0x01);//LCD1602字符型液晶显示器第一行第1个(从第0开始数)位置的显示位
- WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
- break;
- case 6://设时按键S按键第六次按下
- WriteCommand(0x80+0x00+0x00);//LCD1602字符型液晶显示器第一行第0个(从第0开始数)位置的显示位
- WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
- break;
- case 7://设时按键S按键第七次按下
- WriteCommand(0x80+0x00+0x07);//LCD1602字符型液晶显示器第一行第0个(从第0开始数)位置的显示位
- WriteCommand(0x0c);//关光标(或字符)闪烁。
- TR0=1;//开定时器0
- TR0flag=1;//定时器0标志位变量置1,为了在操作设时按键扫描函数进行设时后,可以执行时间报警函数。
- Snum=0;//设时按键S按键按下次数清零,可以反复操作设时按键。
- tiaotimedisplayflag=0;//调时显示标志位变量置0,让设时按键扫描函数执行后,可允许调时按键扫描函数执行。
- settemperaturedisplayflag=0;//设温显示标志位变量置0,让设时按键扫描函数执行后,可允许设温按键扫描函数执行。
- lcd1602displaytimeflag=0;//液晶显示器显示时间标志位变量等于0,让设时按键扫描函数执行后,可允许时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数执行。
- temperaturedisplayflag=0;//温度显示标志位变量等于0,让设时按键扫描函数执行后,可允许温度分解函数和温度显示函数执行。
- break;
- default:
- S0num=0;//设温按键S0按键按下次数清零,可以反复操作设时按键。
- break;
- }
- }
- }
- if(Snum!=0)//判断设时按键S按键按下次数变量是否为0
- {
- if(S2==0)//判断增加按键S2是否按下
- {
- Delay(5);//延时
- if(S2==0)//再次判断增加按键S2是否按下
- {
- S2numflag=1;//增加键标志位变量置1,可以在时间报警函数内进行设时报警。
- while(!S2);//等待增加按键S2弹起
- switch(Snum)//设时按键S按键按下次数变量选择位
- {
- case 1://设时按键S按键第一次按下
- setsecondflag=1;//设时秒钟标志位变量置1,表示设时秒钟数值修改。
- setsecondge++;//设时秒钟个位变量先赋值再加加
- if(setsecondge==10)//判断设时秒钟个位变量设定值是否达到10
- setsecondge=0;//设时秒钟个位变量归零
- WriteCommand(0x80+0x00+0x07);//写入LCD1602字符型液晶显示器第一行第7个(从第0个开始数)位置的设时秒钟个位变量显示位
- WriteData(0x30+setsecondge);//0x30表示字符库的数字0,整个代码表示设时秒钟个位变量可显示0到9的数字。
- WriteCommand(0x80+0x00+0x07);//写入LCD1602字符型液晶显示器第一行第7个(从第0个开始数)位置的设时秒钟个位变量显示位
- setsecond=setsecondshi*10+setsecondge;//设时秒钟变量求值
- break;
- case 2://设时按键S按键第二次按下
- setsecondflag=1;//设时秒钟标志位变量置1,表示设时秒钟数值修改。
- setsecondshi++;//设时秒钟十位变量先赋值再加加
- if(setsecondshi==6)//判断设时秒钟十位变量设定值是否达到6
- setsecondshi=0;//设时秒钟十位变量数归零
- WriteCommand(0x80+0x00+0x06);//写入LCD1602字符型液晶显示器第一行第6个(从第0个开始数)位置的设时秒钟十位变量显示位
- WriteData(0x30+setsecondshi);//0x30表示字符库的数字0,整个代码表示设时秒钟十位变量变量可显示0到9的数字。
- WriteCommand(0x80+0x00+0x06);//写入LCD1602字符型液晶显示器第一行第6个(从第0个开始数)位置的设时秒钟十位变量显示位
- setsecond=setsecondshi*10+setsecondge;//设时秒钟变量求值
- break;
- case 3://设时按键S按键第三次按下
- setminutanflag=1;//设时分钟标志位变量置1,表示设时分钟数值修改。
- setminutange++;//设时分钟个位变量先赋值再加加
- if(setminutange==10)//判断设时分钟个位变量设定值是否达到10
- setminutange=0;//设时分钟个位变量归零
- WriteCommand(0x80+0x00+0x04);//写入LCD1602字符型液晶显示器第一行第4个(从第0个开始数)位置的设时分钟个位变量显示位
- WriteData(0x30+setminutange);//0x30表示字符库的数字0,整个代码表示设时分钟个位变量可显示0到9的数字。
- WriteCommand(0x80+0x00+0x04);//写入LCD1602字符型液晶显示器第一行第4个(从第0个开始数)位置的设时分钟个位变量显示位
- setminutan=setminutanshi*10+setminutange;//设时分钟变量求值
- break;
- case 4://设时按键S按键第四次按下
- setminutanflag=1;//设时分钟标志位变量置1,表示设时分钟数值修改。
- setminutanshi++;//设时分钟十位变量先赋值再加加
- if(setminutanshi==6)//判断设时分钟十位变量设定值是否达到6
- setminutanshi=0;//设时分钟十位变量归零
- WriteCommand(0x80+0x00+0x03);//写入LCD1602字符型液晶显示器第一行第3个(从第0个开始数)位置的设时分钟十位变量显示位
- WriteData(0x30+setminutanshi);//0x30表示字符库的数字0,整个代码表示设时分钟十位变量可显示0到9的数字。
- WriteCommand(0x80+0x00+0x03);//写入LCD1602字符型液晶显示器第一行第3个(从第0个开始数)位置的设时分钟十位变量显示位
- setminutan=setminutanshi*10+setminutange;//设时分钟变量求值
- break;
- case 5://设时按键S按键第五次按下
- sethourflag=1;//设时时钟标志位变量置1,表示设时时钟数值修改。
- sethourge++;//设时时钟个位变量先赋值再加加
- if(sethourge==4)//判断设时时钟个位变量设定值是否达到4
- sethourge=0;//设时时钟个位变量归零
- WriteCommand(0x80+0x00+0x01);//写入LCD1602字符型液晶显示器第一行第1个(从第0个开始数)位置的设时时钟个位显示位
- WriteData(0x30+sethourge);//0x30表示字符库的数字0,整个代码表示设时时钟个位可显示0到9的数字。
- WriteCommand(0x80+0x00+0x01);//写入LCD1602字符型液晶显示器第一行第1个(从第0个开始数)位置的设时时钟个位显示位
- sethour=sethourshi*10+sethourge;//设时时钟变量求值
- break;
- case 6://设时按键S按键第六次按下
- sethourflag=1;//设时时钟标志位变量置1,表示设时时钟数值修改。
- sethourshi++;//设时时钟十位变量先赋值再加加
- if(sethourshi==3)//判断设时时钟十位设定值是否达到3
- sethourshi=0;//设时时钟十位归零
- WriteCommand(0x80+0x00+0x00);//写入LCD1602字符型液晶显示器第一行第0个(从第0个开始数)位置的设时时钟十位显示位
- WriteData(0x30+sethourshi);//0x30表示字符库的数字0,整个代码表示设时时钟十位可显示0到9的数字。
- WriteCommand(0x80+0x00+0x00);//写入LCD1602字符型液晶显示器第一行第0个(从第0个开始数)位置的设时时钟十位显示位
- sethour=sethourshi*10+sethourshi;//设时时钟变量求值
- break;
- }
- }
- }
- }
- if(Snum!=0)//判断设时按键S按键按下次数变量是否为0
- {
- if(S3==0)//判断减少按键S3是否按下
- {
- Delay(5);//延时
- if(S3==0)//再次判断减少按键S3是否按下
- {
- S3numflag=1;//减少键标志位变量,可以在时间报警函数内进行设时报警。
- while(!S3);//等待减少按键S3弹起
- switch(Snum)//设时按键S按键按下次数变量选择位
- {
- case 1://设时按键S按键第一次按下
- setsecondflag=1;//设时秒钟标志位变量置1,表示设时秒钟数值修改。
- setsecondge--;//设时秒钟个位变量先赋值再减减
- if(setsecondge==-1)//判断设时秒钟个位变量设定值是否达到-1
- setsecondge=9;//设时秒钟个位变量置9
- WriteCommand(0x80+0x00+0x07);//写入LCD1602字符型液晶显示器第一行第7个(从第0个开始数)位置的设时秒钟个位变量显示位
- WriteData(0x30+setsecondge);//0x30表示字符库的数字0,整个代码表示设时秒钟个位变量可显示0到9的数字。
- WriteCommand(0x80+0x00+0x07);//写入LCD1602字符型液晶显示器第一行第7个(从第0个开始数)位置的设时秒钟个位变量显示位
- setsecond=setsecondshi*10+setsecondge;//设时秒钟变量求值
- break;
- case 2://设时按键S按键第二次按下
- setsecondflag=1;//设时秒钟标志位变量置1,表示设时秒钟数值修改。
- setsecondshi--;//设时秒钟十位变量先赋值再减减
- if(setsecondshi==-1)//判断设时秒钟十位变量设定值是否达到-1
- setsecondshi=5;//设时秒钟十位变量数置5
- WriteCommand(0x80+0x00+0x06);//写入LCD1602字符型液晶显示器第一行第6个(从第0个开始数)位置的设时秒钟十位变量显示位
- WriteData(0x30+setsecondshi);//0x30表示字符库的数字0,整个代码表示设时秒钟十位变量变量可显示0到9的数字。
- WriteCommand(0x80+0x00+0x06);//写入LCD1602字符型液晶显示器第一行第6个(从第0个开始数)位置的设时秒钟十位变量显示位
- setsecond=setsecondshi*10+setsecondge;//设时秒钟变量求值
- break;
- case 3://设时按键S按键第三次按下
- setminutanflag=1;//设时分钟标志位变量置1,表示设时分钟数值修改。
- setminutange--;//设时分钟个位变量先赋值再减减
- if(setminutange==-1)//判断设时分钟个位变量设定值是否达到-1
- setminutange=9;//设时分钟个位变量置9
- WriteCommand(0x80+0x00+0x04);//写入LCD1602字符型液晶显示器第一行第4个(从第0个开始数)位置的设时分钟个位变量显示位
- WriteData(0x30+setminutange);//0x30表示字符库的数字0,整个代码表示设时分钟个位变量可显示0到9的数字。
- WriteCommand(0x80+0x00+0x04);//写入LCD1602字符型液晶显示器第一行第4个(从第0个开始数)位置的设时分钟个位变量显示位
- setminutan=setminutanshi*10+setminutange;//设时分钟变量求值
- break;
- case 4://设时按键S按键第四次按下
- setminutanflag=1;//设时分钟标志位变量置1,表示设时分钟数值修改。
- setminutanshi--;//设时分钟十位变量先赋值再减减
- if(setminutanshi==-1)//判断设时分钟十位变量设定值是否达到-1
- setminutanshi=5;//设时分钟十位变量置9
- WriteCommand(0x80+0x00+0x03);//写入LCD1602字符型液晶显示器第一行第3个(从第0个开始数)位置的设时分钟十位变量显示位
- WriteData(0x30+setminutanshi);//0x30表示字符库的数字0,整个代码表示设时分钟十位变量可显示0到9的数字。
- WriteCommand(0x80+0x00+0x03);//写入LCD1602字符型液晶显示器第一行第3个(从第0个开始数)位置的设时分钟十位变量显示位
- setminutan=setminutanshi*10+setminutange;//设时分钟变量求值
- break;
- case 5://设时按键S按键第五次按下
- sethourflag=1;//设时时钟标志位变量置1,表示设时时钟数值修改。
- sethourge--;//设时时钟个位变量先赋值再减减
- if(sethourge==-1)//判断设时时钟个位变量设定值是否达到-1
- sethourge=3;//设时时钟个位变量置3
- WriteCommand(0x80+0x00+0x01);//写入LCD1602字符型液晶显示器第一行第1个(从第0个开始数)位置的设时时钟个位显示位
- WriteData(0x30+sethourge);//0x30表示字符库的数字0,整个代码表示设时时钟个位可显示0到9的数字。
- WriteCommand(0x80+0x00+0x01);//写入LCD1602字符型液晶显示器第一行第1个(从第0个开始数)位置的设时时钟个位显示位
- sethour=sethourshi*10+sethourge;//设时时钟变量求值
- break;
- case 6://设时按键S按键第六次按下
- sethourflag=1;//设时时钟标志位变量置1,表示设时时钟数值修改。
- sethourshi--;//设时时钟十位变量先赋值再减减
- if(sethourshi==-1)//判断设时时钟十位设定值是否达到-1
- sethourshi=2;//设时时钟十位置2
- WriteCommand(0x80+0x00+0x00);//写入LCD1602字符型液晶显示器第一行第0个(从第0个开始数)位置的设时时钟十位显示位
- WriteData(0x30+sethourshi);//0x30表示字符库的数字0,整个代码表示设时时钟十位可显示0到9的数字。
- WriteCommand(0x80+0x00+0x00);//写入LCD1602字符型液晶显示器第一行第0个(从第0个开始数)位置的设时时钟十位显示位
- sethour=sethourshi*10+sethourge;//设时时钟变量求值
- break;
- }
- }
- }
- }
- }
- void SetTemperatureKeyScan()//设温按键扫描函数
- {
- if(S0==0)//判断设温按键S0是否按下
- {
- Delay(5);//延时
- if(S0==0)//再次判断设温按键S0是否按下
- {
- settemperatureflag=0;//设温标志位变量置0,在温度报警函数执行后但不报警的情况下,余留settemperatureflag==1,当再次操作设温按键扫描函数设温时,会发生在设温过程中触发设温报警条件而报警,因此在设温按键扫描函数里边添加settemperatureflag=0,再次执行设温按键扫描函数后,温度报警函数里边settemperatureflag==1被置换成settemperatureflag=0,很好地解决了再次操作设温按键扫描函数设温时,在设温过程中触发设温报警条件而报警的问题。
- TR0flag=0;//定时器0标志位变量置0,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留TR0flag==1,假若时间报警函数里边存在TR0=1,当操作设温按键扫描函数时,计时依然在执行,导致计时不恰当,因此在设温按键扫描函数里边添加TR0flag=0,执行设温按键扫描函数后,时间报警函数里边TR0flag==1被置换成TR0flag=1,很好地解决了在操作设温按键扫描函数时,计时依然在执行,导致计时不恰当的问题
- setsecondflag=0;//设时秒钟标志位变量置0,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留setsecondflag==1,假若时间报警函数里边存在TR0=1,当操作设温按键扫描函数时,计时依然在执行,导致计时不恰当,因此在设温按键扫描函数里边添加setsecondflag=0,执行设温按键扫描函数后,时间报警函数里边setsecondflag==1被置换成setsecondflag=0,很好地解决了在操作设温按键扫描函数时,计时依然在执行,导致计时不恰当的问题
- setminutanflag=0;//设时分钟标志位变量置0,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留setminutanflag==1,假若时间报警函数里边存在TR0=1,当操作设温按键扫描函数时,计时依然在执行,导致计时不恰当,因此在设温按键扫描函数里边添加setminutanflag=0,执行设温按键扫描函数后,时间报警函数里边setminutanflag==1被置换成setminutanflag=0,很好地解决了在操作设温按键扫描函数时,计时依然在执行,导致计时不恰当的问题
- sethourflag=0;//设时时钟标志位变量置0,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留sethourflag==1,假若时间报警函数里边存在TR0=1,当操作设温按键扫描函数时,计时依然在执行,导致计时不恰当,因此在设温按键扫描函数里边添加sethourflag=0,执行设温按键扫描函数后,时间报警函数里边sethourflag==1被置换成sethourflag=0,很好地解决了在操作设温按键扫描函数时,计时依然在执行,导致计时不恰当的问题
- S0num++;//设温按键S0按键次数变量先赋值再自加
- while(!S0);//等待设温按键S0弹起
- switch(S0num)//设温按键S0按键按下次数变量选择位
- {
- case 1://设温按键S0按键第一次按下
- TR0=0;//关定时器0
- settimedisplayflag=1;//设时显示标志位变量置1,在操作设温按键扫描函数的情况下,不能操作设时按键扫描函数。
- tiaotimedisplayflag=1;//调时显示标志位变量置1,在操作设温按键扫描函数的情况下,不能操作调时按键扫描函数。
- lcd1602displaytimeflag=1;//液晶显示器显示时间标志位变量置1,在操作设温按键扫描函数的情况下,不受时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数影响。
- temperaturedisplayflag=1;//温度显示标志位变量置1,在操作设温按键扫描函数的情况下,不受温度分解函数和温度显示函数影响。
- WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶显示器第一行第13个(从第0开始数)位置的显示位
- WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
- break;
- case 2://设温按键S0按键第二次按下
- WriteCommand(0x80+0x00+0x0b);//LCD1602字符型液晶显示器第一行第11个(从第0开始数)个位置的显示位
- WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
- break;
- case 3://设温按键S0按键第三次按下
- WriteCommand(0x80+0x00+0x0a);//LCD1602字符型液晶显示器第一行第10个(从第0开始数)位置的显示位
- WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
- break;
- case 4://设温按键S0按键第四次按下
- WriteCommand(0x80+0x00+0x09);//LCD1602字符型液晶显示器第一行第9个(从第0开始数)位置的显示位
- WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
- break;
- case 5://设温按键S0按键第五次按下
- WriteCommand(0x80+0x00+0x08);//LCD1602字符型液晶显示器第一行第8个(从第0开始数)位置的显示位
- WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
- break;
- case 6://设温按键S0按键第六次按下
- WriteCommand(0x80+0x00+0x0d);//LCD1602字符型液晶显示器第一行第13个(从第0开始数)位置的显示位
- WriteCommand(0x0c);//关光标(或字符)闪烁。
- TR0=1;//开定时器0
- S0num=0;//设温按键S0按键按下次数清零,可以反复操作设温按键。
- settimedisplayflag=0;//设时显示标志位变量置0,让设温按键扫描函数执行后,可允许设时按键扫描函数执行。
- tiaotimedisplayflag=0;//调时显示标志位变量置0,让设温按键扫描函数执行后,可允许调时按键扫描函数执行。
- lcd1602displaytimeflag=0;//液晶显示器显示时间标志位变量置0,让设温按键扫描函数执行后,可允许时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数执行。
- temperaturedisplayflag=0;//温度显示标志位变量置0,让设温按键扫描函数执行后,可允许温度分解函数和温度显示函数执行。
- settemperatureflag=1;//设温标志位变量置1,为了在操作设温按键扫描函数进行设温后,可以执行温度报警函数。
- break;
- default:
- S0num=0;//设温按键S0按键按下次数清零
- break;
-
- }
- }
- }
- if(S0num!=0)//判断设温按键S0按键按下次数变量是否为0
- {
- if(S2==0)//判断增加按键S2是否按下
- {
- Delay(5);//延时
- if(S2==0)//再次判断增加按键S2是否按下
- {
- S2numflag=1;//增加键标志位变量置1,可以在温度报警函数内进行设报警。
- while(!S2);//等待增加按键S2弹起
- switch(S0num)//设温按键S0按键按下次数变量选择位
- {
- case 1://设温按键S0按键第一次按下
- setwenduxiaoshu++;//设温小数位变量先赋值再加加
- if(setwenduxiaoshu==10)//判断设温小数位变量设定值是否达到10
- setwenduxiaoshu=0;//设温小数位变量归零
- WriteCommand(0x80+0x00+0x0d);//写入LCD1602字符型液晶显示器第一行第13个(从第0个开始数)位置的设温小数位显示位
- WriteData(0x30+setwenduxiaoshu);//0x30表示字符库的数字0,整个代码表示设温小数位可显示0到9的数字。
- WriteCommand(0x80+0x00+0x0d);//写入LCD1602字符型液晶显示器第一行第13个(从第0个开始数)位置的设温小数位显示位
- settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//设温变量求值
- break;
- case 2://设温按键S0按键第二次按下
- setwenduge++;//设温个位变量先赋值再加加
- if(setwenduge==6)//判断设温个位变量设定值是否达到6
- setwenduge=0;//设温个位变量数归零
- WriteCommand(0x80+0x00+0x0b);//写入LCD1602字符型液晶显示器第一行第11个(从第0个开始数)位置的设温个位显示位
- WriteData(0x30+setwenduge);//0x30表示字符库的数字0,整个代码表示设温个位可显示0到9的数字。
- WriteCommand(0x80+0x00+0x0b);//写入LCD1602字符型液晶显示器第一行第11个(从第0个开始数)位置的设温个位显示位
- settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//设温变量求值
- break;
- case 3://设温按键S0按键第三次按下
- setwendushi++;//设温十位变量先赋值再加加
- if(setwendushi==3)//判断设温十位变量设定值是否达到3
- setwendushi=0;//设温十位变量归零
- WriteCommand(0x80+0x00+0x0a);//写入LCD1602字符型液晶显示器第一行第10个(从第0个开始数)位置的设温十位显示位
- WriteData(0x30+setwendushi);//0x30表示字符库的数字0,整个代码表示设温十位可显示0到9的数字。
- WriteCommand(0x80+0x00+0x0a);//写入LCD1602字符型液晶显示器第一行第10个(从第0个开始数)位置的设温十位显示位
- settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//设温变量求值
- break;
- case 4://设温按键S0按键第四次按下
- setwendubai++;//设温百位变量先赋值再加加
- if(setwendubai==2)//判断设温百位变量设定值是否达到2
- setwendubai=0;//设温百位变量归零
- WriteCommand(0x80+0x00+0x09);//写入LCD1602字符型液晶显示器第一行第9个(从第0个开始数)位置的设温百位显示位
- WriteData(0x30+setwendubai);//0x30表示字符库的数字0,整个代码表示设温百位可显示0到9的数字。
- WriteCommand(0x80+0x00+0x09);//写入LCD1602字符型液晶显示器第一行第9个(从第0个开始数)位置的设温百位显示位
- settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//设温变量求值
- break;
- case 5://设温按键S0按键第五次按下
- WriteCommand(0x80+0x00+0x08);//写入LCD1602字符型液晶显示器第一行第8个(从第0个开始数)位置的设温负符号显示位
- WriteData(0x2b);//0x2d表示字符库的正符号
- WriteCommand(0x80+0x00+0x08);//写入LCD1602字符型液晶显示器第一行第8个(从第0个开始数)个位置的设温负符号显示位
- break;
- }
- }
- }
- }
- if(S0num!=0)//判断设温按键S0按键按下次数变量是否为0
- {
- if(S3==0)//判断减少按键S2是否按下
- {
- Delay(5);//延时
- if(S3==0)//再次判断减少按键S2是否按下
- {
- S3numflag=1;//减少键标志位变量置1,可以在温度报警函数内进行设报警。
- while(!S3);//等待减少按键S2弹起
- switch(S0num)//设温按键S0按键按下次数变量选择位
- {
- case 1://设温按键S0按键第一次按下
- setwenduxiaoshu--;//设温小数位变量先赋值再减减
- if(setwenduxiaoshu==-1)//判断设温小数位变量设定值是否达到-1
- setwenduxiaoshu=9;//设温小数位变量置9
- WriteCommand(0x80+0x00+0x0d);//写入LCD1602字符型液晶显示器第一行第13个(从第0个开始数)位置的设温小数位显示位
- WriteData(0x30+setwenduxiaoshu);//0x30表示字符库的数字0,整个代码表示设温小数位可显示0到9的数字。
- WriteCommand(0x80+0x00+0x0d);//写入LCD1602字符型液晶显示器第一行第13个(从第0个开始数)位置的设温小数位显示位
- settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//设温变量求值
- break;
- case 2://设温按键S0按键第二次按下
- setwenduge--;//设温个位变量先赋值再减减
- if(setwenduge==-1)//判断设温个位变量设定值是否达到-1
- setwenduge=5;//设温个位变量数置5
- WriteCommand(0x80+0x00+0x0b);//写入LCD1602字符型液晶显示器第一行第11个(从第0个开始数)位置的设温个位显示位
- WriteData(0x30+setwenduge);//0x30表示字符库的数字0,整个代码表示设温个位可显示0到9的数字。
- WriteCommand(0x80+0x00+0x0b);//写入LCD1602字符型液晶显示器第一行第11个(从第0个开始数)位置的设温个位显示位
- settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//设温变量求值
- break;
- case 3://设温按键S0按键第三次按下
- setwendushi--;//设温十位变量先赋值再减减
- if(setwendushi==-1)//判断设温十位变量设定值是否达到-1
- setwendushi=2;//设温十位变量置2
- WriteCommand(0x80+0x00+0x0a);//写入LCD1602字符型液晶显示器第一行第10个(从第0个开始数)位置的设温十位显示位
- WriteData(0x30+setwendushi);//0x30表示字符库的数字0,整个代码表示设温十位可显示0到9的数字。
- WriteCommand(0x80+0x00+0x0a);//写入LCD1602字符型液晶显示器第一行第10个(从第0个开始数)位置的设温十位显示位
- settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//设温变量求值
- break;
- case 4://设温按键S0按键第四次按下
- setwendubai--;//设温百位变量先赋值再减减
- if(setwendubai==-1)//判断设温百位变量设定值是否达到-1
- setwendubai=1;//设温百位变量置1
- WriteCommand(0x80+0x00+0x09);//写入LCD1602字符型液晶显示器第一行第9个(从第0个开始数)位置的设温百位显示位
- WriteData(0x30+setwendubai);//0x30表示字符库的数字0,整个代码表示设温百位可显示0到9的数字。
- WriteCommand(0x80+0x00+0x09);//写入LCD1602字符型液晶显示器第一行第9个(从第0个开始数)位置的设温百位显示位
- settemperature=setwendubai*1000+setwendushi*100+setwenduge*10+setwenduxiaoshu;//设温变量求值
- break;
- case 5://设温按键S0按键第五次按下
- WriteCommand(0x80+0x00+0x08);//写入LCD1602字符型液晶显示器第一行第8个(从第0个开始数)位置的设温负符号显示位
- WriteData(0x2d);//0x2d表示字符库的负符号
- WriteCommand(0x80+0x00+0x08);//写入LCD1602字符型液晶显示器第一行第8个(从第0个开始数)个位置的设温负符号显示位
- break;
- }
- }
- }
- }
- }
- void TiaoTimeKeyScan()//调时按键扫描函数
- {
- if(S1==0)//判断调时按键S1是否按下
- {
- Delay(5);//延时
- if(S1==0)//再次判断调时按键S1是否按下
- {
- settemperatureflag=0;//设温标志位变量置0,在温度报警函数执行后但不报警的情况下,温度报警函数里边余留settemperatureflag==1和TR0=1,当操作调时按键扫描函数时,计时依然在执行,导致计时不恰当,因此在调时按键扫描函数里边添加settemperatureflag=0和TR0=0,执行调时按键扫描函数后,温度报警函数里边settemperatureflag==1和TR0=1被置换成settemperatureflag=0和TR0=0,很好地解决了在操作调时按键扫描函数时,计时依然在执行,导致计时不恰当的问题。
- S1num++;//调时按键S1按键次数变量先赋值再自加
- while(!S1);//等待调时按键S1弹起
- switch(S1num)//调时按键S1按键按下次数变量选择位
- {
- case 1://调时按键S1按键第一次按下
- TR0=0;//关定时器0
- settimedisplayflag=1;//设时显示标志位变量置1,在操作调时按键扫描函数的情况下,不能操作设时按键扫描函数。
- settemperaturedisplayflag=1;//设温显示标志位变量置1,在操作调时按键扫描函数的情况下,不能操作设温按键扫描函数。
- lcd1602displaytimeflag=1;//液晶显示器显示时间标志位变量等于1,在操作调时按键扫描函数的情况下,不受时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数影响。
- temperaturedisplayflag=1;//温度显示标志位变量等于1,在操作调时按键扫描函数的情况下,不受温度分解函数和温度显示函数影响。
- secondge=miao%10;//关掉定时器0定时后,把秒钟计时时间数值取余赋给秒钟个位显示位。
- secondshi=miao/10;//关掉定时器0定时后,把秒钟计时时间数值取除赋给秒钟十位显示位。
- WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶显示器第二行第8个位置的显示位
- WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
- break;
- case 2://调时按键S1按键第二次按下
- secondshi=secondshi;//关掉定时器0定时后,把秒钟计时时间数值取除后得到的值再赋给秒钟十位显示位。
- WriteCommand(0x80+0x40+0x06);//LCD1602字符型液晶显示器第二行第7个位置的显示位
- WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
- break;
- case 3://调时按键S1按键第三次按下
- minutange=fen%10;//关掉定时器0定时后,把分钟计时时间数值取余赋给分钟个位显示位。
- minutanshi=fen/10;//关掉定时器0定时后,把分钟计时时间数值取除赋给分钟十位显示位。
- WriteCommand(0x80+0x40+0x04);//LCD1602字符型液晶显示器第二行第5个位置的显示位
- WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
- break;
- case 4://调时按键S1按键第四次按下
- minutanshi=minutanshi;//关掉定时器0定时后,把分钟计时时间数值取除后得到的值再赋给分钟十位显示位。
- WriteCommand(0x80+0x40+0x03);//LCD1602字符型液晶显示器第二行第4个位置的显示位
- WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
- break;
- case 5://调时按键S1按键第五次按下
- hourge=shi%10;//关掉定时器0定时后,把时钟计时时间数值取余赋给时钟个位显示位。
- hourshi=shi/10;//关掉定时器0定时后,把时钟计时时间数值取除赋给时钟十位显示位。
- WriteCommand(0x80+0x40+0x01);//LCD1602字符型液晶显示器第二行第2个位置的显示位
- WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
- break;
- case 6://调时按键S1按键第六次按下
- hourshi=hourshi;//关掉定时器0定时后,把时钟计时时间数值取除后得到的值再赋给时钟十位显示位。
- WriteCommand(0x80+0x40+0x00);//LCD1602字符型液晶显示器第二行第1个位置的显示位
- WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
- break;
- case 7://调时按键S1按键第七次按下
- WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶显示器第二行第8个位置的显示位
- WriteCommand(0x0c);//关光标(或字符)闪烁。
- TR0=1;//开定时器0
- S1num=0;//调时按键S1按键按下次数清零,可以反复操作调时按键。
- settimedisplayflag=0;//设时显示标志位变量置0,让调时按键扫描函数执行后,可允许设时按键扫描函数执行。
- settemperaturedisplayflag=0;//设温显示标志位变量置0,让调时按键扫描函数执行后,可允许设温按键扫描函数执行。
- lcd1602displaytimeflag=0;//液晶显示器显示时间标志位变量等于0,让调时按键扫描函数执行后,可允许时钟两位数分解函数和分钟两位数分解函数和秒钟两位数分解函数执行。
- temperaturedisplayflag=0;//温度显示标志位变量等于0,让调时按键扫描函数执行后,可允许温度分解函数和温度显示函数执行。
- miaoflag=0;//秒钟标志位变量置0,在操作调时按键扫描函数进行调时后,调时按键扫描函数里边余留miaoflag==1,不解除会导致时间报警函数不能启动报警判别,因此在调时按键扫描函数里边添加miaoflag=0,执行调时按键扫描函数后,时间报警函数就可以做出相应时间报警。
- fenflag=0;//分钟标志位变量置0,在操作调时按键扫描函数进行调时后,调时按键扫描函数里边余留fenflag==1,不解除会导致时间报警函数不能启动报警判别,因此在调时按键扫描函数里边添加fenflag=0,执行调时按键扫描函数后,时间报警函数就可以做出相应时间报警。
- shiflag=0;//时钟标志位变量置0,在操作调时按键扫描函数进行调时后,调时按键扫描函数里边余留shiflag==1,不解除会导致时间报警函数不能启动报警判别,因此在调时按键扫描函数里边添加shiflag=0,执行调时按键扫描函数后,时间报警函数就可以做出相应时间报警。
- break;
- default:
- S1num=0;//调时按键S1按键按下次数清零,可以反复操作调时按键。
- break;
- }
- }
- }
- if(S1num!=0)//判断调时按键S1按键按下次数变量是否为0
- {
- if(S2==0)//判断增加按键S2是否按下
- {
- Delay(5);//延时
- if(S2==0)//再次判断增加按键S2是否按下
- {
- while(!S2);//等待增加按键S2弹起
- switch(S1num)//调时按键S1按键按下次数变量选择位
- {
- case 1://调时按键S1按键第一次按下
- miaoflag=1;//秒钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留miaoflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加miaoflag=1,时间报警函数里边miaoflag==0被置换成miaoflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
- secondge++;//秒钟个位数先赋值再加加
- if(secondge==10)//判断秒钟个位数设定值是否达到10
- secondge=0;//秒钟个位数归零
- LCD1602DisplayGeDigitResolve(0x07,secondge);//LCD1602字符型液晶显示器第二行第8个位置的秒钟个位显示位的显示数
- WriteCommand(0x80+0x40+0x07);//写入LCD1602字符型液晶显示器第二行第8个位置的秒钟个位显示位
- miao=secondshi*10+secondge;//移位修改秒钟个位显示位的数值后,需要通过秒钟十位显示位的数值加上秒钟个位显示位的数值之和赋给秒钟变量,才能在修改秒钟个位或十位显示位的数值后重新计时。(原因:秒钟个位或十位显示位的数值是在秒钟的数值上分解得来,当秒钟个位或十位显示位的数值发生变化后,秒钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
- break;
- case 2://调时按键S1按键第二次按下
- miaoflag=1;//秒钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留miaoflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加miaoflag=1,时间报警函数里边miaoflag==0被置换成miaoflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
- secondshi++;//秒钟十位数先赋值再加加
- if(secondshi==6)//判断秒钟十位数设定值是否达到6
- secondshi=0;//秒钟十位数归零
- LCD1602DisplayShiDigitResolve(0x06,secondshi);//LCD1602字符型液晶显示器第二行第7个位置的秒钟十位显示位的显示数
- WriteCommand(0x80+0x40+0x06);//写入LCD1602字符型液晶显示器第二行第7个位置的秒钟十位显示位
- miao=secondshi*10+secondge;//移位修改秒钟十位显示位的数值后,需要通过秒钟十位显示位的数值加上秒钟个位显示位的数值之和赋给秒钟变量,才能在修改秒钟个位或十位显示位的数值后重新计时。(原因:秒钟个位或十位显示位的数值是在秒钟的数值上分解得来,当秒钟个位或十位显示位的数值发生变化后,秒钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
- break;
- case 3://调时按键S1按键第三次按下
- fenflag=1;//分钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留fenflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加fenflag=1,时间报警函数里边fenflag==0被置换成fenflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
- minutange++;//分钟个位数先赋值再加加
- if(minutange==10)//判断分钟个位数设定值是否达到10
- minutange=0;//分钟个位数归零
- LCD1602DisplayGeDigitResolve(0x04,minutange);//LCD1602字符型液晶显示器第二行第5个位置的分钟个位显示位的显示数
- WriteCommand(0x80+0x40+0x04);//写入LCD1602字符型液晶显示器第二行第5个位置的分钟个位显示位
- fen=minutanshi*10+minutange;//移位修改分钟个位显示位的数值后,需要通过分钟十位显示位的数值加上分钟个位显示位的数值之和赋给分钟变量,才能在修改分钟个位或十位显示位的数值后重新计时。(原因:分钟个位或十位显示位的数值是在分钟的数值上分解得来,当分钟个位或十位显示位的数值发生变化后,分钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
- break;
- case 4://调时按键S1按键第四次按下
- fenflag=1;//分钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留fenflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加fenflag-=1,时间报警函数里边fenflag==0被置换成fenflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
- minutanshi++;//分钟十位数先赋值再加加
- if(minutanshi==6)//判断分钟十位数设定值是否达到6
- minutanshi=0;//分钟十位数归零
- LCD1602DisplayShiDigitResolve(0x03,minutanshi);//LCD1602字符型液晶显示器第二行第4个位置的分钟十位显示位的显示数
- WriteCommand(0x80+0x40+0x03);//写入LCD1602字符型液晶显示器第二行第7个位置的分钟十位显示位
- fen=minutanshi*10+minutange;//移位修改分钟十位显示位的数值后,需要通过分钟十位显示位的数值加上分钟个位显示位的数值之和赋给分钟变量,才能在修改分钟个位或十位显示位的数值后重新计时。(原因:分钟个位或十位显示位的数值是在分钟的数值上分解得来,当分钟个位或十位显示位的数值发生变化后,分钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
- break;
- case 5://调时按键S1按键第五次按下
- shiflag=1;//时钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留shiflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加shiflag=1,时间报警函数里边shiflag==0被置换成shiflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
- hourge++;//时钟个位数先赋值再加加
- if(hourge==4)//判断时钟个位数设定值是否达到4
- hourge=0;//时钟个位数归零
- LCD1602DisplayGeDigitResolve(0x01,hourge);//LCD1602字符型液晶显示器第二行第2个位置的时钟个位显示位的显示数
- WriteCommand(0x80+0x40+0x01);//写入LCD1602字符型液晶显示器第二行第2个位置的时钟个位显示位
- shi=hourshi*10+hourge;//移位修改时钟个位显示位的数值后,需要通过时钟十位显示位的数值加上时钟个位显示位的数值之和赋给时钟变量,才能在修改时钟个位或十位显示位的数值后重新计时。(原因:时钟个位或十位显示位的数值是在时钟的数值上分解得来,当时钟个位或十位显示位的数值发生变化后,时钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
- break;
- case 6://调时按键S1按键第六次按下
- shiflag=1;//时钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留shiflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加shiflag=1,时间报警函数里边shiflag==0被置换成shiflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
- hourshi++;//时钟十位数先赋值再加加
- if(hourshi==3)//判断时钟十位数设定值是否达到3
- hourshi=0;//时钟十位数归零
- LCD1602DisplayShiDigitResolve(0x00,hourshi);//LCD1602字符型液晶显示器第二行第1个位置的时钟十位显示位的显示数
- WriteCommand(0x80+0x40+0x00);//写入LCD1602第二行第1个位置的时钟十位显示位
- shi=hourshi*10+hourge;//移位修改时钟十位显示位的数值后,需要通过时钟十位显示位的数值加上时钟个位显示位的数值之和赋给时钟变量,才能在修改时钟个位或十位显示位的数值后重新计时。(原因:时钟个位或十位显示位的数值是在时钟的数值上分解得来,当时钟个位或十位显示位的数值发生变化后,时钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
- break;
- default:
- S1num=0;//调时按键S1按键按下次数清零,可以反复操作调时按键。
- break;
- }
- }
- }
- if(S3==0)//判断减少按键S3是否按下
- {
- Delay(5);//延时
- if(S3==0)//再次判断减少按键S3是否按下
- {
- while(!S3);//等待减少按键S3弹起
- switch(S1num)//调时按键S1按键按下次数变量选择位
- {
- case 1://调时按键S1按键第一次按下
- miaoflag=1;//秒钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留miaoflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加miaoflag=1,时间报警函数里边miaoflag==0被置换成miaoflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
- secondge--;//秒钟个位数先赋值再减减
- if(secondge==-1)//判断秒钟个位数设定值是否达到-1
- secondge=9;//秒钟个位数归9
- LCD1602DisplayGeDigitResolve(0x07,secondge);//LCD1602字符型液晶显示器第二行第8个位置的秒钟个位显示位的显示数
- WriteCommand(0x80+0x40+0x07);//写入LCD1602字符型液晶显示器第二行第8个位置的秒钟个位显示位
- miao=secondshi*10+secondge;//移位修改秒钟个位显示位的数值后,需要通过秒钟十位显示位的数值加上秒钟个位显示位的数值之和赋给秒钟变量,才能在修改秒钟个位或十位显示位的数值后重新计时。(原因:秒钟个位或十位显示位的数值是在秒钟的数值上分解得来,当秒钟个位或十位显示位的数值发生变化后,秒钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
- break;
- case 2://调时按键S1按键第二次按下
- miaoflag=1;//秒钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留miaoflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加miaoflag=1,时间报警函数里边miaoflag==0被置换成miaoflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
- secondshi--;//秒钟十位数先赋值再减减
- if(secondshi==-1)//判断秒钟十位数设定值是否达到-1
- secondshi=5;//秒钟十位数归5
- LCD1602DisplayShiDigitResolve(0x06,secondshi);//LCD1602字符型液晶显示器第二行第7个位置的秒钟十位显示位的显示数
- WriteCommand(0x80+0x40+0x06);//写入LCD1602字符型液晶显示器第二行第7个位置的秒钟十位显示位
- miao=secondshi*10+secondge;//移位修改秒钟十位显示位的数值后,需要通过秒钟十位显示位的数值加上秒钟个位显示位的数值之和赋给秒钟变量,才能在修改秒钟个位或十位显示位的数值后重新计时。(原因:秒钟个位或十位显示位的数值是在秒钟的数值上分解得来,当秒钟个位或十位显示位的数值发生变化后,秒钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
- break;
- case 3://调时按键S1按键第三次按下
- fenflag=1;//分钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留fenflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加fenflag=1,时间报警函数里边fenflag==0被置换成fenflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
- minutange--;//分钟个位数先赋值再减减
- if(minutange==-1)//判断分钟个位数设定值是否达到-1
- minutange=9;//分钟个位数归9
- LCD1602DisplayGeDigitResolve(0x04,minutange);//LCD1602字符型液晶显示器第二行第5个位置的分钟个位显示位的显示数
- WriteCommand(0x80+0x40+0x04);//写入LCD1602字符型液晶显示器第二行第5个位置的分钟个位显示位
- fen=minutanshi*10+minutange;//移位修改分钟个位显示位的数值后,需要通过分钟十位显示位的数值加上分钟个位显示位的数值之和赋给分钟变量,才能在修改分钟个位或十位显示位的数值后重新计时。(原因:分钟个位或十位显示位的数值是在分钟的数值上分解得来,当分钟个位或十位显示位的数值发生变化后,分钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
- break;
- case 4://调时按键S1按键第四次按下
- fenflag=1;//分钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留fenflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加fenflag=1,时间报警函数里边fenflag==0被置换成fenflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
- minutanshi--;//分钟十位数先赋值再减减
- if(minutanshi==-1)//判断分钟十位数设定值是否达到6
- minutanshi=5;//分钟十位数归5
- LCD1602DisplayShiDigitResolve(0x03,minutanshi);//LCD1602字符型液晶显示器第二行第4个位置的分钟十位显示位的显示数
- WriteCommand(0x80+0x40+0x03);//写入LCD1602字符型液晶显示器第二行第7个位置的分钟十位显示位
- fen=minutanshi*10+minutange;//移位修改分钟十位显示位的数值后,需要通过分钟十位显示位的数值加上分钟个位显示位的数值之和赋给分钟变量,才能在修改分钟个位或十位显示位的数值后重新计时。(原因:分钟个位或十位显示位的数值是在分钟的数值上分解得来,当分钟个位或十位显示位的数值发生变化后,分钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
- break;
- case 5://调时按键S1按键第五次按下
- shiflag=1;//时钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留shiflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加shiflag=1,时间报警函数里边shiflag==0被置换成shiflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
- hourge--;//时钟个位数先赋值再减减
- if(hourge==-1)//判断时钟个位数设定值是否达到-1
- hourge=3;//时钟个位数归3
- LCD1602DisplayGeDigitResolve(0x01,hourge);//LCD1602字符型液晶显示器第二行第2个位置的时钟个位显示位的显示数
- WriteCommand(0x80+0x40+0x01);//写入LCD1602字符型液晶显示器第二行第2个位置的时钟个位显示位
- shi=hourshi*10+hourge;//移位修改时钟个位显示位的数值后,需要通过时钟十位显示位的数值加上时钟个位显示位的数值之和赋给时钟变量,才能在修改时钟个位或十位显示位的数值后重新计时。(原因:时钟个位或十位显示位的数值是在时钟的数值上分解得来,当时钟个位或十位显示位的数值发生变化后,时钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
- break;
- case 6://调时按键S1按键第六次按下
- shiflag=1;//时钟标志位变量置1,在时间报警函数执行后但不报警的情况下,时间报警函数里边余留shiflag==0,当操作调时按键扫描函数调时时,会发生在调时过程中触发时间报警条件而报警,因此在调时按键扫描函数里边添加shiflag=1,时间报警函数里边shiflag==0被置换成shiflag=1,很好地解决了在操作调时按键扫描函数调时时,在调时过程中触发时间报警条件而报警的问题。
- hourshi--;//时钟十位数先赋值再减减
- if(hourshi==-1)//判断时钟十位数设定值是否达到-1
- hourshi=2;//时钟十位数归2
- LCD1602DisplayShiDigitResolve(0x00,hourshi);//LCD1602字符型液晶显示器第二行第1个位置的时钟十位显示位的显示数
- WriteCommand(0x80+0x40+0x00);//写入LCD1602字符型液晶显示器第二行第1个位置的时钟十位显示位
- shi=hourshi*10+hourge;//移位修改时钟十位显示位的数值后,需要通过时钟十位显示位的数值加上时钟个位显示位的数值之和赋给时钟变量,才能在修改时钟个位或十位显示位的数值后重新计时。(原因:时钟个位或十位显示位的数值是在时钟的数值上分解得来,当时钟个位或十位显示位的数值发生变化后,时钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
- break;
- default:
- S1num=0;//调时按键S1按键按下次数清零,可以反复操作调时按键。
- break;
- }
- }
- }
- }
- }
- void SumKeyScan()//总按键扫描函数
- {
- if(S4==0)//判断启停按键S4是否按下
- {
- Delay(5);//延时
- if(S4==0)//再次判断启停按键S4是否按下
- {
- S4num++;//启停按键S4按下次数先赋值再加加
- while(!S4);//等待启停按键S4弹起
- if(S4num==1)//判断启停按键S4是否第一次按下过,实现直接停止。
- {
- qitingflag=1;//启停标志位变量置1,用来启动时间报警函数和温度报警函数和设时按键扫描函数和设温按键扫描函数和调时按键扫描函数和秒钟显示两位数分解函数和分钟显示两位数分解函数和时钟显示两位数分解函数和温度分解函数和温度显示函数。
- TR0=1;//启动定时器0
- }
- if(S4num==2&&settimedisplayflag==0&&settemperaturedisplayflag==0&&tiaotimedisplayflag==0&&timebaojingflag==0)//判断启停按键S4是否第二次按下过及设时显示标志位变量是否为0和设温显示标志位变量是否为0和调时显示标志位变量是否为0和时间报警标志位变量是否为0,相当于第一次按下启停键启动后,在没有按其他按键的情况下,第二次按下启停键就停止。
- {
- qitingflag=1;//启停标志位变量置1,用来启动时间报警函数和温度报警函数和设时按键扫描函数和设温按键扫描函数和调时按键扫描函数和秒钟显示两位数分解函数和分钟显示两位数分解函数和时钟显示两位数分解函数和温度分解函数和温度显示函数,相当于总开关。
- TR0=0;//关定时器0
- S4num=0;//启停按键S4按下次数清零,可以反复操作启停按键。
- settimedisplayflag=1;//设时显示标志位变量置1,限制操作设时按键扫描函数。
- settemperaturedisplayflag=1;//设温显示标志位变量置1,限制操作设温按键扫描函数。
- tiaotimedisplayflag=1;//调时显示标志位变量置1,限制操作调时按键扫描函数。
- }
- if(S4num==1&&settimedisplayflag==1&&settemperaturedisplayflag==1&&tiaotimedisplayflag==1)//判断启停按键S4是否第一次按下过以及调时显示标志位变量为1及设温显示标志位变量是否为1和调时显示标志位变量是否为1,相当于第一次按下启停键启动后,第二次按下启停键停止后,在没有按其他按键的情况下,第三次按下启停键就启动。
- {
- qitingflag=1;//启停标志位变量置1,用来启动时间报警函数和温度报警函数和设时按键扫描函数和设温按键扫描函数和调时按键扫描函数和秒钟显示两位数分解函数和分钟显示两位数分解函数和时钟显示两位数分解函数和温度分解函数和温度显示函数,相当于总开关。
- TR0=1;//启动定时器0
- S4num=1;//启停按键S4按下次数置1,为下一次按下启停键实现停止做准备。
- settimedisplayflag=0;//设时显示标志位变量置0,可操作设时按键扫描函数。
- settemperaturedisplayflag=0;//设温显示标志位变量置0,可操作设温按键扫描函数。
- tiaotimedisplayflag=0;//调时显示标志位变量置0,可操作调时按键扫描函数。
- }
- if(S4num==2&&timebaojingflag==1)//判断启停按键S4是否第二次按下过及时间报警标志位变量是否为1,相当于时间报警解除。
- {
- TR0=1;//开定时器0
- S4num=1;//启停按键S4按下次数置1,为下一次按下启停键实现停止做准备。
- timebaojingflag=0;//时间报警标志位变量置0,释放时间报警标志位。
- setsecondge=0;//设时秒钟个位变量变0,释放设时秒钟个位标志位。
- setsecondshi=0;//设时秒钟十位变量变0,释放设时秒钟十位标志位。
- setminutange=0;//设时分钟个位变量变0,释放设时分钟个位标志位。
- setminutanshi=0;//设时分钟十位变量变0,释放设时分钟十位标志位。
- sethourge=0;//设时时钟个位变量变0,释放设时时钟个位标志位。
- sethourshi=0;//设时时钟十位变量变0,释放设时时钟十位标志位。
- WriteCommand(0x80+0x07);//LCD1602字符型液晶显示器第一行第七个(从第零开始数)显示位,即设时秒钟个位。
- WriteData(0x30+setsecondge);//0x30表示字符库的数字0,整个代码表示设时秒钟个位显示0。
- WriteCommand(0x80+0x06);//LCD1602字符型液晶显示器第一行第七个(从第零开始数)显示位,即设时秒钟十位。
- WriteData(0x30+setsecondshi);//0x30表示字符库的数字0,整个代码表示设时秒钟十位显示0。
- WriteCommand(0x80+0x04);//LCD1602字符型液晶显示器第一行第七个(从第零开始数)显示位,即设时分钟个位。
- WriteData(0x30+setminutange);//0x30表示字符库的数字0,整个代码表示设时分钟个位显示0。
- WriteCommand(0x80+0x03);//LCD1602字符型液晶显示器第一行第七个(从第零开始数)显示位,即设时分钟十位。
- WriteData(0x30+setminutanshi);//0x30表示字符库的数字0,整个代码表示设时分钟十位显示0。
- WriteCommand(0x80+0x01);//LCD1602字符型液晶显示器第一行第七个(从第零开始数)显示位,即设时时钟个位。
- WriteData(0x30+sethourge);//0x30表示字符库的数字0,整个代码表示设时时钟个位显示0。
- WriteCommand(0x80+0x00);//LCD1602字符型液晶显示器第一行第七个(从第零开始数)显示位,即设时时钟十位。
- WriteData(0x30+sethourshi);//0x30表示字符库的数字0,整个代码表示设时时钟十位显示0。
- S2numflag=0;//增加键标志位变量置0,释放增加键标志位。
- S3numflag=0;//减少键标志位变量置0,释放减少键标志位。
- TR0flag=0;//定时器0标志位变量置0
- settimedisplayflag=0;//设时显示标志位变量置0,释放设时显示标志位。
- settemperaturedisplayflag=0;//设温显示标志位变量置0,释放设温显示标志位。
- tiaotimedisplayflag=0;//调时显示标志位变量置0,释放调时显示标志位。
- setsecondflag=0;//设时秒钟标志位变量置0,释放设时秒钟标志位。
- setminutanflag=0;//设时分钟标志位变量置0,释放设时分钟标志位。
- sethourflag=0;//设时时钟标志位变量置0,释放设时时钟标志位。
- }
- if(S4num==2&&temperatruebaojingflag==1)//判断启停按键S4是否第二次按下过及温度报警标志位变量是否为1,相当于温度报警解除。
- {
- TR0=1;//开定时器0
- S4num=1;//启停按键S4按下次数置1,为下一次按下启停键实现停止做准备。
- temperatruebaojingflag=0;//温度报警标志位变量置0,释放温度报警标志位。
- setwenduxiaoshu=0;//设温小数位变量置0,释放设温小数位标志位。
- setwenduge=0;//设温个位变量置0,释放设温个位标志位。
- setwendushi=0;//设温十位变量置0,释放设温十位标志位。
- setwendubai=0;//设温百位变量置0,释放设温百位标志位。
- WriteCommand(0x80+0x09);//LCD1602字符型液晶显示器第一行第七个(从第零开始数)显示位,即设时秒钟个位。
- WriteData(0x30+setwendubai);//0x30表示字符库的数字0,整个代码表示设时秒钟个位显示0。
- WriteCommand(0x80+0x0A);//LCD1602字符型液晶显示器第一行第七个(从第零开始数)显示位,即设时秒钟十位。
- WriteData(0x30+setwendushi);//0x30表示字符库的数字0,整个代码表示设时秒钟十位显示0。
- WriteCommand(0x80+0x0B);//LCD1602字符型液晶显示器第一行第七个(从第零开始数)显示位,即设时分钟个位。
- WriteData(0x30+setwenduge);//0x30表示字符库的数字0,整个代码表示设时分钟个位显示0。
- WriteCommand(0x80+0x0D);//LCD1602字符型液晶显示器第一行第七个(从第零开始数)显示位,即设时分钟十位。
- WriteData(0x30+setwenduxiaoshu);//0x30表示字符库的数字0,整个代码表示设时分钟个位显示0。
- S2numflag=0;//增加键标志位变量置0,释放增加键标志位。
- S3numflag=0;//减少键标志位变量置0,释放减少键标志位。
- settemperatureflag=0;//设温标志位变量置0,释放设温标志位。
- settimedisplayflag=0;//设时显示标志位变量置0,释放设时显示标志位。
- settemperaturedisplayflag=0;//设温显示标志位变量置0,释放设温显示标志位。
- tiaotimedisplayflag=0;//调时显示标志位变量置0,释放调时显示标志位。
- temperaturedisplayflag=0;//温度显示标志位变量等于0,释放温度显示标志位。
- }
- if(S4num>=2&&settemperaturedisplayflag==1&&tiaotimedisplayflag==1)//判断启停按键S1是否第二或二以上次按下过及设温显示标志位变量为1及调时显示标志位变量为1,相当于设时启动。
- {
- S4num=1;//启停按键S4按下次数置1,为下一次按下启停键实现停止做准备。
- Snum=0;//设时按键S0按下次数清零,可以反复操作设时按键。
- TR0=1;//启动定时器0
- TR0flag=1;//定时器0标志位变量置1,进入时间报警函数判断是否可执行时间报警。
- WriteCommand(0x0c);//关光标(或字符)闪烁
- settemperaturedisplayflag=0;//设温显示标志位变量置0,释放设温显示标志位。
- tiaotimedisplayflag=0;//调时显示标志位变量置0,释放调时显示标志位。
- lcd1602displaytimeflag=0;//液晶显示器显示时间标志位变量等于0,释放液晶显示器显示时间标志位。
- temperaturedisplayflag=0;//温度显示标志位变量置0,释放温度显示标志位。
- }
- if(S4num>=2&&settimedisplayflag==1&&tiaotimedisplayflag==1)//判断启停按键S1是否第二或二以上次按下过及设时显示标志位变量为1及调时显示标志位变量为1,相当于设温启动。
- {
- S4num=1;//启停按键S4按下次数置1,为下一次按下启停键实现停止做准备。
- S0num=0;//设温按键S0按下次数清零,可以反复操作设温按键。
- TR0=1;//启动定时器0
- WriteCommand(0x0c);//关光标(或字符)闪烁
- settemperatureflag=1;//设温标志位变量置1,进入温度报警函数判断是否可执行温度报警。
- settimedisplayflag=0;//设时显示标志位变量置0,释放设时显示标志位。
- tiaotimedisplayflag=0;//调时显示标志位变量置0,释放调时显示标志位。
- lcd1602displaytimeflag=0;//液晶显示器显示时间标志位变量等于0,释放液晶显示器显示时间标志位。
- temperaturedisplayflag=0;//温度显示标志位变量置0,释放温度显示标志位。
- }
- if(S4num>=2&&settimedisplayflag==1&&settemperaturedisplayflag==1)//判断启停按键S0是否第二或二以上次按下过及设时显示标志位变量为1和设温显示标志位变量为1,相当于调时启动。
- {
- S4num=1;//启停按键S4按下次数置1,为下一次按下启停键实现停止做准备。
- S1num=0;//调时按键S1按下次数清零,可以反复操作调时按键。
- TR0=1;//启动定时器0
- WriteCommand(0x0c);//关光标(或字符)闪烁
- settimedisplayflag=0;//设时显示标志位变量置0,释放设时显示标志位。
- settemperaturedisplayflag=0;//设温显示标志位变量置0,释放设温显示标志位。
- lcd1602displaytimeflag=0;//液晶显示器显示时间标志位变量置0,释放液晶显示器显示时间标志位。
- temperaturedisplayflag=0;//温度显示标志位变量置0,释放温度显示标志位。
- miaoflag=0;//秒钟标志位变量置0,释放秒钟标志位。
- fenflag=0;//分钟标志位变量置0,释放分钟标志位。
- shiflag=0;//时钟标志位变量置0,释放时钟显示标志位。
- }
- }
- }
- }
- void Timer0() interrupt 1//定时器0中断函数
- {
- TH0=(65536-50000)/256;//TH0重新装值
- TL0=(65536-50000)%256;//TL0重新装值
- count++;//定时器0中断次数先赋值再加
- if(count==18)//判断定时器0中断次数是否为18次
- {
- count=0;//定时器0中断次数归零
- miao++;//秒钟先赋值再加
- if(miao==60)//判断秒钟是否达到60秒
- {
- miao=0;//秒钟归零
- fen++;//分钟先赋值再加
- if(fen==60)//判断分钟是否达到60分
- {
- fen=0;//分钟归零
- shi++;//时钟先赋值再加
- if(shi==24)//判断时钟是否达到24时
- {
- shi=0;//时钟归零
- }
- // LCD1602DisplayTime(0x00,shi);//时钟显示两位数分解函数
- }
- // LCD1602DisplayTime(0x03,fen);//分钟显示两位数分解函数
- }
- // LCD1602DisplayTime(0x06,miao);//秒钟显示两位数分解函数
- }
- }
- void DS18B20_Delay(uint i)//微妙级延时函数
- {
- while(i--);
- }
- void FengNingQi_Alarm(uint t)//蜂鸣器报警函数
- {
- uint x,y;
- for(x=0;x<t;x++)
- {
- for(y=0;y<50;y++);
- FengNingQi=~FengNingQi ;//蜂鸣器按位取反FengNingQi
- }
- }
- bit DS18B20Init()//DS18B20初始化函数
- {
- uchar x=0;
- DQ = 1;//单片机将DS18B20通信端口DQ拉高复位
- DS18B20_Delay(8);//稍做延时
- DQ = 0;//单片机将DS18B20通信端口DQ拉低
- DS18B20_Delay(80);//延时在480us与960us之间
- DQ = 1;//单片机将DS18B20通信端口DQ拉高
- DS18B20_Delay(4);//延时在15us与60us之间
- x=DQ;//稍做延时后,如果x=0,则初始化成功,若x=1则初始化失败。
- DS18B20_Delay(20);//延时在60us与240us之间
- return x;
- }
- void DS18B20_WriteOneByte(uchar j)//DS18b20写一个字节函数
- {
- uchar i=0;
- for (i=8; i>0; i--)//单片机向DS18B20写入数据
- {
- DQ = 0;//单片机将DS18B20通信端口DQ从高电平拉至低电平时,单片机向DS18B20写数据开始。
- DQ = j&0x01;//单片机按将字节低位写入DS18B20
- DS18B20_Delay(5);//延时在60us与120us之间
- DQ = 1;//单片机将DS18B20通信端口DQ拉高
- j>>=1;//变量j右移一位,最高位补零。例如当j=1,换成二进制是0000 0001,右移一位就是0000 000。扩展:单片机无符号或有符号数左移几位,高位就依次补几位0,低位也依次去掉几位,让左移几位依次代替低位去掉的几位。单片机有符号数,如果是正数,右移几位,先是确定最高位用0,低位也依次去掉几位,让右移几位依次代替低位去掉的几位,如果是负数,右移几位,先是确定最高位用1,低位也依次去掉几位,让右移几位依次代替低位去掉的几位。
- }
- }
- uchar DS18B20_ReadOneByte()//DS18B20读一个字节函数
- {
- uchar i=0;
- uchar j = 0;
- for (i=8;i>0;i--)//单片机读取DS18B20采集的温度数据转换成一个字节
- {
- DQ = 0;//单片机将DS18B20通信端口DQ从高电平拉成低电平时,单片机读取DS18B20所采集到温度数据开始。
- j>>=1;//变量j右移一位,最高位补零。例如当j=1,换成二进制是0000 0001,右移一位就是0000 000。扩展:单片机无符号或有符号数左移几位,高位就依次补几位0,低位也依次去掉几位,让左移几位依次代替低位去掉的几位。单片机有符号数,如果是正数,右移几位,先是确定最高位用0,低位也依次去掉几位,让右移几位依次代替低位去掉的几位,如果是负数,右移几位,先是确定最高位用1,低位也依次去掉几位,让右移几位依次代替低位去掉的几位。
- DQ = 1;//单片机将DS18B20通信端口DQ拉高
- if(DQ)//判断DQ是否等于1
- j|=0x80;//若DQ=1,则让当前j最高位为1,在下次循环中移位至次高位,最后达到从低位到高位接收的目的;若DQ=0,则可跳过此语句,直接在下次循环对byte进行移位补0。
- DS18B20_Delay(4);//稍做延时
- }
- return j;
- }
- uint DS18B20_ReadTemperature()//单片机读取DS18b20当前温度
- {
- uchar L=0;//定义温度值低8位变量
- uchar H=0;//定义温度值高8位变量
- DS18B20Init( );//DS18B20初始化函数
- DS18B20_WriteOneByte(0xcc);//单片机只连一个DS18B20温度传感器时,可写该段代码,表示单片机向DS18B20写入跳过读DS18B20序号列号指令。
- DS18B20_WriteOneByte(0x44);//单片机向DS18B20九字节暂存器(包括两个字节储温温度寄存器、一字节高温触发器、一字节低温触发器、一字节温度精度转换配置寄存器、三个字节的保留位、一字节DS18B20的64位ROM前56位编码校验CRC发生器)中前两个字节温度寄存器写入启动DS18B20温度转换指令
- // DS18B20_Delay(100);//稍作延时
- DS18B20Init( );//DS18B20初始化函数
- DS18B20_WriteOneByte(0xcc);//单片机只连一个DS18B20温度传感器时,可写该段代码,表示单片机向DS18B20写入跳过读DS18B20序号列号指令。
- DS18B20_WriteOneByte(0xbe);//单片机向DS18B20九字节暂存器(包括两个字节储温温度寄存器、一字节高温触发器、一字节低温触发器、一字节温度精度转换配置寄存器、三个字节的保留位、一字节DS18B20的64位ROM前56位编码校验CRC发生器)中前两个字节温度寄存器写入读取温度的指令
- // DS18B20_Delay(100);//稍作延时
- L=DS18B20_ReadOneByte( );//单片机向DS18B20发送读取温度值低8位指令,把读到的温度值低8位赋给温度值低8位变量
- H=DS18B20_ReadOneByte( );//单片机向DS18B20发送读取温度值高8位指令,把读到的温度值高8位赋给温度值高8位变量
- temperature = H;//DS18B20读到的温度值高8位赋给温度值变量,变成高8位温度值变量,还不是一个温度值变量,由于一个温度值变量是由高8位低8位共16位组成。
- temperature = temperature << 8;//温度值高8位变量左移8位,就可以变成一个只有高8位低8位全0的温度值变量。
- temperature = temperature | L;//只有高8位低8位全0的温度值变量与温度值低8位变量或运算后就变成一个真正有高8位低8位共16位的温度值变量
- if(temperature>0x0fff)//判断表示温度寄存器16位二进制数的温度值变量是否大于表示温度寄存器16位二进制数的正温度值,假若大于且当表示温度寄存器16位二进制数的温度值变量的前5位二进制数全为1时,该温度值变量表示负温度值。
- {
- temperature = ~temperature+2;//负温度值
- temperatureflag=1;//负温度标志变量等于1
- }
- else
- {
- temperatureflag=0;//负温度标志变量等于0
- }
- temperature = temperature*0.0625*10;//扩大10倍的温度值
- return temperature;//返回扩大10倍的温度值
- }
- void TemperatureFenJie()//LCD1602的温度显示函数
- {
- wendu=DS18B20_ReadTemperature();//DS18B20读到的温度值赋给温度值变量
- if(temperatureflag==1)//判断负温度标志变量是否等于1
- {
- fuhaowei=0x2d;//负符号
- wendubai=wendu/1000;//温度值百位
- wendushi=wendu%1000/100;//温度值十位
- wenduge=wendu%100/10;//温度值个位
- xiaoshudian=0x2e;//小数点
- wenduxiaoshu=wendu%10;//小数位
- }
- else
- {
- fuhaowei=0x2b;//正符号
- if(wendu==0)//判断温度是否等于0
- {
- fuhaowei=0x20;//无符号
- }
- wendubai=wendu/1000;//温度值百位
- wendushi=wendu%1000/100;//温度值十位
- wenduge=wendu%100/10;//温度值个位
- xiaoshudian=0x2e;//小数点
- wenduxiaoshu=wendu%10;//小数位
- }
- }
- void TemperatureDisplay()//LCD1602的温度显示函数
- {
- WriteCommand(0x80+0x48);//LCD1602字符型液晶显示器第二行第九个(从第零开始数)显示位
- WriteData(fuhaowei);//符号位显示。
- WriteData(0x30+wendubai);//0x30表示字符库的数字0,整个代码表示温度值百位可显示0到9的数字。
- WriteData(0x30+wendushi);//0x30表示字符库的数字0,整个代码表示温度值十位可显示0到9的数字。
- WriteData(0x30+wenduge);//0x30表示字符库的数字0,整个代码表示温度值个位可显示0到9的数字。
- WriteData(xiaoshudian);//小数点
- WriteData(0x30+wenduxiaoshu);//0x30表示字符库的数字0,整个代码表示小数位可显示0到9的数字。
- WriteData(0xdf);//0xdf表示字符库中摄氏度左上角的符号
- WriteData(0x43);//0x43表示字符库中大写字母C
- }
- // void SetAlarmTemperatrueFenJie(uint alarmwendu)
- //{
- // fuhaowei=0x20;//无符号
- // alarmwendubai=alarmwendu/1000;//温度值百位
- // alarmwendushi=alarmwendu%1000/100;//温度值十位
- // alarmwenduge=alarmwendu%100/10;//温度值个位
- // alarmxiaoshu=alarmwendu%10;//小数位
- // }
- void SetTemperatrueInit()//设温初始化函数
- {
- WriteCommand(0x80+0x08);//LCD1602字符型液晶显示器第一行第九个(从第零开始数)显示位
- WriteData(fuhaowei);//符号位显示。
- WriteData(0x30+setwendubai);//0x30表示字符库的数字0,整个代码表示设温百位变量可显示0到9的数字。
- WriteData(0x30+setwendushi);//0x30表示字符库的数字0,整个代码表示设温十位变量可显示0到9的数字。
- WriteData(0x30+setwenduge);//0x30表示字符库的数字0,整个代码表示设温个位变量可显示0到9的数字。
- WriteData(0x2e);//小数点
- WriteData(0x30+setwenduxiaoshu);//0x30表示字符库的数字0,整个代码表示设温小数位变量可显示0到9的数字。
- WriteData(0xdf);//0xdf表示字符库中摄氏度左上角的符号
- WriteData(0x43);//0x43表示字符库中大写字母C
-
- }
- void SetTimeInit()//设时初始化函数
- {
- WriteCommand(0x80+0x00);//LCD1602字符型液晶显示器第一行第0个(从第零开始数)显示位
- WriteData(0x30+sethourshi);//0x30表示字符库的数字0,整个代码表示设时十位变量可显示0到9的数字。
- WriteData(0x30+sethourge);//0x30表示字符库的数字0,整个代码表示设时个位变量可显示0到9的数字。
- WriteData(0x3a);//0x3a表示字符库中冒号
- WriteData(0x30+setminutanshi);//0x30表示字符库的数字0,整个代码表示设分十位变量可显示0到9的数字。
- WriteData(0x30+setminutange);//0x30表示字符库的数字0,整个代码表示设分个位变量可显示0到9的数字。
- WriteData(0x3a);//0x3a表示字符库中冒号
- WriteData(0x30+setsecondshi);//0x30表示字符库的数字0,整个代码表示设秒十位位变量可显示0到9的数字。
- WriteData(0x30+setsecondge);//0x30表示字符库的数字0,整个代码表示设秒个位位变量可显示0到9的数字。
- }
- void TimeBaoJing()//时间报警函数
- {
- if(S2numflag==1||S3numflag==1)//判断增加键标志位变量是否为1或减少键标志位变量是否为1
- {
- if(setsecondflag==1&&setminutanflag==0&&sethourflag==0&&setsecond>0&&TR0flag==1&&miaoflag==0)//判断设时秒钟标志位变量是否为1和设时分钟标志位变量是否为0和设时时钟标志位变量是否为0和设时秒钟是否大于0和定时器0标志位变量是否等于1和秒钟标志位变量置是否为0
- {
- if(miao==setsecond)//判断走时秒钟是否等于设时秒钟
- {
- timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
- TR0=0;//关定时器0
- }
- }
- if(setminutanflag==1&&setsecondflag==0&&sethourflag==0&&setminutan>0&&TR0flag==1&&fenflag==0)//判断设时分钟标志位变量是否为1和设时秒钟标志位变量是否为0和设时时钟标志位变量是否为0和设时分钟是否大于0和定时器0标志位变量是否等于1和分钟标志位变量置是否为0
- {
- if(fen==setminutan)//判断走时分钟是否等于设时分钟
- {
- timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
- TR0=0;//关定时器0
- }
- }
- if(sethourflag==1&&setsecondflag==0&&setminutanflag==0&&sethour>0&&TR0flag==1&&shiflag==0)//判断设时时钟标志位变量是否为1和设时秒钟标志位变量是否为0和设时分钟标志位变量是否为0设时时钟是否大于0和定时器0标志位变量是否等于1和时钟标志位变量置是否为0
- {
- if(shi==sethour)//判断走时时钟是否等于设时时钟
- {
- timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
- TR0=0;//关定时器0
- }
- }
- if(setsecondflag==1&&setminutanflag==1&&setsecond>0&&setminutan>0&&TR0flag==1&&miaoflag==0&&fenflag==0)//判断设时秒钟标志位变量是否为1和设时分钟标志位变量是否为1和设时秒钟是否大于0和设时分钟是否大于0和定时器0标志位变量是否等于1和秒钟标志位变量置是否为0和分钟标志位变量是否为0
- {
- if(miao==setsecond&&fen==setminutan)//判断走时秒钟和分钟是否等于设时秒钟和分钟
- {
- timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
- TR0=0;//关定时器0
- }
- }
- if(setsecondflag==1&&sethourflag==1&&setsecond>0&&sethour>0&&TR0flag==1&&miaoflag==0&&shiflag==0)//判断设时秒钟标志位变量是否为1和设时时钟标志位变量是否为1和设时秒钟是否大于0和设时时钟是否大于0和定时器0标志位变量是否等于1和秒钟标志位变量是否为0和时钟标志位变量是否为0
- {
- if(miao==setsecond&&shi==sethour)//判断走时秒钟和时钟是否等于设时秒钟和时钟
- {
- timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
- TR0=0;//关定时器0
- }
- }
- if(setminutanflag==1&&sethourflag==1&&setminutan>0&&sethour>0&&TR0flag==1&&fenflag==0&&shiflag==0)//判断设时分钟标志位变量是否为1和设时时钟标志位变量是否为1和设时分钟是否大于0和设时时钟是否大于0和定时器0标志位变量是否等于1和分钟标志位变量是否为0和时钟标志位变量是否为0
- {
- if(fen==setminutan&&shi==sethour)//判断走时分钟和时钟是否等于设时分钟和时钟
- {
- timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
- TR0=0;//关定时器0
- }
- }
- 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
- {
- if(miao==setsecond&&fen==setminutan&&shi==sethour)//判断走时秒钟和分钟和时钟是否都等于设时秒钟和分钟和时钟
- {
- timebaojingflag=1;//时间报警标志位变量置1,进行时间报警。
- TR0=0;//关定时器0
- }
- }
- }
- }
- void TemperatrueBaoJing()//温度报警函数
- {
- if(S2numflag==1||S3numflag==1)//判断增加键标志位变量是否为1或减少键标志位变量是否为1
- {
- if(settemperatureflag==1)//判断设温标志位变量是否为1
- {
- if(wendu-10>settemperature)//判断温度变量减10后是否大于设温变量,其中的10分别表示设温个位数1与设温小数位0,实际上表示1摄氏度,相当于温差报警温度,这么做的原因是因为设温数值和温度数值都带有小数,通过数值取整运算,把设温数值和温度数值换算成整数来计算温差,这样便于处理设温数值与温度数值的温差值。
- {
- temperatruebaojingflag=1;//温度报警标志位变量置1,进行温度报警。
- TR0=0;//关定时器0
- }
- }
- if(wendu<10&&settemperatureflag==1)//判断温度变量是否小于10和设温标志位变量是否为1,其中的10分别表示设温个位数1与设温小数位0,实际上表示1摄氏度,相当于温差报警温度,这么做的原因是因为设温数值和温度数值都带有小数,通过数值取整运算,把设温数值和温度数值换算成整数来计算温差,这样便于处理设温数值与温度数值的温差值。
- {
- temperatruebaojingflag=0;//温度报警标志位变量置0,不进行温度报警。
- TR0=1;//开定时器0
- }
- }
- }
- void main()//主函数
- {
- LCD1602Init();//LCD1602字符型液晶显示器初始化函数
- Timer0Init();//定时器0初始化函数
- LCD1602Display();//LCD1602字符型液晶显示器显示函数
- DS18B20Init();//DS18B20初始化函数
- SetTimeInit();//设时初始化函数
- SetTemperatrueInit();//设温初始化函数
- while(1)//死循环
- {
- SumKeyScan();//总按键扫描函数
- if(qitingflag==1)//判断启停标志位变量是否为1
- {
- TimeBaoJing();//时间报警函数
- if(timebaojingflag==1)//判断时间报警标志位变量置是否为1
- {
- FengNingQi_Alarm(80);//报警
- settimedisplayflag=1;//设时显示标志位变量置1,限制操作设时按键扫描函数。
- settemperaturedisplayflag=1;//设温显示标志位变量置1,限制操作设温按键扫描函数。
- tiaotimedisplayflag=1;//调时显示标志位变量置1,限制操作调时按键扫描函数。
- }
- TemperatrueBaoJing();//温度报警函数
- if(temperatruebaojingflag==1)//判断温度报警标志位变量是否为1
- {
- FengNingQi_Alarm(80);//报警
- settimedisplayflag=1;//设时显示标志位变量置1,限制操作设时按键扫描函数。
- settemperaturedisplayflag=1;//设温显示标志位变量置1,限制操作设温按键扫描函数。
- tiaotimedisplayflag=1;//调时显示标志位变量置1,限制操作调时按键扫描函数。
- temperaturedisplayflag=1;//温度显示标志位变量置1,限制操作温度分解函数和温度显示函数。
- }
- if(settimedisplayflag==0)//判断设时显示标志位变量是否等于0
- {
- SetTimeKeyScan();//设时按键扫描函数
- }
- if(settemperaturedisplayflag==0)//判断设温标志位变量是否等于0
- {
- SetTemperatureKeyScan();//设温按键扫描函数
- }
- if(tiaotimedisplayflag==0)//判断调时标志位变量是否等于0
- {
- TiaoTimeKeyScan();//调时按键扫描函数
- }
- // SetAlarmTemperatrueFenJie(alarmwendu);
- if(lcd1602displaytimeflag==0)//判断液晶显示器显示时间标志位变量是否等于0
- {
- if(miao<=60)//判断秒钟变量是否小于等于60
- LCD1602DisplayTime(0x06,miao);//秒钟显示两位数分解函数
- if(fen<=60)//判断分钟变量是否小于等于60
- LCD1602DisplayTime(0x03,fen);//分钟显示两位数分解函数
- if(shi<=24)//判断时钟变量是否小于等于24
- LCD1602DisplayTime(0x00,shi);//时钟显示两位数分解函数
- }
- if(temperaturedisplayflag==0)//判断温度显示标志位变量是否等于0
- {
- TemperatureFenJie();//温度分解函数
- TemperatureDisplay();//温度显示函数
- }
- }
- }
- }
复制代码
|