📄 czx167-145-v2.2.c
字号:
HW_State=7;
HW_Pointer++;
}
else
{
HW_State=0;
HW_Pointer=0;
HW_Data_CRC=0;
}
}
else if(HW_State==7) // 数据校验和正确,开始接收结束字符
{
Infrared_buf[HW_Pointer]=SBUF;
if(Infrared_buf[HW_Pointer]==0x16)
{
for(i=0; i<(HW_Pointer+1); i++)
Infrared_buf_bak[i]=Infrared_buf[i]; //备份接收到的数据
HW_Re_OK='O'; //置红外接收正确标志
HW_ZB='H'; //置红外/载波状态为===红外标志
}
HW_State=0; //清0红外使用的积存器
HW_Pointer=0;
HW_Data_CRC=0;
}
}
ES=1; //允许串行口0中断
ET0=1;
REN=1; //允许接收
RI=0; //清标志位
return;
}
/**************************************************************************************
*
* FUNCTION: Com1_int
*
* DESCRIPTION: COM1中断程序: COM1(RS485)中断产生时,按照顺序接收规约数据
*
*
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void Com1_int(void) interrupt 6
{
ES1=0; // 串口1中断禁止
ET0=1;
EREN=1;
if(ERI!=0)
{
Timer_RS=20; // 100mS未接收到下一字节则退出接收状态(恢复原始态)
RS485_buf[RS485_Pointer]=SBUF1;
RS485_Pointer++;
}
ES1=1;
ERI=0;
EREN=1;
}
/**************************************************************************************
*
* FUNCTION: pl_pro
*
* DESCRIPTION: 载波中断收、发程序
*
* PARAMETERS:
* in : PLM_RS(PLM_RS=0 载波接收 ; PLM_RS=1 载波发送)
*
* out: plmrxd=1 载波接收成功 ; pl_buf[] 载波接收成功的数据
*
* RETURNED: none
*************************************************************************************/
void pl_pro(void) interrupt 7
{
uchar data j;
if(PLM_RS)
{ // 载波发送
if(pl_8<8) //
{
RXD_TXD=pl_h;
pl_8++; //发送一个字节的比特位的计数器
pl_data=pl_data<<1;
if(pl_8==8)
{
pl_8=0; // 位计数清0
ZB_Txd_Len++; // 发送长度加1
plret_l++; //复位计数器+1
pl_data=Send_Carrier_buf[ZB_Txd_Len]; // 下一个字节
if(plret_l>=20)
{
PLM_RST=0xa2;
plret_l=0;
}
if(ZB_Txd_Len>=ZB_Glob_Len)
{ //发送完成
PLM_RS=0; // 置成收态
ZB_Glob_Len=0; //总长度置成0
pl_data=0;
pl_8=0;
for(ZB_Txd_Len=0;ZB_Txd_Len<20;ZB_Txd_Len++) //接收缓冲区清0
Send_Carrier_buf[ZB_Txd_Len]=0;
ZB_Txd_Len=0;
RXD_TXD=1;
}
}
}
}
else
{ // 载波接收
RXD_TXD=1;
if (r_x==0) //接收检测同步头
{
if (RXD_TXD==1)
{
x_09af=x_09af|1;
}
if (x_09af==0x09af)//判断同步头
{ //myled=0;
r_x=1; //同步头已经接收标志
r_8=0; //比特计数器
x_09af=0; //清0
r_data=0;
r_len=0; //接收有效字节的长度为1
r_len1=30;//接收总长度给初值
}
else
{
x_09af=x_09af<<1;
}
}
else //接收有效字节
{
if (RXD_TXD==1)
r_data=r_data|1;
r_8++;
if (r_8<8)
r_data=r_data<<1;
else
{
Carrier_buf[r_len]=r_data;
r_8=0;
if(r_len==4)
{
r_len1=r_data+7; //得到实际要接收的长度
if(r_len1>60)
r_x=0;
}
r_len++;
r_data=0;
if (r_len>=r_len1)
{
r_x=0;
for (j=0;j<r_len1;j++)
{
Carrier_buf_bak[j]=Carrier_buf[j]; //备份接收到的数据
}
ZB_Re_OK='O';
HW_ZB='Z';
}
}
}
}
}
///////////////////////////////////////
//zb_send_c();
/////////////////////////////////////////////
void zb_send_c(void)
{
uchar i;
uint crc;
i=ZB_Glob_Len;
crc=cal_crc(Send_Carrier_buf,i);
Send_Carrier_buf[ZB_Glob_Len]=(uchar)crc;
crc=crc>>8;
Send_Carrier_buf[ZB_Glob_Len+1]=(uchar)crc;
ZB_Glob_Len+=2; //发送长度增加2个字节校验码
for(i=0;i<ZB_Glob_Len;i++)
Send_Carrier_buf[ZB_Glob_Len-i+7]=Send_Carrier_buf[ZB_Glob_Len-i-1];
for(i=0;i<6;i++)
Send_Carrier_buf[i]=0XFF; //补充数据头
Send_Carrier_buf[6]=0X09;
Send_Carrier_buf[7]=0XAF;
ZB_Glob_Len=ZB_Glob_Len+9;//发射长度增加8个字节的帧头,为可靠多发一个字节
ZB_Txd_Len=0;
pl_8=0;
PLM_RST=0xa2; // 复位发送计数器
plret_l=0; // 清载波复位计数器
pl_data=Send_Carrier_buf[0];
PLM_RS=1;
}
/**************************************************************************************
*
* FUNCTION: Check_HW_Son_ADD
*
* DESCRIPTION: 检查红外通讯地址是否正确
*
*
* PARAMETERS: none
*
* RETURNED: 返回地址类型 'E'=错误地址;0=子表地址;0x99=广播地址;0x55=终端地址
*
*************************************************************************************/
uchar Check_HW_Son_ADD(void)
{
uchar i;
if(Infrared_buf_bak[1]==0)
if(Infrared_buf_bak[2]==0)
if(Infrared_buf_bak[3]==0)
return('E');
if(Infrared_buf_bak[1]==0x99)
if(Infrared_buf_bak[2]==0x99)
if(Infrared_buf_bak[3]==0x99)
return(0x99);
for(i=0;i<16;i++)
{
if(Infrared_buf_bak[1]==Son_Add_buf[i][0])
if(Infrared_buf_bak[2]==Son_Add_buf[i][1])
if(Infrared_buf_bak[3]==Son_Add_buf[i][2])
return(0);
}
if(Infrared_buf_bak[1]==terminal_add[0])
if(Infrared_buf_bak[2]==terminal_add[1])
if(Infrared_buf_bak[3]==terminal_add[2])
return(0x55);
return('E');
}
/**************************************************************************************
*
* FUNCTION: check_HW_password
*
* DESCRIPTION: 检查红外通讯密码是否正确
*
*
* PARAMETERS: none
*
* RETURNED: 'O'=密码正确;'E'=密码错误
*
*************************************************************************************/
void xiaodou(void)
{
uchar j;
key=1;
if(key==0)
{
for(j=0;j<250;j++);for(j=0;j<250;j++); for(j=0;j<250;j++);
if(key==0)
{
for(j=0;j<250;j++);for(j=0;j<250;j++);for(j=0;j<250;j++);
if(key==0)
wp24=0;
}
}
}
/**************************************************************************************
*
* FUNCTION: WR_ADDR
*
* DESCRIPTION: 向EE中写7个字节并校验写入的7个字节是否正确
*
*
* PARAMETERS: none
*
* RETURNED: 返回0写出错,返回O写正确
*
*************************************************************************************/
uchar WR_ADDR(uchar WR_24,uchar Add_FM24)
{
uchar i,j;
if(wp24==1)
return(0);
Write_FM24_nByte(WR_24,7, Add_FM24 );
for(j=0;j<3;j++)
for(i=0;i<250;i++);
WDT_RST=0xA1;
i=Read_FM24_7Byte(WR_24,Add_FM24);
if(i!='O')
return(0);
if(Write_buf[0]==Read_buf[0])
{
if(Write_buf[1]==Read_buf[1])
{
if(Write_buf[2]==Read_buf[2])
{
if(Write_buf[3]==Read_buf[3])
{
if(Write_buf[4]==Read_buf[4])
{
if(Write_buf[5]==Read_buf[5])
{
if(Write_buf[6]==Read_buf[6])
return('O');
}
}
}
}
}
}
return(0);
}
/**************************************************************************************
*
* FUNCTION: write_add_terminal
*
* DESCRIPTION: 写终端表号
*
*
* PARAMETERS: 红外接收的终端表号位置
*
* RETURNED: none
*
*************************************************************************************/
void write_add_terminal(uchar k)
{
uchar i;
uchar j='X';
for(i=0;i<6;i++)
{
Write_buf[i]=Infrared_buf_bak[k+i]-0x33;
j+=Write_buf[i];
}
Write_buf[6]=j;
xiaodou();
i=WR_ADDR(WR_2402,add_terminal);
xiaodou();
j=WR_ADDR(WR_2402,add_terminal_bak);
if((i=='O')&&(j=='O'))
{
for(i=0;i<7;i++)
terminal_add[i]=Write_buf[i];
HW_Answer_Success();
}
}
/**************************************************************************************
*
* FUNCTION: HW_Design_Prog
*
* DESCRIPTION: 红外规约数据处理
*
*
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void HW_Design_Prog()
{
uchar Data_Control_sign; // 控制码( "0x01" or "0x04" )
uchar Command_Sign_H; // 0x90
uchar Command_Sign_L; // 0x1F
uchar Add_FM24; // FM24C04中的数据保存地址
uchar CS;
uchar i,j,k;
uchar Addcheck;
Addcheck=Check_HW_Son_ADD();
Data_Control_sign=Infrared_buf_bak[8]; //读取功能码
Command_Sign_H=Infrared_buf_bak[11]-0x33; //接收方-0x33处理数据
Command_Sign_L=Infrared_buf_bak[10]-0x33; //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -