⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m8.c

📁 采用ATMEGA8的芯片,功能为智能家居的门禁控制,单相交流电机的控制系统,性能稳定.
💻 C
📖 第 1 页 / 共 5 页
字号:
}





//******************函数*******************
//按键处理SBW_STOP_AX
void subpr_sbw_stop_ax(void)
{
    //关闭输出
    j1_close;
    j2_close;
    xc_work_old=cst_out_free;
    bit_sbw_open=cst_sbw_ax;
    bit_sbw_close=cst_sbw_ax;
    
    //测试开关类型
    if (bit_sbw_sort==cst_sbw_k)
    {
        //改写开关类型标志
        eep_sbw_sort=cst_sbw_sb;
        bit_sbw_sort=cst_sbw_sb;
    }
    
}





//******************函数*******************
//按键处理SB_W_LEARN_AX
void subpr_sb_w_learn_ax(void)
{
    unsigned char i;
    //unsigned int  temp;
    
    //按住3秒进入通道设置,放手再按7秒清除清有通道
    //通道设置廷时为20秒
    TCNT1H=cst_tcnt1h;
    TCNT1L=cst_tcnt1l;
    com_timer1=0;
    
    //测试按键
    while (sb_w_learn_ax)
    {
        subpr_yms_com(2);
        
        //测试时间
        if (com_timer1>=3)
        {
            //3秒时间到
            //等待放手
            set_led_r;
            subpr_mot_wink();
            
            while (sb_w_learn_ax)
            {
                subpr_yms_com(2);
            }
            //放手时LED闪烁一下
            clr_led_r;
            subpr_yms_com(2);
            
            //进入通道设置,限时20秒
            TCNT1H=cst_tcnt1h;
            TCNT1L=cst_tcnt1l;
            com_timer1=0;
            
            while ((com_timer1<20)&&(sb_w_learn_fs))
            {
                set_led_r;
                
                if (sb_fx_ax)
                {
                    delay_ms(50);
                    if (sb_fx_ax)
                    {
                        //合法通道,执行换向
                        if (eep_out_j12==cst_out_j12_true)
                        {
                            eep_out_j12=cst_out_j12_false;
                        }
                        else
                        {
                            eep_out_j12=cst_out_j12_true;
                            //eep_out_j12=cst_out_j12_false;
                        }
                            
                        //换向设置完成,闪烁3次表示
                        subpr_led_wink(3,3);      //调用LED闪烁函数
                        
                        //置退出
                        com_timer1=20;
                    }
                    
                    while (sb_fx_ax)
                    {
                        delay_ms(50);
                    }
                }
                
                
                //测试RIF
                if (subpr_rif()==0)
                {
                    //接收到信号
                    if (rif_val[3]==cst_rif_learn)
                    {
                        //通道设置
                        //测试通道是否存在,不存在写入
                        if (subpr_eep_check()!=cst_window_have)
                        {
                            //不存在写入
                            for (i=0;i<3;i++)
                            {
                                eep_window[eep_window_ptr][i]=rif_val[i];
                            }
                            
                            eep_window_ptr++;
                            
                            if (eep_window_ptr>=16)
                            {
                                eep_window_ptr=0;
                            }
                            
                        }
                        //通道设置完成,闪烁3次表示
                        subpr_led_wink(3,3);      //调用LED闪烁函数
                        
                        //置退出
                        com_timer1=20;
                        
                    }
                    else if (rif_val[3]==cst_rif_sel_stop)
                    {
                        //换向设置
                        //测试通道是否合法,不合法不执行换向
                        if (subpr_eep_check()==cst_window_have)
                        {
                            //合法通道,执行换向
                            if (eep_out_j12==cst_out_j12_true)
                            {
                                eep_out_j12=cst_out_j12_false;
                            }
                            else
                            {
                                eep_out_j12=cst_out_j12_true;
                                //eep_out_j12=cst_out_j12_false;
                            }
                            
                            //换向设置完成,闪烁3次表示
                            subpr_led_wink(3,3);      //调用LED闪烁函数
                        
                            //置退出
                            com_timer1=20;
                        }
                        else
                        {
                            //非法通道
                            clr_led_r;
                            subpr_yms_com(2);
                            set_led_r;
                        }
                        
                    }
                    else
                    {
                        //非法指令
                        clr_led_r;
                        subpr_yms_com(2);
                        set_led_r;
                    }
                
                }   //扫描无线信号
                
                WDR();
            
            }   //等待通道设置完成
            
            //重置时间参数
            TCNT1H=cst_tcnt1h;
            TCNT1L=cst_tcnt1l;
            com_timer1=0;
            
            clr_led_r;
            subpr_yms_com(2);
                
            //测试是否为清除
            while (sb_w_learn_ax)
            {   
                set_led_r;
                subpr_yms_com(2);

                //进入通道清除,时间7秒
                if (com_timer1>=7)
                {
                    //7秒时间到
                    subpr_eep_clr();    //清除窗号
                    subpr_led_wink(3,3);  //清除完毕闪烁3次表示
                    
                    while (sb_w_learn_ax)
                    {
                        //等待放手
                        WDR();
                        subpr_yms_com(2);
                        
                    }//等待放手
                    
                }//等待7秒时间
                
            }//测试按键
            
        }//等待3秒时间
        
        WDR();
        
    }//测试按键
    
}






//******************函数*******************
//按键扫描OPEN AND CLOSE
void subpr_sbw_scan(void)
{
    //按键SBW_OPEN--------------------
    if (bit_sbw_open==cst_sbw_fs)
    {
        if (sbw_open_ax)
        {
            set_led_r;
            subpr_yms_com(2);
            
            if (sbw_open_ax)
            {
                //有按键处理
                if (sbw_close_fs)          //测试SBW_CLOSE是否按下
                {
                    //执行开操作
                    subpr_sbw_open_ax();
                }   
                else
                {
                    //执行停机操作
                    subpr_sbw_stop_ax();
                }
            }
                
            clr_led_r;
        
        }
    }
    else
    {
        if (sbw_open_fs)
        {
            set_led_r;
            subpr_yms_com(2);
            if (sbw_open_fs)
            {
                //置放开标志
                bit_sbw_open=cst_sbw_fs;
                //测试按键按下时间
                subpr_sbw_sort_test();

                //测试是否为机械式
                if (bit_sbw_sort==cst_sbw_k)
                {
                    //机械式开关放开处理
                    subpr_sbw_open_fs();
                }
                    
            }
                
            clr_led_r;
            
        }
        
    }
        
        
        
        
    //----------------------------------
    //按键SBW_CLOSE
    if (bit_sbw_close==cst_sbw_fs)
    {
        if (sbw_close_ax)
        {
            set_led_r;
            subpr_yms_com(2);
            if (sbw_close_ax)
            {
                //有按键处理
                if (sbw_open_fs)          //测试SBW_OPEN是否按下
                {
                    //执行开操作
                    subpr_sbw_close_ax();
                
                }   
                else
                {
                    //执行停机操作
                    subpr_sbw_stop_ax();
                }
            }         
                
            clr_led_r;
        
        }
        
    }
    else
    {
        if (sbw_close_fs)
        {
            set_led_r;
            subpr_yms_com(2);
            if (sbw_close_fs)
            {
                //置放开标志
                bit_sbw_close=cst_sbw_fs;
                //测试按键按下时间
                subpr_sbw_sort_test();

                //测试是否为机械式
                if (bit_sbw_sort==cst_sbw_k)
                {
                    //机械式开关放开处理
                    subpr_sbw_close_fs();
                }
                    
            } 
            
            clr_led_r;
            
        }
    }
    
    if (sbp_open_ax)
    {
        set_led_r;
        delay_ms(50);
        if (sbp_open_ax)
        {
            if (j1_out_true || j2_out_true)
            {
                //关闭输出
                j1_close;
                j2_close;
                xc_work_old=cst_out_free;
            }
            else
            {
                //调用输出
                subpr_out_control(cst_out_open);   
            }
        }
        while (sbp_open_ax)
        {
            delay_ms(50);
        }
        delay_ms(50);
        clr_led_r;

    }
    
    else if (sbp_close_ax)
    {
        set_led_r;
        delay_ms(50);
        if (sbp_close_ax)
        {
            if (j1_out_true || j2_out_true)
            {
                //关闭输出
                j1_close;
                j2_close;
                xc_work_old=cst_out_free;
            }
            else
            {
                //调用输出
                subpr_out_control(cst_out_close);   
            }
        }
        
        while (sbp_close_ax)
        {
            delay_ms(50);
        }
        delay_ms(50);
        clr_led_r;
    }
        
}




//******************函数*******************
//按键处理SB_XC_AX
void subpr_sb_xc_ax(void)
{
    //行程设置
    //按下直到LED发光指示,这时放手自动进行行程设置
    //如果不放手而按到LED闪烁指示,这时放手则先执行
    //自动行程测试,然后进入手工设置,可以通过遥控器
    //及手控板调整起点和终点,由SB_XC_AX进行确认,第
    //一次按下为起点,第二次按下为终点
    
    j1_close;
    j2_close;
    
    TCNT1H=cst_tcnt1h;
    TCNT1L=cst_tcnt1l;
    com_timer1=0;
    
    while (sb_xc_ax)
    {
        
        subpr_yms_com(2);
        
        if (com_timer1>=3)
        {
            //自动行程设置时间到,LED发光
            set_led_r;
            subpr_mot_wink();
            
            while (sb_xc_ax)
            {
                //测试手动设置
                subpr_yms_com(1);
                
                if (com_timer1>=7)
                {
                    //手动设置时间到
                    subpr_mot_wink();
                    subpr_mot_wink();
                    
                    while (sb_xc_ax)
                    {
                        //等待放手
                        subpr_led_wink(1,1);      //时间到,闪烁表示
                                            
                    }//等待放手
                    
                    //设定时间
                    com_timer1=7;
                
                }//等待手动时间
            
            }//测试按键
            
        }//等待自动时间
    
    }//测试按键
    
    //测试执行
    if (com_timer1>=7)
    {
        
        
        //清除行程
        subpr_clr_xc();
        subpr_mot_wink();
                

        //执行手动设置
        //bit_xc_man=1;
        //subpr_xc_config();  //调用行程设置
        
        /*        
        //等待手动设置
        set_led_r;
        while (sb_xc_fs)
        {
            //扫描按键
            subpr_sbw_scan();            
            
            //扫描无线
            if (subpr_rif()==0)
            {
                //有信号
                subpr_rif_ok();
                
            }   

        }
        
        //设置起点
        eep_xc_close=xc_currently;
        //等待放手
        clr_led_r;
        while (sb_xc_ax)
        {
            //等待放手
            subpr_yms_com(2);
            
        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -