51单片机智能时钟设计
2020-02-17 来源:51hei
控制系统直接通过STC 8a8k64s4a12 单片机控制两组4位的数码管进行显示,使用DS1302时钟芯片进行获取时钟数据,使用DS18b20,获取温度信息,通过HC-05 蓝牙模块进行与手机app通讯,手机app由App Inventor 2编写 可以实现闹钟、用户设置数据的掉电保存,联机自动校时等功能。
作品实物如图所示:
数码管驱动:
#include #include #include uchar code shuzi[]={ 0xc0,//0 0xf9,//1 0xa4,//2 0xb0,//3 0x99,//4 0x92,//5 0x82,//6 0xf8,//7 0x80,//8 0x90,//9 0x88,//A 0x83,//B 11 0xc6,//C 12 0xa1,//D 0x86,//E 0x8e,//F 0x8c,//P 16 0x40,//0. 0x79,//1. 0x24,//2. 0x30,//3. 0x19,//4. 0x12,//5. 0x02,//6. 0x78,//7. 0x00,//8. 0x10,//9. 0xbf,//- 27 0xff,// 熄灭 28 0x7f,//. 29 0x88,//A 30 0xc7,//L 31 0x87,//t 32 0x86,//E 33 0x8c,//P 34 0x83,//b 35 0x8b,//h 36 0x8e,//F 37 0xc8,//N 38 0x9c,//小圈 39 0xc1,//v 40 }; /*********************************************************************************************************** * 函数名称: xianshi() * 输入参数:uchar,uchar,uchar,uchar,uchar,uchar,uchar,uchar * 输出参数: void * * 功 能: 数码管驱动程序 * * 备 注:驱动8位数码管、形参的值对应数组shuzi里的位 、第几位形参对应数码管的位 * * 完成时间: 2019.12.25 ************************************************************************************************************/ void xianshi(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar g,uchar h)////公阴 { P2=0xff-shuzi[a]; wei1=0; delay(2); wei1=1; P2=0xff-shuzi[b]; wei2=0; delay(2); wei2=1; P2=0xff-shuzi[c]; wei3=0; delay(2); wei3=1; P2=0xff-shuzi[d]; wei4=0; delay(2); wei4=1; P2=0xff-shuzi[e]; wei5=0; delay(2); wei5=1; P2=0xff-shuzi[f]; wei6=0; delay(2); wei6=1; P2=0xff-shuzi[g]; wei7=0; delay(2); wei7=1; P2=0xff-shuzi[h]; wei8=0; delay(2); wei8=1; } /*********************************************************************************************************** * 函数名称: xianshi5() * 输入参数:uchar,uchar,uchar,uchar,uchar * 输出参数: void * * 功 能: 数码管驱动程序 * * 备 注:驱动5位数码管、形参的值对应数组shuzi里的位 、第几位形参对应数码管的位、显示周期短 * * * 完成时间: 2019.12.25 ************************************************************************************************************/ void xianshi5(uchar d,uchar e,uchar f,uchar g,uchar h)////公阴 { wei1=wei2=wei3=1; P2=0xff-shuzi[d]; wei4=0; delay(2); wei4=1; P2=0xff-shuzi[e]; wei5=0; delay(2); wei5=1; P2=0xff-shuzi[f]; wei6=0; delay(2); wei6=1; P2=0xff-shuzi[g]; wei7=0; delay(2); wei7=1; P2=0xff-shuzi[h]; wei8=0; delay(2); wei8=1; } ds1302驱动: #include #include #include uchar shijian[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};//时间缓存数组 /*********************************************************************************************************** * 函数名称: xie1302() * 输入参数:uchar * 输出参数: void * * 功 能: 写1302时序 * * 备 注:向DS1302中写入形参 * * * 完成时间: 2019.12.25 ************************************************************************************************************/ void xie1302(uchar dat)//写1302时序 { uchar i; SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备 delayus(2); //稍微等待,使硬件做好准备 for(i=0;i<8;i++) { IO=dat&0x01;//取出dat的第0位数据写入1302 delayus(2); //稍微等待,使硬件做好准备 SCLK=1; //上升沿写入数据 delayus(2); //稍微等待,使硬件做好准备3 SCLK=0; //重新拉低SCLK,形成脉冲 dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位 } } /*********************************************************************************************************** * 函数名称: du1302() * 输入参数:void * 输出参数: uchar * * 功 能:读1302时序 * * 备 注:将读到的数据输出 * * * 完成时间: 2019.12.25 ************************************************************************************************************/ uchar du1302(void)//读1302时序 { uchar i,dat; delayus(2); //稍微等待,使硬件做好准备 for(i=0;i<8;i++) { dat>>=1;//将dat的各数据位右移1位,因为先读出的是字节的最低位 if(IO==1) //如果读出的数据是1 dat|=0x80; //将1取出,写在dat的最高位 SCLK=1; //将SCLK置于高电平,为下降沿读出 delayus(2); //稍微等待,使硬件做好准备 SCLK=0; //拉低SCLK,形成脉冲下降沿 delayus(2); //稍微等待,使硬件做好准备 } return dat; //将读出的数据返回 } /*********************************************************************************************************** * 函数名称:xiemingling1302() * 输入参数:uchar ,uchar * 输出参数: void * * 功 能:向ds1302写指令、写数据 * * 备 注:实际上是调用两次xie1302(),分别写入指令、数据 * * * 完成时间: 2019.12.25 ************************************************************************************************************/ void xiemingling1302(uchar cmd,uchar dat)//写命令 数据 { CE=0;//禁止数据传递 SCLK=0; //确保写数据前SCLK被拉低 CE=1; //启动数据传输 delayus(2); //稍微等待,使硬件做好准备 xie1302(cmd); //写入命令字 xie1302(dat); //写数据 SCLK=1; //将时钟电平置于已知状态 CE=0; //禁止数据传递 } /*********************************************************************************************************** * 函数名称: dumingling1302() * 输入参数: uchar * 输出参数: uchar * * 功 能:向ds1302写指令、读数据 * * 备 注:实际上是调用一次xie1302()一次du1302(),分别写入指令、读出数据 * * * 完成时间: 2019.12.25 ************************************************************************************************************/ uchar dumingling1302(uchar cmd) { uchar dat; CE=0; //拉低RST SCLK=0; //确保写数居前SCLK被拉低 CE=1; //启动数据传输 xie1302(cmd); //写入命令字 dat=du1302(); //读出数据 SCLK=1; //将时钟电平置于已知状态 CE=0; //禁止数据传递 return dat; //将读出的数据返回 } /*********************************************************************************************************** * 函数名称: zhuanhuan() * 输入参数: void * 输出参数: void * * 功 能:读ds1302的时钟数据,并转换之后缓存在shijian[]数组的相应的位 * * 备 注:实际上是分别读取ds1302的周、秒、分钟、小时、日、月、年信息,并根据数据手册取出其相应的位进行存储 * * * 完成时间: 2019.12.25 ************************************************************************************************************/ void zhuanhuan()//转换 { uchar a,b,c,d,e,f,g; g=dumingling1302(0x8B);//周 f=dumingling1302(0x81);//秒 e=dumingling1302(0x83);//分钟 d=dumingling1302(0x85);//小时 c=dumingling1302(0x87);//日 b=dumingling1302(0x89);//月 a=dumingling1302(0x8D);//年 shijian[12]=(g&0x07);//周转化个位 shijian[11]=(f&0x0f);//秒转化个位 shijian[10]=(f&0x70)>>4;//秒转化十位 shijian[9]=(e&0x0f);//分钟转化个位 shijian[8]=(e&0x70)>>4;//分钟转化十位 shijian[7]=(d&0x0f);//小时转化个位 shijian[6]=(d&0x30)>>4;//小时转化十位 shijian[5]=(c&0x0f);//日转化个位 shijian[4]=(c&0x70)>>4;//日转化十位 shijian[3]=(b&0x0f);//月转化个位 shijian[2]=(b&0x10)>>4;//月转化十位 shijian[1]=(a&0x0f);//年转化个位 shijian[0]=(a>>4);//年转化十位 } /*********************************************************************************************************** * 函数名称: xieshijian() * 输入参数: uchar ,uchar ,uchar ,uchar ,uchar , uchar ,uchar * 输出参数: void * * 功 能:向DS1302写入时钟数据 * * 备 注:无 * * * 完成时间: 2019.12.25 ************************************************************************************************************/ void xieshijian(uchar nian,uchar yue,uchar ri,uchar shi,uchar fen, uchar miao,uchar zhou) { xiemingling1302(0x8E,0x00);//根据写状态寄存器命令字, 写入不保护指令 xiemingling1302(0x80,((miao/10)<<4|(miao%10))); //根据写秒寄存器命令字,写入秒的初始值 xiemingling1302(0x82,((fen/10)<<4|(fen%10))); //根据写分寄存器命令字,写入分的初始值 xiemingling1302(0x84,((shi/10)<<4|(shi%10))); // 根据写小时寄存器命令字,写入小时的初始值 xiemingling1302(0x86,((ri/10)<<4|(ri%10))); // 根据写日寄存器命令字,写入日的初始值 xiemingling1302(0x88,((yue/10)<<4|(yue%10))); // 根据写月寄存器命令字,写入月的初始值 xiemingling1302(0x8c,((nian/10)<<4|(nian%10))); //根据写年寄存器命令字,写入年的初始值 xiemingling1302(0x8B,((zhou/10)<<4|(zhou%10))); //根据写周寄存器命令字,写入周的初始值 } ds18b20驱动: #include '18b20.h' #include #include int wendu;//温度信息 bit deng=0;//等待标志位 /*********************************************************************************************************** * 函数名称: DS18b20Init() * 输入参数:void * 输出参数: void * * 功 能: ds18b20初始化程序 * * 备 注:无 * * * 完成时间: 2019.12.25 ************************************************************************************************************/ void DS18b20Init() { if(deng==0) { DQ = 0; //将总线拉低480us~960us Delay640us(); DQ = 1; //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低 deng=1; } if(DQ&&deng==1) //等待DS18B20拉低总线 { deng=0; Delay60us(); } } /*********************************************************************************************************** * 函数名称: DS18b20WriteByte() * 输入参数:uchar * 输出参数: void * * 功 能: ds18b20写数据程序 * * 备 注:注意时间的把握 * * * 完成时间: 2019.12.25 ************************************************************************************************************/ void DS18b20WriteByte(uchar dat) { uint i; for(i=0; i<8; i++) { DQ = 0; //每写入一位数据之前先把总线拉低1us Delay1us(); DQ = dat & 0x01; //然后写入一个数据,从最低位开始 Delay68us(); DQ = 1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值 dat >>= 1; } } /*********************************************************************************************************** * 函数名称: DS18b20ReadByte() * 输入参数: void * 输出参数: uchar * * 功 能: ds18b20读数据程序 * * 备 注:注意时间的把握 * * * 完成时间: 2019.12.25 ************************************************************************************************************/ uchar DS18b20ReadByte() { uchar byte, bi; uint i; for(i=8; i>0; i--) { DQ = 0;//先将总线拉低1us Delay1us(); DQ = 1;//然后释放总线 Delay6us(); bi = DQ; //读取数据,从最低位开始读取 /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/ byte = (byte >> 1) | (bi << 7); Delay48us(); //读取完之后等待48us再接着读取下一个数 } return byte; } /*********************************************************************************************************** * 函数名称: DS18b20ChangTemp() * 输入参数: void * 输出参数: void * * 功 能: 向ds18b20写启动温度转换命令 * * 备 注: * * * 完成时间: 2019.12.25 ************************************************************************************************************/ void DS18b20ChangTemp() { DS18b20Init(); Delay100us(); DS18b20WriteByte(0xcc); //跳过ROM操作命令 DS18b20WriteByte(0x44); //温度转换命令 } /*********************************************************************************************************** * 函数名称: DS18b20ReadTempCom() * 输入参数: void * 输出参数: void * * 功 能: 向ds18b20写读取温度命令 * * 备 注: * * * 完成时间: 2019.12.25 ************************************************************************************************************/ void DS18b20ReadTempCom() { DS18b20Init(); Delay100us(); DS18b20WriteByte(0xcc); //跳过ROM操作命令 DS18b20WriteByte(0xbe); //发送读取温度命令 } /*********************************************************************************************************** * 函数名称: DS18b20ReadTemp() * 输入参数: void * 输出参数: int * * 功 能: 读取ds18b20温度 * * 备 注:读取ds18b20温度,并返回出来 * * * 完成时间: 2019.12.25 ************************************************************************************************************/ int DS18b20ReadTemp() { int temp = 0; uchar tmh, tml; DS18b20ChangTemp(); //先写入转换命令 DS18b20ReadTempCom(); //然后等待转换完后发送读取温度命令 tml = DS18b20ReadByte(); //读取温度值共16位,先读低字节 tmh = DS18b20ReadByte(); //再读高字节 temp = tmh; temp <<= 8; temp |= tml; if(tmh>0x07) { temp=~temp+1; temp=temp*6.25; temp=temp+5; temp=temp/10; temp=temp+10000; } else { temp=temp*6.25; temp=temp+5; temp=temp/10; } return temp; } /*********************************************************************************************************** * 函数名称: xianshiwendu() * 输入参数: void * 输出参数: void * * 功 能: 转换温度数据 * * 备 注:无 * * * 完成时间: 2019.12.25 ************************************************************************************************************/ void xianshiwendu() { wendu=DS18b20ReadTemp(); if(wendu<10000) xianshi5(28,wendu%1000/100,wendu%100/10+17,wendu%10,12); if(wendu>10000) xianshi5(27,wendu%1000/100,wendu%100/10+17,wendu%10,12); } 菜单程序(主要逻辑): #include #include #include #include #include #include #include #include #include <18b20.H> extern uchar shijian[13]; extern uint ms1;//用于闪烁计时 extern uint ms2;//用于按键长按快加计时 extern uint ms4;//用于循环显示计时 bit changan=0;//长按标志位 uint n=0;//计算平年闰年 uint y=0;//计算月份 bit runnian=1; //闰年标志位 uchar yue=0;//大月标志位 1大月 2 2月 0小月 uchar tiaozheng[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};//调整时间数据暂存数组 uchar cd=0;//菜单 bit aj1,aj2,aj3,aj4; extern int nao_kaiguan,nao_shi,nao_fen,nao2_kaiguan,nao2_shi,nao2_fen,wendu_kaiguan;//eeprom数据 bit s;//闹钟1、2切换标志位 extern int wendu;//温度信息 /*********************************************************************************************************** * 函数名称: caidan() * 输入参数: void * 输出参数: void * * 功 能: 菜单程序 * * 备 注: 该程序是本作品的核心 *0级菜单用于正常显示时间、日期、温度; *1级菜单用于闪烁全部的时间(提示是否修改) *2级菜单用于显示日期的全部闪烁(提示是否修改) *3级菜单用于闪烁al(提示是否修改闹钟信息) *4级菜单用于闪烁temp(提示是否修改温度开关) *5级菜单预留 *10级菜单用于闪烁小时位 *11级菜单用于闪烁分钟位 *12级菜单用于闪烁秒位 *13级级菜单用于闪烁年位 *14级菜单用于闪烁月位 *15级级菜单用于闪烁日位 *16级菜单用于闪烁闹钟一的开关 *17级级菜单用于闪烁闹钟一的时位 *18级菜单用于闪烁闹钟一的分位 *19级级菜单用于闪烁温度的开关 *20级菜单用于闪烁闹钟一闹钟二选择位 *21级菜单用于闪烁闹钟二的开关 *22级菜单用于闪烁闹钟二的时位 *23级菜单用于闪烁闹钟二的分位 * * * 完成时间: 2019.12.25 ************************************************************************************************************/ void caidan() { zhuanhuan();//获取时间信息 naozhong();//检测闹钟 if(cd==0)//0级菜单 { if(ms4>0&&ms4<10000) xianshi(shijian[6],shijian[7],27,shijian[8],shijian[9],27,shijian[10],shijian[11]); if(ms4>10000&&ms4<10100) wendu=DS18b20ReadTemp(); if(ms4>10100&&ms4<15000) xianshi(2,0,shijian[0],shijian[1]+17,shijian[2],shijian[3]+17,shijian[4],shijian[5]); if(wendu_kaiguan==0&&ms4>15000) ms4=0; if(ms4>15200&&ms4<20000) xianshiwendu(); if(ms4>20000) ms4=0; if(anjian1==0&&aj1==0) { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) aj1=0,cd=1,ms1=0;//按键1按下松开,去1级菜单 } if(cd==1)//1级菜单 闪烁全部时间 { if(ms1>0&&ms1<300) xianshi(shijian[6],shijian[7],27,shijian[8],shijian[9],27,shijian[10],shijian[11]); if(ms1>300&&ms1<600) xianshi(28,28,27,28,28,27,28,28); if(ms1>600) ms1=0; if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) aj1=0,cd=2,ms1=0;//按键1按下松开,去2级菜单 if(anjian2==0&&aj2==0)//检测按键2 { delay(5); if(anjian2==0) aj2=1; } if(anjian2==1&&aj2==1) { tiaozheng[0]=shijian[0]; tiaozheng[1]=shijian[1]; tiaozheng[2]=shijian[2]; tiaozheng[3]=shijian[3]; tiaozheng[4]=shijian[4]; tiaozheng[5]=shijian[5]; tiaozheng[6]=shijian[6]; tiaozheng[7]=shijian[7]; tiaozheng[8]=shijian[8]; tiaozheng[9]=shijian[9]; tiaozheng[10]=shijian[10]; tiaozheng[11]=shijian[11]; aj2=0; cd=10; ms1=0;//按键2按下松开,去10级菜单 } } if(cd==2)//2级菜单 闪烁全部日期 { if(ms1>0&&ms1<300) xianshi(2,0,shijian[0],shijian[1]+17,shijian[2],shijian[3]+17,shijian[4],shijian[5]); if(ms1>300&&ms1<600) xianshi(28,28,28,29,28,29,28,28); if(ms1>600) ms1=0; if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) aj1=0,cd=3,ms1=0;//按键1按下松开,去3级菜单 if(anjian2==0&&aj2==0)//检测按键2 { delay(5); if(anjian2==0) aj2=1; } if(anjian2==1&&aj2==1) { tiaozheng[0]=shijian[0]; tiaozheng[1]=shijian[1]; tiaozheng[2]=shijian[2]; tiaozheng[3]=shijian[3]; tiaozheng[4]=shijian[4]; tiaozheng[5]=shijian[5]; tiaozheng[6]=shijian[6]; tiaozheng[7]=shijian[7]; tiaozheng[8]=shijian[8]; tiaozheng[9]=shijian[9]; tiaozheng[10]=shijian[10]; tiaozheng[11]=shijian[11]; aj2=0; cd=13; ms1=0;//按键2按下松开,去13级菜单 } } if(cd==3)//3级菜单 显示al闹钟 { if(ms1>0&&ms1<300) xianshi(27,27,27,30,31,27,27,27); if(ms1>300&&ms1<600) xianshi(27,27,27,28,28,27,27,27); if(ms1>600) ms1=0; if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) aj1=0,cd=4,ms1=0;//按键1按下松开,去4级菜单 if(anjian2==0&&aj2==0)//检测按键2 { delay(5); if(anjian2==0) aj2=1; } if(anjian2==1&&aj2==1) { aj2=0; cd=20; dunaozhong();//读取闹钟数据 ms1=0;//按键2按下松开,去20级菜单 } } if(cd==4)//4级菜单 显示temp 温度 { if(ms1>0&&ms1<300) xianshi(27,27,32,33,34,33,27,27); if(ms1>300&&ms1<600) xianshi(27,27,28,28,28,28,27,27); if(ms1>600) ms1=0; if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) aj1=0,cd=0,ms1=0;//按键1按下松开,去0级菜单 if(anjian2==0&&aj2==0)//检测按键2 { delay(5); if(anjian2==0) aj2=1; } if(anjian2==1&&aj2==1) { aj2=0; cd=19; wendu_kaiguan=IapRead(0x0800); ms1=0;//按键2按下松开,去19级菜单 } } if(cd==5)//5级菜单 预留 { // if(ms1>0&&ms1<300) xianshi(27,27,35,31,32,36,27,27); // if(ms1>300&&ms1<600) xianshi(27,27,28,28,28,28,27,27); // if(ms1>600) ms1=0; // // if(anjian1==0&&aj1==0)//检测按键1 // { // delay(5); // if(anjian1==0) aj1=1; // } // if(anjian1==1&&aj1==1) aj1=0,cd=0,ms1=0;//按键1按下松开,去0级菜单 // if(anjian2==0&&aj2==0)//检测按键2 // { // delay(5); // if(anjian2==0) aj2=1; // } // if(anjian2==1&&aj2==1) // { // aj2=0; // cd=20;//按键2按下松开,去20级菜单 // } } while(cd==10)//10级菜单 小时位闪烁调整 { if(ms1>0&&ms1<300) xianshi(tiaozheng[6],tiaozheng[7],27,tiaozheng[8],tiaozheng[9],27,tiaozheng[10],tiaozheng[11]); if(ms1>300&&ms1<600) xianshi(28,28,27,tiaozheng[8],tiaozheng[9],27,tiaozheng[10],tiaozheng[11]); if(ms1>600) ms1=0; if(ms1>300&&changan==1) ms1=0; if(anjian3==0&&aj3==0)//检测按键3 { delay(5); if(anjian3==0) aj3=1,ms2=0; } if(anjian3==1&&aj3==1) { tiaozheng[7]++; if((tiaozheng[6]==2)&&(tiaozheng[7]==4)) tiaozheng[6]=tiaozheng[7]=0; if(((tiaozheng[6]==0)||(tiaozheng[6]==1))&&(tiaozheng[7]==10)) tiaozheng[6]++,tiaozheng[7]=0; changan=0; aj3=0;//按键1按下松开,小时++ } if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj3==1&&changan==1&&ms2>=100)//快加 { tiaozheng[7]++; if((tiaozheng[6]==2)&&(tiaozheng[7]==4)) tiaozheng[6]=tiaozheng[7]=0; if(((tiaozheng[6]==0)||(tiaozheng[6]==1))&&(tiaozheng[7]==10)) tiaozheng[6]++,tiaozheng[7]=0; ms2=0; } if(anjian4==0&&aj4==0)//检测按键4 { delay(5); if(anjian4==0) aj4=1,ms2=0; } if(anjian4==1&&aj4==1) { tiaozheng[7]--; if((tiaozheng[6]==0)&&(tiaozheng[7]>100)) tiaozheng[6]=2,tiaozheng[7]=3; if(((tiaozheng[6]==2)||(tiaozheng[6]==1))&&(tiaozheng[7]>100)) tiaozheng[6]--,tiaozheng[7]=9; changan=0; aj4=0;//按键1按下松开,小时-- } if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj4==1&&changan==1&&ms2>=100)//快减 { tiaozheng[7]--; if((tiaozheng[6]==0)&&(tiaozheng[7]>100)) tiaozheng[6]=2,tiaozheng[7]=3; if(((tiaozheng[6]==2)||(tiaozheng[6]==1))&&(tiaozheng[7]>100)) tiaozheng[6]--,tiaozheng[7]=9; ms2=0; } if(anjian2==0&&aj2==0)//检测按键2 { delay(5); if(anjian2==0) aj2=1; } if(anjian2==1&&aj2==1) { aj2=0; cd=11; ms1=0;//按键2按下松开,去11级菜单 } if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) { aj1=0; cd=2; xieshijian(tiaozheng[0]*10+tiaozheng[1],tiaozheng[2]*10+tiaozheng[3],tiaozheng[4]*10+tiaozheng[5],tiaozheng[6]*10+tiaozheng[7],tiaozheng[8]*10+tiaozheng[9],tiaozheng[10]*10+tiaozheng[11],shijian[12]); ms1=0;//按键1按下松开,去2级菜单 } } while(cd==11)//11级菜单 分钟位闪烁调整 { if(ms1>0&&ms1<300) xianshi(tiaozheng[6],tiaozheng[7],27,tiaozheng[8],tiaozheng[9],27,tiaozheng[10],tiaozheng[11]); if(ms1>300&&ms1<600) xianshi(tiaozheng[6],tiaozheng[7],27,28,28,27,tiaozheng[10],tiaozheng[11]); if(ms1>600) ms1=0; if(ms1>300&&changan==1) ms1=0; if(anjian3==0&&aj3==0)//检测按键3 { delay(5); if(anjian3==0) aj3=1,ms2=0; } if(anjian3==1&&aj3==1) { tiaozheng[9]++; if(tiaozheng[9]==10) tiaozheng[8]++,tiaozheng[9]=0; if(tiaozheng[8]==6) tiaozheng[8]=tiaozheng[9]=0; changan=0; aj3=0;//按键1按下松开,小时++ } if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj3==1&&changan==1&&ms2>=100)//快加 { tiaozheng[9]++; if(tiaozheng[9]==10) tiaozheng[8]++,tiaozheng[9]=0; if(tiaozheng[8]==6) tiaozheng[8]=tiaozheng[9]=0; ms2=0; } if(anjian4==0&&aj4==0)//检测按键4 { delay(5); if(anjian4==0) aj4=1,ms2=0; } if(anjian4==1&&aj4==1) { tiaozheng[9]--; if(tiaozheng[9]>100) tiaozheng[8]--,tiaozheng[9]=9; if(tiaozheng[8]>100) tiaozheng[8]=5,tiaozheng[9]=9; changan=0; aj4=0;//按键1按下松开,小时-- } if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj4==1&&changan==1&&ms2>=100)//快减 { tiaozheng[9]--; if(tiaozheng[9]>100) tiaozheng[8]--,tiaozheng[9]=9; if(tiaozheng[8]>100) tiaozheng[8]=5,tiaozheng[9]=9; ms2=0; } if(anjian2==0&&aj2==0)//检测按键2 { delay(5); if(anjian2==0) aj2=1; } if(anjian2==1&&aj2==1) { aj2=0; cd=12; ms1=0;//按键2按下松开,去12级菜单 } if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) { aj1=0; cd=2; xieshijian(tiaozheng[0]*10+tiaozheng[1],tiaozheng[2]*10+tiaozheng[3],tiaozheng[4]*10+tiaozheng[5],tiaozheng[6]*10+tiaozheng[7],tiaozheng[8]*10+tiaozheng[9],tiaozheng[10]*10+tiaozheng[11],shijian[12]); ms1=0;//按键1按下松开,去2级菜单 } } while(cd==12)//12级菜单 秒位闪烁调整 { if(ms1>0&&ms1<300) xianshi(tiaozheng[6],tiaozheng[7],27,tiaozheng[8],tiaozheng[9],27,tiaozheng[10],tiaozheng[11]); if(ms1>300&&ms1<600) xianshi(tiaozheng[6],tiaozheng[7],27,tiaozheng[8],tiaozheng[9],27,28,28); if(ms1>600) ms1=0; if(ms1>300&&changan==1) ms1=0; if(anjian3==0&&aj3==0)//检测按键3 { delay(5); if(anjian3==0) aj3=1,ms2=0; } if(anjian3==1&&aj3==1) { tiaozheng[11]++; if(tiaozheng[11]==10) tiaozheng[10]++,tiaozheng[11]=0; if(tiaozheng[10]==6) tiaozheng[10]=tiaozheng[11]=0; changan=0; aj3=0;//按键1按下松开,小时++ } if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj3==1&&changan==1&&ms2>=100)//快加 { tiaozheng[11]++; if(tiaozheng[11]==10) tiaozheng[10]++,tiaozheng[11]=0; if(tiaozheng[10]==6) tiaozheng[10]=tiaozheng[11]=0; ms2=0; } if(anjian4==0&&aj4==0)//检测按键4 { delay(5); if(anjian4==0) aj4=1,ms2=0; } if(anjian4==1&&aj4==1) { tiaozheng[11]--; if(tiaozheng[11]>100) tiaozheng[10]--,tiaozheng[11]=9; if(tiaozheng[10]>100) tiaozheng[10]=5,tiaozheng[11]=9; changan=0; aj4=0;//按键1按下松开,小时-- } if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj4==1&&changan==1&&ms2>=100)//快减 { tiaozheng[11]--; if(tiaozheng[11]>100) tiaozheng[10]--,tiaozheng[11]=9; if(tiaozheng[10]>100) tiaozheng[10]=5,tiaozheng[11]=9; ms2=0; } if(anjian2==0&&aj2==0)//检测按键2 { delay(5); if(anjian2==0) aj2=1; } if(anjian2==1&&aj2==1) { aj2=0; cd=10; ms1=0;//按键2按下松开,去10级菜单 } if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) { aj1=0; cd=2; xieshijian(tiaozheng[0]*10+tiaozheng[1],tiaozheng[2]*10+tiaozheng[3],tiaozheng[4]*10+tiaozheng[5],tiaozheng[6]*10+tiaozheng[7],tiaozheng[8]*10+tiaozheng[9],tiaozheng[10]*10+tiaozheng[11],shijian[12]); ms1=0;//按键1按下松开,去2级菜单 } } while(cd==13)//第13级菜单 年位闪烁 { if(ms1>0&&ms1<300) xianshi(2,0,tiaozheng[0],tiaozheng[1]+17,tiaozheng[2],tiaozheng[3]+17,tiaozheng[4],tiaozheng[5]); if(ms1>300&&ms1<600) xianshi(28,28,28,29,tiaozheng[2],tiaozheng[3]+17,tiaozheng[4],tiaozheng[5]); if(ms1>600) ms1=0; if(ms1>300&&changan==1) ms1=0; if(anjian3==0&&aj3==0)//检测按键3 { delay(5); if(anjian3==0) aj3=1,ms2=0; } if(anjian3==1&&aj3==1) { tiaozheng[1]++; if(tiaozheng[1]==10) tiaozheng[0]++,tiaozheng[1]=0; if(tiaozheng[0]==10) tiaozheng[0]=tiaozheng[1]=0; changan=0; aj3=0;//按键1按下松开,小时++ } if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj3==1&&changan==1&&ms2>=100)//快加 { tiaozheng[1]++; if(tiaozheng[1]==10) tiaozheng[0]++,tiaozheng[1]=0; if(tiaozheng[0]==10) tiaozheng[0]=tiaozheng[1]=0; ms2=0; } if(anjian4==0&&aj4==0)//检测按键4 { delay(5); if(anjian4==0) aj4=1,ms2=0; } if(anjian4==1&&aj4==1) { tiaozheng[1]--; if(tiaozheng[1]>100) tiaozheng[0]--,tiaozheng[1]=9; if(tiaozheng[0]>100) tiaozheng[0]=9,tiaozheng[1]=9; changan=0; aj4=0;//按键1按下松开,小时-- } if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj4==1&&changan==1&&ms2>=100)//快减 { tiaozheng[1]--; if(tiaozheng[1]>100) tiaozheng[0]--,tiaozheng[1]=9; if(tiaozheng[0]>100) tiaozheng[0]=9,tiaozheng[1]=9; ms2=0; } if(anjian2==0&&aj2==0)//检测按键2 { delay(5); if(anjian2==0) aj2=1; } if(anjian2==1&&aj2==1) { aj2=0; cd=14; ms1=0;//按键2按下松开,去14级菜单 } if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) { aj1=0; cd=3; xieshijian(tiaozheng[0]*10+tiaozheng[1],tiaozheng[2]*10+tiaozheng[3],tiaozheng[4]*10+tiaozheng[5],tiaozheng[6]*10+tiaozheng[7],tiaozheng[8]*10+tiaozheng[9],tiaozheng[10]*10+tiaozheng[11],shijian[12]); ms1=0;//按键1按下松开,去3级菜单 } } while(cd==14)//第14级菜单 月位闪烁 { if(ms1>0&&ms1<300) xianshi(2,0,tiaozheng[0],tiaozheng[1]+17,tiaozheng[2],tiaozheng[3]+17,tiaozheng[4],tiaozheng[5]); if(ms1>300&&ms1<600) xianshi(2,0,tiaozheng[0],tiaozheng[1]+17,28,28,tiaozheng[4],tiaozheng[5]); if(ms1>600) ms1=0; if(ms1>300&&changan==1) ms1=0; if(anjian3==0&&aj3==0)//检测按键3 { delay(5); if(anjian3==0) aj3=1,ms2=0; } if(anjian3==1&&aj3==1) { tiaozheng[3]++; if(tiaozheng[3]==10) tiaozheng[2]++,tiaozheng[3]=0; if(tiaozheng[2]==1&&tiaozheng[3]==3) tiaozheng[2]=0,tiaozheng[3]=1; changan=0; aj3=0;//按键1按下松开,小时++ } if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj3==1&&changan==1&&ms2>=100)//快加 { tiaozheng[3]++; if(tiaozheng[3]==10) tiaozheng[2]++,tiaozheng[3]=0; if(tiaozheng[2]==1&&tiaozheng[3]==3) tiaozheng[2]=0,tiaozheng[3]=1; ms2=0; } if(anjian4==0&&aj4==0)//检测按键4 { delay(5); if(anjian4==0) aj4=1,ms2=0; } if(anjian4==1&&aj4==1) { tiaozheng[3]--; if(tiaozheng[3]>100) tiaozheng[2]--,tiaozheng[3]=9; if(tiaozheng[2]==0&&tiaozheng[3]==0) tiaozheng[2]=1,tiaozheng[3]=2; changan=0; aj4=0;//按键1按下松开,小时-- } if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj4==1&&changan==1&&ms2>=100)//快减 { tiaozheng[3]--; if(tiaozheng[3]>100) tiaozheng[2]--,tiaozheng[3]=9; if(tiaozheng[2]==0&&tiaozheng[3]==0) tiaozheng[2]=1,tiaozheng[3]=2; ms2=0; } if(anjian2==0&&aj2==0)//检测按键2 { delay(5); if(anjian2==0) aj2=1; } if(anjian2==1&&aj2==1) { aj2=0; cd=15; n=2000+tiaozheng[0]*10+tiaozheng[1];//计算平年闰年 y=tiaozheng[2]*10+tiaozheng[3]; if((n%4==0)&&(n%100!=0)) runnian=1; //闰年标志位 else runnian=0; if(y==1||y==3||y==5||y==7||y==8||y==10||y==12) yue=1;//大月标志位 else if(y==2) yue=2;//2月标志位 else yue=0;//小月标志位 ms1=0;//按键2按下松开,去15级菜单 } if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) { aj1=0; cd=3; xieshijian(tiaozheng[0]*10+tiaozheng[1],tiaozheng[2]*10+tiaozheng[3],tiaozheng[4]*10+tiaozheng[5],tiaozheng[6]*10+tiaozheng[7],tiaozheng[8]*10+tiaozheng[9],tiaozheng[10]*10+tiaozheng[11],shijian[12]); ms1=0;//按键1按下松开,去3级菜单 } } while(cd==15)//第15级菜单 日位闪烁 { if(ms1>0&&ms1<300) xianshi(2,0,tiaozheng[0],tiaozheng[1]+17,tiaozheng[2],tiaozheng[3]+17,tiaozheng[4],tiaozheng[5]); if(ms1>300&&ms1<600) xianshi(2,0,tiaozheng[0],tiaozheng[1]+17,tiaozheng[2],tiaozheng[3]+17,28,28); if(ms1>600) ms1=0; if(ms1>300&&changan==1) ms1=0; if(anjian3==0&&aj3==0)//检测按键3 { delay(5); if(anjian3==0) aj3=1,ms2=0; } if(anjian3==1&&aj3==1) { tiaozheng[5]++; if(tiaozheng[5]==10) tiaozheng[4]++,tiaozheng[5]=0; if(runnian==1&&yue==2&&tiaozheng[4]==3) tiaozheng[4]=0,tiaozheng[5]=1; if(runnian==0&&yue==2&&tiaozheng[4]==2&&tiaozheng[5]==9) tiaozheng[4]=0,tiaozheng[5]=1; if(yue==1&&tiaozheng[4]==3&&tiaozheng[5]==2) tiaozheng[4]=0,tiaozheng[5]=1; if(yue==0&&tiaozheng[4]==3&&tiaozheng[5]==1) tiaozheng[4]=0,tiaozheng[5]=1; changan=0; aj3=0;//按键1按下松开,日++ } if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj3==1&&changan==1&&ms2>=100)//快加 { tiaozheng[5]++; if(tiaozheng[5]==10) tiaozheng[4]++,tiaozheng[5]=0; if(runnian==1&&yue==2&&tiaozheng[4]==3) tiaozheng[4]=0,tiaozheng[5]=1; if(runnian==0&&yue==2&&tiaozheng[4]==2&&tiaozheng[5]==9) tiaozheng[4]=0,tiaozheng[5]=1; if(yue==1&&tiaozheng[4]==3&&tiaozheng[5]==2) tiaozheng[4]=0,tiaozheng[5]=1; if(yue==0&&tiaozheng[4]==3&&tiaozheng[5]==1) tiaozheng[4]=0,tiaozheng[5]=1; ms2=0; } if(anjian4==0&&aj4==0)//检测按键4 { delay(5); if(anjian4==0) aj4=1,ms2=0; } if(anjian4==1&&aj4==1) { tiaozheng[5]--; if(tiaozheng[5]>100) tiaozheng[4]--,tiaozheng[5]=9; if(runnian==1&&yue==2&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=2,tiaozheng[5]=9; if(runnian==0&&yue==2&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=2,tiaozheng[5]=8; if(yue==1&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=3,tiaozheng[5]=1; if(yue==0&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=3,tiaozheng[5]=0; changan=0; aj4=0;//按键1按下松开,日-- } if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj4==1&&changan==1&&ms2>=100)//快减 { tiaozheng[5]--; if(tiaozheng[5]>100) tiaozheng[4]--,tiaozheng[5]=9; if(runnian==1&&yue==2&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=2,tiaozheng[5]=9; if(runnian==0&&yue==2&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=2,tiaozheng[5]=8; if(yue==1&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=3,tiaozheng[5]=1; if(yue==0&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=3,tiaozheng[5]=0; ms2=0; } if(anjian2==0&&aj2==0)//检测按键2 { delay(5); if(anjian2==0) aj2=1; } if(anjian2==1&&aj2==1) { aj2=0; cd=13; ms1=0;//按键2按下松开,去13级菜单 } if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) { aj1=0; cd=3; xieshijian(tiaozheng[0]*10+tiaozheng[1],tiaozheng[2]*10+tiaozheng[3],tiaozheng[4]*10+tiaozheng[5],tiaozheng[6]*10+tiaozheng[7],tiaozheng[8]*10+tiaozheng[9],tiaozheng[10]*10+tiaozheng[11],shijian[12]); ms1=0;//按键1按下松开,去3级菜单 } } while(cd==16)//菜单16 设置闹钟1开关 { if(nao_kaiguan==0) { if(ms1>0&&ms1<300) xianshi(30,31,1,27,27,0,37,37); if(ms1>300&&ms1<600) xianshi(30,31,1,27,27,28,28,28); if(ms1>600) ms1=0; } if(nao_kaiguan==1) { if(ms1>0&&ms1<300) xianshi(30,31,1,27,27,27,0,38); if(ms1>300&&ms1<600) xianshi(30,31,1,27,27,27,28,28); if(ms1>600) ms1=0; } if(anjian3==0&&aj3==0)//检测按键3 { delay(5); if(anjian3==0) aj3=1; } if(anjian3==1&&aj3==1) { aj3=0; nao_kaiguan++; } if(anjian4==0&&aj4==0)//检测按键4 { delay(5); if(anjian4==0) aj4=1; } if(anjian4==1&&aj4==1) { aj4=0; nao_kaiguan++; } if(nao_kaiguan>1) nao_kaiguan=0; if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) { aj1=0; cd=4; IapErase(0x0200); IapProgram(0x0200, nao_kaiguan);//写开关值 } if(anjian2==0&&aj2==0)//检测按键2 { delay(5); if(anjian2==0) aj2=1; } if(anjian2==1&&aj2==1) { aj2=0; cd=17;//去菜单17 IapErase(0x0200); IapProgram(0x0200, nao_kaiguan);//写开关值 } } while(cd==17)//菜单17 设置闹钟1 时 { if(ms1>0&&ms1<300) xianshi(27,nao_shi/10,nao_shi%10,27,27,nao_fen/10,nao_fen%10,27); if(ms1>300&&ms1<600) xianshi(27,28,28,27,27,nao_fen/10,nao_fen%10,27); if(ms1>600) ms1=0; if(ms1>300&&changan==1) ms1=0; if(anjian3==0&&aj3==0)//检测按键3 { delay(5); if(anjian3==0) aj3=1,ms2=0; } if(anjian3==1&&aj3==1) { nao_shi++; if(nao_shi==25) nao_shi=0; changan=0; aj3=0;//按键1按下松开,小时++ } if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj3==1&&changan==1&&ms2>=100)//快加 { nao_shi++; if(nao_shi==25) nao_shi=0; ms2=0; } if(anjian4==0&&aj4==0)//检测按键4 { delay(5); if(anjian4==0) aj4=1,ms2=0; } if(anjian4==1&&aj4==1) { nao_shi--; if(nao_shi<0) nao_shi=24; changan=0; aj4=0;//按键1按下松开,小时-- } if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj4==1&&changan==1&&ms2>=100)//快减 { nao_shi--; if(nao_shi<0) nao_shi=24; ms2=0; } if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) { aj1=0; cd=4; IapErase(0x0400); IapProgram(0x0400, nao_shi);//写小时值 } if(anjian2==0&&aj2==0)//检测按键2 { delay(5); if(anjian2==0) aj2=1; } if(anjian2==1&&aj2==1) { aj2=0; cd=18;//去菜单18 IapErase(0x0400); IapProgram(0x0400, nao_shi);//写小时值 } } while(cd==18)//菜单18 设置闹钟1 分 { if(ms1>0&&ms1<300) xianshi(27,nao_shi/10,nao_shi%10,27,27,nao_fen/10,nao_fen%10,27); if(ms1>300&&ms1<600) xianshi(27,nao_shi/10,nao_shi%10,27,27,28,28,27); if(ms1>600) ms1=0; if(ms1>300&&changan==1) ms1=0; if(anjian3==0&&aj3==0)//检测按键3 { delay(5); if(anjian3==0) aj3=1,ms2=0; } if(anjian3==1&&aj3==1) { nao_fen++; if(nao_fen==60) nao_fen=0; changan=0; aj3=0;//按键1按下松开,小时++ } if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj3==1&&changan==1&&ms2>=100)//快加 { nao_fen++; if(nao_fen==60) nao_fen=0; ms2=0; } if(anjian4==0&&aj4==0)//检测按键4 { delay(5); if(anjian4==0) aj4=1,ms2=0; } if(anjian4==1&&aj4==1) { nao_fen--; if(nao_fen<0) nao_fen=59; changan=0; aj4=0;//按键1按下松开,小时-- } if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj4==1&&changan==1&&ms2>=100)//快减 { nao_fen--; if(nao_fen<0) nao_fen=59; ms2=0; } if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) { aj1=0; cd=4; IapErase(0x0600); IapProgram(0x0600, nao_fen);//写小时值 } if(anjian2==0&&aj2==0)//检测按键2 { delay(5); if(anjian2==0) aj2=1; } if(anjian2==1&&aj2==1) { aj2=0; cd=20;//去菜单20 IapErase(0x0600); IapProgram(0x0600, nao_fen);//写小时值 } } while(cd==19)//菜单19 设置温度开关 { if(wendu_kaiguan==0) { if(ms1>0&&ms1<300) xianshi(32,33,34,33,27,0,37,37); if(ms1>300&&ms1<600) xianshi(32,33,34,33,27,28,28,28); if(ms1>600) ms1=0; } if(wendu_kaiguan==1) { if(ms1>0&&ms1<300) xianshi(32,33,34,33,27,27,0,38); if(ms1>300&&ms1<600) xianshi(32,33,34,33,27,27,28,28); if(ms1>600) ms1=0; } if(anjian3==0&&aj3==0)//检测按键3 { delay(5); if(anjian3==0) aj3=1; } if(anjian3==1&&aj3==1) { aj3=0; wendu_kaiguan++; } if(anjian4==0&&aj4==0)//检测按键4 { delay(5); if(anjian4==0) aj4=1; } if(anjian4==1&&aj4==1) { aj4=0; wendu_kaiguan++; } if(wendu_kaiguan>1) wendu_kaiguan=0; if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) { aj1=0; cd=0; IapErase(0x0800); IapProgram(0x0800, wendu_kaiguan);//写开关值 } } while(cd==20)//菜单20 选择闹钟1、2 { if(s==0) { if(nao_kaiguan==0) { if(ms1>0&&ms1<300) xianshi(30,31,1,27,27,0,37,37); if(ms1>300&&ms1<600) xianshi(30,31,28,27,27,0,37,37); if(ms1>600) ms1=0; } if(nao_kaiguan==1) { if(ms1>0&&ms1<300) xianshi(30,31,1,27,27,27,0,38); if(ms1>300&&ms1<600) xianshi(30,31,28,27,27,27,0,38); if(ms1>600) ms1=0; } } if(s==1) { if(nao2_kaiguan==0) { if(ms1>0&&ms1<300) xianshi(30,31,2,27,27,0,37,37); if(ms1>300&&ms1<600) xianshi(30,31,28,27,27,0,37,37); if(ms1>600) ms1=0; } if(nao2_kaiguan==1) { if(ms1>0&&ms1<300) xianshi(30,31,2,27,27,27,0,38); if(ms1>300&&ms1<600) xianshi(30,31,28,27,27,27,0,38); if(ms1>600) ms1=0; } } if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) aj1=0,cd=4,ms1=0;//按键1按下松开,去4级菜单 if(anjian2==0&&aj2==0)//检测按键2 { delay(5); if(anjian2==0) aj2=1; } if(anjian2==1&&aj2==1) { aj2=0; if(s==1) cd=21;//按键2按下松开,去21级菜单 if(s==0) cd=16;//按键2按下松开,去16级菜单 } if(anjian3==0&&aj3==0)//检测按键3 { delay(5); if(anjian3==0) aj3=1; } if(anjian3==1&&aj3==1) { aj3=0; s=1; } if(anjian4==0&&aj4==0)//检测按键4 { delay(5); if(anjian4==0) aj4=1; } if(anjian4==1&&aj4==1) { aj4=0; s=0; } } while(cd==21)//菜单21 设置闹钟2开关 { if(nao2_kaiguan==0) { if(ms1>0&&ms1<300) xianshi(30,31,2,27,27,0,37,37); if(ms1>300&&ms1<600) xianshi(30,31,2,27,27,28,28,28); if(ms1>600) ms1=0; } if(nao2_kaiguan==1) { if(ms1>0&&ms1<300) xianshi(30,31,2,27,27,27,0,38); if(ms1>300&&ms1<600) xianshi(30,31,2,27,27,27,28,28); if(ms1>600) ms1=0; } if(anjian3==0&&aj3==0)//检测按键3 { delay(5); if(anjian3==0) aj3=1; } if(anjian3==1&&aj3==1) { aj3=0; nao2_kaiguan++; } if(anjian4==0&&aj4==0)//检测按键4 { delay(5); if(anjian4==0) aj4=1; } if(anjian4==1&&aj4==1) { aj4=0; nao2_kaiguan++; } if(nao2_kaiguan>1) nao2_kaiguan=0; if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) { aj1=0; cd=4; IapErase(0x0c00); IapProgram(0x0c00, nao2_kaiguan);//写开关值 } if(anjian2==0&&aj2==0)//检测按键2 { delay(5); if(anjian2==0) aj2=1; } if(anjian2==1&&aj2==1) { aj2=0; cd=22;//去菜单22 IapErase(0x0c00); IapProgram(0x0c00, nao2_kaiguan);//写开关值 } } while(cd==22)//菜单22 设置闹钟2 时 { if(ms1>0&&ms1<300) xianshi(27,nao2_shi/10,nao2_shi%10,27,27,nao2_fen/10,nao2_fen%10,27); if(ms1>300&&ms1<600) xianshi(27,28,28,27,27,nao2_fen/10,nao2_fen%10,27); if(ms1>600) ms1=0; if(ms1>300&&changan==1) ms1=0; if(anjian3==0&&aj3==0)//检测按键3 { delay(5); if(anjian3==0) aj3=1,ms2=0; } if(anjian3==1&&aj3==1) { nao2_shi++; if(nao2_shi==25) nao2_shi=0; changan=0; aj3=0;//按键1按下松开,小时++ } if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj3==1&&changan==1&&ms2>=100)//快加 { nao2_shi++; if(nao2_shi==25) nao2_shi=0; ms2=0; } if(anjian4==0&&aj4==0)//检测按键4 { delay(5); if(anjian4==0) aj4=1,ms2=0; } if(anjian4==1&&aj4==1) { nao2_shi--; if(nao2_shi<0) nao2_shi=24; changan=0; aj4=0;//按键1按下松开,小时-- } if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj4==1&&changan==1&&ms2>=100)//快减 { nao2_shi--; if(nao2_shi<0) nao2_shi=24; ms2=0; } if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) { aj1=0; cd=4; IapErase(0x0e00); IapProgram(0x0e00, nao2_shi);//写小时值 } if(anjian2==0&&aj2==0)//检测按键2 { delay(5); if(anjian2==0) aj2=1; } if(anjian2==1&&aj2==1) { aj2=0; cd=23;//去菜单23 IapErase(0x0e00); IapProgram(0x0e00, nao2_shi);//写小时值 } } while(cd==23)//菜单23 设置闹钟2 分 { if(ms1>0&&ms1<300) xianshi(27,nao2_shi/10,nao2_shi%10,27,27,nao2_fen/10,nao2_fen%10,27); if(ms1>300&&ms1<600) xianshi(27,nao2_shi/10,nao2_shi%10,27,27,28,28,27); if(ms1>600) ms1=0; if(ms1>300&&changan==1) ms1=0; if(anjian3==0&&aj3==0)//检测按键3 { delay(5); if(anjian3==0) aj3=1,ms2=0; } if(anjian3==1&&aj3==1) { nao2_fen++; if(nao2_fen==60) nao2_fen=0; changan=0; aj3=0;//按键1按下松开,小时++ } if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj3==1&&changan==1&&ms2>=100)//快加 { nao2_fen++; if(nao2_fen==60) nao2_fen=0; ms2=0; } if(anjian4==0&&aj4==0)//检测按键4 { delay(5); if(anjian4==0) aj4=1,ms2=0; } if(anjian4==1&&aj4==1) { if(nao2_fen==0) nao2_fen=60; nao2_fen--; changan=0; aj4=0;//按键1按下松开,小时-- } if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s if(aj4==1&&changan==1&&ms2>=100)//快减 { nao2_fen--; if(nao2_fen<0) nao2_fen=59; ms2=0; } if(anjian1==0&&aj1==0)//检测按键1 { delay(5); if(anjian1==0) aj1=1; } if(anjian1==1&&aj1==1) { aj1=0; cd=4; IapErase(0x1000); IapProgram(0x1000, nao2_fen);//写小时值 } if(anjian2==0&&aj2==0)//检测按键2 { delay(5); if(anjian2==0) aj2=1; } if(anjian2==1&&aj2==1) { aj2=0; cd=20;//去菜单20 IapErase(0x1000); IapProgram(0x1000, nao2_fen);//写小时值 } } } 串口驱动: #include #include #include 'intrins.h' #define FOSC 11059200UL #define BRT (65536 - FOSC / 115200 / 4) bit busy; //extern uchar tiaozheng[]; char a=0; uchar huancun[15]={0}; /*Z-------------A*/ //传送时间数据 /*Z----------B*/ //传送闹钟数据 /*Z----------C*/ //请求传送温度数据 /*********************************************************************************************************** * 函数名称: UartIsr() * 输入参数: void * 输出参数: void * * 功 能: 串口1中断(第4号中断) * * 备 注:将数据缓存在 huancun[]数组中 * * 作 者: 范 * * 完成时间: 2019.12.25 ************************************************************************************************************/ void UartIsr() interrupt 4 { if (TI) { TI = 0; busy = 0; } if (RI) { RI = 0; switch(SBUF) { case 'Z': a=0;//时间数据传送开始标志 break; case 'A': huancun[14]=1;//时间数据更新标志 break; case 'B': huancun[14]=2;//闹钟数据更新标志 break; case 'C': huancun[14]=3;//请求传送温度数据 标志 break; case '0': huancun[a]=0,a++; break; case '1': huancun[a]=1,a++; break; case '2': huancun[a]=2,a++; break; case '3': huancun[a]=3,a++; break; case '4': huancun[a]=4,a++; break; case '5': huancun[a]=5,a++; break; case '6': huancun[a]=6,a++; break; case '7': huancun[a]=7,a++; break; case '8': huancun[a]=8,a++; break; case '9': huancun[a]=9,a++; break; default:break; } } } /*********************************************************************************************************** * 函数名称: UartInit() * 输入参数: void * 输出参数: void * * 功 能: 串口1初始化 * * 备 注:用定时器2做波特率发生器 * * 作 者: 范 * * 完成时间: 2019.12.25 ************************************************************************************************************/ void UartInit() { SCON = 0x50; T2L = BRT; T2H = BRT >> 8; AUXR = 0x15; busy = 0; } /*********************************************************************************************************** * 函数名称: UartSend() * 输入参数: char * 输出参数: void * * 功 能: 串口1发送一个字符 * * 备 注:无 * * 作 者: 范 * * 完成时间: 2019.12.25 ************************************************************************************************************/ void UartSend(char dat) { while (busy); busy = 1; SBUF = dat; } /*********************************************************************************************************** * 函数名称: UartSendStr() * 输入参数: char *p * 输出参数: void * * 功 能: 串口1发送一个字符串 * * 备 注:无 * * 作 者: 范 * * 完成时间: 2019.12.25 ************************************************************************************************************/ void UartSendStr(char *p) { while (*p) { UartSend(*p++); } } 主函数: #include #include #include #include #include #include 'eeprom.h' extern uchar huancun[];//蓝牙接收缓存数据 extern int nao_kaiguan,nao_shi,nao_fen,nao2_kaiguan,nao2_shi,nao2_fen;//eeprom数据 extern int wendu;//温度信息 uchar wenzhuan[5]={0,0,0,0,0}; uchar i; uchar xiawu;//下午标志位 /*********************************************************************************************************** * 函数名称: main() * 输入参数: void * 输出参数: void * * 功 能: 主函数 * * 备 注:程序的初始化、串口打印、串口接收手机端发来的数据、运行菜单程序 * * 作 者: 范 * * 完成时间: 2019.12.25 ************************************************************************************************************/ void main() { itin(); UartSendStr('Uart Test !rn'); while(1) { caidan(); if(huancun[14]==1)//待时间更新数据 { huancun[14]=0;//清标志位 if(huancun[13]==1) xiawu=12; if(huancun[13]==0) xiawu=0; xieshijian(huancun[0]*10+huancun[1],huancun[2]*10+huancun[3],huancun[4]*10+huancun[5],huancun[6]*10+huancun[7]+xiawu,huancun[8]*10+huancun[9],huancun[10]*10+huancun[11],huancun[12]);//更新时间 UartSendStr('时间信息已校准rn'); } if(huancun[14]==2)//待闹钟更新数据 { huancun[14]=0;//清标志位 nao_kaiguan=huancun[0]; nao_shi=huancun[1]*10+huancun[2]; nao_fen=huancun[3]*10+huancun[4]; nao2_kaiguan=huancun[5]; nao2_shi=huancun[6]*10+huancun[7]; nao2_fen=huancun[8]*10+huancun[9]; IapErase(0x0200); IapProgram(0x0200, nao_kaiguan);//写闹钟1开关默认值 IapErase(0x0400); IapProgram(0x0400, nao_shi);//写闹钟1小时默认值 IapErase(0x0600); IapProgram(0x0600, nao_fen);//写闹钟1分钟默认值 IapErase(0x0c00); IapProgram(0x0c00, nao2_kaiguan);//写闹钟2分钟默认值 IapErase(0x0e00); IapProgram(0x0e00, nao2_shi);//写闹钟2分钟默认值 IapErase(0x1000); IapProgram(0x1000, nao2_fen);//写闹钟2亮度默认值 UartSendStr('闹钟信息已更改rn'); } if(huancun[14]==3)//请求传送温度数据 标志 { huancun[14]=0;//清标志位 wenzhuan[0]=wendu%1000/100; if(wendu<10000) wenzhuan[0]=wendu%1000/100,wenzhuan[1]=wendu%100/10,wenzhuan[2]=wendu%10,wenzhuan[3]=0; if(wendu>10000) wenzhuan[0]=wendu%1000/100,wenzhuan[1]=wendu%100/10,wenzhuan[2]=wendu%10,wenzhuan[3]=1; for(i=0;i<4;i++) { switch(wenzhuan[i]) { case 0 : UartSend('0'); break; case 1 : UartSend('1'); break; case 2 : UartSend('2'); break; case 3 : UartSend('3'); break; case 4 : UartSend('4'); break; case 5 : UartSend('5'); break; case 6 : UartSend('6'); break; case 7 : UartSend('7'); break; case 8 : UartSend('8'); break; case 9 : UartSend('9'); break; default:break; } } } } }