//CommandBuf数组中 CommandBuf[i]=SystemBuf[64+i]; }
if(Compare()&&(CommandBuf[6]=='k')) //判断指令是否为开继电器指令 { switch(CommandBuf[7]) { case 0x31: relay_1=0; // check=1; break; case 0x32: relay_2=0; // check=1; break; case 0x33: relay_3=0; // check=1; break; case 0x34: // check=1; break; case 0x35: case 0x36: case 0x37: case 0x38: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: case 0x48: case 0x3f: // check=1; break; default:flag=1; //其他指令定义为错误操作 break; //置位错误操作位为1 } } else { if(Compare()&&(CommandBuf[6]=='g')) //判断指令是否为关闭电器指令
49
{ switch(CommandBuf[7]) { case 0x31: relay_1=1; break; case 0x32: relay_2=1; break; case 0x33: relay_3=1; break; case 0x34: break; case 0x35: case 0x36: case 0x37: case 0x38: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: case 0x48: break; default:flag=1; //其他指令定义为错误操作 break; //置位错误操作位为1 } } else {flag=1;} //如果发送的指令既不是open也不是shut就定义为错误操作 } }
/*******************************************************************************************
/////////////////////////////////bit Compare(void)
********************************************************************************************/ bit Compare(void) {
uchar i,k;
50
for(i=0;i<6;i++) {
if(CommandBuf[i]==password[i]) k++; }
if(k==6) { k=0; return 1; } }
///////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////报警短息:应用中断 模拟红外、烟雾、煤气报警 ////////////////////////////////////////////////////////////////////////////////////////////// void sendBaoJing(void) {
uchar i;
for(i=0;i<8;i++) { AT_SendNumber[i]=AT_CMGS[i]; }
for(i=8;i<24;i++) { AT_SendNumber[i]=MyTel[i-8]; //将对方号码提取用来回复给对方 }
sendstring(AT_SendNumber); Delay_ms(400);
sendstring(danger); //
Delay_ms(30); sendchar(0X1A); }
3、EEPROM.C #include
uchar password[6];
uchar passwordx[6]={'0','0','0','0','0','1'};//初始密码000001
/*========================关闭IAP功能====================*/
void iap_disable()
51
{
isp_contr=0x00; //关IAP功能 isp_cmd =0x00; //清寄存器 isp_trig =0x00; //清触发器 isp_addrh=0x00; isp_addrl=0x00; }
/*=========================读数据======================*/ uchar e2_read(uint addres) {
uchar i=0; uchar z=0; EA=0;
isp_addrl=addres%0x100; //低位地址 isp_addrh=addres/0x100; //高位地址
isp_contr=0x80; //设时间与充ISP操作。 isp_cmd=0x01; //写命令 isp_trig=0x46; //触发
isp_trig=0xb9; //触发启动。 for(i=0;i<6;i++); //延时
iap_disable(); //关IAP功能 z=isp_data; //把数据送到Z并返回 EA=1; return(z); }
/*=========================编程数据=====================*/ void e2_write(uint addres,uchar write_data)//写数据。 {
uchar i=0; EA=0;
isp_data=write_data; //要写入的数据。 isp_addrl=addres%0x100; //低位地址 isp_addrh=addres/0x100; //高位地址 isp_contr=0x80; //设时间与充ISP操作 isp_cmd=0x02; //写命令
isp_trig=0x46; //触发 isp_trig=0xb9; //触发启动 for(i=0;i<6;i++); //延时 EA=1;
iap_disable(); //关IAP功能 }
/*=========================擦除扇区======================*/
52
void e2_erasure (uint addres) //扇区擦除。 {
EA=0;
isp_addrl=addres%0x100; //低位地址 isp_addrh=addres/0x100; //高位地址
isp_contr=0x80; //设时间与充ISP操作。 isp_cmd=0x03; //扇区命命令 isp_trig=0x46; //触发
isp_trig=0xb9; //触发启动。 iap_disable(); //关IAP功能 EA=1; }
/*=========================存储读取======================*/
//State=1 存储数据、为0则读取数据并返回;Value1为写入的数;addres为地址 //第一扇区:0x2000-0x21FF 第二扇区:0x2200-0x23FF //第三扇区:0x2400-0x25FF 第四扇区:0x2600-0x27FF //第五扇区:0x2800-0x29FF 第六扇区:0x2A00-0x2BFF //第七扇区:0x2C00-0x2DFF 第八扇区:0x2E00-0x2FFF uchar Isp_Write_Read(bit State,uchar Value1,uint addres) {
uchar num; if(State==1) {
e2_erasure(addres);
e2_write(addres,Value1); } else {
num= e2_read(addres); return num; } }
/////////////////读出EEPROM中的密码/////////////////// void Read_Password(void) {
uchar i;
for(i=0;i<6;i++) {
password[i]=Isp_Write_Read(0,0,0x2000+0x0200*i); } }
///////////////向EEPROM中写入密码//////////////////// void Write_Password(void) {
53