找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 34246|回復(fù): 86
打印 上一主題 下一主題
收起左側(cè)

你從未見過(guò)的單片機(jī)密碼鎖設(shè)計(jì)(基本版)

  [復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 20 黑幣 回復(fù)本帖可獲得 1 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
ID:362076 發(fā)表于 2018-12-5 10:18 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 凌凈清河 于 2018-12-11 12:04 編輯

重新編輯說(shuō)明:取消了回復(fù)才能下載的限制,取消了下載付黑幣的設(shè)置。
另外我建立了一個(gè)STC 51單片機(jī)初學(xué)者提升qq群,如果你想在單片機(jī)的道路上從菜鳥走到入門,歡迎加群和大家共同成長(zhǎng)。群剛開始建立,人數(shù)尚少,內(nèi)有資料不斷完善中。群聊號(hào)碼:873434536
特注:群不盈利、無(wú)廣告、沒有強(qiáng)制活動(dòng)、沒有潛規(guī)則,僅為個(gè)人興趣和專業(yè)方向使然。

聲明:
0.基本版代碼相對(duì)冗余,但仍然請(qǐng)大家在轉(zhuǎn)載、分享時(shí)提及原作者,非常感謝
1.設(shè)計(jì)使用STC15W4K48S4制作,在無(wú)需修改管理員密碼的版本中可以使用IAP的單片機(jī)代替
2.本程序和設(shè)計(jì)為最基本版,只有簡(jiǎn)單的密碼開鎖和管理功能,更多更完善功能的版本請(qǐng)期待本人的后續(xù)帖子(雖然已經(jīng)設(shè)計(jì)完成,但還是預(yù)計(jì)2019年1月份,考完研之后才能夠整理發(fā)出)
3.由于是初稿,所以程序的結(jié)構(gòu)上比較混亂,本人只保證其可以運(yùn)行并且沒有明顯的BUG、不保證程序可讀性,但是大家可以自取所需功能
4.本版本只是一個(gè)“預(yù)熱”,請(qǐng)高手勿噴,至少也請(qǐng)看完1、2個(gè)月后的第二版之后再說(shuō);
請(qǐng)初學(xué)者不要仿制,畢竟這個(gè)版本還非常非常LOW,遠(yuǎn)遠(yuǎn)沒有達(dá)到使用標(biāo)準(zhǔn),也沒有進(jìn)行功能的優(yōu)化、邏輯的論證、程序的精簡(jiǎn),這些將在第二版中體現(xiàn)出來(lái)。

設(shè)計(jì)亮點(diǎn):
1.使用OLED12864屏幕顯示,具有用戶菜單和管理員菜單,直觀明了的設(shè)置使用流程(菜單未使用結(jié)構(gòu)體或鏈表)
2.用戶密碼存儲(chǔ)加密,使用BKDR哈希值計(jì)算并存儲(chǔ),防止從24C02中竊取密碼
3.放棄傳統(tǒng)的矩陣鍵盤,使用ADC鍵盤,連接上更加方便
4.如3項(xiàng)所示,密碼為16進(jìn)制,最大輸入16位
5.對(duì)于添加了管理員密碼的版本,使用內(nèi)部EEPROM存儲(chǔ)管理員密碼(在本版本中,管理員密碼明文存儲(chǔ))

簡(jiǎn)易操作說(shuō)明:
上電進(jìn)入用戶模式鎖定狀態(tài),在鎖定狀態(tài)下輸入密碼后,使用KEY1鍵確認(rèn),KEY2鍵取消,若密碼正確,在按下確認(rèn)鍵的時(shí)候會(huì)顯示正確提示信息,松開按鍵進(jìn)入用戶菜單
如果用戶模式下密碼連續(xù)輸入錯(cuò)誤5次則自動(dòng)鎖死,此時(shí)可以重新上電清空錯(cuò)誤計(jì)數(shù)或者進(jìn)入管理員模式立即解鎖,這種鎖定不會(huì)自動(dòng)解鎖
在用戶菜單下不進(jìn)行任何操作5秒則自動(dòng)上鎖,使用KEY3、KEY4鍵進(jìn)行選項(xiàng)的上下選擇,KEY1鍵執(zhí)行,KEY2鍵取消,在用戶模式下按KEY2鍵取消會(huì)返回上鎖狀態(tài)
在用戶模式鎖定狀態(tài)下,若硬件開關(guān)Hardware_Switch(P4^5)置0,按下KEY1鍵進(jìn)入管理員認(rèn)證,管理員密碼輸入流程與用戶相同,密碼正確則進(jìn)入管理菜單
在管理員菜單下可以進(jìn)行各樣高權(quán)限操作,這些操作在程序上對(duì)用戶模式屏蔽。
在管理模式菜單中各項(xiàng)選項(xiàng)的功能和操作說(shuō)明如下:
1.立即解除鎖定
    該選項(xiàng)將用戶模式錯(cuò)誤計(jì)數(shù)變量清零,沒有提示信息,按下確認(rèn)鍵即可
2.修改用戶密碼
    在管理員狀態(tài)下修改用戶密碼不需要確認(rèn),直接輸入新密碼確定即立即生效,在輸入密碼時(shí)按下取消鍵原密碼不改變
3.修改管理密碼
    修改管理密碼需要兩步:身份認(rèn)證和輸入新密碼。在任何一步按下取消鍵原密碼不改變
4.常開常關(guān)選項(xiàng)
    當(dāng)停用密碼鎖時(shí)返回用戶狀態(tài)時(shí)繼電器常開
    當(dāng)啟用密碼鎖時(shí)用戶模式正常
5.版本信息
    用于記錄或顯示某些信息,這些信息允許在編程階段修改
6.退出管理模式
    選擇此項(xiàng)按確定鍵和在任意項(xiàng)上按返回鍵效果一致,均回到管理員身份驗(yàn)證狀態(tài),希望回到用戶模式時(shí)可以在管理員非密碼修改模式下拔除Hardware_Switch(P4^5)跳帽或?qū)⑵渲酶?br />
考慮到的意外情況:
如果在關(guān)機(jī)時(shí)將AT24C02替換,且沒有存儲(chǔ)準(zhǔn)確的信息,開機(jī)上電用戶模式會(huì)自動(dòng)鎖死,需要管理員重置用戶密碼
實(shí)現(xiàn)機(jī)制:在AT24C02中不僅存放了用戶密碼的HASH值,也存入了4個(gè)字節(jié)的用戶ID信息,這信息與燒錄在程序中的用戶ID信息必須一致,才能夠通過(guò)上電檢測(cè),否則使用戶鎖定標(biāo)志位有效

版本缺陷:

由于本版本是最初學(xué)習(xí)時(shí)嘗試設(shè)計(jì)的,所以有一些問(wèn)題和缺陷,隨著后續(xù)的修改和測(cè)試逐漸發(fā)現(xiàn)的,但是已經(jīng)無(wú)心更改,F(xiàn)列出所有問(wèn)題如下所示:
1.繼電器控制引腳的位定義未在包含文件語(yǔ)句(#include)之前,使得其他文件中對(duì)繼電器的操作是直接給P00賦值,而非使用JDQ這個(gè)位定義名稱,修改時(shí)需要注意;
2.繼電器的控制三極管采用了NPN型,但是后來(lái)發(fā)現(xiàn)這樣會(huì)導(dǎo)致上電吸合一次,在第二版中修正了這個(gè)錯(cuò)誤但是本版本仍然保留;
3.本版本中設(shè)定密碼開鎖后5秒自動(dòng)關(guān)鎖,這個(gè)在程序中可以修改,需要注意一下;
4.按鍵按下會(huì)導(dǎo)致程序死循環(huán),原因是僅僅使用了最簡(jiǎn)單的按鍵判斷:即假設(shè)每個(gè)獨(dú)立按鍵按下之后都會(huì)立即松開;
5.本版本中未添加時(shí)間修改函數(shù),程序的時(shí)間是在下載程序的時(shí)候掐點(diǎn)矯正的,第二版會(huì)添加該功能。












單片機(jī)源程序如下:
  1. #include<STC15.H>
  2. #include<intrins.h>

  3. sbit LED1=P3^0;
  4. sbit LED2=P3^1;
  5. sbit KEY1=P3^2;
  6. sbit KEY2=P3^3;
  7. sbit KEY3=P2^1;
  8. sbit KEY4=P2^2;
  9. //由于后續(xù)包含的文件中可能用到上述位定義故將這部分位定義放在包含文件的語(yǔ)句之前
  10. #include"OLED_Display.c"
  11. #include"DS1302_Driver.c"
  12. #include"AT24C02_Driver.c"
  13. #include"BKDR_HASH_Fuction.c"

  14. sbit JDQ=P0^0;//繼電器引腳

  15. sbit Hardware_Switch=P4^5;//管理員/用戶硬件開關(guān) 用戶:1 管理員:0

  16. //擴(kuò)展作用域
  17. extern unsigned char hash_result[4];

  18. //運(yùn)行數(shù)組
  19. unsigned char user_ID[4]={0x92,0x5A,0xA0,0xC1};
  20. unsigned char version[4]={0,9,0,8};//版本信息(自定義)
  21. unsigned char Administrator_Password[16]={0,1,0,15,0,0,0,0,0,0,0,0,0,0,0,0};//管理員密碼存放數(shù)組
  22. unsigned char User_Password_Putin[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//用戶密碼輸入臨時(shí)存放數(shù)組
  23. unsigned char Admin_Password_Putin[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//管理員密碼輸入臨時(shí)存放數(shù)組
  24. unsigned char Admin_Password_New_Temp[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//管理員密碼修改時(shí),新密碼臨時(shí)存放數(shù)組,可以考慮與輸入臨時(shí)存放數(shù)組復(fù)用

  25. //運(yùn)行變量
  26. unsigned int ADC_DATA;//讀取到的ADC轉(zhuǎn)換值
  27. unsigned char ADC_value=0;//設(shè)置一個(gè)讀取到的按鍵位置值。位置值由電路連接確定,各個(gè)按鍵位置值由所連電阻分壓大小依次順序排列
  28. unsigned char ADC_keyvalue=0;//讀取到的ADC按鍵設(shè)定值。按鍵位置由電路而定可能并不規(guī)整,設(shè)定值為自定的各按鍵數(shù)值
  29. unsigned char first_num=1;//管理模式第一項(xiàng)菜單標(biāo)號(hào)

  30. //運(yùn)行計(jì)數(shù)
  31. unsigned char choose=1;//用戶菜單選擇號(hào),用于記錄當(dāng)前選中的菜單項(xiàng)目序號(hào),默認(rèn)在第一項(xiàng)位置
  32. unsigned char cnt_user_putin_wrong=0;//用戶輸入錯(cuò)誤計(jì)數(shù)
  33. unsigned char t1_cnt=0;//定時(shí)器1運(yùn)行計(jì)數(shù)

  34. //運(yùn)行標(biāo)志位
  35. bit flag_Identity=1;//身份標(biāo)志位,表明當(dāng)前所處身份狀態(tài) 用戶:1 管理員:0
  36. bit En_Standby=1;//待機(jī)狀態(tài)有效標(biāo)志位(使能) 有效:1 無(wú)效:0
  37. bit En_Admin=0;//管理員模式下管理有效標(biāo)志位(使能) 有效:1 無(wú)效:0
  38. bit User_Locker=0;//用戶輸入錯(cuò)誤導(dǎo)致的鎖定有效 有效:1 無(wú)效:0
  39. bit Admin_Info=0;//管理員提示開關(guān),在用戶待機(jī)狀態(tài)下顯示某些信息 有效:1 無(wú)效:0
  40. bit _ReLock=0;//自動(dòng)鎖定標(biāo)志位,顯示定時(shí)器是否已經(jīng)到達(dá)計(jì)時(shí)時(shí)間 是:1 否:0

  41. /*##############################################################################################
  42. 設(shè)計(jì)名稱:電子鎖設(shè)計(jì)
  43. 設(shè)計(jì)者:清河

  44. 版本:9.8.1
  45. 詳情:已經(jīng)初步完成功能設(shè)定,添加自動(dòng)鎖定功能,并排除BUG。豐富了注釋內(nèi)容。
  46.         添加用戶的斷電密碼記憶功能和密碼加密存儲(chǔ)功能,添加開機(jī)AT24C02判斷

  47. 掉電存儲(chǔ)構(gòu)想:
  48.         在每一次更新用戶密碼時(shí)將新密碼hash值存放進(jìn)存儲(chǔ)器中,管理員密碼明文存儲(chǔ)

  49. 加密存儲(chǔ)構(gòu)想:
  50.         使用加密函數(shù)將用戶密碼加密后存儲(chǔ),核對(duì)密碼時(shí)通過(guò)加密函數(shù)求出特征值和存儲(chǔ)器中的比對(duì)

  51. 存儲(chǔ)安全性保證:為防止換用AT24C02導(dǎo)致使用不便或達(dá)到非法開鎖的目的,分別使用AT24C02存儲(chǔ)用戶的密碼HASH值
  52. 片外EEPROM:存放用戶密碼的HASH值,并存入檢測(cè)字節(jié),在系統(tǒng)啟動(dòng)時(shí)檢測(cè)AT24C02是否有被改動(dòng)過(guò)以提高系統(tǒng)安全性
  53. 擴(kuò)展:如果有用戶個(gè)性化的設(shè)置,也可以如此存放,便于管理

  54. 平臺(tái):STC15W4K48S4
  55. 硬件部分
  56. 獨(dú)立按鍵:共4個(gè),用于進(jìn)行各項(xiàng)調(diào)整
  57. ADC鍵盤:用于輸入密碼,本作品中可以輸入16進(jìn)制的密碼,較平常10位密碼更加安全,只要程序和電路做相應(yīng)的修改,也可以實(shí)現(xiàn)在AD可分辨的情況下上百的按鍵鍵位
  58. DS1302:配電池,實(shí)現(xiàn)斷電走時(shí),用于待機(jī)顯示,如果在關(guān)機(jī)時(shí)取下電池或者替換DS1302則會(huì)出錯(cuò),需要重新燒錄程序初始化DS1302
  59. LED指示燈:指示所處狀態(tài),本作品中進(jìn)入用戶模式則LED1亮,進(jìn)入管理員模式則LED2亮
  60. AT24C02:實(shí)現(xiàn)斷電密碼記憶功能,用于記錄用戶密碼的HASH值

  61. 軟件部分
  62. 使用定時(shí)器0實(shí)現(xiàn)對(duì)DS1302數(shù)據(jù)的定時(shí)讀取,間隔50ms,以便更新當(dāng)前的顯示值
  63. 使用定時(shí)器1在用戶解鎖成功時(shí)定時(shí)上鎖,設(shè)置的超時(shí)時(shí)間為5秒

  64. 操作說(shuō)明:
  65. 上電進(jìn)入用戶模式鎖定狀態(tài),在鎖定狀態(tài)下輸入密碼后,使用KEY1鍵確認(rèn),KEY2鍵取消,若密碼正確,在按下確認(rèn)鍵的時(shí)候會(huì)顯示正確提示信息,松開按鍵進(jìn)入用戶菜單
  66. 如果用戶模式下密碼連續(xù)輸入錯(cuò)誤5次則自動(dòng)鎖死,此時(shí)可以重新上電清空錯(cuò)誤計(jì)數(shù)或者進(jìn)入管理員模式立即解鎖,這種鎖定不會(huì)自動(dòng)解鎖
  67. 在用戶菜單下不進(jìn)行任何操作5秒則自動(dòng)上鎖,使用KEY3、KEY4鍵進(jìn)行選項(xiàng)的上下選擇,KEY1鍵執(zhí)行,KEY2鍵取消,在用戶模式下按KEY2鍵取消會(huì)返回上鎖狀態(tài)
  68. 在用戶模式鎖定狀態(tài)下,若硬件開關(guān)Hardware_Switch(P4^5)置0,按下KEY1鍵進(jìn)入管理員認(rèn)證,管理員密碼輸入流程與用戶相同,密碼正確則進(jìn)入管理菜單
  69. 在管理員菜單下可以進(jìn)行各樣高權(quán)限操作,這些操作在程序上對(duì)用戶模式屏蔽。
  70. 在管理模式菜單中各項(xiàng)選項(xiàng)的功能和操作說(shuō)明如下:
  71. 1.立即解除鎖定
  72.         該選項(xiàng)將用戶模式錯(cuò)誤計(jì)數(shù)變量清零,沒有提示信息,按下確認(rèn)鍵即可
  73. 2.修改用戶密碼
  74.         在管理員狀態(tài)下修改用戶密碼不需要確認(rèn),直接輸入新密碼確定即立即生效,在輸入密碼時(shí)按下取消鍵原密碼不改變
  75. 3.修改管理密碼
  76.         修改管理密碼需要兩步:身份認(rèn)證和輸入新密碼。在任何一步按下取消鍵原密碼不改變
  77. 4.常開常關(guān)選項(xiàng)
  78.         當(dāng)停用密碼鎖時(shí)返回用戶狀態(tài)時(shí)繼電器常開
  79.         當(dāng)啟用密碼鎖時(shí)用戶模式正常
  80. 5.版本信息
  81.         用于記錄或顯示某些信息,這些信息允許在編程階段修改
  82. 6.退出管理模式
  83.         選擇此項(xiàng)按確定鍵和在任意項(xiàng)上按返回鍵效果一致,均回到管理員身份驗(yàn)證狀態(tài),希望回到用戶模式時(shí)可以在管理員非密碼修改模式下拔除Hardware_Switch(P4^5)跳帽或?qū)⑵渲酶?br />

  84. 考慮到的意外情況:
  85. 如果在關(guān)機(jī)時(shí)將AT24C02替換,且沒有存儲(chǔ)準(zhǔn)確的信息,開機(jī)上電用戶模式會(huì)自動(dòng)鎖死,需要管理員重置用戶密碼
  86. 實(shí)現(xiàn)機(jī)制:在AT24C02中不僅存放了用戶密碼的HASH值,也存入了4個(gè)字節(jié)的用戶ID信息,這信息與燒錄在程序中的用戶ID信息必須一致,才能夠通過(guò)上電檢測(cè),否則使用戶鎖定標(biāo)志位有效

  87. 特別注意:繼電器部分在本版本程序中沒有考慮到上電初始控制電平的問(wèn)題,上電瞬間會(huì)吸合一次,建議將所有JDQ位反向控制,并將OLED_Display.c中對(duì)P00的控制相應(yīng)更改。
  88. 更改后外圍電路上應(yīng)采用PNP典型控制電路即P口低電平時(shí)繼電器打開,否則關(guān)閉

  89. 經(jīng)過(guò)再三考慮,不添加密碼重置功能,即在添加掉電存儲(chǔ)的程序版本中,一旦忘記用戶密碼和管理密碼則無(wú)法找回,只能通過(guò)刷固件的方式重置密碼以提高整體安全性
  90. 但是后期若能夠添加指紋識(shí)別等模塊,通過(guò)該個(gè)人生物識(shí)別的機(jī)制更改管理密碼會(huì)使安全性得到很大的提升
  91. ##############################################################################################*/

  92. void delay(unsigned int cnt)//調(diào)用該函數(shù)進(jìn)行一段時(shí)間的延時(shí)
  93. {
  94.         while(cnt--);
  95. }

  96. unsigned char KeyScan()
  97. {
  98.         unsigned char ADC_keyvalue=0;//讀取到的ADC按鍵設(shè)定值
  99.         ADC_CONTR=0xea;//開始轉(zhuǎn)換
  100.         delay(1000);//這段暫停的時(shí)間用于等待AD轉(zhuǎn)換完成
  101.         switch(ADC_value)
  102.         {
  103.                 case 0:ADC_keyvalue=12;break;
  104.                 case 1:ADC_keyvalue=13;break;
  105.                 case 2:ADC_keyvalue=14;break;
  106.                 case 3:ADC_keyvalue=15;break;
  107.                 case 4:ADC_keyvalue=11;break;
  108.                 case 5:ADC_keyvalue=10;break;
  109.                 case 6:ADC_keyvalue=9;break;
  110.                 case 7:ADC_keyvalue=8;break;
  111.                 case 8:ADC_keyvalue=4;break;
  112.                 case 9:ADC_keyvalue=5;break;
  113.                 case 10:ADC_keyvalue=6;break;
  114.                 case 11:ADC_keyvalue=7;break;
  115.                 case 12:ADC_keyvalue=3;break;
  116.                 case 13:ADC_keyvalue=2;break;
  117.                 case 14:ADC_keyvalue=1;break;
  118.                 case 15:ADC_keyvalue=0;break;
  119.                 default:ADC_keyvalue=16;break;
  120.         }
  121.         return ADC_keyvalue;
  122. }

  123. unsigned char Modify_User_Password()//用戶密碼更改函數(shù),用于獲取新值賦給用戶密碼數(shù)組
  124. {
  125.         unsigned char i;
  126.         OLED_Clear();
  127.         OLED_Show_CHinese(0,CCTitle7,1);//顯示標(biāo)題:修改密碼
  128.         for(i=0;i<16;i++)
  129.         {
  130.                 OLED_Show_sChar(i*8,2,sChar3,1);//顯示橫線
  131.         }
  132.         OLED_Show_CHinese(4,CCInfo5,1);//顯示說(shuō)明文字:請(qǐng)輸入新密碼:
  133.         
  134.         for(i=0;i<16;)//進(jìn)入輸密碼的環(huán)節(jié)
  135.         {
  136.                 OLED_Show_Number(0,6,User_Password_Putin,i,1);//顯示輸入的值
  137.                 if(KeyScan()!=16)
  138.                 {
  139.                         delay(5000);
  140.                         if(KeyScan()!=16)
  141.                         {
  142.                                 User_Password_Putin[i]=KeyScan();//記錄每一次輸入的值
  143.                                 i++;
  144.                         }
  145.                         while(KeyScan()!=16);//等待按鍵松開
  146.                 }
  147.                
  148.                 if(KEY1==0||i==16)//如果確定鍵按下或輸滿16位
  149.                 {
  150.                         delay(5000);
  151.                         if(KEY1==0||i==16)
  152.                         {
  153.                                 unsigned char k=0;
  154.                                 Password_BKDRHASH_Calculation(User_Password_Putin,16);//對(duì)輸入的值求HASH值,保存在hash_result數(shù)組中
  155.                                 Save_User_Password();//保存新數(shù)據(jù)
  156.                                 for(k=0;k<16;k++)
  157.                                 {
  158.                                         User_Password_Putin[k]=0;//清空用戶輸入
  159.                                 }
  160.                         }
  161.                         while(!KEY1);
  162.                         OLED_Clear();//清屏,清屏放在此處可以使密碼正確的提示信息在按鍵松開前一直顯示
  163.                         break;//立即退出輸入密碼的環(huán)節(jié)
  164.                 }
  165.                
  166.                 if(KEY2==0)//如果取消鍵按下
  167.                 {
  168.                         delay(5000);
  169.                         if(KEY2==0)
  170.                         {
  171.                                 unsigned char j;
  172.                                 for(j=0;j<16;j++)
  173.                                 {
  174.                                         User_Password_Putin[j]=0;//清空用戶輸入
  175.                                 }
  176.                                 OLED_Clear();//清屏                        
  177.                         }
  178.                         while(!KEY2);
  179.                         break;//立即退出輸入密碼的環(huán)節(jié)
  180.                 }
  181.         }
  182.         return 0;
  183. }

  184. unsigned char Modify_Admin_Password()//管理員密碼修改,包括2個(gè)步驟:身份認(rèn)證、密碼修改,其中任何一步都可以由取消鍵退出
  185. {
  186.         unsigned char i;
  187.         OLED_Clear();
  188.         OLED_Display_Administrator_Onload();
  189.         
  190.         for(i=0;i<16;)//進(jìn)入輸密碼的環(huán)節(jié)
  191.         {
  192.                 if(KeyScan()!=16)
  193.                 {
  194.                         delay(5000);
  195.                         if(KeyScan()!=16)
  196.                         {
  197.                                 Admin_Password_Putin[i]=KeyScan();//記錄每一次輸入的值
  198.                                 OLED_Show_sChar(i*8,6,sChar1,1);//顯示*
  199.                                 i++;
  200.                         }
  201.                         while(KeyScan()!=16);//等待按鍵松開
  202.                 }
  203.         
  204.                 if(KEY1==0||i==16)//如果確定鍵按下或輸入位數(shù)滿
  205.                 {
  206.                         delay(5000);
  207.                         if(KEY1==0||i==16)
  208.                         {
  209.                                 unsigned char k=0,t=0;
  210.                                 for(k=0;k<16;k++)
  211.                                 {
  212.                                         if(Admin_Password_Putin[k]==Administrator_Password[k])//核對(duì)明文密碼
  213.                                         {
  214.                                                 t++;//每有一個(gè)位置同,則t自增
  215.                                         }
  216.                                 }
  217.                                 
  218.                                 if(t==16)//密碼正確,可以進(jìn)行修改密碼的操作
  219.                                 {
  220.                                         OLED_Clear();
  221.                                         OLED_Show_CHinese(0,CCTitle7,1);//顯示標(biāo)題:修改密碼
  222.                                         for(i=0;i<16;i++)
  223.                                         {
  224.                                                 OLED_Show_sChar(i*8,2,sChar3,1);//顯示橫線
  225.                                         }
  226.                                         OLED_Show_CHinese(4,CCInfo5,1);//顯示說(shuō)明文字:請(qǐng)輸入新密碼:
  227.                                         while(!KEY1);
  228.                                        
  229.                                         for(i=0;i<16;)//進(jìn)入輸密碼的環(huán)節(jié)
  230.                                         {
  231.                                                 OLED_Show_Number(0,6,Admin_Password_New_Temp,i,1);//顯示輸入的值
  232.                                                 if(KeyScan()!=16)
  233.                                                 {
  234.                                                         delay(5000);
  235.                                                         if(KeyScan()!=16)
  236.                                                         {
  237.                                                                 Admin_Password_New_Temp[i]=KeyScan();//記錄每一次輸入的值
  238.                                                                 i++;
  239.                                                         }
  240.                                                         while(KeyScan()!=16);//等待按鍵松開
  241.                                                 }
  242.                                                 
  243.                                                 if(KEY1==0||i==16)//如果確定鍵按下或輸滿16位
  244.                                                 {
  245.                                                         delay(5000);
  246.                                                         if(KEY1==0||i==16)
  247.                                                         {
  248.                                                                 unsigned char k=0,t=0;
  249.                                                                 for(k=0;k<16;k++)
  250.                                                                 {
  251.                                                                         Administrator_Password[k]=Admin_Password_New_Temp[k];//存入新密碼
  252.                                                                         Admin_Password_New_Temp[k]=0;//清空輸入
  253.                                                                 }
  254.                                                         }
  255.                                                         while(!KEY1);
  256.                                                         OLED_Clear();//清屏,清屏放在此處可以使密碼正確的提示信息在按鍵松開前一直顯示
  257.                                                         break;//立即退出輸入密碼的環(huán)節(jié)
  258.                                                 }
  259.                                                 
  260.                                                 if(KEY2==0)//如果取消鍵按下
  261.                                                 {
  262.                                                         delay(5000);
  263.                                                         if(KEY2==0)
  264.                                                         {
  265.                                                                 unsigned char j;
  266.                                                                 for(j=0;j<16;j++)
  267.                                                                 {
  268.                                                                         Admin_Password_New_Temp[j]=0;//清空用戶輸入
  269.                                                                 }
  270.                                                                 OLED_Clear();//清屏                        
  271.                                                         }
  272.                                                         while(!KEY2);
  273.                                                         break;//立即退出輸入密碼的環(huán)節(jié)
  274.                                                 }
  275.                                         }
  276.                                 }
  277.                                 else//密碼錯(cuò)誤
  278.                                 {
  279.                                         for(k=0;k<16;k++)
  280.                                         {
  281.                                                 Admin_Password_Putin[k]=0;//清空管理員輸入
  282.                                         }
  283.                                         OLED_Clear();
  284.                                 }
  285.                         }
  286.                         while(!KEY1);
  287.                         goto END;//結(jié)束輸入
  288.                 }
  289.                
  290.                 if(KEY2==0)//如果取消鍵按下
  291.                 {
  292.                         delay(5000);
  293.                         if(KEY2==0)
  294.                         {
  295.                                 unsigned char j;
  296.                                 for(j=0;j<16;j++)
  297.                                 {
  298.                                         Admin_Password_Putin[j]=0;//清空管理員輸入
  299.                                 }
  300.                                 OLED_Clear();
  301.                         }
  302.                         while(!KEY2);
  303.                         goto END;//結(jié)束輸入
  304.                 }
  305.         }
  306. END:return 0;
  307. }

  308. void sys_init()//系統(tǒng)初始化
  309. {
  310.         P1M1=0x00;
  311.         P1M0=0x00;
  312.         P3M1=0x00;
  313.         P3M0=0x00;
  314.         P2M1=0x00;
  315.         P2M0=0x00;
  316.         P4M1=0x00;
  317.         P4M0=0x00;
  318.         P5M0=0x00;
  319.         P5M1=0x00;
  320.         P0M1=0x00;
  321.         P0M0=0x00;//對(duì)于STC15W4K32S4系列的單片機(jī),對(duì)IO的初始化操作必須要有
  322.         
  323.         TMOD=0x11;//設(shè)置定時(shí)器模式
  324.         EA=1;//開啟總中斷
  325.         TL0=0x00;//設(shè)置定時(shí)初值
  326.         TH0=0x28;//設(shè)置定時(shí)初值
  327.         ET0=1;//允許定時(shí)器0中斷
  328.         TR0=1;//定時(shí)器0開始計(jì)時(shí)
  329.         
  330.         TL1=0x00;//設(shè)置定時(shí)初值
  331.         TH1=0x28;//設(shè)置定時(shí)初值
  332.         ET1=1;//允許定時(shí)器1中斷
  333.         TR1=0;//定時(shí)器1開始計(jì)時(shí)
  334.         
  335.         P1ASF=0x04;//將P1^2設(shè)置為模擬輸入
  336.         ADC_CONTR=0xe7;//開啟ADC電源,設(shè)置為最快轉(zhuǎn)換速度,停止轉(zhuǎn)換,選取P1^2作為ADC輸入
  337.         ADC_RES=0;//清除結(jié)果寄存器
  338.         /*ADRJ=0;//ADC_RES[7:0]存放高8位ADC結(jié)果,ADC_RES[1:0]存放低2位ADC結(jié)果    EADC=1;//A/D轉(zhuǎn)換中斷允許    PADC=1;//設(shè)置A/D轉(zhuǎn)換中斷優(yōu)先級(jí)為最高*/
  339.         //CLK_DIV=0X20;
  340.         EADC=1;
  341.         PADC=1;
  342. }

  343. void sys_Pretreat()//系統(tǒng)預(yù)處理
  344. {
  345.         //Ds1302Init();//首次上電對(duì)DS1302做初始化
  346.         OLED_Init();//初始化OLED
  347.         OLED_Clear();//OLED清屏
  348.         JDQ=0;//繼電器給低電平
  349.         
  350.         /*在此處添加上電AT24C02檢測(cè)*/
  351.         for(t1_cnt=0;t1_cnt<8;t1_cnt++)//將t1_cnt作為臨時(shí)計(jì)時(shí)變量
  352.         {
  353.                 AT24C02_Read_Array[t1_cnt]=AT24C02_Read(0xA0,t1_cnt+1);
  354.                 Delay1ms();
  355.         }

  356.         for(t1_cnt=0;t1_cnt<4;t1_cnt++)//將t1_cnt作為臨時(shí)計(jì)時(shí)變量
  357.         {
  358.                 if(AT24C02_Read_Array[t1_cnt]!=user_ID[t1_cnt])//如果從AT24C02中讀出的用戶ID和程序中設(shè)定值不同說(shuō)明器件被更替,用戶鎖定,需要重新設(shè)置密碼
  359.                 {
  360.                         User_Locker=1;
  361.                 }
  362.         }
  363.         t1_cnt=0;//使用后重置t1_cnt
  364. }

  365. void main()
  366. {
  367.         sys_init();
  368.         sys_Pretreat();
  369.         while(1)
  370.         {
  371.                 if(flag_Identity)//身份狀態(tài)
  372.                 {//用戶模式
  373.                         if(En_Standby)
  374.                         {//上鎖的待機(jī)狀態(tài)
  375.                                 LED1=1;LED2=1;
  376.                                 if(Admin_Info)
  377.                                 {
  378.                                         unsigned char i;
  379.                                         OLED_Show_CHinese(0,CCInfo6,1);//顯示說(shuō)明文字:繼電器已啟用
  380.                                         for(i=0;i<16;i++)
  381.                                         {
  382.                                                 OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
  383.                                         }
  384.                                         OLED_Show_CHinese(4,CCText1,1);//顯示說(shuō)明文字:解鎖由管理員初始
  385.                                 }
  386.                                 else
  387.                                 {
  388.                                         OLED_Display_Standby();//用戶模式下,上鎖時(shí)的待機(jī)顯示
  389.                                 }
  390.                                 
  391.                                 if(KeyScan()!=16&&En_Standby&&(!User_Locker))//如果在某一時(shí)刻ADC鍵盤有了輸入并且用戶沒有鎖定則繼續(xù)探測(cè)
  392.                                 {
  393.                                         delay(5000);
  394.                                         if(KeyScan()!=16&&En_Standby)
  395.                                         {
  396.                                                 unsigned char i;
  397.                                                 User_Password_Putin[0]=KeyScan();//那么重新捕獲這個(gè)值
  398.                                                 while(KeyScan()!=16);//等待按鍵松開
  399.                                                 OLED_Clear();//OLED清屏
  400.                                                 OLED_Display_Put_In_Password();//顯示密碼輸入界面
  401.                                                 OLED_Show_sChar(0,6,sChar1,1);//顯示*
  402.                                                 for(i=1;i<16;)//進(jìn)入輸密碼的環(huán)節(jié)
  403.                                                 {
  404.                                                         if(KeyScan()!=16)
  405.                                                         {
  406.                                                                 delay(5000);
  407.                                                                 if(KeyScan()!=16)
  408.                                                                 {
  409.                                                                         User_Password_Putin[i]=KeyScan();//記錄每一次輸入的值
  410.                                                                         OLED_Show_sChar(i*8,6,sChar1,1);//顯示*
  411.                                                                         i++;
  412.                                                                 }
  413.                                                                 while(KeyScan()!=16);//等待按鍵松開
  414.                                                         }
  415.                                                         
  416.                                                         if(KEY1==0||i==16)//如果確定鍵按下或輸滿16位
  417.                                                         {
  418.                                                                 delay(5000);
  419.                                                                 if(KEY1==0||i==16)
  420.                                                                 {
  421.                                                                         unsigned char k=0,t=0;
  422.                                                                         Password_BKDRHASH_Calculation(User_Password_Putin,16);//對(duì)輸入的值求HASH值,保存在hash_result數(shù)組中
  423.                                                                         
  424.                                                                         if(HASH_Compare())//密碼正確
  425.                                                                         {
  426.                                                                                 En_Standby=0;//不再是待機(jī)狀態(tài)
  427.                                                                                 JDQ=1;//開啟繼電器
  428.                                                                                 OLED_Clear();
  429.                                                                                 OLED_Display_Right_Password();
  430.                                                                                 t1_cnt=0;
  431.                                                                                 TR1=1;//定時(shí)器1開始計(jì)時(shí)
  432.                                                                         }
  433.                                                                         else//密碼錯(cuò)誤
  434.                                                                         {
  435.                                                                                 En_Standby=1;//仍在待機(jī)狀態(tài)
  436.                                                                                 cnt_user_putin_wrong++;//錯(cuò)誤計(jì)數(shù)增加一次
  437.                                                                                 if(cnt_user_putin_wrong==5)
  438.                                                                                 {
  439.                                                                                         User_Locker=1;//用戶鎖定有效
  440.                                                                                         cnt_user_putin_wrong=0;//但錯(cuò)誤計(jì)數(shù)置0,這樣一來(lái)在管理員模式下只需要關(guān)心用戶鎖定標(biāo)志位即可
  441.                                                                                 }
  442.                                                                         }
  443.                                                                         
  444.                                                                         for(k=0;k<16;k++)
  445.                                                                         {
  446.                                                                                 User_Password_Putin[k]=0;//清空用戶輸入
  447.                                                                         }
  448.                                                                         
  449.                                                                         HASH_Result_Clear();//清空哈希計(jì)算結(jié)果
  450.                                                                 }
  451.                                                                 while(!KEY1);
  452.                                                                 OLED_Clear();//清屏,清屏放在此處可以使密碼正確的提示信息在按鍵松開前一直顯示
  453.                                                                 goto A;//立即退出輸入密碼的環(huán)節(jié)
  454.                                                         }
  455.                                                         
  456.                                                         if(KEY2==0)//如果取消鍵按下
  457.                                                         {
  458.                                                                 delay(5000);
  459.                                                                 if(KEY2==0)
  460.                                                                 {
  461.                                                                         unsigned char j;
  462.                                                                         for(j=0;j<16;j++)
  463.                                                                         {
  464.                                                                                 User_Password_Putin[j]=0;//清空用戶輸入
  465.                                                                         }
  466.                                                                         OLED_Clear();//清屏
  467.                                                                         HASH_Result_Clear();//清空哈希計(jì)算結(jié)果
  468.                                                                 }
  469.                                                                 while(!KEY2);
  470.                                                                 goto A;//立即退出輸入密碼的環(huán)節(jié)
  471.                                                         }
  472.                                                 }
  473. A:                                                _nop_();
  474.                                         }
  475.                                 }
  476.                                 
  477.                                 if(KEY1==0)//待機(jī)狀態(tài)下KEY1是管理員入口開關(guān)
  478.                                 {
  479.                                         delay(8000);
  480.                                         if(KEY1==0)
  481.                                         {
  482.                                                 if(Hardware_Switch==0)
  483.                                                 {
  484.                                                         OLED_Clear();
  485.                                                         flag_Identity=0;
  486.                                                 }
  487.                                         }
  488.                                         while(!KEY1);
  489.                                 }
  490.                         }
  491.                         else
  492.                         {//解鎖的待機(jī)狀態(tài)
  493.                                 OLED_User_Mode();//用戶模式菜單動(dòng)態(tài)顯示
  494.                                 LED1=0;LED2=1;
  495.                                 if(KEY1==0)//確定按鍵
  496.                                 {
  497.                                         delay(5000);
  498.                                         if(KEY1==0)
  499.                                         {
  500.                                                 switch(choose)
  501.                                                 {
  502.                                                         case 1:
  503.                                                                 JDQ=0;//關(guān)閉繼電器
  504.                                                                 TR1=0;//定時(shí)器1停止計(jì)時(shí)
  505.                                                                 TL1=0x00;//設(shè)置定時(shí)初值
  506.                                                                 TH1=0x28;//設(shè)置定時(shí)初值
  507.                                                                 t1_cnt=0;
  508.                                                                 En_Standby=1;//重新回到上鎖狀態(tài)
  509.                                                                 break;
  510.                                                         case 2:
  511.                                                                 while(!KEY1);//等待按鍵松開,若不加此句可能導(dǎo)致Modify_User_Password()瞬間運(yùn)行完,用戶密碼變?yōu)?
  512.                                                                 choose=1;//重置菜單選擇位
  513.                                                                 TR1=0;//定時(shí)器1停止計(jì)時(shí)
  514.                                                                 TL1=0x00;//設(shè)置定時(shí)初值
  515.                                                                 TH1=0x28;//設(shè)置定時(shí)初值
  516.                                                                 t1_cnt=0;
  517.                                                                 Modify_User_Password();
  518.                                                                 TR1=1;//定時(shí)器1開始計(jì)時(shí)
  519.                                                                 break;
  520.                                                 }
  521.                                         }
  522.                                         while(!KEY1);
  523.                                         OLED_Clear();
  524.                                 }
  525.                                 
  526.                                 if(KEY2==0)//取消按鍵
  527.                                 {
  528.                                         delay(5000);
  529.                                         if(KEY2==0)
  530.                                         {
  531.                                                 choose=1;//重置菜單選擇位
  532.                                                 JDQ=0;//關(guān)閉繼電器
  533.                                                 TR1=0;//定時(shí)器1停止計(jì)時(shí)
  534.                                                 TL1=0x00;//設(shè)置定時(shí)初值
  535.                                                 TH1=0x28;//設(shè)置定時(shí)初值
  536.                                                 t1_cnt=0;
  537.                                                 En_Standby=1;//重新回到上鎖狀態(tài)
  538.                                         }
  539.                                         while(!KEY2);
  540.                                         OLED_Clear();
  541.                                 }
  542.                                 
  543.                                 if(_ReLock)//自動(dòng)上鎖判斷
  544.                                 {
  545.                                         En_Standby=1;//重新回到上鎖狀態(tài)
  546.                                         _ReLock=0;//重置標(biāo)志位
  547.                                         TR1=0;//關(guān)閉定時(shí)器1
  548.                                         TL1=0x00;//設(shè)置定時(shí)初值
  549.                                         TH1=0x28;//設(shè)置定時(shí)初值
  550.                                         t1_cnt=0;//重置定時(shí)器1運(yùn)行計(jì)數(shù)
  551.                                         OLED_Clear();//此處的清屏使用戶菜單在待機(jī)界面沒有殘留
  552.                                 }
  553.                         }
  554.                 }
  555.                 else
  556.                 {//管理員狀態(tài)確認(rèn)
  557.                         if(Hardware_Switch==0)
  558.                         {//管理員模式
  559.                                 if(En_Admin)//管理有效
  560.                                 {
  561.                                         OLED_Admin_Mode();//管理模式菜單動(dòng)態(tài)顯示
  562.                                         LED1=1;LED2=0;
  563.                                         if(KEY1==0)//確定按鍵
  564.                                         {
  565.                                                 delay(5000);
  566.                                                 if(KEY1==0)
  567.                                                 {
  568.                                                         switch(choose)
  569.                                                         {
  570.                                                                 case 1:
  571.                                                                         User_Locker=0;//解除用戶鎖定
  572.                                                                         break;
  573.                                                                 case 2:
  574.                                                                         while(!KEY1);//等待按鍵松開,若不加此句可能導(dǎo)致Modify_User_Password()瞬間運(yùn)行完,用戶密碼變?yōu)?
  575.                                                                         Modify_User_Password();
  576.                                                                         break;
  577.                                                                 case 3:
  578.                                                                         while(!KEY1);//等待按鍵松開,若不加此句可能導(dǎo)致Modify_Admin_Password()瞬間運(yùn)行完,管理密碼變?yōu)?
  579.                                                                         Modify_Admin_Password();
  580.                                                                         break;
  581.                                                                 case 4:
  582.                                                                         OLED_Admin_onoff_Mode();//常開常關(guān)選項(xiàng)
  583.                                                                         break;
  584.                                                                 case 5:
  585.                                                                         OLED_Display_System_Information();//顯示版本信息
  586.                                                                         break;
  587.                                                                 case 6:
  588.                                                                         En_Admin=0;//管理無(wú)效
  589.                                                                         break;
  590.                                                         }
  591.                                                 }
  592.                                                 while(!KEY1);
  593.                                                 OLED_Clear();
  594.                                         }
  595.                                        
  596.                                         if(KEY2==0)//取消按鍵
  597.                                         {
  598.                                                 delay(5000);
  599.                                                 if(KEY2==0)
  600.                                                 {
  601.                                                         En_Admin=0;//管理無(wú)效
  602.                                                 }
  603.                                                 while(!KEY2);
  604.                                                 OLED_Clear();
  605.                                         }
  606.                                 }
  607.                                 else//管理無(wú)效
  608.                                 {
  609.                                         OLED_Display_Administrator_Onload();
  610.                                         LED1=1;LED2=1;
  611.                                         if(KeyScan()!=16&&(!En_Admin))//如果在某一時(shí)刻ADC鍵盤有了輸入
  612.                                         {
  613.                                                 delay(5000);
  614.                                                 if(KeyScan()!=16&&(!En_Admin))
  615.                                                 {
  616.                                                         unsigned char i;
  617.                                                         Admin_Password_Putin[0]=KeyScan();//那么重新捕獲這個(gè)值
  618.                                                         while(KeyScan()!=16);//等待按鍵松開
  619.                                                         OLED_Show_sChar(0,6,sChar1,1);//顯示*
  620.                                                         
  621.                                                         for(i=1;i<16;)//進(jìn)入輸密碼的環(huán)節(jié),如果前面有對(duì)第一位密碼的捕獲操作,則此處的循環(huán)從1開始15次
  622.                                                         {
  623.                                                                 if(KeyScan()!=16)
  624.                                                                 {
  625.                                                                         delay(5000);
  626.                                                                         if(KeyScan()!=16)
  627.                                                                         {
  628.                                                                                 Admin_Password_Putin[i]=KeyScan();//記錄每一次輸入的值
  629.                                                                                 OLED_Show_sChar(i*8,6,sChar1,1);//顯示*
  630.                                                                                 i++;
  631.                                                                         }
  632.                                                                         while(KeyScan()!=16);//等待按鍵松開
  633.                                                                 }
  634.                                                                
  635.                                                                 if(KEY1==0||i==16)//如果確定鍵按下或輸入位數(shù)滿
  636.                                                                 {
  637.                                                                         delay(5000);
  638.                                                                         if(KEY1==0||i==16)
  639.                                                                         {
  640.                                                                                 unsigned char k=0,t=0;
  641.                                                                                 for(k=0;k<16;k++)
  642.                                                                                 {
  643.                                                                                         if(Admin_Password_Putin[k]==Administrator_Password[k])//核對(duì)明文密碼
  644.                                                                                         {
  645.                                                                                                 t++;//每有一個(gè)位置同,則t自增
  646.                                                                                         }
  647.                                                                                 }
  648.                                                                                 
  649.                                                                                 if(t==16)//密碼正確
  650.                                                                                 {
  651.                                                                                         En_Admin=1;//管理有效
  652.                                                                                 }
  653.                                                                                 else//密碼錯(cuò)誤
  654.                                                                                 {
  655.                                                                                         En_Admin=0;//管理無(wú)效
  656.                                                                                 }
  657.                                                                                 
  658.                                                                                 for(k=0;k<16;k++)
  659.                                                                                 {
  660.                                                                                         Admin_Password_Putin[k]=0;//清空管理員輸入
  661.                                                                                 }
  662.                                                                                 OLED_Clear();
  663.                                                                         }
  664.                                                                         while(!KEY1);
  665.                                                                         goto B;//立即退出輸入密碼的環(huán)節(jié)
  666.                                                                 }
  667.                                                                
  668.                                                                 if(KEY2==0||Hardware_Switch==1)//如果取消鍵按下或硬件標(biāo)志位被置1
  669.                                                                 {
  670.                                                                         delay(5000);
  671.                                                                         if(KEY2==0||Hardware_Switch==1)
  672.                                                                         {
  673.                                                                                 unsigned char j;
  674.                                                                                 for(j=0;j<16;j++)
  675.                                                                                 {
  676.                                                                                         Admin_Password_Putin[j]=0;//清空管理員輸入
  677.                                                                                 }
  678.                                                                                 OLED_Clear();
  679.                                                                         }
  680.                                                                         while(!KEY2);
  681.                                                                         goto B;//立即退出輸入密碼的環(huán)節(jié)
  682.                                                                 }
  683.                                                         }
  684.                                                 }
  685.                                         }
  686. B:                                        _nop_();
  687.                                 }
  688.                         }
  689.                         else//如果硬件標(biāo)志位被置1
  690.                         {
  691.                                 OLED_Clear();
  692.                                 En_Admin=0;//管理無(wú)效
  693.                                 choose=1;//由于管理模式菜單和用戶模式共用一個(gè)選擇項(xiàng),并且菜單顯示和choose有關(guān),所以如果不重置菜單選中位,菜單長(zhǎng)度的不同會(huì)導(dǎo)致用戶顯示的失敗
  694.                                 first_num=1;/*如果第一項(xiàng)菜單標(biāo)號(hào)first_num改為全局變量,那么在此處將它置1可以保證每一次進(jìn)入管理菜單是默認(rèn)選中第一項(xiàng)*/
  695.                                 flag_Identity=1;//返回用戶狀態(tài)
  696.                         }
  697.                 }
  698.         }
  699. }
  700. ……………………

  701. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
密碼鎖基本版 凌凈清河.zip (260.4 KB, 下載次數(shù): 233)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏21 分享淘帖 頂3 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

來(lái)自 2#
ID:362076 發(fā)表于 2019-1-7 16:12 | 只看該作者
第二版的密碼鎖設(shè)計(jì)已經(jīng)上傳到本站,但是被移動(dòng)到“單片機(jī)DIY”區(qū)域了,特此說(shuō)明,本帖子的承諾沒有鴿!
回復(fù)

使用道具 舉報(bào)

板凳
ID:71421 發(fā)表于 2018-12-5 21:13 | 只看該作者
感謝分享!。。。。。。。!

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:102963 發(fā)表于 2018-12-6 08:51 | 只看該作者
相當(dāng)不錯(cuò)的設(shè)計(jì)!!

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 受到了相當(dāng)大的鼓勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:295874 發(fā)表于 2018-12-6 09:45 | 只看該作者
強(qiáng)大,學(xué)習(xí)的動(dòng)力

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載補(bǔ)貼黑幣

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:328014 發(fā)表于 2018-12-11 16:06 | 只看該作者
設(shè)計(jì)思路很新穎,這個(gè)完善一下可以用于實(shí)際了

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 感謝回帖評(píng)價(jià)

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

7#
ID:444537 發(fā)表于 2018-12-11 23:08 | 只看該作者
很強(qiáng),感謝分享。!

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載黑幣補(bǔ)貼

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

8#
ID:358930 發(fā)表于 2018-12-12 03:37 | 只看該作者
這么專業(yè),讓人向往,請(qǐng)教。有顏色高速識(shí)別的傳感器例程嗎?或者是方向。就是一段電線從傳感器通過(guò),有一小段幾厘米不同色能快速識(shí)別嗎?如TCS3200,好像要用些高級(jí)算法才能用于生產(chǎn),還有什么傳感器嗎?
回復(fù)

使用道具 舉報(bào)

9#
ID:362076 發(fā)表于 2018-12-12 10:26 | 只看該作者
冰冰潔潔 發(fā)表于 2018-12-12 03:37
這么專業(yè),讓人向往,請(qǐng)教。有顏色高速識(shí)別的傳感器例程嗎?或者是方向。就是一段電線從傳感器通過(guò),有一小 ...

抱歉,顏色傳感器我還沒有用過(guò)。不過(guò)有一點(diǎn)是不變的,一分錢一分貨,想要高性能,一定程度上就要多花錢,TCS3200的顏色好像需要再矯正一下才能達(dá)到精度,要不試試TCS34725?
關(guān)于TCS3200,這一篇文章說(shuō)的挺詳細(xì)的,不知道你看沒看過(guò)
https://blog.csdn.net/b108074013/article/details/50240219
回復(fù)

使用道具 舉報(bào)

10#
ID:358930 發(fā)表于 2018-12-12 18:21 | 只看該作者
謝謝,正在想辦法,看來(lái)運(yùn)用的不太多,但是方向很重要,不行先試試TCS34725,改天做過(guò)去測(cè)試,這個(gè)好像是串口通信,內(nèi)部有MCU計(jì)算,看來(lái)有點(diǎn)像18b20,相信能簡(jiǎn)單點(diǎn)。?佳许樌,真想知道了您考研的是什么課題……
回復(fù)

使用道具 舉報(bào)

11#
ID:362076 發(fā)表于 2018-12-13 11:11 | 只看該作者
冰冰潔潔 發(fā)表于 2018-12-12 18:21
謝謝,正在想辦法,看來(lái)運(yùn)用的不太多,但是方向很重要,不行先試試TCS34725,改天做過(guò)去測(cè)試,這個(gè)好像是串 ...

感謝祝愿,如果我考研初試順利,復(fù)試的科目就是單片機(jī)。
回復(fù)

使用道具 舉報(bào)

12#
ID:445711 發(fā)表于 2018-12-13 16:36 | 只看該作者
本科的時(shí)候也設(shè)計(jì)過(guò)一個(gè)密碼鎖,只是沒有成功。

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載補(bǔ)貼15黑幣

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

13#
ID:445380 發(fā)表于 2018-12-13 16:51 | 只看該作者
這個(gè)比較牛叉對(duì)于初學(xué)者而言有參考價(jià)值

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載補(bǔ)貼15黑幣

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

14#
ID:362076 發(fā)表于 2018-12-13 22:23 | 只看該作者
知守 發(fā)表于 2018-12-13 16:36
本科的時(shí)候也設(shè)計(jì)過(guò)一個(gè)密碼鎖,只是沒有成功。

密碼鎖還是比較簡(jiǎn)單的一個(gè)實(shí)例,本科不成功,現(xiàn)在也可以再做一個(gè)試試呀
回復(fù)

使用道具 舉報(bào)

15#
ID:362076 發(fā)表于 2018-12-13 22:24 | 只看該作者
電子學(xué)系 發(fā)表于 2018-12-13 16:51
這個(gè)比較牛叉對(duì)于初學(xué)者而言有參考價(jià)值

這只是有基本功能,在機(jī)制上還要在完善一下,另外可以增加射頻卡的功能,這個(gè)功能在第二版里添加上了
回復(fù)

使用道具 舉報(bào)

16#
ID:354282 發(fā)表于 2018-12-14 08:18 | 只看該作者
支持,很好,喜歡加油,做自己喜歡的硬件,方便的話,大家一起交流學(xué)習(xí)。

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 感謝支持!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

17#
ID:237159 發(fā)表于 2018-12-14 10:50 | 只看該作者
好東西,謝謝分享

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載補(bǔ)貼

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

18#
ID:228888 發(fā)表于 2018-12-17 17:27 | 只看該作者
我是新手,喜歡,謝謝樓主

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載補(bǔ)貼黑幣~

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

19#
ID:448297 發(fā)表于 2018-12-17 20:18 | 只看該作者
gnez 發(fā)表于 2018-12-5 21:13
感謝分享。。。。。。。。!

棒 啊,特別好吧

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載黑幣補(bǔ)貼!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

20#
ID:448333 發(fā)表于 2018-12-17 20:32 | 只看該作者
感謝分享

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載黑幣補(bǔ)貼!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

21#
ID:448333 發(fā)表于 2018-12-17 20:32 | 只看該作者
非常新穎

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載黑幣補(bǔ)貼!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

22#
ID:446953 發(fā)表于 2018-12-17 21:05 | 只看該作者
感謝樓主分享源碼,正愁沒東西參考呢

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載黑幣補(bǔ)貼!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

23#
ID:449175 發(fā)表于 2018-12-18 19:39 | 只看該作者
樓主真厲害  夠新穎

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載黑幣補(bǔ)貼!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

24#
ID:449978 發(fā)表于 2018-12-19 17:58 | 只看該作者
可以哦6666

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載黑幣補(bǔ)貼!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

25#
ID:449175 發(fā)表于 2018-12-21 17:15 來(lái)自手機(jī) | 只看該作者
明天加油  一切順利(ò  ó)

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 哈哈,我考完才看見,是不是有點(diǎn)晚咯?

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

26#
ID:454478 發(fā)表于 2018-12-25 15:59 | 只看該作者
這也太棒了吧

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載補(bǔ)貼黑幣

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

27#
ID:409674 發(fā)表于 2019-1-7 21:49 | 只看該作者
感謝樓主分享源碼

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載黑幣補(bǔ)貼

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

28#
ID:417702 發(fā)表于 2019-1-9 10:28 | 只看該作者
流弊,感謝樓主的分享!

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載黑幣補(bǔ)貼

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

29#
ID:471227 發(fā)表于 2019-1-23 17:22 | 只看該作者
學(xué)習(xí)了,感謝分享!

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載補(bǔ)貼

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

30#
ID:60656 發(fā)表于 2019-1-23 20:29 | 只看該作者
學(xué)習(xí)一下,感謝分享

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載補(bǔ)貼

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

31#
ID:472369 發(fā)表于 2019-1-24 17:38 | 只看該作者
厲害厲害!我有一個(gè)學(xué)長(zhǎng)學(xué)完課程自己摸索出來(lái)一個(gè),都沒有你這個(gè)厲害!

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 非常感謝~筆芯~

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

32#
ID:318309 發(fā)表于 2019-1-24 20:56 | 只看該作者
樓主好強(qiáng)啊,謝謝樓主分享

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載補(bǔ)貼

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

33#
ID:470892 發(fā)表于 2019-1-24 22:25 | 只看該作者
感謝樓主分享

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載補(bǔ)貼

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

34#
ID:470892 發(fā)表于 2019-1-24 22:45 | 只看該作者
感謝樓主分享

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
凌凈清河 + 15 下載補(bǔ)貼

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

35#
ID:486236 發(fā)表于 2019-3-7 14:24 | 只看該作者
感謝樓主分享

評(píng)分

參與人數(shù) 1黑幣 +12 收起 理由
NPC-1024 + 12 下載補(bǔ)貼

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

36#
ID:248611 發(fā)表于 2019-3-8 00:11 | 只看該作者
感謝樓主分享,很好的學(xué)習(xí)資料

評(píng)分

參與人數(shù) 1黑幣 +16 收起 理由
凌凈清河 + 16 黑幣補(bǔ)貼

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

37#
ID:458411 發(fā)表于 2019-3-8 15:46 | 只看該作者
很好的學(xué)習(xí)資料,感謝樓主分享
回復(fù)

使用道具 舉報(bào)

38#
ID:338565 發(fā)表于 2019-4-11 19:51 | 只看該作者
哇!學(xué)長(zhǎng)厲害了,請(qǐng)問(wèn)考研結(jié)果怎么樣了呢?
回復(fù)

使用道具 舉報(bào)

39#
ID:539581 發(fā)表于 2019-5-30 08:26 | 只看該作者
對(duì)于我們這種初學(xué)者太有用了吧!贊!
回復(fù)

使用道具 舉報(bào)

40#
ID:466896 發(fā)表于 2019-5-30 09:47 | 只看該作者
15系列的單片機(jī)不是有內(nèi)部存儲(chǔ)嗎?為啥要寫到外部哎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表