⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zjcx.txt

📁 红外遥控电子密码锁程序
💻 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 + -