单片机
返回首页

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;

                                }

                        }

                }

        }

}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 永不缺相启动运行的电动机控制电路

  • CCFL的工作原理及电子驱动电路解析

  • 开关电源的基本组成及工作原理

  • 运算放大器IC741的基本工作原理及在电路中的实现方式

  • 基于CA3193的热电偶放大器电路

  • 基于TDA1554的立体声放大器电路

    相关电子头条文章