#include<reg52.h>
#include<intrins.h>
#include "delay.h"
#include "12232.h"
#include "1549.h"
#include "warning.h"
#include "1302.h"
#include "keynew.h"
#define uchar unsigned char
#define uint unsigned int
/**************串口命令********************************************/
/*功能:全局变量的初始化*/
#define RS_start 0x02 //开始
#define COM_time 0x31 //查询时钟和温度
#define COM_updown 0x32 //设置上下限
#define COM_stwarn 0x33 //启动报警
#define COM_endwarn 0x34 //停止报警
#define RS_end1 0x03 //结束
uchar i,a,s=1,hi=0;
uchar rsave=0,maxarry; //rsave,,,,,,maxarry数组的最大长度
bit sdd=0;
bit bjbz=0; //初始化报警标志位
bit bjkz=1; //报警控制位
/*************串口中断标志位**************************/
bit R_start=0; //开始标志 开始接受=1;
bit R_addr=0; //地址标志=1表示接受完成
bit R_com=0; //命令标志 命令接受完成=1
bit R_shuju=0; //数据标志:数据接收完成=1;
bit R_jiaoyan=0; //校验位标志 校验成功=1
bit R_endb=0; //结束标志 接受到结束的命令=1;
uchar data recivearry[15]; //接收缓冲区
uchar data sendarry[18]; //发送缓冲区 第一位存在
/*****************定时器0************************/
/*功能:定时扫描报警情况和喂狗*/
void timefw(void) interrupt 1
{ i++;
hi++;
if(hi==250){sw1=sw;sw=ad_read();}
if(bjbz&bjkz)
{beep=0;
if(a==250){a=0;ledb=1;}
else ledb=0;}
else
{ledb=0;beep=1;}
dog=apple;
dog=sweet;
TH0=0xe3;
TL0=0x33;
}
/*********************定时器初始化*****************************//*功能:*/
/*功能:初始化定时器和中断器服务*/
void interrupt_init()
{PCON=0x00;
SCON=0x50;
TMOD=0x21;
//SMOD=1; //波特率倍增
EA=1;
ET0=1;
EX0=1;
IT0=1;
PX0=0;
PT0=1;
PT1=0;
EA=1;
ES=1;
REN=1;
TR0=1;
TR1=1;
RI=0;
PS=1;
TH0=0xe3;
TL0=0x33;
TH1=0xfd;
TL1=0xfd;
}
/**************************sendb************************/
/*功能:发送一个字节*/
void sendb8(uchar f)
{SBUF=f;
while(!TI);
TI=0;
}
/************************校验方式()校验数据********************************/
void sendjiaoyan()
{uchar tmp,temp;
if(sendarry[3]==COM_time)
{tmp=sendarry[1]+sendarry[2]+sendarry[3]+sendarry[4]+sendarry[5]+sendarry[6]+sendarry[7]+sendarry[8]+sendarry[9]+sendarry[10]+sendarry[11]+sendarry[12]+sendarry[13]+sendarry[14];
tmp=~tmp;
tmp=tmp+1;
temp=(tmp&0xf0)>>4; /************字节修改位置************************/
sendarry[15]=Hex_To_ASCII(temp);
tmp=tmp&0x0f;
sendarry[16]=Hex_To_ASCII(tmp);
}
else
{tmp=sendarry[1]+sendarry[2]+sendarry[3];
tmp=~tmp;
tmp=tmp+1;
temp=(tmp&0xf0)>>4; /************字节修改位置************************/
sendarry[4]=Hex_To_ASCII(temp);
tmp=tmp&0x0f;
sendarry[5]=Hex_To_ASCII(tmp);
}
}
/*888888888888888888888回答数据包88888888888888888888888888888888888888888888*/
void timesjb()
{uchar tmp,temp,tmp1,temp1;
uint tep,tep1,tep2;
if(sdd)
{sendarry[3]=COM_time;
tep=ad_read();
_nop_();
_nop_();
tep1=ad_read();
tep2=tep1-tep;
tep=ad_read();
tep1=tep-tep1;
tep=(tep1+tep2)/2;
tep=ad_read()+tep;
temp=tep/1000;
temp1=tep/100%10;
tmp=tep/10%10;
tmp1=tep%10;
sendarry[4]=temp|0x30;
sendarry[5]=temp1|0x30;
sendarry[6]=tmp|0x30;
sendarry[7]=tmp1|0x30;
if(tep>shangxian)
{sendarry[14]=0x32;}
if(tep<xiaxian)
{sendarry[14]=0x31; }
if(tep>=xiaxian&tep<=shangxian)
{sendarry[14]=0x30;}
temp=Read1302 (READ_HOUR);
delay_us(30);
tmp=temp/10%10;
tmp1=temp%10;
sendarry[8]=tmp|0x30;
sendarry[9]=tmp1|0x30;
temp=Read1302 (READ_MINUTE);
delay_us(30);
tmp=temp/10%10;
tmp1=temp%10;
sendarry[10]=tmp|0x30;
sendarry[11]=tmp1|0x30;
temp=Read1302 (READ_SECOND);delay_us(30);
tmp=temp/10%10;
tmp1=temp%10;
sendarry[12]=tmp|0x30;
sendarry[13]=tmp1|0x30;
sendjiaoyan();
sendarry[17]=RS_end1;
tmp=0;
do
{dog=apple;
dog=sweet;
sendb8(sendarry[tmp]);
tmp++;}while(tmp<18);
}
}
/*****************回答相应数据包*****************************************/
void updownsjb()
{uchar tmp,temp;
uint tep;
if(sdd)
{dog=apple;
dog=sweet;
temp=0;
sendarry[3]=COM_updown;
sendjiaoyan();
sendarry[6]=RS_end1;
tmp=0;
do{sendb8(sendarry[tmp]);tmp++;}while(tmp<7);}
tep=ASCII_To_Hex(recivearry[4])*100+ASCII_To_Hex(recivearry[3])*1000+ASCII_To_Hex(recivearry[6])+ASCII_To_Hex(recivearry[5])*10;
shangxian=tep;
tep=ASCII_To_Hex(recivearry[8])*100+ASCII_To_Hex(recivearry[7])*1000+ASCII_To_Hex(recivearry[10])+ASCII_To_Hex(recivearry[9])*10;
xiaxian=tep;
}
/////////////////////////////////////////////////////////////
void stwarnsjb()
{uchar tmp;
if(sdd)
{dog=apple;
dog=sweet;
sendarry[3]=COM_stwarn;
sendjiaoyan();
sendarry[6]=RS_end1;
tmp=0;
do{sendb8(sendarry[tmp]);tmp++;}while(tmp<7);}
bjkz=0;}
void endwarnsjb()
{uchar tmp;
if(sdd)
{dog=apple;
dog=sweet;
sendarry[3]=COM_endwarn;
sendjiaoyan();
sendarry[6]=RS_end1;
tmp=0;
do{sendb8(sendarry[tmp]);tmp++;}while(tmp<7);}
bjkz=1;
}
/*×××××××××××××××××××××××××××××××回答响应××××××××××××××××××××××××××××*/
/*功能:发送回答数据包*/
void send()
{uchar temp,tmp;
dog=apple;
dog=sweet;
sendarry[0]=RS_start;
P0=0xff;
tmp=(P0&0xf0)>>4;
sendarry[1]=Hex_To_ASCII(tmp);
temp=P0&0x0f;
sendarry[2]=Hex_To_ASCII(temp);
switch(recivearry[2])
{case COM_time :
timesjb();break;
case COM_updown :
updownsjb();break;
case COM_stwarn:
stwarnsjb();break;
case COM_endwarn:
endwarnsjb();break;}
for(temp=0;temp<18;temp++)
{
recivearry[temp]=0xff;
}
}
/**************************串口中断服务程序(禁止修改)*************************/
/*功能:接收上位机的数据并作出判断*/
void recived() interrupt 4
{uchar adr,adr1,jyjy;
ES=0;
if(RI)
{RI=0;
if((SBUF==RS_start)&(R_start==1))
{rsave=0;
R_start=0;
R_addr=0;
R_com=0;
R_shuju=0;
R_jiaoyan=0;
}
if(R_start==1)
{if(R_addr==1)
{if(R_com==1)
{if(R_shuju==1)
{
if(R_jiaoyan==1)
{
recivearry[rsave++]=SBUF;
if(recivearry[maxarry+3]==RS_end1)send();
}
else /***************校验方式修改区*******》》》》***************/
{ recivearry[rsave++]=SBUF;
if(rsave==maxarry+3)
{adr1=ASCII_To_Hex(recivearry[maxarry+1])<<4;
adr1=adr1|ASCII_To_Hex(recivearry[maxarry+2]);
if(recivearry[2]==COM_updown)
{jyjy=recivearry[0]+recivearry[1]+recivearry[2]+recivearry[3]+recivearry[4]+recivearry[5]+recivearry[6]+recivearry[7]+recivearry[8]+recivearry[9]+recivearry[10];
jyjy=~jyjy;
jyjy=jyjy+1;
adr=jyjy;
}
else
{jyjy=recivearry[0]+recivearry[1]+recivearry[2];
jyjy=~jyjy;
jyjy=jyjy+1;
adr=jyjy;
} /****《《《《《《****校验方式修改区******************************/
if(adr==adr1)R_jiaoyan=1;
}
}
}
else
{
recivearry[rsave++]=SBUF;
if(rsave==maxarry+1)R_shuju=1;
}
}
else
{
recivearry[rsave++]=SBUF; //把命令字放到接受缓冲区的第三位 recivearry[2]
if(recivearry[2]==COM_updown) //确定用不用接受数据如果是上位机设置上下限的话,那就接受接下来的接受8位上下限,
{maxarry=10;
}
else