xingyuewang 发表于 2012-12-30 18:53:52

分享一个已投入使用带预约定时功能的电紫砂煲程序,很方便


工程文件 :
前段时间给电紫砂煲做的一个带预约定时功能的控制器,用51做的 , 程序部分是从前辈那copy的,编的有点乱,如果有哪位高手能给优化一下将不胜感激.


/******************************************************************/
/*用2片74 595 驱动8位LED显示   按键使用中断实现短按长按和连续   */
/*因此操作按键时不影响程序的运行                              */
/*                                                                            */
/*                                                                                  */
/******************************************************************/

/******************************************************************/
/*            预处理宏定义                                        */
/******************************************************************/
        #include <REG52.h>
        #include <math.h>
        #include <INTRINS.H>
        #include <string.h>

        typedefunsigned intuint;           //无符号整型
        typedefunsigned intUINT;
        typedefunsigned longulong;           //无符号长整型
        typedefunsigned longULONG;
        typedefunsigned charuchar;           //无符号字符型
        typedefunsigned charUCHAR;

        /* 按键键值宏定义 */
        #define    KEY_VALUE1    0x0E           //按键1按下
        #define    KEY_VALUE2    0x0D
        #define    KEY_VALUE3    0x0B
        #define    KEY_VALUE4    0x07
        #define    KEY_NULL      0xFF      //无按键按下
        uint KeyValue = KEY_NULL ;

        /* 按键状态宏定义 */
        #define    INIT_STATE    0                   //初始化状态
        #define           SHAKE_STATE   1                   //按键抖动状态
        #define    PRESS_STATE   2         //按键按下状态
        #define    LONG_STATE    3         //按键长按状态
        #define    CONTINUE_STATE    4   //按键连续状态
        #define    RELEASE_STATE   5   //按键释放状态

    /* 按键返回值状态宏定义 */
        #define    KEY_DOWN       0x80           //按下
        #define    KEY_LONG      0x40           //长按
        #define    KEY_CONTINUE    0x20           //连按
        #define    KEY_UP   0x10           //释放

        /* 定义长按键的TICK数,以及连按间隔的TICK数*/
        #define KEY_LONG_PERIOD 100           //长按时间基数
        #define KEY_CONTINUE_PERIOD 25            //连按时间基数
        uint KeyDelay=0;// key 按下延时


        /* 定义数码管显示位*/
        #define        wei1   0xfe
        #define        wei2   0xfd
    #define        wei3   0xfb
        #define        wei4   0xf7
        #define        wei5   0xef
        #define        wei6   0xdf
        #define        wei7   0xbf
        #define        wei8   0x7f
        #define        wei_all   0xf0


/******************************************************************/
/*            I/O定义                                          */
/******************************************************************/       
        /* 锁存使能 */
        //sbitDM = P1^4;               //数码管段码锁存使能
        //sbitWM = P1^5;                  //数码管位码锁存使能
        //sbitLED = P1^6;                  //LED锁存使能
        //sbitMOTOR = P3^7;           //电机锁存使能
        //sbitMOTOR1 = P3^6;           //电机锁存使能

        /* 继电器输出 */
        sbitHighTmp=P0^7;      //高温继电器
        sbitLowTmp=P0^5;                //低温继电器
        sbitAutoTmp=P0^6;                //自动温度继电器
        //sbitledtest=P1^5;       
        sbitBeep=P2^7;       //蜂鸣器

        /* 功能指示Led */
        sbitFunc_Led1=P0^0;      //功能1指示
        sbitFunc_Led2=P0^1;                //功能2指示
        sbitFunc_Led3=P0^2;                //功能3指示
        sbitTimeOn_Led=P1^6;                //预约指示
        sbitTimeOff_Led=P1^7;                //定时指示

        /* 数码管显示595 2片 */
        sbit SCLK_595 =P2^0; //移位时钟脉冲
        sbit SDATA_595=P2^2; //串行数据输入
        sbit RCK_595 =P2^1; //输出锁存器控制脉冲

        /* 独立按键 */
        sbitKEY1 = P2^3;                  //独立按键1
        sbitKEY2 = P2^4;                  //独立按键2
        sbitKEY3 = P2^5;                  //独立按键3
        sbitKEY4 = P2^6;                  //独立按键4

/******************************************************************/
/*                  变量定义开始                                    */
/******************************************************************/

        /* 定义定时中断变量*/
        bitbTime20mS = 0;   //20ms中断标志位
        bitfTime1S = 0;          //2s中断标志位
        bit Flag_5s_Start=0;
        bit Flag_5s_End=0;
        uint cnt_5s=0;       
        bit Flag_1s_Start=0;       
        uint cnt_1s=0;
        uint cnt_Beepshort=0;
        bit Beepshort=0;
        bit Beeplong=0;
        uint cnt_Beeplong=0;
        uint flash_1s=0;       
        uchar FlagFunc=0; //定义功能标识
        uchar FlagTimeOn=0; //定义预约标识
        uchar FlagTimeOff=0; //定义定时标识
        bit FuncStart=0;   //功能启动标识
        bit TimeOnStart=0; //预约启动标识
        bit TimeOffStart=0; //定时启动标识       
        uchar h,m,s;
        uint x=0 ;
        int ii=0;

        /* 定义数据传输存储数组*/
        #define        Address   0x02   //定从站站址为 2
        uchar DataBuf={0x02,0x00,0x00,0x00,0x00,00,00,10,03,30,30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};          //0站址1命令2功能 3状态 4预约 5预约时 6预约分 7定时 8定时时 9定时分 10取消
                                   //         0    1          2    3    4   5   67   8    9    10   11   12   13   14   15   16   17   18   19

        /* 定义数码管显示变量*/
        uint Disp_temp;       
        uchar code DAT[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76,0x73,0x3e,0x00,0x40,0x63};       
                                        //         0 ,1 , 2    3    4   5    6    7    8   9          A    b    C    d    E    F(16)H        P   U    空   -       °C   
                                        //以下为7段共阴LED数码管段码表
                                        //    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,         /*共阴7段LED段码表*/
                                        //    0x77,0x7c,0x39,0x5e,0x79,0x71,0x76,0x73,0x3e,0x00};

/******************************************************************/
/*                   函数声明2                                    */
/******************************************************************/
        voidKeyInit(void);
        voidGetKey(uint *pKeyValue);
        voidWR_595(void);
        voidOUT_595(void);
        voidDisp_Out(uchar wei,uchar shu);
        voidLedOnOff(void);
        voidTimerInit(void);
        voidKeyChuli(void);
        voidFunChuli(void); //功能处理
        voidDisplay(void); //显示函数

/******************************************************************/
/*                   按键初始化函数                               */
/******************************************************************/
        voidKeyInit(void)
        {
                KEY1 = 1;
                KEY2 = 1;
                KEY3 = 1;
                KEY4 = 1;
        }       
/******************************************************************/
/*                   底层按键扫描函数                           */
/******************************************************************/
        uintKeyScan(void)
        {
                if(KEY1 == 0)
                {
                        return KEY_VALUE1;                           //0x0e
                }
                else if(KEY2 == 0)
                {
                        return KEY_VALUE2;
                }
                else if(KEY3 == 0)
                {
                        return KEY_VALUE3;
                }
                else if(KEY4 == 0)
                {
                        return KEY_VALUE4;
                }
                else
                {
                        return KEY_NULL;
                }
        }
/******************************************************************/
/*                   获取按键值函数                               */
/******************************************************************/
        voidGetKey(uint *pKeyValue)
        {
                staticuintsKeyState = INIT_STATE;          //设按键状态为 初始化状态 0
                staticuintsTimeCount = 0;
                staticuintsLastKey = KEY_NULL;                   //保存按键释放时候的键值
                uintKeyTemp = KEY_NULL;                  
       
                if(bTime20mS)                //20mS扫描一次 中断一次
                {
                        bTime20mS = 0;       
                        KeyTemp = KeyScan();                // 底层按键扫描函数返回时哪个按键按下
       
                        switch(sKeyState)               //根据按键状态选择
                        {
                                caseINIT_STATE:           //如果为初始状态 0
                                {
                                        if(KeyTemp != KEY_NULL)          // 如果有按键按下
                                        {
                                                sKeyState = SHAKE_STATE;//消抖返回1
                                        }       
                                }
                                break;
       
                                caseSHAKE_STATE:               //消抖 1
                                {
                                        if(KeyTemp != KEY_NULL)          // 如果有按键按下
                                        {
                                                sKeyState = PRESS_STATE;   //返回2 按键为按下状态
                                        }       
                                }
                                break;
       
                                casePRESS_STATE:                  //如果为按下状态 2
                                {
                                        if(KeyTemp != KEY_NULL)
                                        {                               
                                                sLastKey = KeyTemp ;//保存键值,以便在释放按键状态返回键值
                                                KeyTemp |= KEY_DOWN ;        //按键按下
                                                sKeyState = LONG_STATE;             //赋值为长按状态                                               
                                        }
                                        else
                                        {
                                                sKeyState = INIT_STATE;
                                        }
                                }
                                break;
       
                                caseLONG_STATE:           //如果为长按状态
                                {
                                        if(KeyTemp != KEY_NULL)
                                        {
                                                if(++sTimeCount > KEY_LONG_PERIOD)    //长按时间计数
                                                {
                                                        sTimeCount = 0;                                               
                                                        KeyTemp |= KEY_LONG ;       //长按键事件发生
                                                        sKeyState = CONTINUE_STATE;                  //4连续按下
                                                }       
                                        }
                                        else
                                        {
                                                sKeyState = RELEASE_STATE;
                                        }
                                }
                                break;
       
                                caseCONTINUE_STATE:                //连续按下状态
                                {
                                        if(KeyTemp != KEY_NULL)
                                        {
                                                if(++sTimeCount > KEY_CONTINUE_PERIOD)        //连按时间计数
                                                {
                                                        sTimeCount = 0;
                                                        KeyTemp |= KEY_CONTINUE ;        //赋值为连续按下
                                                }
                                        }
                                        else
                                        {
                                                sKeyState = RELEASE_STATE;          //5
                                        }
                                }
                                break;
       
                                caseRELEASE_STATE:               //释放状态 5
                                {
                                        sLastKey |= KEY_UP ;
                                        KeyTemp = sLastKey ;       
                                        sKeyState = INIT_STATE;                                               
                                }
                                break;
                       
                        }                       
                }
                *pKeyValue = KeyTemp ;          //返回按键值和按键状态       
        }
/******************************************************************/
/*                   写595寄存器函数                              */
/******************************************************************/               
        void WR_595(void)        //将显示数据送入74HC595内部移位寄存器
        {
                uchar j;
                for (j=0;j<16;j++)
                {
                        Disp_temp=Disp_temp<<1;
                        SDATA_595=CY;
                        SCLK_595=1; //上升沿发生移位
        //                _nop_();_nop_();
                        SCLK_595=0;
                }
        }
/******************************************************************/
/*                   595寄存器输出函数                            */
/******************************************************************/
        void OUT_595(void)               //将移位寄存器内的数据锁存到输出寄存器并显示
        {
                RCK_595=0;
        //        _nop_();_nop_();
                RCK_595=1;                 //上升沿将数据送到输出锁存器
        //        _nop_();_nop_(); _nop_();
                RCK_595=0;
        }
/******************************************************************/
/*                   数码管显示函数                              */
/******************************************************************/
        void Disp_Out(uchar wei,uchar shu)       //接收数据并显示到数码管上
        {
        Disp_temp= (wei<<8)+ DAT[ shu ] ;
        WR_595();
        OUT_595();
        }

/******************************************************************/
/*                   指示灯亮灭闪烁函数                              */
/******************************************************************/
        void LedOnOff(void)
        {
                /******功能指示灯开始*****/
                if(FlagFunc==0)
                {
               Func_Led1 = 1 ;
               Func_Led2 = 1 ;
               Func_Led3 = 1 ;
                }
                if(FlagFunc==1&&FuncStart==0)
                {
               Func_Led1 = ~Func_Led1 ;
               Func_Led2 = 1 ;
               Func_Led3 = 1 ;
                }
                else if(FlagFunc==1&&FuncStart==1)
                {
               Func_Led1 = 0 ;
               Func_Led2 = 1 ;
               Func_Led3 = 1 ;
                }
                if(FlagFunc==2&&FuncStart==0)
                {
               Func_Led1 = 1 ;
               Func_Led2 =~Func_Led2 ;
               Func_Led3 = 1 ;
                }
                else if(FlagFunc==2&&FuncStart==1)
                {
               Func_Led1 = 1 ;
               Func_Led2 = 0 ;
               Func_Led3 = 1 ;
                }
                if(FlagFunc==3&&FuncStart==0)       
                {
               Func_Led1 = 1 ;
               Func_Led2 = 1 ;
               Func_Led3 = ~Func_Led3 ;
                }
                else if(FlagFunc==3&&FuncStart==1)
                {
               Func_Led1 = 1 ;
               Func_Led2 = 1 ;
               Func_Led3 = 0 ;
                }
                /******预约指示灯开始*****/
                if( FlagTimeOn==0 )           // 预约指示灯灭初始化
                {
               TimeOn_Led = 1 ;
                }
                if( FlagTimeOn==1 && TimeOnStart==0 )       //预约指示灯闪烁
                {
               TimeOn_Led = ~TimeOn_Led ;
                }
                else if( FlagTimeOn==1 && TimeOnStart==1 )           //预约指示灯常亮
                {
               TimeOn_Led = 0 ;
                }
          /******定时指示灯开始*****/
                if( FlagTimeOff==0 )           // 指示灯灭初始化
                {
               TimeOff_Led = 1 ;
                }
                if( FlagTimeOff==1 && TimeOffStart==0 && FlagTimeOn==0 )       //指示灯闪烁
                {
               TimeOff_Led = ~TimeOff_Led ;
                }
                else if( FlagTimeOff==1 && TimeOffStart==1 )           //指示灯常亮
                {
               TimeOff_Led = 0 ;
                }                                            
        }

/******************************************************************/
/*                   定时器初始化函数                           */
/******************************************************************/                                       
        voidTimerInit(void)
        {
                TMOD &= 0xf0;      //定时器0 工作方式1 20ms中断一次
                TMOD |= 0x01;
                //TH0 = 0xB1;
                //TL0 = 0xE0;
                TH0 = 0xB8;
                TL0 = 0x19;
                TR0 = 1;
                ET0 = 1;
        }
/******************************************************************/
/*                   定时中断函数                                 */
/******************************************************************/
        voidTimer0(void) interrupt 1          // 定时器中断处理函数
        {
                TH0 = 0xB8;
                TL0 = 0x19;
                bTime20mS = 1;
                flash_1s ++;
                //MOTOR = ~MOTOR ;
                /******led闪烁开始*****/
          if(flash_1s>=25)          //功能选择时相应led闪烁
                  {
                  flash_1s=0;
                        LedOnOff();          //指示灯亮灭函数
                  }
                /******5s倒计时开始*****/
                if( Flag_5s_Start && ( ~Flag_5s_End ) )          //5秒倒计时
                {
                   cnt_5s++;
                   if(cnt_5s>=250)    //5s
                   {
                      cnt_5s = 0;
                          Flag_5s_End=1;
                   }
                }
                else
                {
                   cnt_5s=0;
                }
       
                /******1s定时开始*****/
                if(Flag_1s_Start)
                {
                   cnt_1s++;
                   if(cnt_1s==100)    //1s
                   {
                      cnt_1s=0;
                          Flag_1s_Start=0;
                   }
                }
                else
                {
                   cnt_1s=0;
                }
                /******蜂鸣器短响开始*****/
                if( Beepshort==1 )
                {
                   cnt_Beepshort++;
                   if(cnt_Beepshort==10) Beep=0;
                   if(cnt_Beepshort==20)    //1s
                   {
                      cnt_Beepshort=0;
                          Beep=1;
                          Beepshort=0;                     
                   }
                }
                else
                {
                   cnt_Beepshort=0;
                }
                /******蜂鸣器长响开始*****/
                if( Beeplong==1 )
                {
                   cnt_Beeplong++;
                   //Beep=0;
                   if(cnt_Beeplong%10==0)    //1s
                   {
                          Beep=~Beep;             
                   }
                   if(cnt_Beeplong%30==0)    //1s
                   {
                          Beep=~Beep;             
                   }

                   if(cnt_Beeplong==1260)    //1s
                   {
                      cnt_Beeplong=0;
                          Beep=1;
                          Beeplong=0;                     
                   }
                }
                else
                {
                   cnt_Beeplong=0;
                }               
                /*预约倒计时减及s基数定义处理 */
                if( TimeOnStart==1 )          //预约
                {
                        if( DataBuf>0 || DataBuf>0 || DataBuf>0 )   // 判断是否需要减位
                        {       
                                x++;          //x=50 , 50*20ms=1s来实现计时单位为1s
                                if(x==50) //x=50 , 50*20ms=1s来实现计时单位为1s
                                {
                                        x=0 ;
                                        if(DataBuf==0)
                                        {
                                                DataBuf=59;
                                                if(DataBuf==0)
                                                {
                                                        DataBuf=59 ;
                                                        if(DataBuf>0)
                                                        {
                                                                DataBuf-- ;
                                                        }
                                                }
                                                else
                                                {
                                                        DataBuf--;
                                                }               
                                        }
                                        else
                                        {
                                       DataBuf-- ;
                                        }
                                }
                     }
                    }       
                /*定时倒计时减及s基数定义处理 */
                if( TimeOffStart==1 )          //定时
                {
                        if( DataBuf>0 || DataBuf>0 || DataBuf>0 )   // 判断是否需要减位
                        {       
                                x++;          //x=50 , 50*20ms=1s来实现计时单位为1s
                                if(x==50) //x=50 , 50*20ms=1s来实现计时单位为1s
                                {
                                        x=0 ;
                                        if(DataBuf==0)
                                        {
                                                DataBuf=59;
                                                if(DataBuf==0)
                                                {
                                                        DataBuf=59 ;
                                                        if(DataBuf>0)
                                                        {
                                                                DataBuf-- ;
                                                        }
                                                }
                                                else
                                                {
                                                        DataBuf--;
                                                }               
                                        }
                                        else
                                        {
                                       DataBuf-- ;
                                        }
                                }
                     }
                  }                                 
        }
/******************************************************************/
/*                   按键处理函数                                 */
/******************************************************************/
        voidKeyChuli(void)
        {       
                KeyDelay ++;
                /****** 按键1 ********/
                if( KeyValue == (KEY_VALUE1 | KEY_DOWN) )               //按键1按下0x0e|0x80 = 0x8e
                {
                        if(KeyDelay>300)
                        {       
                                if( FuncStart != 1 )
                                {
                                        if( FlagFunc>2 )
                                        {
                                       FlagFunc=0;
                                        }
                                        FlagFunc ++;
                                        KeyDelay=0;
                                        if( FlagFunc==1 )
                                        {
                                        DataBuf=0;
                                        DataBuf=0;
                                        DataBuf=0;
                                        DataBuf=2;
                                        DataBuf=0;
                                        DataBuf=0;
                                        //高温
                                        }
                                        if( FlagFunc==2 )
                                        {
                                        DataBuf=8;
                                        DataBuf=30;
                                        DataBuf=0;
                                        DataBuf=0;
                                        DataBuf=30;
                                        DataBuf=3;
                                        //自动
                                        }
                                        if( FlagFunc==3 )
                                        {
                                        DataBuf=0;
                                        DataBuf=0;
                                        DataBuf=0;
                                        DataBuf=5;
                                        DataBuf=1;
                                        DataBuf=0;
                                        //保温
                                        }
                                }               
                        }
                }
                else if( KeyValue == (KEY_VALUE1 | KEY_LONG) )                //按键1长按
                {

                }
                else if( KeyValue == (KEY_VALUE1 |KEY_CONTINUE) )               //按键1连续
                {
                       
                }
                else if( KeyValue == (KEY_VALUE1 | KEY_UP) )                //按键1释放
                {
       
                }
                /******* 按键2 *******/
                if( KeyValue == (KEY_VALUE2 | KEY_DOWN) )               //按键2按下0x0e|0x80 = 0x8e
                {                                                 
                        if(KeyDelay>300)
                        {
                                if( FlagFunc!=0 && FuncStart==0 && TimeOffStart==0 )
                                {
                                        Flag_1s_Start=0;
                                        if( FlagTimeOn==1 )
                                        {
                                       DataBuf+=10 ;
                                        }
                                        FlagTimeOn=1;                        
                                }
                        }
                }
                else if( KeyValue == (KEY_VALUE2 | KEY_LONG) )                //按键2长按
                {

                }
                else if( KeyValue == (KEY_VALUE2 |KEY_CONTINUE) )               //按键2连续
                {
               
               DataBuf++ ;
                }
                else if( KeyValue == (KEY_VALUE2 | KEY_UP) )                //按键2释放
                {
       
                }
          /******* 按键3 *******/
                if( KeyValue == (KEY_VALUE3 | KEY_DOWN) )               //按键3按下
                {
                       if(KeyDelay>300)
                        {
                                if( FlagFunc!=0 )
                                {
                                  Flag_1s_Start=1;
                                        if( FlagTimeOff==1 )
                                        {
                                       DataBuf+=10 ;
                                        }
                                        FlagTimeOff=1;                        
                                }
                        }
               
                }
                else if( KeyValue == (KEY_VALUE3 | KEY_LONG) )                //按键3长按
                {
               //DataBuf++ ;                       
                }
                else if( KeyValue == (KEY_VALUE3 |KEY_CONTINUE) )               //按键3连续
                {
               DataBuf++ ;       
                }
                else if( KeyValue == (KEY_VALUE3 | KEY_UP) )                //按键3释放
                {
               
                }
          /******** 按键4 ********/
                if( KeyValue == (KEY_VALUE4 | KEY_DOWN) )               //按键4按下
                {
                       FlagFunc=0;
                       FuncStart=0;
                       FlagTimeOn=0;
                       TimeOnStart=0;
                       FlagTimeOff=0;
                       TimeOffStart=0;
                       Disp_Out(wei_all,0) ;
                       Beeplong=0;                               
                }
                else if( KeyValue == (KEY_VALUE4 | KEY_LONG) )                //按键4长按
                {
                                       
                }
                else if( KeyValue == (KEY_VALUE4 |KEY_CONTINUE) )               //按键4连续
                {
               
                }
                else if( KeyValue == (KEY_VALUE4 | KEY_UP) )                //按键4释放
                {
               
                }
                /*******按键加预约时间处理部分*******/
                if( DataBuf>=60 )
                {
               DataBuf=DataBuf-60;
               DataBuf++;               
                }
                   if( DataBuf>=60 ) //如果
                {
               DataBuf=DataBuf-60;
               DataBuf++;               
                }
                if( DataBuf>=12 )
                {
               DataBuf=0;
                }
                /*******按键加定时时间处理部分*******/
          if( DataBuf>=60 )
                {
               DataBuf=DataBuf-60;
               DataBuf++;               
                }
                   if( DataBuf>=60 ) //如果
                {
               DataBuf=DataBuf-60;
               DataBuf++;               
                }
                if( DataBuf>=12 )
                {
               DataBuf=0;
                }
                  /*****按键蜂鸣程序*****/
                if( KeyValue != KEY_NULL ) //只要有按键按下
                {
               Beepshort=1;
                }
        }
/******************************************************************/
/*                   功能处理函数                                 */
/******************************************************************/
        voidFunChuli(void)
        {
                if( FlagFunc!=0 ) //功能1时间赋初值
                {

                       if( FlagTimeOn==1 && Flag_1s_Start==0 )   //预约功能选择且无定时键按下显示预约
                       {
                      h=DataBuf;
                       m=DataBuf;
                       s=DataBuf;
                       }       
                        if( FlagTimeOn==0 || Flag_1s_Start==1 )        //无预约或定时间按下 则显示定时
                        {
                       h=DataBuf;
                       m=DataBuf;
                       s=DataBuf;
                        }               
                }
                // 预约5s倒计时
                if( FlagFunc!=0 )
                {
              Flag_5s_Start=1;
                }
                else
                {
              Flag_5s_Start=0;
                }

                if( KeyValue != KEY_NULL ) //只要有按键按下5s倒计时就重新计时
                {
               cnt_5s=0;
               cnt_1s=0;
                }
               /*****当只按下功能键5s后启动定时*****/
               if( FlagFunc!=0 && Flag_5s_End==1 && FlagTimeOn==0 )// 在直选功能模式中 当5秒倒计时结束时 启用
               {
                        FlagTimeOff=1;           //启用定时倒计时
                        if( TimeOffStart==0 )Beepshort=1;
               }
               /*****预约倒计时5s后启动*****/
               if( FlagTimeOn==1 && Flag_5s_End==1 )// 在预约模式中 当5秒倒计时结束时 启用预约模式
               {
                  if( TimeOnStart==0 )Beepshort=1;                          
                  TimeOnStart=1;
                  Flag_5s_End=0;
               }
               /*****定时倒计时5s后启动*****/
               if( FlagTimeOff==1 && Flag_5s_End==1 )// 在定时模式中 当5秒倒计时结束时 启用模式
               {                  
                  TimeOffStart=1;
                  FuncStart=1;    //倒计时启动的同时 功能启动
                  Flag_5s_End=0;       
               }
                /*****预约倒计时完成后启用定时倒计时*****/
                if( FlagFunc!=0 && FlagTimeOn==1 && TimeOnStart==1 )        //如果选择了功能,且选择了预约 而且预约已启动
                {
                        if( h==0 && m==0 && s==0 ) //如果预约倒计时完成,则启用功能
                        {
                         FlagTimeOn=0;   //预约标识复位
                       TimeOnStart=0;   //预约启动复位
                       FlagTimeOff=1;           //启用定时倒计时
                        }
                }
                /*****定时倒计时完成后关闭功能*****/
                if( FlagFunc!=0 && FlagTimeOff==1 && TimeOffStart==1 )        //如果选择了功能,且选择了定时
                {
                        if( h==0 && m==0 && s==0 ) //如果定时倒计时完成,则启用功能
                        {
                       FlagFunc=0;           //功能标识复位
                       FuncStart=0;           //功能复位
                       FlagTimeOff=0;           //定时倒计时标识复位
                       TimeOffStart=0;   //定时倒计时停止
                       Disp_Out(wei_all,20) ;
                       Beeplong=1;
                        }
                }

                /*****根据功能启动相应继电器*****/
                if( FuncStart==1 )
                { //if( FlagFunc==1) AutoTmp=0;
               switch(FlagFunc)               //根据功能状态选择
                        {
                                case0:           //无功能 继电器无输出
                                {
                               HighTmp=1;
                               LowTmp=1;
                               AutoTmp=1;       
                                }
                                break;
                                case1:               //功能1 高温
                                {
                               HighTmp=0;
                               LowTmp=0;
                               AutoTmp=1;       
                                }
                                break;
                                case2:               //功能2 自动
                                {
                               HighTmp=1;
                               LowTmp=0;
                               AutoTmp=0;       
                                }
                                break;
                                case3:               //功能3 保温
                                {
                               HighTmp=1;
                               LowTmp=0;
                               AutoTmp=1;       
                                }
                                break;
                        }
                }
                else
                {
                        HighTmp=1;
                        LowTmp=1;
                        AutoTmp=1;       
                }
        }
/******************************************************************/
/*                   显示函数                                 */
/******************************************************************/
        voidDisplay(void)
        {

                /*****显示输出*****/
                if( FlagFunc!=0 )        //选择相应功能后才显示预约定时时间
                {
                       
                        Disp_Out(wei4,h/10) ;       
                        Disp_Out(wei3,h%10) ;
                        Disp_Out(wei2,m/10) ;
                        Disp_Out(wei1,m%10) ;
                        Disp_Out(wei6,s/10) ;
                        Disp_Out(wei5,s%10) ;

                        //Disp_Out(wei4,DataBuf/10) ;       
                        //Disp_Out(wei3,DataBuf%10) ;
                        //Disp_Out(wei2,DataBuf/10) ;
                        //Disp_Out(wei1,DataBuf%10) ;
                        //Disp_Out(0xbf,DataBuf/10) ;
                        //Disp_Out(0x7f,DataBuf%10) ;
                }
        }
/******************************************************************/
/*                   主函数                                       */
/******************************************************************/
voidMain(void)
{       
        Beep=1;                  //初始化蜂鸣器
        TimerInit();          /* 定时器初始化函数 */
        KeyInit();           /* 按键扫描初始化函数 */
        EA = 1;          //开总中断
        Disp_Out(wei_all,0) ;        //显示待机状态 00:00

        while(1)
        {       
                //Display(); //显示函数
                GetKey(&KeyValue);        //按键判断函数
                KeyChuli();           //按键处理函数
                FunChuli();          //功能处理函数
                Display(); //显示函数
       }       

}       

//************主函数结束*********************************//


langbaiyue 发表于 2012-12-30 19:57:20

刚买了一个!

xingyuewang 发表于 2012-12-30 21:00:32

langbaiyue 发表于 2012-12-30 19:57 static/image/common/back.gif
刚买了一个!

本来我也想买的 可是买便宜的不能联网啊, 没法只能自己做了 然后再连到电脑或互联网上,这一块还在做着, 这个通讯以及协议让人头疼

wtiechen1969 发表于 2012-12-30 21:16:58

mark一下

tonyone 发表于 2013-1-1 21:31:44

不错哦,再贴原理图和实物图上来看看啦

xingyuewang 发表于 2013-1-2 12:20:10

本帖最后由 xingyuewang 于 2013-1-2 12:25 编辑

tonyone 发表于 2013-1-1 21:31 static/image/common/back.gif
不错哦,再贴原理图和实物图上来看看啦

一开始做的那个外壳有点丑内部电路当时忘了拍照了 这样吧把我新作的一个图贴上来吧 功能差不多


页: [1]
查看完整版本: 分享一个已投入使用带预约定时功能的电紫砂煲程序,很方便