新闻  |   论坛  |   博客  |   在线研讨会
51做的门禁系统代码
lionwq | 2008-01-09 16:47:47    阅读:5789   发布文章
51做的门禁系统代码,有4×4键盘扫描,9346的存储功能,掉电不丢失密码,3重密码防忘记功能






#include"reg51.h" #include"intrins.h" #define uchar unsigned char #define uint unsigned int uchar keyvalue,keytemp[7],keyflag,password[6]; uchar romflag,doorflag,adr9346,order,coder,readtemp,codetemp[3],code_case; const uchar keyin[]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77}; const uchar value[]={0x03,0x07,0x0b,0x0f,0x02,0x06,0x0a,0x0e,0x01,0x05,0x09,0x0d,0x00,0x04,0x08,0x0c}; sbit door=P1^0; sbit next=P1^1; sbit cs=P3^7; sbit clk=P3^6; sbit di=P3^5; sbit doi=P3^4; //变量说明: //keyvalue:键值(1次的) //keytemp[7]:输入的键值存放处(第7为按下ENTER键设计) //keyflag:按键标志位,当此位为1时有键按下,否则无 //romflag:93C46的密码标志位,当此位为1时有存有密码,否则无 //doorflag:门标志位,即密码是否正确,当此位为1时开门(或密码正确),否则不开(或不正确) //adr9346:要写入或要读出93C46的地址 //order:要送入93C46的信息 //code:读出的密码(1次的) //readtemp:读取数据的临时存放处 //codetemp[3]:读取的密码的临时存放处 //code_case:选择密码存放地址情况(1表示从0x01开始的密码,2表示从0x04开始的备用密码,3表示从0x07开始的身份密码)



void delay(uint j) //延时 { uchar i; for(;j>0;j--) { for(i=0;i<125;i++) {;} } } //延时32us void delay1() { uchar i; for(i=0;i<4;i++) {;} } //键盘扫描 void scan() { uchar i,j,m,first,key,temp; first=0xef; m=0; keyflag=0; for(i=0;i<4;i++) { P2=first; key=P2; if(key!=first) { delay(10); temp=P2; if(key=temp) { for(j=0;j<16;j++) { if(key=keyin[m]) { keyvalue=value[m]; break; } else m++; } keyflag=1; } } if(keyflag==1) break; else first=_crol_(first,1); } } //密码打包存入codetemp[3] void pack() { uchar codepack,packtemp,i; char n=-1; for(i=0;i<3;i++) { keytemp[n++]=codepack; keytemp[n++]=packtemp; codepack=codepack<<4; codepack=codepack+packtemp; codetemp[i]=codepack; } } //密码解包存入password[6] void undo() { uchar codeundo,undotemp,dotemp,i,m; char n=-1; for(i=0;i<3;i++) { codetemp[i]=codeundo; for(m=0;m<4;m++) { codeundo=codeundo>>1; dotemp=CY; undotemp=undotemp+dotemp; undotemp=_crol_(undotemp,1); } password[n++]=codeundo; password[n++]=undotemp; } } //确认比较处理 void enter() { uchar i; for(i=0;i<6;i++) { if(keytemp[i]!=password[i]) break; } if(i==5) doorflag=1; } //发出指令到93C46 void send9346() { uchar i; for(i=0;i<8;i++) { order=order>>1; di=CY; clk=~clk; delay1(); clk=~clk; delay1(); } } //读出93C46的数据 void read9346() { uchar i; coder=0; for(i=0;i<8;i++) { clk=~clk; delay1(); clk=~clk; delay1(); readtemp=doi; coder=coder+readtemp; coder=_cror_(coder,1); } } //从93C46读出密码 void readpassword(uchar adr_case) { uchar i,n; P3=0xf0; delay1(); clk=0; delay1(); if(adr_case==0) {adr9346=0x00;n=1;} else if(adr_case==1) {adr9346=0x01;n=3;} else if(adr_case==2) {adr9346=0x04;n=3;} else if(adr_case==3) {adr9346=0x07;n=3;} order=adr9346+0x80; //加入读指令 for(i=0;i<n;i++) { send9346(); read9346(); codetemp[i]=coder; } cs=0; } //把密码写入93C46 void writepassword(uchar adr_case) { uchar i,n; P3=0xf0; //写使能 delay1(); clk=0; delay1(); order=0x80; send9346(); cs=0; P3=0xf0; //写入数据 delay1(); clk=0; delay1(); if(adr_case==0) {adr9346=0x00;n=1;} else if(adr_case==1) {adr9346=0x01;n=3;} else if(adr_case==2) {adr9346=0x04;n=3;} else if(adr_case==3) {adr9346=0x07;n=3;} for(i=0;i<n;i++) { order=adr9346+0x40; //加入写指令 send9346(); order=codetemp[i]; send9346(); adr9346++; } cs=0; order=0x00; //写禁止 send9346(); cs=0; } //输入处理2 void keytwo() { uchar i=0,led=0xfb; for(;i<7;i++) { while(1) { scan(); if(keyflag==0x01) break; } P1=led; if(keyvalue==0x02) enter(); //判断是否按下确认键 else if(keyvalue==0x00) i=i-1; //判断是否按下清除键 else keytemp[i]=keyvalue; if(doorflag==1) break; led=_crol_(led,1); } } //修改现有密码 void repassword() { uchar i=0,led=0xfb; readpassword(3); undo(); keytwo(); enter(); if(doorflag==1) { next=0; keytwo(); pack(); writepassword(code_case); } } //输入处理 void key() { uchar i=0,led=0xfb; for(;i<7;i++) { while(1) { scan(); if(keyflag==0x01) break; } P1=led; if(keyvalue==0x0b) repassword(); //判断是否按下修改密码键 else if(keyvalue==0x02) enter(); //判断是否按下确认键 else if(keyvalue==0x00) i=i-1; //判断是否按下清除键 else keytemp[i]=keyvalue; if(doorflag==1) break; led=_crol_(led,1); } } //93C46有无密码判断处理 void sign() { readpassword(0); romflag=coder; if(romflag==0x00) { codetemp[0]=0x00; codetemp[1]=0x00; codetemp[2]=0x00; writepassword(1); writepassword(2); writepassword(3); writepassword(0); } } //主函数 void main() { //sign(); doorflag=0; while(1) { P1=0xff; scan(); if(keyflag==0x01) { if(keyvalue==0x03) //按下了输入密码键 { code_case=1; readpassword(code_case); key(); if(doorflag==1) door=0; delay(1000); //开门动作时间1S } else if(keyvalue==0x07) //按下了输入备用密码键 { code_case=2; readpassword(code_case); key(); if(doorflag==1) door=0; delay(1000); //开门动作时间1S } else if(keyvalue==0x0f) //按下了修改身份验证密码键 { code_case=3; readpassword(code_case); undo(); key(); enter(); if(doorflag==1) { next=0; key(); pack(); writepassword(code_case); } } } } }
参与讨论
登录后参与讨论
kkft_2008@yahoo.com [ 匿名]  2008-01-22 20:24:26 

thank you.

淡泊以明志 宁静以致远
推荐文章
最近访客