密码锁仿真使用说明
一、 配钥匙: 1、 打开仿真,把门锁.hex和钥匙.hex下载到相应单片机里,单片机晶振都统一设置为12MHz,运行仿真,可以看到门锁的指示灯和钥匙的指示灯都为熄灭状态。此时门锁为等待开门状态,两把钥匙为没有注入开门密码状态。 2、 点击、闭合1号开关(按按键右边的小红色箭头),点击一下1号钥匙KEY2,此时可以看到1号钥匙蓝灯点亮,为等待注入数据状态。 3、 点击一下门锁KEY1键,可以看到门锁蓝灯点亮,此时为即将注入数据状态(也是删除钥匙的前一步,下面细说,跳过)。 4、 点击一下门锁KEY2键,可以看到1号钥匙蓝灯熄灭,黄灯点亮。此状态表示数据注入成功。点击、断开1号开关,点击一下门锁KEY3键,门锁指示灯全部熄灭,此时门锁回到等待开门状态。点击一下1号钥匙KEY1,此时可以看到1号钥匙绿灯点亮、黄灯熄灭。此时为钥匙已经注入开门密码状态。 5、 当配第二把钥匙时,重复以上过程即可,只是要把对1号开关、按键的操作改为2号开关、按键。(配钥匙时,开关只能同时闭合一个) 二、 开门: 1、将注入过数据的1号钥匙(绿灯点亮)的开关点击、闭合。此时即可看到门锁绿灯点亮,表示门锁被打开。此时可以点击、打开1号开关,点击一下门锁KEY4键,门锁绿灯熄灭,门锁重新回到闭合状态,等待开门。 三、 删除钥匙 1、1号、2号开关为断开状态,此时点击一下门锁KEY1键,可以看到门锁蓝灯点亮, 此时点击一下门锁KEY4键,即删除了第一把所配的钥匙,门锁所有灯熄灭,回到等待开门状态。(重复此动作,即可一次删除第二把、第三把钥匙。) 2、此后,点击、闭合1号开关(刚才已经注入过数据的那把钥匙),可以看到门锁红灯点亮,蜂鸣器长叫,表示有人用已经删除的钥匙开门,报警。此时,若断开1号开关,再点击一下门锁KEY4键,报警解除,门锁又回到等待开门状态。
注意:1、仿真不同于实物,操作数据无法关闭后无法保存,所以以上演示过程,仿真要一直运行,关闭仿真后等于重新开始。 2、若配过钥匙后,,断开开关按门锁复位键,可以恢复以前删除的所有钥匙。 3、同理,点击一下钥匙的复位键,也可以清楚已经注入的数据。 4、点击按键时,可以放大仿真窗口,方便操作。 5、门锁绿灯点亮,即为开门。 门锁程序: - #include<reg51.h>
- #define SL 60//同步信号低电平时间设定
- #define SH 60//同步信号高电平时间设定
- #define DH 15//数据信号高电平时间设定
- #define DL 2 //数据信号低电平时间松瓒?
- #define SLM 110//同步信号低电平最大时间设定
- #define SHM 110//同步信号高电平最大时间设定
- #define DHM 30//数据信号高电平最大时间设定
- #define DLM 13//数据信号低电平最大时间设定
- #define SL_F 140//同步信号低电平时间设定
- #define SH_F 140//同步信号高电平时间设定
- #define DH_F 80//数据信号高电平时间设定
- #define DL_F 30 //数据信号低电平时间设定
- sbit P10=P1^0;//输入端口
- sbit P11=P1^1;//输出端口
- sbit LED_G=P3^0;
- sbit LED_R=P3^1;
- sbit LED_Y=P3^2;
- sbit LED_B=P3^3;
- sbit sound=P2^0;
- sbit key_1=P0^0;
- sbit key_2=P0^1;
- sbit key_3=P0^2;
- sbit key_4=P0^3;
- unsigned char data_1,data_2,data_3,data_4;
- unsigned int e=0;
- unsigned char t=0;
- unsigned char h=0;
- unsigned char d=0;
- unsigned char c=0;
- bit flag_1=0;
- bit flag_2=0;
- bit flag_3=0;
- bit flag_4=0;
- void GET_DATA(void)//提取信息
- {
- for (h=0;h<8;h++)
- {
- d<<=0x01;
- t=0;
- while(!P10);
- while(P10&&t<DHM)//高电平计数
- t++;
- if (t>DL&&t<DLM)//时间在100us左右为 数据0
- d|=0x00;
- else
- if (t>DH&&t<DHM)//时间在200us左右为 数据1
- d|=0x01;
- else
- return ;//在高电平计数超过时,则认为错误,退出
- }
- data_1=d;
- for (h=0;h<8;h++)
- {
- c<<=0x01;
- t=0;
- while(!P10);
- while(P10&&t<DHM)//高电平计数
- t++;
- if (t>DL&&t<DLM)//时间在100us左右为 数据0
- c|=0x00;
- else
- if (t>DH&&t<DHM)//时间在200us左右为 数据1
- c|=0x01;
- else
- return ;//在高电平计数超过时,则认为错误,退出
- }
- data_2=c;
- }
- void SEND_SYN(void)//发送同步位
- {
- unsigned int k=0;
- P10=0;
- while(k<100)//每次发送一组数据前加入低电平,具体值看测试, 发现数据间间隔加大可以使错误率减小,通讯速率加快
- k++;
- P10=1;//同步位高电平
- k=0;
- while(k<SL_F)//高电平1MS左右
- k++;
- P10=0;//同步位低电平
- k=0;
- while(k<SH_F)//低电平1MS左右
- k++;
- }
- void SEND_DATA(unsigned char a,unsigned char b)//数据位发送
- {
- unsigned char i;
- unsigned char j;
- SEND_SYN();
- for (i=0;i<8;i++)//发送8位数据
- {
- if (a&0x80)//从高位开始发送
- {
- P10=1;//如果是1则发送高电平200us
- j=0;
- while(j<DH_F)
- j++;
- P10=0;
- j=0;
- while(j<DL_F)//发送低电平100us
- j++;
- }
- else
- {
- P10=1;//如果是0则发送高电平100us
- j=0;
- while(j<DL_F)
- j++;
- P10=0;
- j=0;
- while(j<DL_F)//发送低电平100us
- j++;
- }
- a<<=0x01;
- }
- for (i=0;i<8;i++)//发送8位数据
- {
- if (b&0x80)//从高位开始发送
- {
- P10=1;//如果是1则发送高电平200us
- j=0;
- while(j<DH_F)
- j++;
- P10=0;
- j=0;
- while(j<DL_F)//发送低电平100us
- j++;
- }
- else
- {
- P10=1;//如果是0则发送高电平100us
- j=0;
- while(j<DL_F)
- j++;
- P10=0;
- j=0;
- while(j<DL_F)//发送低电平100us
- j++;
- }
- b<<=0x01;
- }
- }
- 钥匙程序:
- #include<reg51.h>
- #define SL 60//同步信号低电平时间设定
- #define SH 60//同步信号高电平时间设定
- #define DH 15//数据信号高电平时间设定
- #define DL 2 //数据信号低电平时间松瓒?
- #define SLM 110//同步信号低电平最大时间设定
- #define SHM 110//同步信号高电平最大时间设定
- #define DHM 30//数据信号高电平最大时间设定
- #define DLM 13//数据信号低电平最大时间设定
- #define SL_F 140//同步信号低电平时间设定
- #define SH_F 140//同步信号高电平时间设定
- #define DH_F 80//数据信号高电平时间设定
- #define DL_F 30 //数据信号低电平时间松瓒?
- sbit key_1=P0^7;
- sbit key_2=P0^6;
- sbit LED_G=P3^2;
- sbit LED_Y=P3^1;
- sbit LED_B=P3^0;
- sbit P10=P1^0;//output pin
- sbit P11=P1^1;//input pin
- unsigned char data_1,data_2;
- unsigned int e=0;
- unsigned char t=0;
- unsigned char h=0;
- unsigned char d=0;
- unsigned char c=0;
- bit flag_1=0;
- bit flag_2=0;
- unsigned char addr_self[3]={0x35,0x52};
- const unsigned char CRC_TABLE[16]={0x00,0x31,0x62,0x53,0xC4,0xF5,0xA6,0x97,
- 0xB9,0x88,0xDB,0xEA,0x7D,0x4C,0x1F,0x2E};
- /****************************************/
- /*功能:CRC_8校验 */
- /*入口:待校验的数据指针和数据长度 */
- /****************************************/
- void CalculateCRC8(unsigned char *PData,unsigned char Len) //CRC校验子程序
- {
- unsigned char Temp,CRC;
- CRC=0;
- while(Len--)
- {
- Temp=CRC>>4;
- CRC<<=4;
- CRC^=CRC_TABLE[Temp^(*PData>>4)];
- Temp=CRC>>4;
- CRC<<=4;
- CRC^=CRC_TABLE[Temp^(*PData&0x0F)];
- PData++;
- }
- }
- void GET_DATA(void)//提取信息
- {
- for (h=0;h<8;h++)
- {
- d<<=0x01;
- t=0;
- while(!P10);
- while(P10&&t<DHM)//高电平计数
- t++;
- if (t>DL&&t<DLM)//时间在100us左右为 数据0
- d|=0x00;
- else
- if (t>DH&&t<DHM)//时间在200us左右为 数据1
- d|=0x01;
- else
- return ;//在高电平计数超过时,则认为错误,退出
- }
- data_1=d;
- for (h=0;h<8;h++)
- {
- c<<=0x01;
- t=0;
- while(!P10);
- while(P10&&t<DHM)//高电平计数
- t++;
- if (t>DL&&t<DLM)//时间在100us左右为 数据0
- c|=0x00;
- else
- if (t>DH&&t<DHM)//时间在200us左右为 数据1
- c|=0x01;
- else
- return ;//在高电平计数超过时,则认为错误,退出
- }
- data_2=c;
- CalculateCRC8(addr_self,2); //CRC校验
- }
- void SEND_SYN(void)//发送同步位
- {
- unsigned int k=0;
- P10=0;
- while(k<100)//每次发送一组数据前加入低电平,具体值看测试, 发现数据间间隔加大可以使错误率减小,通讯速率加快
- k++;
- P10=1;//同步位高电平
- k=0;
- while(k<SL_F)//高电平1MS左右
- k++;
- P10=0;//同步位低电平
- k=0;
- while(k<SH_F)//低电平1MS左右
- k++;
- }
- void SEND_DATA(unsigned char a,unsigned char b)//数据位发送
- {
- unsigned char i;
- unsigned char j;
- CalculateCRC8(addr_self,2); //CRC校验
- SEND_SYN();
- for (i=0;i<8;i++)//发送8位数据
- {
- if (a&0x80)//从高位开始发送
- {
- P10=1;//如果是1则发送高电平200us
- j=0;
- while(j<DH_F)
- j++;
- P10=0;
- j=0;
- while(j<DL_F)//发送低电平100us
- j++;
- }
- else
- {
- P10=1;//如果是0则发送高电平100us
- j=0;
- while(j<DL_F)
- j++;
- P10=0;
- j=0;
- while(j<DL_F)//发送低电平100us
- j++;
- }
- a<<=0x01;
- }
- for (i=0;i<8;i++)//发送8位数据
- {
- if (b&0x80)//从高位开始发送
- {
- P10=1;//如果是1则发送高电平200us
- j=0;
- while(j<DH_F)
- j++;
- P10=0;
- j=0;
- while(j<DL_F)//发送低电平100us
- j++;
- }
- else
- {
- P10=1;//如果是0则发送高电平100us
- j=0;
- while(j<DL_F)
- j++;
- P10=0;
- j=0;
- while(j<DL_F)//发送低电平100us
- j++;
- }
- b<<=0x01;
- }
- }
- void main(void)
- {
- key_1=1;
- key_2=1;
- LED_G=0;
- LED_Y=0;
- LED_B=0;
- while(1)
- {
- if(flag_1==0&&flag_2==0)
- {
- if(data_2==0xab)
- LED_G=1;
- else
- LED_G=0;
- SEND_DATA(data_1,data_2);
- P10=1;
- }
- if(key_2==0)
- {
- while(key_2==0);
- flag_1=1;
- LED_B=1;
- LED_G=0;
-
- }
- if(key_1==0&&flag_2==1)
- {
- while(key_1==0);
-
- LED_Y=0;
- flag_2=0;
- }
- if(flag_1==1)
- {
- while(!P10);
- e=0;
- while(P10&&(e<SHM))//对高电平计数
- e++;
- if ((e>SH)&&(e<SHM))// 如果时间为1000us左右则进行低电平检测
- {
- e=0;
- while(!P10&&(e<SHM))//对低电平计数
- e++;
-
- if ((e>SL)&&(e<SHM))//如果低电平时间为1000us左右则认为同步位正确,接收数据
- {
-
- GET_DATA();
- if(data_2==0xaa)
- {
- LED_Y=1;
- LED_B=0;
- flag_1=0;
- flag_2=1;
- data_2=data_2+1;
- }
- }
- }
- }
- }
- }
- void main(void)
- {
- LED_G=0;
- LED_R=0;
- LED_Y=0;
- LED_B=0;
- while(1)
- {
- if(flag_1==0)
- { while(!P10)
- e=0;
- while(P10&&(e<SHM))//对高电平计数
- e++;
- if ((e>SH)&&(e<SHM))// 如果时间为1000us左右则进行低电平检测
- {
- e=0;
- while(!P10&&(e<SHM))//对低电平计数
- e++;
-
- if ((e>SL)&&(e<SHM))//如果低电平时间为1000us左右则认为同步位正确,接收数据
- {
-
- GET_DATA();
- if(data_1>data_4&&data_2==0xab)
- {
- LED_G=1;
- LED_R=0;
- }
- if(data_1<=data_4&&data_2==0xab)
- {
- LED_G=0;
- LED_R=1;
- flag_4=1;
- }
-
- }
- }
- }
- if(flag_4==1)
- sound=~sound;
- if(key_1==0&&flag_1==0)
- {
- LED_B=1;
- while(key_1==0);
- flag_1=1;
- LED_G=0;
- LED_R=0;
- flag_4=0;
- sound=0;
- }
- if(key_2==0&&flag_1&&flag_2==0)
- {
- LED_Y=1;
- while(key_1==0);
- LED_Y=0;
- data_3++;
- SEND_DATA(data_3,0xaa);
- P10=1;
-
- flag_2=1;
- }
- if(key_3==0&&flag_1)
- {
- LED_B=1;
- while(key_1==0);
- LED_B=0;
- LED_G=0;
- LED_Y=0;
- flag_1=0;
- flag_2=0;
- }
- if(key_4==0&&flag_1&&flag_2==0)
- {
- while(key_4==0);
- data_4++;
- LED_B=0;
- LED_G=0;
- LED_Y=0;
- flag_1=0;
- flag_2=0;
- }
- if(key_4==0&&flag_1==0&&flag_2==0)
- {
- LED_R=0;
- LED_B=0;
- LED_G=0;
- LED_Y=0;
- flag_4=0;
- sound=0;
- }
- }
- }
复制代码
全部资料51hei下载地址:
密码锁仿真所有资料.zip
(77.32 KB, 下载次数: 22)
|