📄 mmm.c
字号:
//#include <reg52.h>
#include<w77c32.h>
#include <absacc.h>
#include "string.h"
#include "serial.h"
#include "intrins.h"
#include "e25045.h"
#include "comm.h"
#include "crc.h"
static unsigned char xdata RemainRec[4][16];
unsigned char xdata Card_id[200];
unsigned char xdata Call_id[8];
unsigned char idata ring_flg=0,x,ADDR;
unsigned int idata rest_delay=0,bcc;
//*********************************************************
union charint{
unsigned char chrX[2];
unsigned int intX;
};
union charint ad_temp, recordint,rx_bcc;
//************************程序用的变量********************
unsigned char data RXtem[6], RXdata[6];//程序接收数据缓冲区
unsigned char idata RXNOM,RXSTAT;
unsigned char idata RXTimerOUT,com1=0,com2=0; //接收超时
bit rxok,Waring=0; // 接收完成标志
sbit CS=P2^4;
sbit PWR_UP=P2^5;
sbit TX_EN=P2^6;
sbit Test_led=P1^4;
/****************************************************************************/
void Delay100ms(unsigned char x)
{
unsigned char i,j;
while(x-- != 0)
{
for (j = 0;j < 74; j++)for (i = 0;i < 88; i++){_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
_nop_() ;_nop_() ;_nop_() ;};
}
}
/****************************************************************************/
void Delay1ms(unsigned char idata x)
{
unsigned char i;
while(x-- != 0)
{
for (i = 0;i < 89; i++){_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
_nop_() ;_nop_() ;_nop_() ;};
}
}
/****************************************************************************
* *
* Function: init_com *
* *
* Input: - *
* Output: - *
* *
* Description: *
****************************************************************************/
void init_com(void)
{
ES = 1; // Enable serail interrupts
EA=0;
ET0 = 1; // Enable t0 interrupts
RecvState = RECV_STX;
RecvReady = TRUE;
SendReady = FALSE;
SendOk = FALSE;
Cmdok = FALSE;
En485 = RECV;
EA=1;
}
/****************************************************************************
* *
* Function: START_T0 *
* *
* Input: - *
* Output: - *
* *
* Description: *
* *
* *
****************************************************************************/
void START_T0com2(unsigned char x)
{
ET0 = 0 ;
TR0 = 0;
RXTimerOUT = x ;
TL0 = 0;
TH0 = 0;
TR0 = 1;
ET0 = 1 ;
com2=1;
}
/****************************************************************************
* *
* Function: START_T0 *
* *
* Input: - *
* Output: - *
* *
* Description: *
* *
* *
****************************************************************************/
void START_T0(unsigned char x)
{
ET0 = 0 ;
TR0 = 0;
Timer0Cnt = x ;
TL0 = 0;
TH0 = 0;
TR0 = 1;
ET0 = 1 ;
com1=1;
}
/****************************************************************************
* *
* Function: CALL_isr_T0 *
* *
* Input: - *
* Output: - *
* *
* Description: *
* *
* *
****************************************************************************/
void CALL_isr_T0com2(void)
{
//TR0 = 0;
RXTimerOUT = 0;
//TF0 = 1;
com2=0;
}
/****************************************************************************
* *
* Function: CALL_isr_T0 *
* *
* Input: - *
* Output: - *
* *
* Description: *
* *
* *
****************************************************************************/
void CALL_isr_T0(void)
{
// TR0 = 0;
Timer0Cnt = 0;
// TF0 = 1;
com1=0;
}
//********************串口中断处理程序**************************************************************
void ub1ISR(void) interrupt 7 using 1
{
unsigned char data c;
if ( RI_1 ) // Receive Command
{
RI_1 = 0;
c = SBUF1;
switch(RXSTAT)
{
case 0: //接受帧头02
if(c==0x88)
{RXSTAT=1;START_T0com2(20); }
else
CALL_isr_T0com2();
break;
case 1: //接收
if(c==0xff)
{
RXSTAT=2;
START_T0com2(20);
}
else
{
RXSTAT=0;
CALL_isr_T0com2();
}
// RXSTAT=0;
break;
case 2:
x=c;
RXSTAT=3;
START_T0com2(20);
break;
case 3:
if(x==c)
{
rxok=1;
ring_flg=x;
}
RXSTAT=0;
x=0;
CALL_isr_T0com2();
break;
default:
RXSTAT=0;
break;
}
}
else
{
TI_1=0;
}
}
/****************************************************************************
* *
* Function: isr_UART *
* *
* Input: - *
* Output: - *
* *
* Description: *
****************************************************************************/
void isr_UART(void) interrupt 4 using 2
{
unsigned char c , oldRecvState , i , bcc;
// WatchDog();
if ( RI ) // Receive Command
{
TR0 = 0 ; //stop t0
c = SBUF;
RI = 0;
if (RecvReady)
{
SendReady = FALSE;
oldRecvState = RecvState;
RecvState = RECV_STX;
switch (oldRecvState)
{
case RECV_STX: // Receive STX and answer DLE
if (c == STX)
{
RecvState = RECV_ADDR0;
START_T0(T_533_ms);
}
else
{
CALL_isr_T0() ;
};
break;
case RECV_ADDR0:
if (c == ADDR)//0xd2)//MeterNum.chrX[3])
{
RecvState = RECV_ADDR1;
START_T0(T_533_ms);
}
else
{
CALL_isr_T0() ;
};
break;
case RECV_ADDR1:
if (c == 0x02)//MeterNum.chrX[2])
{
RecvState = RECV_ADDR2;
START_T0(T_533_ms);
}
else
{
CALL_isr_T0() ;
};
break;
case RECV_ADDR2:
if (c == 0x96)//MeterNum.chrX[1])
{
RecvState = RECV_ADDR3;
START_T0(T_533_ms);
}
else
{
CALL_isr_T0() ;
};
break;
case RECV_ADDR3:
if (c ==0x49) //MeterNum.chrX[0])
{
// LED_RED = ~LED_RED;
En485 = SEND;
//Ir_En = SEND;
SBUF = DLE ;
RecvState = RECV_DATA_DLE_ETX;
DataDleReceived = FALSE;
Index = 0;
Cmdok = FALSE;
while( !TI );
TI = FALSE;
En485 = RECV;
//Ir_En = RECV;
START_T0(T_533_ms);
}
else
{
CALL_isr_T0() ;
};
break;
case RECV_DATA_DLE_ETX:// Receive data,DEL,ETX and answer DLE
if (c == DLE)
{
if (!DataDleReceived) //如果上一个不是DLE 丢掉
{
DataDleReceived = TRUE;
RecvState = RECV_DATA_DLE_ETX;
START_T0(T_533_ms);
break;
}
else //如果上一个是DLE
{
DataDleReceived = FALSE; //留下
};
}
else if (c == ETX)
{
if (DataDleReceived) //如果是结束标记 处理
{
DataDleReceived = FALSE;
bcc = 0;
for (i = 0; i < Index; i++)
{
bcc ^= SerBuffer[i];
} ;
if( bcc == 0)
{ En485 = SEND;
//Ir_En = SEND;
Cmdok = TRUE;
SBUF = DLE ;
while( !TI );
TI = FALSE;
En485 = RECV;
//LED_RED = ~LED_RED;
//Ir_En = RECV;
}
else
{ En485 = SEND;
//Ir_En = SEND;
Cmdok = FALSE;
SBUF = NAK ;
while( !TI );
TI = FALSE;
En485 = RECV;
//Ir_En = RECV;
};
RecvState=RECV_STX;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -