📄 timer0.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 + -