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

📄 timer0.c

📁 本程序是一个RS232转网口的。是一个透明传输的模块
💻 C
字号:
/*
*****************************************************************************************************
*
*  File name: timer.c
*****************************************************************************************************
*/

#include "..\head\includes.h"



data struct timer D10ms,D1s;
unsigned char xdata ConnectNum;
unsigned char xdata bConnect;
unsigned int  xdata TimerSec[T_SEC_NUM];
unsigned int  xdata TimerMil[T_MIL_NUM];



/*
*****************************************************************************************************
* FUNC: 1ms中断一次 = 1000   32M晶振
* NOTE: onecycle = 12/xtal=12/32=0.375   1000/0.375 = 2667  (65536-2667)/256=245 (65536-2667)%256=149
        onecycle = 12/xtal=12/40=0.3   1000/0.3 = 3333  (65536-3333)/256=242 (65536-3333)%256=251
		onecycle = 12/22.1184= 0.5425  1000/0.5425 = 1843.3179~=1844    =248                 =204  
*****************************************************************************************************
*/ 

#define   TIMEH1ms    248    //定时1MS  FOSC=22.1184M
#define   TIMEL1ms    204


void  timer0()  interrupt 1
{

    if (TimerMil[T_FRAME_END]) {
        TimerMil[T_FRAME_END]--;
	}

	if (TimerMil[T_DELAY_NUM]) {
        TimerMil[T_DELAY_NUM]--;
	}

	D10ms.count--;

	if(0 == D10ms.count) {
		D10ms.arrived=TRUE;
		D10ms.count=10;
		D1s.count--;
		if(0 == D1s.count) {
			D1s.count=100;
			D1s.arrived=TRUE;
		}
	}
	
	TH0=TIMEH1ms;
	TL0=TIMEL1ms;
	TR0=1;
}

/*
*****************************************************************************************************
*FUNC:初始化定时器,设置波特率
*NOTE:  
*****************************************************************************************************
*/
void Timer0Init(void)
{
    unsigned char i;

	IE=0x00;
    ET0=1;          // timer0 interrupt enable
    ES=1;           // RS-232 interrupt enable
    EA=1;           // all interrupt enable

	TMOD=0x21;		//定时器1用于波特率发生器,定时器0用于定时
	TH0=TIMEH1ms;
	TL0=TIMEL1ms;

	D10ms.arrived=FALSE;
	D1s.arrived=FALSE;
    D1s.count=100;
	D10ms.count=10;

    for (i=0; i<T_MIL_NUM; i++) {
        TimerMil[i] = 0;
	}
    for (i=0; i<T_SEC_NUM; i++) {
        TimerSec[i] = 0;
	}

	TR0=1;         //启动定时器
}

/*
*****************************************************************************************************
*Func: 延时 
*Note:
*    1:  入参: 小时  分钟  秒   毫秒
*    2:
*****************************************************************************************************
*/
void TimeDly(unsigned int ticks)
{
    TimerMil[T_DELAY_NUM] = ticks;
	while(TimerMil[T_DELAY_NUM]) {             
		;
	}
}

unsigned char DelayHMSM(unsigned char hours,unsigned char minutes,\
unsigned char seconds, unsigned int milli)
{
    unsigned long xdata ticks;
    unsigned int xdata loops;
 

    if (hours > 0 || minutes > 0 || seconds > 0 || milli > 0) {
        if (minutes > 59) {
            return FALSE;    
        }
        if (seconds > 59) {
            return FALSE;
        }
        if (milli > 999) {
            return FALSE;
        }

        ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * TICKS_PER_SEC
              + TICKS_PER_SEC * ((INT32U)milli + 500L / TICKS_PER_SEC) / 1000L;
        loops = ticks / 65536L;                  
        ticks = ticks % 65536L;                  
        TimeDly(ticks);
        while (loops > 0) {
            TimeDly(32768);
            TimeDly(32768);
            loops--;
        }
        return TRUE;
    } else {
        return FALSE;
    }
}


/*
*****************************************************************************************************
*FUNC:  
*NOTE:  
    如果处于配置状态下,3分钟分强制退出
	//WriteFlash(ConfigReg.bytes,FLASH_DATA_NUM);  //进入运行状态前把参数写入到FLASH
*****************************************************************************************************
*/
void Updata_Model_Statu(void)
{
    if (ModelStatu == MODEL_RUN_STATU) {
        return;
	}
 	if (TimerSec[T_EXIT_CONFIG]) {
        TimerSec[T_EXIT_CONFIG]--;
	} else {
		ModelStatu = MODEL_RUN_STATU;
        NetConfigInit();              //强制退出参数以原来的为主,当前没保存的数据放弃!
		HintMsg(4,NULL);
	}
}


/*
*****************************************************************************************************
*FUNC:  
*NOTE:  
    客户端连接,如果连上以后等待发送心跳包
	        //InitPingTable();                              //如果还没连上的时候,PING不成功会被清掉
*****************************************************************************************************
*/
void Client_Connect(void)
{
    if (ModelStatu == MODEL_CONFIG_STATU) {                 //配置状态下不去连接服务器
        return;
	}

	if (!bConnect){                                         //每隔1秒去连接一次,直到连上为止
		if (!conxn[IndexOfClient].bUsed) {
			conxn[IndexOfClient].bUsed = TRUE;	            //标志该套接字已使用
		}
		if (ConnectNum > 0) {                               //连接10次仍旧连不上更改本地端口号
            ConnectNum--;
		} else {
			ConnectNum = RECONNECT_NUM;                     //重连填初值
			SocketIndexInit(IndexOfClient);                 //客户端套接字初始化
			LocalPort++;
			InitArpTable();                                 //初始化ARP表
            if ((LocalPort < 1024) || (LocalPort > 5000)) {
                LocalPort = 1024;                           //本地端口填初始值1024 
                McuRst(NO_SAVE_EXIT);                       //如果连到这里还没连上,程序重起                            
			}
		}
		TCPConnect(IndexOfClient,my_ServerIP,Server_PORT.word,OnReceive,OnClose,OnConnect);
	} else {                                                //连上以后     
        if (TimerSec[T_SEND_HEART] > 0) {                   //判断发送心跳包时间到达                     
            TimerSec[T_SEND_HEART]--;                                
		} else {
		    TimerSec[T_SEND_HEART] = HeartTimeOutBak;       //时间初始化
			DebugMsg(53);
            #ifdef  PROTOCOL_2004   
                SendHeart2004();                            //发送心跳包 //屏蔽供测试
            #else 
	            SendHeart();                                //发送心跳包
            #endif
			SentHeartTime++;
		}
		OnLineTime++;                                       //连续在线时间计时
	}
}



/*
*****************************************************************************************************
*FUNC:  
*NOTE:  
    缓冲区里的数据生存时间,超出最大生存时间,放弃
*****************************************************************************************************
*/
void Te2NetBuf_Ttl(void)                                 
{
    unsigned char i;
	for (i=0; i<MAX_BUF_NUM; i++) {
        if (Te2NetBuf[i].statu > 0) {     //有数据
            if (Te2NetBuf[i].ttl > 0) {
                Te2NetBuf[i].ttl--;       //生存时间
			} else {
                Te2NetBuf[i].statu = 0;   //放弃
			}
		} 
	}
}


/*
*****************************************************************************************************
*FUNC:  
*NOTE:  
    缓冲区里的数据生存时间,超出最大生存时间,放弃
*****************************************************************************************************
*/
void Net2TeBuf_Ttl(void)                                 
{
    unsigned char i;
	for (i=0; i<MAX_BUF_NUM2; i++) {
        if (Net2TeBuf[i].statu > 0) {     //有数据
            if (Net2TeBuf[i].ttl > 0) {
                Net2TeBuf[i].ttl--;       //生存时间
			} else {
                Net2TeBuf[i].statu = 0;   //放弃
			}
		} 
	}
}

/*
*****************************************************************************************************
*FUNC:  套接字超时重连
*NOTE:   心跳包发出后2分钟没响应重连  
*****************************************************************************************************
*/
void Socket_Ttl(void)
{
    if (SendHeartFlag == FALSE) {                       //心跳包已发,开始超时计时
        return;
	}
    if (TimerSec[T_SOCKET_TTL] > 0) {
        TimerSec[T_SOCKET_TTL]--;
	} else {
        HintMsg(9,NULL);
        tcp_send(&TCPSend,FLG_RST, 20, IndexOfClient);  //这里一定要加RST
		InerClose(IndexOfClient);                       //关闭该套接字,重连 关闭后SendHeartFlag=FALSE;
	}
}
/*
*****************************************************************************************************
*FUNC:  10MS周期函数
*NOTE:  对发出的数据如果超时,进行重发,每一次隔1S,每二次隔2S,4S,8S,16S,32S,由FINALTIMEOUT决定

*****************************************************************************************************
*/
void Cycle10ms(void)
{
	if (10==D10ms.count)	{              //10ms定时到
		D10ms.arrived=FALSE;
		initial_sequence_nr += 1280;       // 初始序列号加1.
		tcp_retransmit();                  //数据超时没响应,重传
		if (initial_sequence_nr == 0xFFFFFFFFL) {
		    initial_sequence_nr=1;
		}
		DefaultPin();                      //恢复出厂值IO脚电平判断
	}
}

/*
*****************************************************************************************************
*FUNC:  
*NOTE:  1:2分钟时间到发心跳ARP包,如果没返回,视对方PC不存在,关闭套接字
        2:对PING的结果状态进行判断,是否PING通
		3:更新ARP表的生存时间
		4:当作客户端,连接套接字
*****************************************************************************************************
*/
void Cycle1s(void) 
{
    static unsigned char xdata seconds=0;
	static unsigned char xdata count=0;

    if ((100 == D1s.count) && D1s.arrived) {     //1s定时到
	    D1s.arrived = FALSE;                     //保证D1s=100的时候只进来一次
        if (bConnect) {
            if (++count % 4) {
                LED(RUN_LED,OFF);                //连上以后运行LED灭3S
			} else {
                LED(RUN_LED,ON);                 //连上以后运行LED亮1S
			}
		} else {
            RUN_LED =~RUN_LED;
		}
		if ((bBound == FALSE) && DHCPMode) {     //DHCP模式并且IP未绑定
		    if (++seconds % 2){                  //如果未得到IP,2秒请求DHCP分配一次
                DHCPRequest();
			}
		} else { 
		    tcp_inactivity();              //在线后,tcp保活心跳定时器,2分钟发一次ARP探测,配合:TCP_ATYARP();
			UpdateArpTab();                //更新ARP表的生存时间
			Client_Connect();              //客户端尝试连接
			Socket_Ttl();                  //套接字超时重连
            DHCPTimer();                   //DHCP租期计时器
		}
		PingCycle();                       //PING结果

		Updata_Model_Statu();              //配置状态下3分钟分强制进入运行状态
		Te2NetBuf_Ttl();                   //数据生存时间判断(终端到网络)	 
		Net2TeBuf_Ttl();                   //数据生存时间判断(网络到终端)
		#ifdef PROTOCOL_2004
		    ResenBuf_Interval();
		#endif
	}
}

⌨️ 快捷键说明

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