密碼鎖仿真.jpg (728.07 KB, 下載次數(shù): 67)
下載附件
密碼鎖仿真
2018-6-21 12:49 上傳
密碼鎖仿真使用說(shuō)明
一、 配鑰匙: 1、 打開(kāi)仿真,把門(mén)鎖.hex和鑰匙.hex下載到相應(yīng)單片機(jī)里,單片機(jī)晶振都統(tǒng)一設(shè)置為12MHz,運(yùn)行仿真,可以看到門(mén)鎖的指示燈和鑰匙的指示燈都為熄滅狀態(tài)。此時(shí)門(mén)鎖為等待開(kāi)門(mén)狀態(tài),兩把鑰匙為沒(méi)有注入開(kāi)門(mén)密碼狀態(tài)。 2、 點(diǎn)擊、閉合1號(hào)開(kāi)關(guān)(按按鍵右邊的小紅色箭頭),點(diǎn)擊一下1號(hào)鑰匙KEY2,此時(shí)可以看到1號(hào)鑰匙藍(lán)燈點(diǎn)亮,為等待注入數(shù)據(jù)狀態(tài)。 3、 點(diǎn)擊一下門(mén)鎖KEY1鍵,可以看到門(mén)鎖藍(lán)燈點(diǎn)亮,此時(shí)為即將注入數(shù)據(jù)狀態(tài)(也是刪除鑰匙的前一步,下面細(xì)說(shuō),跳過(guò))。 4、 點(diǎn)擊一下門(mén)鎖KEY2鍵,可以看到1號(hào)鑰匙藍(lán)燈熄滅,黃燈點(diǎn)亮。此狀態(tài)表示數(shù)據(jù)注入成功。點(diǎn)擊、斷開(kāi)1號(hào)開(kāi)關(guān),點(diǎn)擊一下門(mén)鎖KEY3鍵,門(mén)鎖指示燈全部熄滅,此時(shí)門(mén)鎖回到等待開(kāi)門(mén)狀態(tài)。點(diǎn)擊一下1號(hào)鑰匙KEY1,此時(shí)可以看到1號(hào)鑰匙綠燈點(diǎn)亮、黃燈熄滅。此時(shí)為鑰匙已經(jīng)注入開(kāi)門(mén)密碼狀態(tài)。 5、 當(dāng)配第二把鑰匙時(shí),重復(fù)以上過(guò)程即可,只是要把對(duì)1號(hào)開(kāi)關(guān)、按鍵的操作改為2號(hào)開(kāi)關(guān)、按鍵。(配鑰匙時(shí),開(kāi)關(guān)只能同時(shí)閉合一個(gè)) 二、 開(kāi)門(mén): 1、將注入過(guò)數(shù)據(jù)的1號(hào)鑰匙(綠燈點(diǎn)亮)的開(kāi)關(guān)點(diǎn)擊、閉合。此時(shí)即可看到門(mén)鎖綠燈點(diǎn)亮,表示門(mén)鎖被打開(kāi)。此時(shí)可以點(diǎn)擊、打開(kāi)1號(hào)開(kāi)關(guān),點(diǎn)擊一下門(mén)鎖KEY4鍵,門(mén)鎖綠燈熄滅,門(mén)鎖重新回到閉合狀態(tài),等待開(kāi)門(mén)。 三、 刪除鑰匙 1、1號(hào)、2號(hào)開(kāi)關(guān)為斷開(kāi)狀態(tài),此時(shí)點(diǎn)擊一下門(mén)鎖KEY1鍵,可以看到門(mén)鎖藍(lán)燈點(diǎn)亮, 此時(shí)點(diǎn)擊一下門(mén)鎖KEY4鍵,即刪除了第一把所配的鑰匙,門(mén)鎖所有燈熄滅,回到等待開(kāi)門(mén)狀態(tài)。(重復(fù)此動(dòng)作,即可一次刪除第二把、第三把鑰匙。) 2、此后,點(diǎn)擊、閉合1號(hào)開(kāi)關(guān)(剛才已經(jīng)注入過(guò)數(shù)據(jù)的那把鑰匙),可以看到門(mén)鎖紅燈點(diǎn)亮,蜂鳴器長(zhǎng)叫,表示有人用已經(jīng)刪除的鑰匙開(kāi)門(mén),報(bào)警。此時(shí),若斷開(kāi)1號(hào)開(kāi)關(guān),再點(diǎn)擊一下門(mén)鎖KEY4鍵,報(bào)警解除,門(mén)鎖又回到等待開(kāi)門(mén)狀態(tài)。
注意:1、仿真不同于實(shí)物,操作數(shù)據(jù)無(wú)法關(guān)閉后無(wú)法保存,所以以上演示過(guò)程,仿真要一直運(yùn)行,關(guān)閉仿真后等于重新開(kāi)始。 2、若配過(guò)鑰匙后,,斷開(kāi)開(kāi)關(guān)按門(mén)鎖復(fù)位鍵,可以恢復(fù)以前刪除的所有鑰匙。 3、同理,點(diǎn)擊一下鑰匙的復(fù)位鍵,也可以清楚已經(jīng)注入的數(shù)據(jù)。 4、點(diǎn)擊按鍵時(shí),可以放大仿真窗口,方便操作。 5、門(mén)鎖綠燈點(diǎn)亮,即為開(kāi)門(mén)。 門(mén)鎖程序: - #include<reg51.h>
- #define SL 60//同步信號(hào)低電平時(shí)間設(shè)定
- #define SH 60//同步信號(hào)高電平時(shí)間設(shè)定
- #define DH 15//數(shù)據(jù)信號(hào)高電平時(shí)間設(shè)定
- #define DL 2 //數(shù)據(jù)信號(hào)低電平時(shí)間松瓚?
- #define SLM 110//同步信號(hào)低電平最大時(shí)間設(shè)定
- #define SHM 110//同步信號(hào)高電平最大時(shí)間設(shè)定
- #define DHM 30//數(shù)據(jù)信號(hào)高電平最大時(shí)間設(shè)定
- #define DLM 13//數(shù)據(jù)信號(hào)低電平最大時(shí)間設(shè)定
- #define SL_F 140//同步信號(hào)低電平時(shí)間設(shè)定
- #define SH_F 140//同步信號(hào)高電平時(shí)間設(shè)定
- #define DH_F 80//數(shù)據(jù)信號(hào)高電平時(shí)間設(shè)定
- #define DL_F 30 //數(shù)據(jù)信號(hào)低電平時(shí)間設(shè)定
- 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)//高電平計(jì)數(shù)
- t++;
- if (t>DL&&t<DLM)//時(shí)間在100us左右為 數(shù)據(jù)0
- d|=0x00;
- else
- if (t>DH&&t<DHM)//時(shí)間在200us左右為 數(shù)據(jù)1
- d|=0x01;
- else
- return ;//在高電平計(jì)數(shù)超過(guò)時(shí),則認(rèn)為錯(cuò)誤,退出
- }
- data_1=d;
- for (h=0;h<8;h++)
- {
- c<<=0x01;
- t=0;
- while(!P10);
- while(P10&&t<DHM)//高電平計(jì)數(shù)
- t++;
- if (t>DL&&t<DLM)//時(shí)間在100us左右為 數(shù)據(jù)0
- c|=0x00;
- else
- if (t>DH&&t<DHM)//時(shí)間在200us左右為 數(shù)據(jù)1
- c|=0x01;
- else
- return ;//在高電平計(jì)數(shù)超過(guò)時(shí),則認(rèn)為錯(cuò)誤,退出
- }
- data_2=c;
- }
- void SEND_SYN(void)//發(fā)送同步位
- {
- unsigned int k=0;
- P10=0;
- while(k<100)//每次發(fā)送一組數(shù)據(jù)前加入低電平,具體值看測(cè)試, 發(fā)現(xiàn)數(shù)據(jù)間間隔加大可以使錯(cuò)誤率減小,通訊速率加快
- 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)//數(shù)據(jù)位發(fā)送
- {
- unsigned char i;
- unsigned char j;
- SEND_SYN();
- for (i=0;i<8;i++)//發(fā)送8位數(shù)據(jù)
- {
- if (a&0x80)//從高位開(kāi)始發(fā)送
- {
- P10=1;//如果是1則發(fā)送高電平200us
- j=0;
- while(j<DH_F)
- j++;
- P10=0;
- j=0;
- while(j<DL_F)//發(fā)送低電平100us
- j++;
- }
- else
- {
- P10=1;//如果是0則發(fā)送高電平100us
- j=0;
- while(j<DL_F)
- j++;
- P10=0;
- j=0;
- while(j<DL_F)//發(fā)送低電平100us
- j++;
- }
- a<<=0x01;
- }
- for (i=0;i<8;i++)//發(fā)送8位數(shù)據(jù)
- {
- if (b&0x80)//從高位開(kāi)始發(fā)送
- {
- P10=1;//如果是1則發(fā)送高電平200us
- j=0;
- while(j<DH_F)
- j++;
- P10=0;
- j=0;
- while(j<DL_F)//發(fā)送低電平100us
- j++;
- }
- else
- {
- P10=1;//如果是0則發(fā)送高電平100us
- j=0;
- while(j<DL_F)
- j++;
- P10=0;
- j=0;
- while(j<DL_F)//發(fā)送低電平100us
- j++;
- }
- b<<=0x01;
- }
- }
- 鑰匙程序:
- #include<reg51.h>
- #define SL 60//同步信號(hào)低電平時(shí)間設(shè)定
- #define SH 60//同步信號(hào)高電平時(shí)間設(shè)定
- #define DH 15//數(shù)據(jù)信號(hào)高電平時(shí)間設(shè)定
- #define DL 2 //數(shù)據(jù)信號(hào)低電平時(shí)間松瓚?
- #define SLM 110//同步信號(hào)低電平最大時(shí)間設(shè)定
- #define SHM 110//同步信號(hào)高電平最大時(shí)間設(shè)定
- #define DHM 30//數(shù)據(jù)信號(hào)高電平最大時(shí)間設(shè)定
- #define DLM 13//數(shù)據(jù)信號(hào)低電平最大時(shí)間設(shè)定
- #define SL_F 140//同步信號(hào)低電平時(shí)間設(shè)定
- #define SH_F 140//同步信號(hào)高電平時(shí)間設(shè)定
- #define DH_F 80//數(shù)據(jù)信號(hào)高電平時(shí)間設(shè)定
- #define DL_F 30 //數(shù)據(jù)信號(hào)低電平時(shí)間松瓚?
- 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校驗(yàn) */
- /*入口:待校驗(yàn)的數(shù)據(jù)指針和數(shù)據(jù)長(zhǎng)度 */
- /****************************************/
- void CalculateCRC8(unsigned char *PData,unsigned char Len) //CRC校驗(yàn)子程序
- {
- 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)//高電平計(jì)數(shù)
- t++;
- if (t>DL&&t<DLM)//時(shí)間在100us左右為 數(shù)據(jù)0
- d|=0x00;
- else
- if (t>DH&&t<DHM)//時(shí)間在200us左右為 數(shù)據(jù)1
- d|=0x01;
- else
- return ;//在高電平計(jì)數(shù)超過(guò)時(shí),則認(rèn)為錯(cuò)誤,退出
- }
- data_1=d;
- for (h=0;h<8;h++)
- {
- c<<=0x01;
- t=0;
- while(!P10);
- while(P10&&t<DHM)//高電平計(jì)數(shù)
- t++;
- if (t>DL&&t<DLM)//時(shí)間在100us左右為 數(shù)據(jù)0
- c|=0x00;
- else
- if (t>DH&&t<DHM)//時(shí)間在200us左右為 數(shù)據(jù)1
- c|=0x01;
- else
- return ;//在高電平計(jì)數(shù)超過(guò)時(shí),則認(rèn)為錯(cuò)誤,退出
- }
- data_2=c;
- CalculateCRC8(addr_self,2); //CRC校驗(yàn)
- }
- void SEND_SYN(void)//發(fā)送同步位
- {
- unsigned int k=0;
- P10=0;
- while(k<100)//每次發(fā)送一組數(shù)據(jù)前加入低電平,具體值看測(cè)試, 發(fā)現(xiàn)數(shù)據(jù)間間隔加大可以使錯(cuò)誤率減小,通訊速率加快
- 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)//數(shù)據(jù)位發(fā)送
- {
- unsigned char i;
- unsigned char j;
- CalculateCRC8(addr_self,2); //CRC校驗(yàn)
- SEND_SYN();
- for (i=0;i<8;i++)//發(fā)送8位數(shù)據(jù)
- {
- if (a&0x80)//從高位開(kāi)始發(fā)送
- {
- P10=1;//如果是1則發(fā)送高電平200us
- j=0;
- while(j<DH_F)
- j++;
- P10=0;
- j=0;
- while(j<DL_F)//發(fā)送低電平100us
- j++;
- }
- else
- {
- P10=1;//如果是0則發(fā)送高電平100us
- j=0;
- while(j<DL_F)
- j++;
- P10=0;
- j=0;
- while(j<DL_F)//發(fā)送低電平100us
- j++;
- }
- a<<=0x01;
- }
- for (i=0;i<8;i++)//發(fā)送8位數(shù)據(jù)
- {
- if (b&0x80)//從高位開(kāi)始發(fā)送
- {
- P10=1;//如果是1則發(fā)送高電平200us
- j=0;
- while(j<DH_F)
- j++;
- P10=0;
- j=0;
- while(j<DL_F)//發(fā)送低電平100us
- j++;
- }
- else
- {
- P10=1;//如果是0則發(fā)送高電平100us
- j=0;
- while(j<DL_F)
- j++;
- P10=0;
- j=0;
- while(j<DL_F)//發(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))//對(duì)高電平計(jì)數(shù)
- e++;
- if ((e>SH)&&(e<SHM))// 如果時(shí)間為1000us左右則進(jìn)行低電平檢測(cè)
- {
- e=0;
- while(!P10&&(e<SHM))//對(duì)低電平計(jì)數(shù)
- e++;
-
- if ((e>SL)&&(e<SHM))//如果低電平時(shí)間為1000us左右則認(rèn)為同步位正確,接收數(shù)據(jù)
- {
-
- 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))//對(duì)高電平計(jì)數(shù)
- e++;
- if ((e>SH)&&(e<SHM))// 如果時(shí)間為1000us左右則進(jìn)行低電平檢測(cè)
- {
- e=0;
- while(!P10&&(e<SHM))//對(duì)低電平計(jì)數(shù)
- e++;
-
- if ((e>SL)&&(e<SHM))//如果低電平時(shí)間為1000us左右則認(rèn)為同步位正確,接收數(shù)據(jù)
- {
-
- 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;
- }
- }
- }
復(fù)制代碼
全部資料51hei下載地址:
密碼鎖仿真所有資料.zip
(77.32 KB, 下載次數(shù): 22)
2018-6-21 12:59 上傳
點(diǎn)擊文件名下載附件
密碼鎖仿真所有資料 下載積分: 黑幣 -5
|