📄 zjcx.txt
字号:
#include <regx52.h>
#include <stdlib.h>
#include "decrypt.h"
#include "cmd.h"
#include "comm.h"
#include "24cxx.h"
#include "password.h"
/*------------------------------------------------
AT89S5X SFR定义(REGX52.h中未定义)
--------------------------------------------------*/
sfr AUXR = 0x8e;
sfr WDTRST = 0xa6;
sfr WDTPRG =0xA7;
sfr16 TIMEER2 = 0xcc;
sfr16 RCAP2 = 0xca;
#define WDIDLE (1<<4)
sbit KEY_REG=P3^3;//注册按键
sbit UNLOCK=P3^6; //开锁显示
sbit KEY_LOCK=P3^2;//锁按键
sbit LIGHT_REG_OK=P3^7;//注册显示
sbit OUT_38K =P2^7;//脉冲信号输出
#define USER_MASK P1
const DWORD id=15600;
extern uchar RecBuf[7];
extern uchar WrIdx;
extern bit DataOK;
#define FRAME_HEAD_MASTER 0x24
uchar SndBuf[7]={FRAME_HEAD_MASTER,0,0,0,0,0,0};
uchar *RecCmd=(uchar *)&RecBuf[1];
uchar *SndCmd=(uchar *)&SndBuf[1];
DWORD rand_num;
WORD rand_seed;
DWORD *RecData=(DWORD *)&RecBuf[2];
DWORD *SndData=(DWORD *)&SndBuf[2];
bit idOK=0;
bit PassOK=0;
uchar count=0;
uchar time=0;
void ClrWdt(void)//喂狗
{
WDTRST = 0x1e;//89s52内狗
WDTRST = 0xe1;//89s52内狗
}
void send_data(void)
{
REN = 0; //关接受
send_string(SndBuf,6);
REN = 1; //允许接受
}
void send_CMD(uchar cmd)
{ int r1;
int r2;
r1=rand();
r2=rand();
rand_num =r1*r2;
rand_num&=0x0FFFFFFF;
*SndCmd = cmd;
*SndData = rand_num;
send_data();
}
void delay(void)
{
uchar i,j;
for(i=100;i>0;i--)
for(j=50;j>0;j--);
}
void init(void)
{
UNLOCK =0;
LIGHT_REG_OK=0;
T2CON = 0x00; // 16 Bit Auto-Reload Mode
RCAP2H = (65535-32767)/256; // 重装值
RCAP2L = (65535-32767)%256;
TH2 = (65535-32767)/256;
TL2 = (65535-32767)%256;
ET2 = 1;
TR2 = 1;
TMOD|=0x02;
TH0=0xF4;
ET0=1;
TR0=1;
init_comm();
EA=1;
if(ReadMask() !=0x23) //first use
{
uchar i;
WriteMask(0x23);
for(i=0;i<8;i++)
{
WritePass((i<<4)|rand());
}
}
}
void main(void)
{
init();
send_string("Hello",5);
AUXR |= WDIDLE;
PCON |= GF0_ | IDL_;//喂疯狗(GF0_=1)并进入空闲状态(IDL_=1)
WDTPRG |=0x06;
ClrWdt();
while(1)
{
if(KEY_REG) LIGHT_REG_OK=0;
if(UNLOCK)
{
if(KEY_LOCK==0)
{
delay();
if(KEY_LOCK==0)
UNLOCK=0;
while(KEY_LOCK==0) ;//ClrWdt();;
}
}
ClrWdt();
if(time>=150)
{
time =0;
send_string("idle",4);
ET0 = 0;
ET2 = 0;
EX0 = 1;
EX1 = 1;
WrIdx = 0;
ClrWdt();
PCON |= IDL_;
}
if(DataOK)
{
time =0;
switch(*RecCmd)
{
case CMD_COME:
TR2 = 0;
rand_seed = TH2;
rand_seed<<=8;
rand_seed+=TL2;
rand_seed = RCAP2;
TR2 = 1;
srand(rand_seed);
send_CMD(CMD_WHO);
break;
case CMD_ID:
Decrypt(&RecBuf[2],4,rand_num,(uchar)rand_num&0x07);
if(*RecData==id)
{
if(KEY_REG==0) //注册
{
send_CMD(CMD_NEW_PASSWORD);
}
else
{
idOK=1;
send_CMD(CMD_PASSWORD);
}
}
break;
case CMD_CRYPT_PASSWORD:
{
if(!idOK) break;
Decrypt(&RecBuf[2],4,rand_num,(uchar)rand_num&0x07);
if((1<<(RecBuf[2]>>4)) & USER_MASK) break;
if(*RecData==ReadPass(RecBuf[2]>>4))
{
PassOK=1;
send_CMD(CMD_NEW_PASSWORD);
}
idOK=0;
break;
}
case CMD_REPLY_PASSWORD:
if(!(PassOK || KEY_REG==0)) break;
if(rand_num==(*RecData&0x0FFFFFFF))
{
PassOK=0;
WritePass(*RecData);
*SndCmd = CMD_OVER;
send_data();
if(KEY_REG==0) LIGHT_REG_OK=1;
else UNLOCK=1;
}
else
{
if(count++<10)
send_CMD(CMD_NEW_PASSWORD);
else
{
PassOK=0;
count=0;
}
}
break;
default:
break;
}
DataOK=0;
}
}
}
void t0(void) interrupt 1 using 0
{
OUT_38K=! OUT_38K;
}
void t2(void) interrupt 5 using 0
{
TF2 =0;
time++;
}
void int0(void) interrupt 0 using 0
{
ET0 = 1;
ET2 = 1;
EX0 = 0;
EX1 = 0;
}
void int1(void) interrupt 2 using 0
{
ET0 = 1;
ET2 = 1;
EX0 = 0;
EX1 = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -