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

📄 rs232.c

📁 一整套电梯控制器源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//#include<w77c32.h>
//#include<intrins.h>
#include "Math.h"
#include "global.h"
/*
void timer0 (void) interrupt 1 using 1
{
    m_nTestTimer = m_nTestTimer + 5;
    if(m_nTestTimer==1000){
        m_nTestTimer=0;
        P1_0=0;
    }
    mE_InputData.mDianTi[0].nJiaSuDu=m_nTestTimer;
    
}
*/
//void timer0 (void)interrupt 1 using 2                                          //5ms 定时器
void timer2 (void)interrupt 5 using 2                                          //5ms 定时器
{  
    uchar a;
    TF2=0;
    EA=0;
//  TH0=-(0x28B0/256);
//  TL0=-(0x28B0/256);
    //串口通讯处理(串口在主程序及中断中)
	serial_comm();

	//监视延迟
	m_monitor_delay_count++;
	if(m_monitor_delay_count>=SCC_MONITOR_DELAYCOUNT)
		m_monitor_delay_count=SCC_MONITOR_DELAYCOUNT;
//---------------------------------04-5-17
   
    can_send_count++;
    if(can_send_count>5){
        m_state_20ms=~m_state_20ms;
        can_send_count=0;
    }
    if((m_state_20ms>0x7f)&&(can_send_count==3)){
        e_out_call_flag=1;                   //发一组外呼数据
        e_lamp_call_flag=0;                  //发一组外呼灯亮灭
    }else if((m_state_20ms<0x7f)&&(can_send_count==3)){
        e_lamp_call_flag=1;                  //发一组外呼灯亮灭
        e_out_call_flag=0;                   //发一组外呼数据
    } 



//---------群控器连接计时处理04-5-10
//以下程序联机1分钟可为群控,脱机1分钟必为单梯
 
    for(a=0;a<=3;a++){   
        //can在线计时
        if(e_online_time_count[a]<200){    //如1S未接收到群控器的数据,视群控器脱机
            e_online_time_count[a]++;
            e_1_second_flag[a]=0;
            e_online_flag[a]=1;               //群控器在线
            e_group_comm_count[a]=0;          //群控器计时=0
        }else if((e_online_time_count[a]>=200)&&(e_1_second_flag[a]==0)){
            e_online_flag[a]=0;               //群控器不在线
            e_1_second_flag[a]=1;
            e_group_comm_count[a]=1;           //群控器通讯计时 
            e_single_comm_count[a]=0;
        }
        if(e_group_comm_count[a]>0)           //群控器脱机1分钟,自动改为单梯控制
            e_group_comm_count[a]++;             
        if(e_group_comm_count[a]>=1000){
            e_online[a]=0;                    //单梯运行,初值即为单梯
            mE_InputData.mDianTi[a].TongXun.bCanChuShiOK=0;		//2004.06.16 added by LHM(改为1分钟通讯)  
            e_group_comm_count[a]=1000;
        }
        if(e_online_flag[a]==1)               //群控器在线         
            e_single_comm_count[a]++;              //群控器脱机1分钟,自动改为单梯控制 
        if(e_single_comm_count[a]>=1000){     
            e_online[a]=1;           //群控运行
            mE_InputData.mDianTi[a].TongXun.bCanChuShiOK=1;		//2004.06.16 added by LHM(改为1分钟通讯)   
            e_single_comm_count[a]=1000;
        } 
        //关门不到位计时
        if(mE_InputData.mDianTi[a].Men.bGuanMenDaoWei==0){	          //关门不到位
            m_Timer.lChaoShiTimer[a] =m_Timer.lChaoShiTimer[a]+5;	  //累加5ms
        }else{
            m_Timer.lChaoShiTimer[a]=0;
        }
			//2004.11.23
        //淘汰标志计时
        if(m_MenGuZhang_flg[a]==1)
        if(mE_InputData.mDianTi[a].Men.bMenGuZhang==0)
        if((m_MenGuZhang_count[a]--)==0){
            mE_InputData.mDianTi[a].Men.bMenGuZhang=1;
            m_MenGuZhang_count[a]=COUNT_10s;
        }
        if(m_ManZai_flg[a]==1)
        if(mE_InputData.mDianTi[a].ChengZai.bManZai==0)
        if((m_ManZai_count[a]--)==0){
            mE_InputData.mDianTi[a].ChengZai.bManZai=1;
            m_ManZai_count[a]=COUNT_3s;
        }
        if(m_ChaoZai_flg[a]==1)
        if(mE_InputData.mDianTi[a].ChengZai.bChaoZai==0)
        if((m_ChaoZai_count[a]--)==0){
            mE_InputData.mDianTi[a].ChengZai.bChaoZai=1;
            m_ChaoZai_count[a]=COUNT_3s;
        }
        if(m_JianXiu_flg[a]==1)
        if(mE_InputData.mDianTi[a].TeBie.bJianXiu==0)
        if((m_JianXiu_count[a]--)==0){
            mE_InputData.mDianTi[a].TeBie.bJianXiu=1;
            m_JianXiu_count[a]=COUNT_1s;
        }
        if(m_SiJi_flg[a]==1)
        if(mE_InputData.mDianTi[a].TeBie.bSiJi==0)
        if((m_SiJi_count[a]--)==0){
            mE_InputData.mDianTi[a].TeBie.bSiJi=1;
            m_SiJi_count[a]=COUNT_1s;
        }
        if(m_ZhiShi_flg[a]==1)
        if(mE_InputData.mDianTi[a].TeBie.bZhiShi==0)
        if((m_ZhiShi_count[a]--)==0){
            mE_InputData.mDianTi[a].TeBie.bZhiShi=1;
            m_ZhiShi_count[a]=COUNT_1s;
        }
        if(m_BaoLiu_flg[a]==1)
        if(mE_InputData.mDianTi[a].TeBie.bBaoLiu==0)
        if((m_BaoLiu_count[a]--)==0){
            mE_InputData.mDianTi[a].TeBie.bBaoLiu=1;
            m_BaoLiu_count[a]=COUNT_1s;
        }
        if(m_SuoTi_flg[a]==1)
        if(mE_InputData.mDianTi[a].TeBie.bSuoTi==0)
        if((m_SuoTi_count[a]--)==0){
            mE_InputData.mDianTi[a].TeBie.bSuoTi=1;
            m_SuoTi_count[a]=COUNT_1s;
        }
        if(m_XiaoFang_flg[a]==1)
        if(mE_InputData.mDianTi[a].TeBie.bXiaoFang==0)
        if((m_XiaoFang_count[a]--)==0){
            mE_InputData.mDianTi[a].TeBie.bXiaoFang=1;
            m_XiaoFang_count[a]=COUNT_1s;
        }
        if(m_JiTing_flg[a]==1)
        if(mE_InputData.mDianTi[a].TeBie.bJiTing==0)
        if((m_JiTing_count[a]--)==0){
            mE_InputData.mDianTi[a].TeBie.bJiTing=1;
            m_JiTing_count[a]=COUNT_1s;
        }
        if(m_GuZhang_flg[a]==1)
        if(mE_InputData.mDianTi[a].TeBie.bGuZhang==0)
        if((m_GuZhang_count[a]--)==0){
            mE_InputData.mDianTi[a].TeBie.bGuZhang=1;
            m_GuZhang_count[a]=COUNT_1s;
        }
        if(m_JingGao_flg[a]==1)
        if(mE_InputData.mDianTi[a].TeBie.bJingGao==0)
        if((m_JingGao_count[a]--)==0){
            mE_InputData.mDianTi[a].TeBie.bJingGao=1;
            m_JingGao_count[a]=COUNT_1s;
        }

    }
    
    if(m_IsExistWaiInFlg==0)
    	m_pTimer->lJingTaiTimer = m_pTimer->lJingTaiTimer +5; 
    else
    	m_pTimer->lJingTaiTimer = 0; 
    
    if(m_read_time==0)
    if((m_read_time_count--)==0){
        m_read_time=1;
        m_read_time_count=COUNT_5s;
    }

	if(m_can0_flg==1)
	if(m_can0err_flg==0)
	if((m_can0_count--)==0){
		m_can0err_flg=1;
		m_can0_count=COUNT_ERR;
	}
	if(m_can1_flg==1)
	if(m_can1err_flg==0)
	if((m_can1_count--)==0){
		m_can1err_flg=1;
		m_can1_count=COUNT_ERR;
	}
	if(m_can2_flg==1)
	if(m_can2err_flg==0)
	if((m_can2_count--)==0){
		m_can2err_flg=1;
		m_can2_count=COUNT_ERR;
	}
	if(m_can3_flg==1)
	if(m_can3err_flg==0)
	if((m_can3_count--)==0){
		m_can3err_flg=1;
		m_can3_count=COUNT_ERR;
	}
//---------------------------------------------------------------------

		EA=1;
}

// 串口通信处理
void serial_comm(void)
{

	comm_check();						// 上位机通讯检测程序 
	monitor_rec();
	monitor_send();

}

// 串口命令解析
void serial_command_resolve(void)
{
	if(m_comm_enable_flg==1){
		if(m_resolve_flg==1)
			command(m_scc.m_ReadBuf);
	}
}

// 串口发送数据作成
void serial_make_senddata(void)
{
	if(m_comm_enable_flg==1){
		//作成发送缓冲区
		if(m_scc.WriteFlg==0){							//完整命令起始
/*			if(m_monitor_type[m_active_idx]!=0){				//有效的类型
				make_send_buf();						//作成发送数据
			}else{		//遇无效类型,尝试监视下一参数
				m_active_idx++;
				if(m_active_idx>=MORN_PARAM_NUM){
					m_active_idx=0;
					return;	
				}				
			}*/
VALIDE_TYPE:if(m_monitor_type[m_active_idx]!=0){				//有效的类型
				make_send_buf();						//作成发送数据
			}else{		//遇无效类型,尝试监视下一参数
				m_active_idx++;
				if(m_active_idx>=MORN_PARAM_NUM){
					m_active_idx=0;
					return;	
				}
				goto VALIDE_TYPE;				
			}
		}
	}
}

//----------------------------------------------------------------------------------------------------------
void comm_check(void)   				// 上位机通讯检测程序 
{                                                                            
   if(RI==1){   								// 如接收到数据,通讯标志置1                                                                            
     	m_comm_60sover_flg=0;                                                       
     	m_comm_enable_flg=1;
	 	m_comm_data_flg=1;                                                            
   }else{ 
	 	m_comm_data_flg=0;
	 	if(m_comm_60sover_flg==1){       // 如计时1分钟到,无接收数据,通讯程序不再执行,标志清零        
			m_comm_enable_flg=0;                  
      	    message_quit();                // 串口通信退出(V命令)子程序
     	}
   }

	//无串口数据时,开始60s计时
	if(m_comm_data_flg==0)
		m_ST_60s_count++;
	else
		m_ST_60s_count=0;
	
	//无串口数据时,60s计时到
	if(m_ST_60s_count>=COUNT_60s){
		m_ST_60s_count=COUNT_60s;
		//60s无串口通信数据,60s计时结束标志置1
		m_comm_60sover_flg=1;
	}
}


//-------------------------------------------------------------------------------------------------------------------------------
void monitor_rec(void)                                                                //上位机通讯程序
{ 
   if(m_comm_enable_flg==1){
		if(RI==1){							//有数据输入
       	 	sbuf_rec=SBUF;
         	RI=0;	
			if(m_host_flg==1){
				m_get_senddata_flg=1;
			}else{
			}
		}else{
			sbuf_rec=INVALID_ASC2; 
		}

		if((sbuf_rec==REC_COMMAND) || (sbuf_rec==SEND_COMMAND)){	//第1个命令元素ESC/FS,放入数组的第一个元素
			if(sbuf_rec==REC_COMMAND){

				m_host_flg=0;
				m_scc.nReadCount=0;
				m_scc.m_ReadBuf[m_scc.nReadCount]=sbuf_rec;
				m_scc.nReadCount++;
				SBUF=sbuf_rec;		//返回接收的数据
				//终止监视 
				message_quit();
			}else if(sbuf_rec==SEND_COMMAND){
				m_host_flg=1;			//移至主动发送处
			}
		
			sbuf_rec=INVALID_ASC2;
		}else if((m_scc.nReadCount==1) && ((sbuf_rec!=INVALID_ASC2))){	//第2个命令元素
			if(m_host_flg==0){
				m_scc.m_ReadBuf[m_scc.nReadCount]=sbuf_rec;
				m_scc.nReadCount++;
				SBUF=sbuf_rec;		//返回接收的数据
			}else{

⌨️ 快捷键说明

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