可设置定时的插座_全项目文件_c语言状态机

此项目用数码管做显示,  设置的定时时间存储在stc11X 内部eeprom中,计时采用定时器计时方式

#include <stdio.h>
#include <Key.h>
#include <Usart.h>
#include <Timer.h>
#include "Led.h"
#include "eeprom.h"

sbit SupplyPower = P3^3; 
#define  OpenPower  0
#define  ShutPower  1
typedef struct 
{
     //小时计数器
 char  Hour;
    //分钟计数器
 char  Minute;
    
//volatile char  Seconds;

}TimeDef;


/*
void  delay( void )
{
    unsigned int x;
    unsigned int y;
    for(x= 0; x<400;x++)
    for(y= 0;y<2000;y++);
}*/

void main(void)           //主函数
{

TimeDef setting = { 0,0};  //小时分钟位分离
 unsigned  char KeyCode;
static  char LedFlag = 0;
//保存时间数据
static  unsigned  int  SaveData = 0;
//static  int TimVar = 0;
//开始启动打开电源
SupplyPower = OpenPower;

    InitUART();   //串口初始化
    
    SendStr("\r\n定时器插座启动" );
//    SendU16(24856);
    TimerInit() ;//定时器初始化
                
 InitButtonVar();  //按钮初始化
    
    //读取保存的数据
SaveData = ( ( (unsigned int)IapReadByte(0) ) << 8 )  +  IapReadByte(1) ;
SendStr("\r\n启动读取上次存储的值SaveData = " );
SendU16(SaveData);
SendStr(";" );
//初次更新显示
setting.Hour  =   SaveData/100;
setting.Minute  =  SaveData % 100;
if(setting.Hour > 99)
setting.Hour = 0;
if(setting.Minute > 59)
setting.Minute = 0;
Led_Dis_Var =  setting.Minute + setting.Hour*100;
    while(1)
    {

        
    Timer_Shaft_Increasing(); //计时器更新时间
    //按键扫描    
    KeyPro();    

        //读取按键值,读一个数据,会自动移位一次
    KeyCode = GetKey();    
    
        //大于零表示有按钮按下
        if (KeyCode > 0)
        {                
                        //组合短按
                        if(KeyCode == K1AndK2_Choose)
                        {
                                //设置循环
                                LedFlag++;
                             if(LedFlag  >= 3 )
                             {
                                //Led_Flicker_Minute_Dis   这个状态的下一个状态,保存数据
                                 if(LedFlag == Led_Flicker_Minute_Dis + 1)
                                 {
                                    //保存数据
                                 SaveData = ((unsigned int)setting.Minute) + ((unsigned int)setting.Hour) * 100;    
                
                        /*第一扇区其实地址 0000h  结束地址1ffh    
                     必须要先删除扇区才能写入    */
                        IapEraseSector(IAP_ADDRESS);    //Erase current sector
                        //0地址写入高8位
                        IapProgramByte(0, (unsigned char)(SaveData>>8)  );    
                        //1地址写入低8位
                        IapProgramByte(1,(unsigned char)(SaveData) );
                                            
                                 }
                                 //Led_Flicker_Second_Dis  启动定时器倒计时状态下按了组合按键
                                 //溢出判断,由倒计时状态变成停止状态
                                 if( (LedFlag == Led_Flicker_Second_Dis + 1) || (LedFlag == Time_Go + 1) )
                                 {
                                     //重新赋予新值

                                      setting.Hour  =   SaveData/100;
                                         setting.Minute  =  SaveData % 100;

                                 }
                                 LedFlag = 0;
                                 
                             }
                        }        
        else
                        
                if(KeyCode == K1_DataAdd)
                        {            
                                
                                             if(LedFlag == Led_Flicker_Hour_Dis)  //进入到这个设置界面按钮才有效
                                             {
                                                            ++setting.Hour;
                                                     if(setting.Hour > 99)
                                                         {
                                                                setting.Hour = 0;
                                                         }
                                             }
                                        else
                                              if( LedFlag == Led_Flicker_Minute_Dis)  //进入到这个设置界面按钮才有效
                                                {
                                                            ++setting.Minute;
                                                            if(setting.Minute > 59)
                                                         {
                                                                setting.Minute = 0;
                                                         }
                                                }
                                    
                        }
            else
                        if(KeyCode == K2_DataSubtract)
                        {
                                                        if(LedFlag == Led_Flicker_Hour_Dis)  //进入到这个设置界面按钮才有效
                                                 {
                                                             --setting.Hour ;
                                                        if(setting.Hour < 0)
                                                            {
                                                                setting.Hour = 99;
                                                            }
                                                 }
                                        else
                                              if( LedFlag == Led_Flicker_Minute_Dis)  //进入到这个设置界面按钮才有效
                                                {
                                                            --setting.Minute;
                                                        if(setting.Minute < 0)
                                                            {
                                                                setting.Minute = 59;
                                                            }
                                                }
                                                
                             
                        }
            else
                        //组合长按
                        if(KeyCode == K1AndK2_LongChoose)
                        {
                            if(LedFlag == Led_Flicker_No_Dis )  //表示在不闪烁界面
                                {                        
                                        //将需要计时的时间计算成秒
                                            Count_Second_Sys  =  ((long)setting.Hour) * 60 * 60  +   ((long)setting.Minute) * 60;   //需要强制转换,不然计算出来的值 是char型
                                      if(Count_Second_Sys > 0)  //设置的时间大于0
                                            {
                                                LedFlag = Led_Flicker_Second_Dis ;  //秒点闪烁倒计时开
                                       //设置Count_Second_Sys初始时间
                                        
                                            }
                                      
                                }
                        
                        }
                            //更新显示
                        Led_Dis_Var =  setting.Minute + setting.Hour*100;
                        
        }
        
        
        //定时器启动,倒计时计时
        if(LedFlag == Led_Flicker_Second_Dis)
      {
        //if(Count_mS  )
            //设置的定时时间到,启动的时候必须Count_Second_Sys > 0;
                        if(Count_Second_Sys == 0)
                        {
                            Count_Second_Sys  = 0;  //清除计时器
                            LedFlag = Time_Go; //定时时间到,进入到循环等待
                           //定时时间到,关闭数码管,关闭继电器
                            CloseLed();  //关闭数码管
                            
                            //关闭电源供电
                             SupplyPower = ShutPower; 

                        }
                else
                       //定时 时间 没有到 继续定时
                            if(Count_Second_Sys != 0)
                        {
                              setting.Hour  =   Count_Second_Sys/60/60;
                                setting.Minute =  Count_Second_Sys/60%60; 
                              
                        }
                    Led_Dis_Var =  setting.Minute + setting.Hour*100;
        }    
        
        
        
       Led_Dis(LedFlag);      //扫描显示
            
    }    
}
        

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
定时插座开关设计背景: 作为学生党,想必一定有这样的经历:还没放假回家的时候,家里人天天念叨,想你回来;刚回家时,天天大鱼大肉,好吃的伺候着;可是,好日子没几天,整天葛优躺的你就会被念叨,整天啥也不干,于是,为了化解这种困境,为了让我的勤劳和葛优躺完美结合,有了下面这个定时插座开关装置的设计,懒人可以将它的功能发挥到极致。 定时插座开关功能: 在设定的时间内开电,例如设定时间A点到B点,当时间到A点时开电,到B点时便断电。 可显示时钟(日期+时间) 可显示环境温度, 对烧水特别设定的功能:在设定的时间内,可根据检测到的温度开、断电(设定开电时间内,温度高于80度断电,低于50度开电) 定时插座开关用途: 对于无法定时的用电器,但是你想让它在某个时间段运行,人又不在或者懒于动的情况下 例1:对于普通的电饭煲,只有煮饭功能而没有预约功能,可用本装置!先将米、水倒进锅里,设定好时间,时间到了,便开始煮饭。早上上班出门前把时间设定好,中午或者晚上,一到家就能吃到刚煮好新鲜的饭。岂不乐哉! 例2:在没有热水器的场所,例如一些学校没有热水器 用热水棒烧水,想早上起来洗头或者洗澡,如果是冬天,大早上起来去提水会很冷,水提来还要等它少热,不但浪费时间,还耽误瞌睡,有它,便可在前一天晚上将水提来,将热水棒和温度传感器放进桶里 插上插座 设定好开电时间,早上一起床便可以用到热水,如果赖床也不用担心水被烧干引起火灾,在设定的时间内,当水温高于80度就停止烧水,低于五十度了便再烧水。 定时插座开关原理图: 定时插座开关PCB图: 定时插座开关实物图:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值