標(biāo)題: 你從未見過的單片機(jī)密碼鎖設(shè)計(jì)(第二版) [打印本頁(yè)]

作者: 凌凈清河    時(shí)間: 2019-1-7 15:15
標(biāo)題: 你從未見過的單片機(jī)密碼鎖設(shè)計(jì)(第二版)
本版本是第一版功能的延伸和擴(kuò)展。配合B站上傳的視頻更佳。
B站搜索你從未見過的密碼鎖(第二版)(UP凌凈清河)即可查到相關(guān)視頻()。
視頻有演示過程,有助于理解程序,強(qiáng)烈建議觀看。


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

請(qǐng)先參閱第一版的說明:
http://www.torrancerestoration.com/bbs/dpj-144690-1.html

聲明:
0.第二版代碼仍冗余,但仍然請(qǐng)大家在轉(zhuǎn)載、分享時(shí)提及原作者,非常感謝
1.設(shè)計(jì)使用STC15W4K48S4制作,由于管理員密碼存儲(chǔ)在內(nèi)部EEPROM中,故請(qǐng)勿使用IAP、IRC版本的單片機(jī),否則會(huì)導(dǎo)致無(wú)法修改管理員密碼
2.本版本已經(jīng)可以作為課程設(shè)計(jì)使用了,但是仍然有斟酌的空間,下文將展示出功能上欠妥的部分,供使用者注意
3.設(shè)計(jì)目的是給密碼鎖課題的課設(shè)、畢設(shè)者提供一個(gè)完善的思路,可以看到在淘寶上目前還沒有這樣功能齊全,界面明了的密碼鎖。本設(shè)計(jì)若放在淘寶,有沒有買的不敢說,但是按照功能的定價(jià)超過300是可以的,此處提供給大家免費(fèi)使用,唯一要求是不要用于盈利(寫給淘寶抄設(shè)計(jì)用來賣的家伙們,當(dāng)然,我反正也管不了)。
4.注意兩點(diǎn):其一,首次下載先在初始化函數(shù)中清除掉管理員密碼寫入的語(yǔ)句注釋符,編譯寫入后,將此語(yǔ)句注釋后再次編譯下載方可正常使用。僅首次,以后就再也不用如此操作了。其二,初次使用AT24C02是不能通過合法性檢測(cè)的,鎖會(huì)自動(dòng)鎖死,進(jìn)入管理員菜單后先修改用戶密碼,再執(zhí)行一次“立即解除鎖定”,即可正常使用。

器件/功能清單:
1.本作品使用了如下模塊(各模塊的位定義見源代碼):
2.OLED12864(SPI)
3.火焰探測(cè)模塊(三線制)
4.BMP180溫度氣壓傳感模塊(5線)
5.RC522射頻卡識(shí)別模塊
6.ADC鍵盤典型連接方式(STC手冊(cè)上的典型電路)
7.DS1302,不帶涓流充電(使用1N4148使電池單向供電)
8.AT24C02,硬件地址0xA0
9.繼電器(JQC-3FF)
10.單片機(jī)采用STC15W4K48S4,使用到的片內(nèi)資源有定時(shí)器0、定時(shí)器1、AD轉(zhuǎn)換器、EEPROM等。


設(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ǔ))
6.添加新器件BMP180,用于顯示溫度和氣壓
7.添加新器件RC522,并且配有完整的設(shè)置菜單,其權(quán)限小于密碼方式,開鎖時(shí)間為5秒
8.添加新功能火焰探測(cè),僅是提供一個(gè)接口或思路,用于特殊情況的開鎖模式
9.修正了第一版中繼電器的錯(cuò)誤驅(qū)動(dòng)方式,改成PNP驅(qū)動(dòng)


版本缺陷:
1.關(guān)于設(shè)計(jì)針對(duì)的鎖類型。因?yàn)樯漕l卡的開鎖有時(shí)長(zhǎng)限制,所以可以看出該鎖管理系統(tǒng)是針對(duì)可以自動(dòng)開關(guān)的滑動(dòng)門設(shè)計(jì)的,只是簡(jiǎn)化了門鎖的模型和樣式,換成繼電器供直觀顯示
2.本版本中設(shè)定密碼開鎖后5秒自動(dòng)關(guān)鎖,這個(gè)在程序中可以修改,但是沒有提供手動(dòng)修改的接口,可以自行添加
3.對(duì)按鍵的消抖和判斷部分仍然延續(xù)了第一版,因?yàn)楹镁弥暗脑O(shè)計(jì)了,懶得改。按鍵按下會(huì)導(dǎo)致程序死循環(huán),原因是僅僅使用了最簡(jiǎn)單的按鍵判斷:即假設(shè)每個(gè)獨(dú)立按鍵按下之后都會(huì)立即松開
4.采用的時(shí)間芯片為DS1302,有誤差,可以自行改為DS3231
5.BMP180部分,即狀態(tài)信息部分對(duì)數(shù)據(jù)的處理似乎有BUG,但是因?yàn)槭堑诙,也懶得改?br />

局限性:

1.RC522射頻卡只判斷了卡號(hào),存儲(chǔ)也是基于卡號(hào)的信息。所以,雖然原則上,某些銀行卡、校園卡、公交卡都可以作為本設(shè)計(jì)射頻卡部分的“鑰匙”,但是也對(duì)安全造成了一定的威脅
2.采用的時(shí)間芯片支持時(shí)間不是到永遠(yuǎn)
3.AT24C02最大可以存儲(chǔ)30張卡的信息,宏定義里面最大設(shè)置為30,要是換器件的話,驅(qū)動(dòng)部分的器件地址和頁(yè)寫方式也要跟著換,記得注意
4.承上,AT24C02中數(shù)據(jù)搜索是按頁(yè)枚舉,效率很低,數(shù)量小倒也無(wú)所謂了,但是數(shù)量很多的話,勢(shì)必影響效率
5.設(shè)計(jì)完全沒有考慮到成本和功耗喲







LOCKER.C

  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^7;
  7. sbit KEY3=P2^1;
  8. sbit KEY4=P2^6;
  9. sbit JDQ=P0^0;//繼電器引腳

  10. sbit OLED_CS=P1^3; //片選
  11. sbit OLED_RST=P1^5;//復(fù)位
  12. sbit OLED_DC=P1^4;//數(shù)據(jù)/命令控制
  13. sbit OLED_SCL=P1^7;//時(shí)鐘 D0(SCLK)
  14. sbit OLED_SDIN=P1^6;//D1(MOSI) 數(shù)據(jù)

  15. sbit Hardware_Switch=P4^5;//管理員/用戶硬件開關(guān) 用戶:1 管理員:0
  16. sbit Fire_Sensor=P0^6;//火焰?zhèn)鞲衅魑,有火焰?,無(wú)火焰為0

  17. #include"DS1302_Driver.c"
  18. #include"BKDR_HASH_Fuction.c"
  19. #include"AT24C02_Driver.c"
  20. #include"OLED_Display.c"
  21. #include"Internal_EEPROM_Fuction.c"

  22. //運(yùn)行數(shù)組
  23. unsigned char device_ID[4]={0x92,0x5A,0xA0,0xCA};
  24. unsigned char Administrator_Password[16]={0,1,0,15,0,0,0,0,0,0,0,0,0,0,0,0};//管理員密碼存放數(shù)組,作為預(yù)設(shè)值保留此項(xiàng)
  25. unsigned char User_Password_Putin[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//用戶密碼輸入臨時(shí)存放數(shù)組
  26. unsigned char Admin_Password_Putin[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//管理員密碼輸入臨時(shí)存放數(shù)組

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

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

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

  45. /*########################################################################################
  46. 設(shè)計(jì)名稱:密碼鎖設(shè)計(jì) 第二版
  47. 設(shè)計(jì)者:清河

  48. 版本:A1.0
  49. 最后封裝日期:2018-08-20
  50. 設(shè)備內(nèi)置ID:0x925AA0CA
  51. 管理員初始密碼010F(00000000)

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

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

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

  68. unsigned char KeyScan()
  69. {
  70.         unsigned char ADC_keyvalue=0;//讀取到的ADC按鍵設(shè)定值
  71.         ADC_CONTR=0xea;//開始轉(zhuǎn)換
  72.         delay(1000);//這段暫停的時(shí)間用于等待AD轉(zhuǎn)換完成
  73.         switch(ADC_value)
  74.         {
  75.                 case 0:ADC_keyvalue=12;break;
  76.                 case 1:ADC_keyvalue=13;break;
  77.                 case 2:ADC_keyvalue=14;break;
  78.                 case 3:ADC_keyvalue=15;break;
  79.                 case 4:ADC_keyvalue=11;break;
  80.                 case 5:ADC_keyvalue=10;break;
  81.                 case 6:ADC_keyvalue=9;break;
  82.                 case 7:ADC_keyvalue=8;break;
  83.                 case 8:ADC_keyvalue=4;break;
  84.                 case 9:ADC_keyvalue=5;break;
  85.                 case 10:ADC_keyvalue=6;break;
  86.                 case 11:ADC_keyvalue=7;break;
  87.                 case 12:ADC_keyvalue=3;break;
  88.                 case 13:ADC_keyvalue=2;break;
  89.                 case 14:ADC_keyvalue=1;break;
  90.                 case 15:ADC_keyvalue=0;break;
  91.                 default:ADC_keyvalue=16;break;
  92.         }
  93.         return ADC_keyvalue;
  94. }

  95. unsigned char Modify_User_Password()//用戶密碼更改函數(shù),用于獲取新值賦給用戶密碼數(shù)組
  96. {
  97.         unsigned char i;
  98.         OLED_Clear();
  99.         OLED_Show_CHinese(0,CCTitle7,1);//顯示標(biāo)題:修改密碼
  100.         for(i=0;i<16;i++)
  101.         {
  102.                 OLED_Show_sChar(i*8,2,sChar3,1);//顯示橫線
  103.         }
  104.         OLED_Show_CHinese(4,CCInfo5,1);//顯示說明文字:請(qǐng)輸入新密碼:
  105.         
  106.         for(i=0;i<16;)//進(jìn)入輸密碼的環(huán)節(jié)
  107.         {
  108.                 OLED_Show_Number(0,6,User_Password_Putin,i,1);//顯示輸入的值
  109.                 if(KeyScan()!=16)
  110.                 {
  111.                         delay(5000);
  112.                         if(KeyScan()!=16)
  113.                         {
  114.                                 User_Password_Putin[i]=KeyScan();//記錄每一次輸入的值
  115.                                 i++;
  116.                         }
  117.                         while(KeyScan()!=16);//等待按鍵松開
  118.                 }
  119.                
  120.                 if(KEY1==0||i==16)//如果確定鍵按下或輸滿16位
  121.                 {
  122.                         delay(5000);
  123.                         if(KEY1==0||i==16)
  124.                         {
  125.                                 unsigned char k=0;
  126.                                 Password_BKDRHASH_Calculation(User_Password_Putin,16);//對(duì)輸入的值求HASH值,保存在hash_result數(shù)組中
  127.                                 Save_User_Password();//保存新數(shù)據(jù)
  128.                                 for(k=0;k<16;k++)
  129.                                 {
  130.                                         User_Password_Putin[k]=0;//清空用戶輸入
  131.                                 }
  132.                         }
  133.                         while(!KEY1);
  134.                         OLED_Clear();//清屏,清屏放在此處可以使密碼正確的提示信息在按鍵松開前一直顯示
  135.                         break;//立即退出輸入密碼的環(huán)節(jié)
  136.                 }
  137.                
  138.                 if(KEY2==0)//如果取消鍵按下
  139.                 {
  140.                         delay(5000);
  141.                         if(KEY2==0)
  142.                         {
  143.                                 unsigned char j;
  144.                                 for(j=0;j<16;j++)
  145.                                 {
  146.                                         User_Password_Putin[j]=0;//清空用戶輸入
  147.                                 }
  148.                                 OLED_Clear();//清屏                        
  149.                         }
  150.                         while(!KEY2);
  151.                         break;//立即退出輸入密碼的環(huán)節(jié)
  152.                 }
  153.         }
  154.         return 0;
  155. }

  156. unsigned char Modify_Admin_Password()//管理員密碼修改,包括2個(gè)步驟:身份認(rèn)證、密碼修改,其中任何一步都可以由取消鍵退出
  157. {
  158.         unsigned char i;
  159.         OLED_Clear();
  160.         OLED_Display_Administrator_Onload();
  161.         
  162.         for(i=0;i<16;)//進(jìn)入輸密碼的環(huán)節(jié)
  163.         {
  164.                 if(KeyScan()!=16)
  165.                 {
  166.                         delay(5000);
  167.                         if(KeyScan()!=16)
  168.                         {
  169.                                 Admin_Password_Putin[i]=KeyScan();//記錄每一次輸入的值
  170.                                 OLED_Show_sChar(i*8,6,sChar1,1);//顯示*
  171.                                 i++;
  172.                         }
  173.                         while(KeyScan()!=16);//等待按鍵松開
  174.                 }
  175.         
  176.                 if(KEY1==0||i==16)//如果確定鍵按下或輸入位數(shù)滿
  177.                 {
  178.                         delay(5000);
  179.                         if(KEY1==0||i==16)
  180.                         {
  181.                                 unsigned char k=0;
  182.                                 Password_BKDRHASH_Calculation(Admin_Password_Putin,16);
  183.                                 for(k=0;k<16;k++)
  184.                                 {
  185.                                         Admin_Password_Putin[k]=0;//清空管理員輸入,為后續(xù)輸入做準(zhǔn)備
  186.                                 }
  187.                                 
  188.                                 if(Admin_HASH_Compare())//密碼正確,可以進(jìn)行修改密碼的操作
  189.                                 {
  190.                                         OLED_Clear();
  191.                                         OLED_Show_CHinese(0,CCTitle7,1);//顯示標(biāo)題:修改密碼
  192.                                         for(i=0;i<16;i++)
  193.                                         {
  194.                                                 OLED_Show_sChar(i*8,2,sChar3,1);//顯示橫線
  195.                                         }
  196.                                         OLED_Show_CHinese(4,CCInfo5,1);//顯示說明文字:請(qǐng)輸入新密碼:
  197.                                         while(!KEY1);
  198.                                        
  199.                                         for(i=0;i<16;)//進(jìn)入輸密碼的環(huán)節(jié)
  200.                                         {
  201.                                                 OLED_Show_Number(0,6,Admin_Password_Putin,i,1);//顯示輸入的值
  202.                                                 if(KeyScan()!=16)
  203.                                                 {
  204.                                                         delay(5000);
  205.                                                         if(KeyScan()!=16)
  206.                                                         {
  207.                                                                 Admin_Password_Putin[i]=KeyScan();//記錄每一次輸入的值
  208.                                                                 i++;
  209.                                                         }
  210.                                                         while(KeyScan()!=16);//等待按鍵松開
  211.                                                 }
  212.                                                 
  213.                                                 if(KEY1==0||i==16)//如果確定鍵按下或輸滿16位
  214.                                                 {
  215.                                                         delay(5000);
  216.                                                         if(KEY1==0||i==16)
  217.                                                         {
  218.                                                                 Password_BKDRHASH_Calculation(Admin_Password_Putin,16);//計(jì)算新管理員密碼的HASH值
  219.                                                                 IAP_Clear_Sector(IAP_ADDRESS);//在寫入之前進(jìn)行塊擦除操作,否則可能寫入失敗
  220.                                                                 Delay2ms();
  221.                                                                 Save_Admin_Password();//保存新數(shù)據(jù)
  222.                                                                 for(k=0;k<16;k++)
  223.                                                                 {
  224.                                                                         Admin_Password_Putin[k]=0;//清空管理員輸入
  225.                                                                 }
  226.                                                         }
  227.                                                         while(!KEY1);
  228.                                                         OLED_Clear();//清屏,清屏放在此處可以使密碼正確的提示信息在按鍵松開前一直顯示
  229.                                                         break;//立即退出輸入密碼的環(huán)節(jié)
  230.                                                 }
  231.                                                 
  232.                                                 if(KEY2==0)//如果取消鍵按下
  233.                                                 {
  234.                                                         delay(5000);
  235.                                                         if(KEY2==0)
  236.                                                         {
  237.                                                                 for(k=0;k<16;k++)
  238.                                                                 {
  239.                                                                         Admin_Password_Putin[k]=0;//清空管理員輸入
  240.                                                                 }
  241.                                                                 OLED_Clear();//清屏                        
  242.                                                         }
  243.                                                         while(!KEY2);
  244.                                                         break;//立即退出輸入密碼的環(huán)節(jié)
  245.                                                 }
  246.                                         }
  247.                                 }
  248.                                 else//密碼錯(cuò)誤
  249.                                 {
  250.                                         OLED_Clear();
  251.                                 }
  252.                         }
  253.                         while(!KEY1);
  254.                         goto END;//結(jié)束輸入
  255.                 }
  256.                
  257.                 if(KEY2==0)//如果取消鍵按下
  258.                 {
  259.                         delay(5000);
  260.                         if(KEY2==0)
  261.                         {
  262.                                 unsigned char j;
  263.                                 for(j=0;j<16;j++)
  264.                                 {
  265.                                         Admin_Password_Putin[j]=0;//清空管理員輸入
  266.                                 }
  267.                                 OLED_Clear();
  268.                         }
  269.                         while(!KEY2);
  270.                         goto END;//結(jié)束輸入
  271.                 }
  272.         }
  273. END:return 0;
  274. }
  275. //################################################################################################################以下為主函數(shù)部分#############
  276. void sys_init()//系統(tǒng)初始化
  277. {
  278.         P1M1=0x00;
  279.         P1M0=0x00;
  280.         P2M1=0x00;
  281.         P2M0=0x00;
  282.         P3M1=0x00;
  283.         P3M0=0x00;
  284.         P4M1=0x00;
  285.         P4M0=0x00;
  286.         P5M0=0x00;
  287.         P5M1=0x00;
  288.         P0M1=0x00;
  289.         P0M0=0x00;//對(duì)于STC15W4K32S4系列的單片機(jī),對(duì)IO的初始化操作必須要有
  290.         
  291.         TMOD=0x11;//設(shè)置定時(shí)器模式
  292.         EA=1;//開啟總中斷
  293.         TL0=0x00;//設(shè)置定時(shí)初值
  294.         TH0=0x28;//設(shè)置定時(shí)初值
  295.         ET0=1;//允許定時(shí)器0中斷
  296.         TR0=1;//定時(shí)器0開始計(jì)時(shí)
  297.         
  298.         TL1=0x00;//設(shè)置定時(shí)初值
  299.         TH1=0x28;//設(shè)置定時(shí)初值
  300.         ET1=1;//允許定時(shí)器1中斷
  301.         TR1=0;//定時(shí)器1停止計(jì)時(shí)
  302.         
  303.         P1ASF=0x04;//將P1^2設(shè)置為模擬輸入
  304.         ADC_CONTR=0xe7;//開啟ADC電源,設(shè)置為最快轉(zhuǎn)換速度,停止轉(zhuǎn)換,選取P1^2作為ADC輸入
  305.         ADC_RES=0;//清除結(jié)果寄存器
  306.         /*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í)為最高*/
  307.         //CLK_DIV=0X20;
  308.         EADC=1;
  309.         PADC=1;
  310. }

  311. void sys_Pretreat()//系統(tǒng)預(yù)處理
  312. {
  313.         Init_Determine();//DS1302上電自動(dòng)初始化判斷
  314.         //IAP_Clear_Sector(IAP_ADDRESS);//首次下載對(duì)EEPROM擦除
  315.         //Admin_Password_Init();//首次下載存入管理員預(yù)置密碼
  316.         OLED_Init();//初始化OLED
  317.         OLED_Clear();//OLED清屏
  318.         RFID_init();//射頻卡初始化
  319.         Init_BMP180();//BMP180初始化
  320.         JDQ=1;
  321.         
  322.         //上電AT24C02檢測(cè)
  323.         AT24C02_Page_Read(0xA0,1);//讀取用戶模式密碼的頁(yè)

  324.         for(t1_cnt=0;t1_cnt<4;t1_cnt++)//將t1_cnt作為臨時(shí)計(jì)時(shí)變量
  325.         {
  326.                 if(AT24C02_Read_Array[t1_cnt]!=device_ID[t1_cnt])//如果從AT24C02中讀出的設(shè)備ID和程序中設(shè)定值不同說明器件被更替,用戶鎖定,需要重新設(shè)置密碼
  327.                 {
  328.                         User_Locker=1;
  329.                 }
  330.         }
  331.         t1_cnt=0;//使用后重置t1_cnt
  332. }

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

  743. void GetTime() interrupt 1//使用定時(shí)器0每隔約50ms獲取一次時(shí)間信息
  744. {
  745.         TL0=(65536-50000)/256;//設(shè)置定時(shí)初值
  746.         TH0=(65536-50000)%256;//設(shè)置定時(shí)初值
  747.         Ds1302ReadTime();//讀取DS1302時(shí)間信息
  748.         time_procressing();//將讀取到的時(shí)間轉(zhuǎn)換為十進(jìn)制數(shù)據(jù),存放在time_trans數(shù)組中
  749.         time_assign();//將得到的值放置在顯示數(shù)組中
  750. }

  751. void ReLock() interrupt 3
  752. {
  753.         TL1=0x00;//設(shè)置定時(shí)初值
  754.         TH1=0x28;//設(shè)置定時(shí)初值
  755.         t1_cnt++;
  756.         if(t1_cnt==100)
  757.         {
  758.                 _ReLock=1;//置標(biāo)志位
  759.                 JDQ=1;//關(guān)閉繼電器
  760.                 t1_cnt=0;
  761.         }
  762. }

  763. void ADC_Routine() interrupt 5//中斷發(fā)生證明AD轉(zhuǎn)換的結(jié)束
  764. {
  765.         ADC_CONTR&=!0x10;//清除ADC中斷標(biāo)志,例程
  766.         ADC_DATA=ADC_RES*4+ADC_RESL;
  767.         if(ADC_DATA<90&&ADC_DATA>50)
  768.                 ADC_value=0;
  769.         else if(ADC_DATA<150&&ADC_DATA>112)
  770.                 ADC_value=1;
  771.         else if(ADC_DATA<220&&ADC_DATA>176)
  772.                 ADC_value=2;
  773.         else if(ADC_DATA<290&&ADC_DATA>220)
  774.                 ADC_value=3;
  775.         else if(ADC_DATA<370&&ADC_DATA>304)
  776.                 ADC_value=4;
  777.         else if(ADC_DATA<400&&ADC_DATA>368)
  778.                 ADC_value=5;
  779.         else if(ADC_DATA<464&&ADC_DATA>432)
  780.                 ADC_value=6;
  781.         else if(ADC_DATA<528&&ADC_DATA>496)
  782.                 ADC_value=7;
  783.         else if(ADC_DATA<592&&ADC_DATA>560)
  784.                 ADC_value=8;
  785.         else if(ADC_DATA<656&&ADC_DATA>624)
  786.                 ADC_value=9;
  787.         else if(ADC_DATA<720&&ADC_DATA>688)
  788.                 ADC_value=10;
  789.         else if(ADC_DATA<784&&ADC_DATA>752)
  790.                 ADC_value=11;
  791.         else if(ADC_DATA<848&&ADC_DATA>816)
  792.                 ADC_value=12;
  793.         else if(ADC_DATA<912&&ADC_DATA>880)
  794.                 ADC_value=13;
  795.         else if(ADC_DATA<976&&ADC_DATA>944)
  796.                 ADC_value=14;
  797.         else if(ADC_DATA<1024&&ADC_DATA>1007)
  798.                 ADC_value=15;
  799.         else ADC_value=16;
  800. }
復(fù)制代碼
OLED_DISPLAY.C(和顯示有關(guān)的功能函數(shù))

  1. /*

  2. 此文件中將來自O(shè)LED_Fuction.c中的顯示函數(shù)按程序狀態(tài)封裝,調(diào)用時(shí)更新特定顯示

  3. */

  4. #include"OLED_Fuction.c"
  5. #include"RFID_Fuction.c"
  6. #include"BMP180_Fuction.c"

  7. extern unsigned char display_hour[];
  8. extern unsigned char display_minute[];
  9. extern unsigned char display_month[];
  10. extern unsigned char display_day[];
  11. extern unsigned char display_year[];
  12. extern unsigned char display_second[];
  13. extern unsigned char display_week;

  14. extern unsigned char Space_State[4];

  15. extern long BMP180_Temperature;
  16. extern long BMP180_Pressure;

  17. extern unsigned char choose;
  18. extern unsigned char first_num;
  19. extern bit User_Locker;
  20. extern bit Admin_Info;
  21. extern bit En_Fire_Sensor;
  22. extern bit En_RFID;

  23. void OLED_Admin_RFID_Manage(void);

  24. void delay2(unsigned int cnt)//調(diào)用該函數(shù)進(jìn)行一段時(shí)間的延時(shí)
  25. {
  26.         while(cnt--);
  27. }
  28. /*####################################################用戶狀態(tài)函數(shù)##############################################*/

  29. void OLED_Display_Standby()//待機(jī)狀態(tài),顯示定時(shí)器0獲取的時(shí)間或通知已鎖信息
  30. {
  31.         unsigned char i;
  32.         OLED_Show_CHinese(0,CCTitle1,1);//顯示標(biāo)題:當(dāng)前已鎖
  33.         for(i=0;i<16;i++)
  34.         {
  35.                 OLED_Show_sChar(i*8,2,sChar3,1);//顯示橫線
  36.         }
  37.         OLED_Show_Number(8,4,display_year,4,1);
  38.         OLED_Show_cChar(40,4,cChar1,1);//年
  39.         OLED_Show_Number(56,4,display_month,2,1);
  40.         OLED_Show_cChar(72,4,cChar2,1);//月
  41.         OLED_Show_Number(88,4,display_day,2,1);
  42.         OLED_Show_cChar(104,4,cChar3,1);//日

  43.         OLED_Show_Number(32,6,display_hour,2,1);
  44.         OLED_Show_sChar(48,6,sChar2,1);//:
  45.         OLED_Show_Number(56,6,display_minute,2,1);
  46.         OLED_Show_sChar(72,6,sChar2,1);//:
  47.         OLED_Show_Number(80,6,display_second,2,1);
  48. }

  49. void OLED_Display_Put_In_Password()//用戶模式下輸入密碼的靜態(tài)顯示
  50. {
  51.         unsigned char i;
  52.         OLED_Show_CHinese(0,CCTitle1,1);//顯示標(biāo)題:當(dāng)前已鎖
  53.         for(i=0;i<16;i++)
  54.         {
  55.                 OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
  56.         }
  57.         OLED_Show_CHinese(4,CCInfo1,1);//顯示說明文字:請(qǐng)輸入密碼:
  58. }

  59. void OLED_Display_Right_Password()//用戶模式下輸入密碼正確的靜態(tài)提示信息
  60. {
  61.         unsigned char i;
  62.         OLED_Show_CHinese(0,CCTitle3,1);//顯示標(biāo)題:密碼正確
  63.         for(i=0;i<16;i++)
  64.         {
  65.                 OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
  66.         }
  67.         OLED_Show_CHinese(6,CCInfo6,1);//顯示說明文字:繼電器已啟用
  68. }

  69. void OLED_User_Mode()//用戶模式菜單動(dòng)態(tài)顯示,因?yàn)槿萘啃∮诘扔?個(gè),一屏可以放得下,所以不加滾屏功能,僅在兩個(gè)選項(xiàng)中跳動(dòng)
  70. {
  71.         OLED_Show_CHinese(0,CCTitle4,0);//顯示標(biāo)題:用戶模式
  72.         switch(choose)
  73.         {
  74.                 case 1:OLED_Show_CHinese(2,CCList_user_1,0);OLED_Show_CHinese(4,CCList_user_2,1);break;
  75.                 case 2:OLED_Show_CHinese(2,CCList_user_1,1);OLED_Show_CHinese(4,CCList_user_2,0);break;
  76.         }
  77.         
  78.         if(KEY3==0)//上調(diào)按鍵
  79.         {
  80.                 delay2(5000);
  81.                 if(KEY3==0)
  82.                 {
  83.                         choose--;
  84.                         if(choose==0)choose=1;//選項(xiàng)最少不能小于1
  85.                 }
  86.                 while(!KEY3);
  87.         }
  88.         
  89.         if(KEY4==0)//下調(diào)按鍵
  90.         {
  91.                 delay2(5000);
  92.                 if(KEY4==0)
  93.                 {
  94.                         choose++;
  95.                         if(choose==3)choose=2;//選項(xiàng)最大不能大于2
  96.                 }
  97.                 while(!KEY4);
  98.         }
  99. }

  100. /*######################################################管理員狀態(tài)函數(shù)############################################*/

  101. void OLED_Display_Administrator_Onload()//管理員登入靜態(tài)顯示
  102. {
  103.         unsigned char i;
  104.         OLED_Show_CHinese(0,CCTitle5,1);//顯示標(biāo)題:管理模式
  105.         for(i=0;i<16;i++)
  106.         {
  107.                 OLED_Show_sChar(i*8,2,sChar5,1);//顯示橫線
  108.         }
  109.         OLED_Show_CHinese(4,CCInfo3,1);//顯示說明文字:請(qǐng)輸入口令:
  110. }

  111. void OLED_Display_Menu(unsigned char menu_num,unsigned char choose)
  112. {//定制的菜單顯示接口函數(shù),用于將菜單變量名和調(diào)用它的變量值連接起來,需要知道顯示的起始菜單號(hào)和當(dāng)前選中的菜單
  113.         switch(menu_num)
  114.         {
  115.                 case 1:
  116.                         OLED_Show_CHinese(2,CCList_admin_1,!(choose==1));
  117.                         OLED_Show_CHinese(4,CCList_admin_2,!(choose==2));
  118.                         OLED_Show_CHinese(6,CCList_admin_3,!(choose==3));
  119.                         break;
  120.                 case 2:
  121.                         OLED_Show_CHinese(2,CCList_admin_2,!(choose==2));
  122.                         OLED_Show_CHinese(4,CCList_admin_3,!(choose==3));
  123.                         OLED_Show_CHinese(6,CCList_admin_4,!(choose==4));
  124.                         break;
  125.                 case 3:
  126.                         OLED_Show_CHinese(2,CCList_admin_3,!(choose==3));
  127.                         OLED_Show_CHinese(4,CCList_admin_4,!(choose==4));
  128.                         OLED_Show_CHinese(6,CCList_admin_5,!(choose==5));
  129.                         break;
  130.                 case 4:
  131.                         OLED_Show_CHinese(2,CCList_admin_4,!(choose==4));
  132.                         OLED_Show_CHinese(4,CCList_admin_5,!(choose==5));
  133.                         OLED_Show_CHinese(6,CCList_admin_6,!(choose==6));
  134.                         break;
  135.                 case 5:
  136.                         OLED_Show_CHinese(2,CCList_admin_5,!(choose==5));
  137.                         OLED_Show_CHinese(4,CCList_admin_6,!(choose==6));
  138.                         OLED_Show_CHinese(6,CCList_admin_7,!(choose==7));
  139.                         break;
  140.                 case 6:
  141.                         OLED_Show_CHinese(2,CCList_admin_6,!(choose==6));
  142.                         OLED_Show_CHinese(4,CCList_admin_7,!(choose==7));
  143.                         OLED_Show_CHinese(6,CCList_admin_8,!(choose==8));
  144.                         break;
  145.                 case 7:
  146.                         OLED_Show_CHinese(2,CCList_admin_7,!(choose==7));
  147.                         OLED_Show_CHinese(4,CCList_admin_8,!(choose==8));
  148.                         OLED_Show_CHinese(6,CCList_admin_9,!(choose==9));
  149.                         break;
  150.         }
  151. }

  152. void OLED_Admin_Mode()//管理模式菜單動(dòng)態(tài)顯示
  153. {
  154.         //static unsigned char first_num=1;//第一項(xiàng)菜單標(biāo)號(hào)
  155.         OLED_Show_CHinese(0,CCTitle5,0);//顯示標(biāo)題:管理模式
  156.         
  157.         OLED_Display_Menu(first_num,choose);//根據(jù)first_num和choose的動(dòng)態(tài)刷新顯示函數(shù)
  158.         
  159.         if(KEY3==0)//上調(diào)按鍵
  160.         {
  161.                 delay2(5000);
  162.                 if(KEY3==0)
  163.                 {
  164.                         choose--;
  165.                         if(choose==0)choose=1;//選項(xiàng)最少不能小于1
  166.                         if(choose<first_num)first_num--;
  167.                 }
  168.                 while(!KEY3);
  169.         }
  170.         
  171.         if(KEY4==0)//下調(diào)按鍵
  172.         {
  173.                 delay2(5000);
  174.                 if(KEY4==0)
  175.                 {
  176.                         choose++;
  177.                         if(choose==10)choose=9;//選項(xiàng)最大不能大于9
  178.                         if(choose>first_num+2)first_num++;
  179.                 }
  180.                 while(!KEY4);
  181.         }
  182. }

  183. void OLED_Admin_onoff_Mode()//常開常關(guān)選項(xiàng),因?yàn)槿萘啃∮诘扔?個(gè),一屏可以放得下,所以不加滾屏功能,僅在兩個(gè)選項(xiàng)中跳動(dòng)
  184. {
  185.         unsigned char choose_possition;//用于存放進(jìn)入此級(jí)菜單時(shí)上一級(jí)choose的值
  186.         choose_possition=choose;
  187.         OLED_Clear();
  188.         OLED_Show_CHinese(0,CCTitle9,0);//顯示標(biāo)題:開關(guān)選項(xiàng)
  189.         while(!KEY1);//等待按鍵松開
  190.         choose=1;
  191.         
  192.         while(1)
  193.         {
  194.                 switch(choose)
  195.                 {
  196.                         case 1:OLED_Show_CHinese(2,CCList_onoff_1,0);OLED_Show_CHinese(4,CCList_onoff_2,1);break;
  197.                         case 2:OLED_Show_CHinese(2,CCList_onoff_1,1);OLED_Show_CHinese(4,CCList_onoff_2,0);break;
  198.                 }
  199.                
  200.                 if(KEY1==0)//確定按鍵
  201.                 {
  202.                         delay2(5000);
  203.                         if(KEY1==0)
  204.                         {
  205.                                 switch(choose)
  206.                                 {
  207.                                         case 1:
  208.                                                 JDQ=0;//開啟繼電器,由于繼電器所在接口的位定義不再此文件中,故直接使用單片機(jī)頭文件中的IO口定義
  209.                                                 User_Locker=1;//用戶鎖定
  210.                                                 Admin_Info=1;//管理員開鎖通知開,該提示信息在用戶代碼處修改
  211.                                                 break;
  212.                                         case 2:
  213.                                                 JDQ=1;//開啟繼電器,由于繼電器所在接口的位定義不再此文件中,故直接使用單片機(jī)頭文件中的IO口定義
  214.                                                 User_Locker=0;//用戶解鎖
  215.                                                 Admin_Info=0;//管理員開鎖通知關(guān),該提示信息在用戶代碼處修改
  216.                                                 break;
  217.                                 }
  218.                         }
  219.                         while(!KEY1);
  220.                         OLED_Clear();
  221.                         goto OUT2;
  222.                 }
  223.                
  224.                 if(KEY2==0)//取消按鍵
  225.                 {
  226.                         delay2(5000);
  227.                         if(KEY2==0)
  228.                         {
  229.                                 choose=1;//重置菜單選擇位
  230.                         }
  231.                         while(!KEY2);
  232.                         OLED_Clear();
  233.                         goto OUT2;
  234.                 }
  235.                
  236.                 if(KEY3==0)//上調(diào)按鍵
  237.                 {
  238.                         delay2(5000);
  239.                         if(KEY3==0)
  240.                         {
  241.                                 choose--;
  242.                                 if(choose==0)choose=1;//選項(xiàng)最少不能小于1
  243.                         }
  244.                         while(!KEY3);
  245.                 }
  246.                
  247.                 if(KEY4==0)//下調(diào)按鍵
  248.                 {
  249.                         delay2(5000);
  250.                         if(KEY4==0)
  251.                         {
  252.                                 choose++;
  253.                                 if(choose==3)choose=2;//選項(xiàng)最大不能大于2
  254.                         }
  255.                         while(!KEY4);
  256.                 }
  257.         }
  258. OUT2:choose=choose_possition;//將之前存儲(chǔ)的值還給choose以保證上級(jí)菜單不出現(xiàn)錯(cuò)亂
  259. }

  260. void OLED_Admin_firesensor_Mode()//火焰探測(cè)器開關(guān)選項(xiàng),因?yàn)槿萘啃∮诘扔?個(gè),一屏可以放得下,所以不加滾屏功能,僅在兩個(gè)選項(xiàng)中跳動(dòng)
  261. {
  262.         unsigned char choose_possition;//用于存放進(jìn)入此級(jí)菜單時(shí)上一級(jí)choose的值
  263.         choose_possition=choose;
  264.         OLED_Clear();
  265.         OLED_Show_CHinese(0,CCTitle11,0);//顯示標(biāo)題:火焰探測(cè)
  266.         while(!KEY1);//等待按鍵松開
  267.         choose=1;
  268.         
  269.         while(1)
  270.         {
  271.                 switch(choose)
  272.                 {
  273.                         case 1:OLED_Show_CHinese(2,CCList_firesensor_1,0);OLED_Show_CHinese(4,CCList_firesensor_2,1);break;
  274.                         case 2:OLED_Show_CHinese(2,CCList_firesensor_1,1);OLED_Show_CHinese(4,CCList_firesensor_2,0);break;
  275.                 }
  276.                
  277.                 if(KEY1==0)//確定按鍵
  278.                 {
  279.                         delay2(5000);
  280.                         if(KEY1==0)
  281.                         {
  282.                                 switch(choose)
  283.                                 {
  284.                                         case 1:
  285.                                                 En_Fire_Sensor=0;//關(guān)閉火焰探測(cè)器使能位
  286.                                                 break;
  287.                                         case 2:
  288.                                                 En_Fire_Sensor=1;//使能火焰探測(cè)器
  289.                                                 break;
  290.                                 }
  291.                         }
  292.                         while(!KEY1);
  293.                         OLED_Clear();
  294.                         goto FSMENUQUIT;
  295.                 }
  296.                
  297.                 if(KEY2==0)//取消按鍵
  298.                 {
  299.                         delay2(5000);
  300.                         if(KEY2==0)
  301.                         {
  302.                                 choose=1;//重置菜單選擇位
  303.                         }
  304.                         while(!KEY2);
  305.                         OLED_Clear();
  306.                         goto FSMENUQUIT;
  307.                 }
  308.                
  309.                 if(KEY3==0)//上調(diào)按鍵
  310.                 {
  311.                         delay2(5000);
  312.                         if(KEY3==0)
  313.                         {
  314.                                 choose--;
  315.                                 if(choose==0)choose=1;//選項(xiàng)最少不能小于1
  316.                         }
  317.                         while(!KEY3);
  318.                 }
  319.                
  320.                 if(KEY4==0)//下調(diào)按鍵
  321.                 {
  322.                         delay2(5000);
  323.                         if(KEY4==0)
  324.                         {
  325.                                 choose++;
  326.                                 if(choose==3)choose=2;//選項(xiàng)最大不能大于2
  327.                         }
  328.                         while(!KEY4);
  329.                 }
  330.         }
  331. FSMENUQUIT:choose=choose_possition;//將之前存儲(chǔ)的值還給choose以保證上級(jí)菜單不出現(xiàn)錯(cuò)亂
  332. }

  333. void OLED_Admin_RFID_Mode()//RFID選項(xiàng),因?yàn)槿萘啃∮诘扔?個(gè),一屏可以放得下,所以不加滾屏功能,僅在3個(gè)選項(xiàng)中跳動(dòng)
  334. {
  335.         unsigned char choose_possition;//用于存放進(jìn)入此級(jí)菜單時(shí)上一級(jí)choose的值
  336.         choose_possition=choose;
  337.         OLED_Clear();
  338.         OLED_Show_CHinese(0,CCTitle14,0);//顯示標(biāo)題:RFID
  339.         while(!KEY1);//等待按鍵松開
  340.         choose=1;
  341.         
  342.         while(1)
  343.         {
  344.                 switch(choose)
  345.                 {
  346.                         case 1:OLED_Show_CHinese(2,CCList_RFID_1,0);OLED_Show_CHinese(4,CCList_RFID_2,1);OLED_Show_CHinese(6,CCList_RFID_3,1);break;
  347.                         case 2:OLED_Show_CHinese(2,CCList_RFID_1,1);OLED_Show_CHinese(4,CCList_RFID_2,0);OLED_Show_CHinese(6,CCList_RFID_3,1);break;
  348.                         case 3:OLED_Show_CHinese(2,CCList_RFID_1,1);OLED_Show_CHinese(4,CCList_RFID_2,1);OLED_Show_CHinese(6,CCList_RFID_3,0);break;
  349.                 }
  350.                
  351.                 if(KEY1==0)//確定按鍵
  352.                 {
  353.                         delay2(5000);
  354.                         if(KEY1==0)
  355.                         {
  356.                                 switch(choose)
  357.                                 {
  358.                                         case 1:
  359.                                                 En_RFID=0;//關(guān)閉射頻卡模塊使能位
  360.                                                 break;
  361.                                         case 2:
  362.                                                 En_RFID=1;//使能射頻卡模塊
  363.                                                 break;
  364.                                         case 3:
  365.                                                 OLED_Admin_RFID_Manage();
  366.                                                 break;
  367.                                 }
  368.                         }
  369.                         while(!KEY1);
  370.                         if(choose!=3)
  371.                         {
  372.                                 goto RFIDQUIT;
  373.                         }
  374.                         else
  375.                         {
  376.                                 OLED_Clear();
  377.                                 OLED_Show_CHinese(0,CCTitle14,0);//顯示標(biāo)題:RFID
  378.                         }
  379.                 }
  380.                
  381.                 if(KEY2==0)//取消按鍵
  382.                 {
  383.                         delay2(5000);
  384.                         if(KEY2==0)
  385.                         {
  386.                                 choose=1;//重置菜單選擇位
  387.                         }
  388.                         while(!KEY2);
  389.                         OLED_Clear();
  390.                         goto RFIDQUIT;
  391.                 }
  392.                
  393.                 if(KEY3==0)//上調(diào)按鍵
  394.                 {
  395.                         delay2(5000);
  396.                         if(KEY3==0)
  397.                         {
  398.                                 choose--;
  399.                                 if(choose==0)choose=1;//選項(xiàng)最少不能小于1
  400.                         }
  401.                         while(!KEY3);
  402.                 }
  403.                
  404.                 if(KEY4==0)//下調(diào)按鍵
  405.                 {
  406.                         delay2(5000);
  407.                         if(KEY4==0)
  408.                         {
  409.                                 choose++;
  410.                                 if(choose==4)choose=3;//選項(xiàng)最大不能大于3
  411.                         }
  412.                         while(!KEY4);
  413.                 }
  414.         }
  415. RFIDQUIT:choose=choose_possition;//將之前存儲(chǔ)的值還給choose以保證上級(jí)菜單不出現(xiàn)錯(cuò)亂
  416. }

  417. void OLED_Admin_RFID_Manage()//射頻管理選項(xiàng),因?yàn)槿萘啃∮诘扔?個(gè),一屏可以放得下,所以不加滾屏功能,僅在3個(gè)選項(xiàng)中跳動(dòng)
  418. {
  419.         unsigned char choose_manage;//新建一個(gè)臨時(shí)選項(xiàng)變量,與上兩層目錄無(wú)關(guān)
  420.         OLED_Clear();
  421.         OLED_Show_CHinese(0,CCTitle15,0);//顯示標(biāo)題:管理RFID
  422.         while(!KEY1);//等待按鍵松開
  423.         choose_manage=1;
  424.         
  425.         while(1)
  426.         {
  427.                 switch(choose_manage)
  428.                 {
  429.                         case 1:
  430.                                 OLED_Show_CHinese(2,CCList_admin_RFID_1,0);
  431.                                 OLED_Show_CHinese(4,CCList_admin_RFID_2,1);
  432.                                 OLED_Show_CHinese(6,CCList_admin_RFID_3,1);break;
  433.                         case 2:
  434.                                 OLED_Show_CHinese(2,CCList_admin_RFID_1,1);
  435.                                 OLED_Show_CHinese(4,CCList_admin_RFID_2,0);
  436.                                 OLED_Show_CHinese(6,CCList_admin_RFID_3,1);break;
  437.                         case 3:
  438.                                 OLED_Show_CHinese(2,CCList_admin_RFID_1,1);
  439.                                 OLED_Show_CHinese(4,CCList_admin_RFID_2,1);
  440.                                 OLED_Show_CHinese(6,CCList_admin_RFID_3,0);break;
  441.                 }
  442.                
  443.                 if(KEY1==0)//確定按鍵
  444.                 {
  445.                         delay2(5000);
  446.                         if(KEY1==0)
  447.                         {
  448.                                 switch(choose_manage)
  449.                                 {
  450.                                         case 1:
  451.                                                 /*添加卡函數(shù)*/
  452.                                                 Card_Add();
  453.                                                 break;
  454.                                         case 2:
  455.                                                 /*刪除卡函數(shù)*/
  456.                                                 Card_Delete();
  457.                                                 break;
  458.                                         case 3:
  459.                                                 /*對(duì)比卡函數(shù)*/
  460.                                                 Card_Compare();
  461.                                                 break;
  462.                                 }
  463.                         }
  464.                         while(!KEY1);
  465.                         OLED_Clear();
  466.                         OLED_Show_CHinese(0,CCTitle14,0);//顯示標(biāo)題:RFID
  467.                 }
  468.                
  469.                 if(KEY2==0)//取消按鍵
  470.                 {
  471.                         delay2(5000);
  472.                         if(KEY2==0)
  473.                         {
  474.                                 choose_manage=1;//重置菜單選擇位
  475.                         }
  476.                         while(!KEY2);
  477.                         OLED_Clear();
  478.                         goto RFIDMQUIT;
  479.                 }
  480.                
  481.                 if(KEY3==0)//上調(diào)按鍵
  482.                 {
  483.                         delay2(5000);
  484.                         if(KEY3==0)
  485.                         {
  486.                                 choose_manage--;
  487.                                 if(choose_manage==0)choose_manage=1;//選項(xiàng)最少不能小于1
  488.                         }
  489.                         while(!KEY3);
  490.                 }
  491.                
  492.                 if(KEY4==0)//下調(diào)按鍵
  493.                 {
  494.                         delay2(5000);
  495.                         if(KEY4==0)
  496.                         {
  497.                                 choose_manage++;
  498.                                 if(choose_manage==4)choose_manage=3;//選項(xiàng)最大不能大于3
  499.                         }
  500.                         while(!KEY4);
  501.                 }
  502.         }
  503. RFIDMQUIT:        _nop_();
  504. }

  505. void OLED_Display_System_Information()//顯示BMP180傳回的溫度氣壓信息
  506. {
  507.         unsigned char i;
  508.         OLED_Clear();
  509.         OLED_Show_CHinese(0,CCTitle10,1);//顯示標(biāo)題:狀態(tài)信息
  510.         for(i=0;i<16;i++)
  511.         {
  512.                 OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
  513.         }
  514.         
  515.         /*在此添加存儲(chǔ)容量檢測(cè)*/
  516.         Storage_Check();
  517.         OLED_Show_cChar(0,4,cChar10,1);//卡
  518.         OLED_Show_cChar(16,4,cChar11,1);//存
  519.         OLED_Show_cChar(32,4,cChar12,1);//儲(chǔ)
  520.         OLED_Show_cChar(48,4,cChar8,1);//:
  521.         OLED_Show_sChar(96,4,sChar13,1);///
  522.         OLED_Show_One_Number(80,4,Space_State[0],1);
  523.         OLED_Show_One_Number(88,4,Space_State[1],1);
  524.         OLED_Show_One_Number(104,4,Space_State[2],1);
  525.         OLED_Show_One_Number(112,4,Space_State[3],1);
  526.         
  527.         while(!KEY1);//等待按鍵松開
  528.         
  529.         while(1)
  530.         {
  531.                 /*在此添加溫度氣壓掃描顯示函數(shù)*/
  532.                 BMP180_Calculate();
  533.                 OLED_Show_sChar(0,6,sChar9,1);//T
  534.                 OLED_Show_sChar(8,6,sChar8,1);//P
  535.                 OLED_Show_sChar(16,6,sChar2,1);//:
  536.                 OLED_Show_sChar(40,6,sChar11,1);//.
  537.                 OLED_Show_sChar(56,6,sChar12,1);//°
  538.                 OLED_Show_sChar(64,6,sChar10,1);//C
  539.                 OLED_Show_sChar(96,6,sChar11,1);//.
  540.                 OLED_Show_sChar(112,6,sChar6,1);//K
  541.                 OLED_Show_sChar(120,6,sChar7,1);//p
  542.                
  543.                 OLED_Show_One_Number(24,6,BMP180_Temperature/100,1);
  544.                 OLED_Show_One_Number(32,6,BMP180_Temperature%100/10,1);
  545.                 OLED_Show_One_Number(48,6,BMP180_Temperature%10,1);
  546.                
  547.                 if((BMP180_Pressure/100000)!=0)
  548.                 {
  549.                         OLED_Show_One_Number(72,6,BMP180_Pressure/100000,1);
  550.                 }
  551.                 OLED_Show_One_Number(80,6,BMP180_Pressure%100000/10000,1);
  552.                 OLED_Show_One_Number(88,6,BMP180_Pressure%10000/1000,1);
  553.                 OLED_Show_One_Number(104,6,BMP180_Pressure%1000/100,1);
  554.                
  555.                 if(KEY1==0)//確定按鍵
  556.                 {
  557.                         delay2(5000);
  558.                         if(KEY1==0)
  559.                         {
  560.                                 _nop_();
  561.                         }
  562.                         while(!KEY1);//由于按鍵只起到返回的作用,此處也可以將第二次if判斷去掉,僅使用while判斷,但為了整體規(guī)范性,就不在意那幾個(gè)時(shí)鐘了
  563.                         OLED_Clear();
  564.                         goto OUT3;
  565.                 }
  566.                
  567.                 if(KEY2==0)//取消按鍵
  568.                 {
  569.                         delay2(5000);
  570.                         if(KEY2==0)
  571.                         {
  572.                                 _nop_();
  573.                         }
  574.                         while(!KEY2);//由于按鍵只起到返回的作用,此處也可以將第二次if判斷去掉,僅使用while判斷,但為了整體規(guī)范性,就不在意那幾個(gè)時(shí)鐘了
  575.                         OLED_Clear();
  576.                         goto OUT3;
  577.                 }
  578.         }
  579. OUT3:_nop_();
  580. }

  581. void Time_Set()//時(shí)間修改函數(shù)
  582. {
  583.         bit en_data=1;//數(shù)據(jù)合法標(biāo)志位,表示數(shù)據(jù)檢查時(shí)的合法:1/不合法:0判斷結(jié)果
  584.         unsigned char i,choose=1,year_temp;
  585.         unsigned char set_clock[6];
  586.         unsigned char set_date[8];
  587.         
  588.         set_date[0]=display_year[0];
  589.         set_date[1]=display_year[1];
  590.         set_date[2]=display_year[2];
  591.         set_date[3]=display_year[3];
  592.         set_date[4]=display_month[0];
  593.         set_date[5]=display_month[1];
  594.         set_date[6]=display_day[0];
  595.         set_date[7]=display_day[1];
  596.         
  597.         set_clock[0]=display_hour[0];
  598.         set_clock[1]=display_hour[1];
  599.         set_clock[2]=display_minute[0];
  600.         set_clock[3]=display_minute[1];
  601.         set_clock[4]=display_second[0];
  602.         set_clock[5]=display_second[1];//復(fù)制運(yùn)行數(shù)組,取待顯示每一位
  603.         
  604.         
  605.         /*第一部分,日期設(shè)置*/
  606.         OLED_Clear();
  607.         OLED_Show_CHinese(0,CCTitle13,1);//顯示標(biāo)題:時(shí)間修改
  608.         for(i=0;i<16;i++)
  609.         {
  610.                 OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
  611.         }
  612.         OLED_Show_CHinese(4,CCInfo7,1);//顯示說明文字:請(qǐng)輸入年月日:
  613.         while(!KEY1);//確認(rèn)進(jìn)入該函數(shù)時(shí)的按鍵已經(jīng)松開
  614.         while(1)
  615.         {
  616.                 OLED_DateSet_Display(set_date,choose);//刷新顯示時(shí)間設(shè)置數(shù)組,該數(shù)組保存設(shè)置的時(shí)間(按位)
  617.                
  618.                 if(KeyScan()<10)//如果在此時(shí)有鍵盤按鍵按下則更改當(dāng)前位的值
  619.                 {
  620.                         delay2(5000);
  621.                         if(KeyScan()<10)
  622.                         {
  623.                                 set_date[choose-1]=KeyScan();
  624.                         }
  625.                         while(KeyScan()!=16);//等待按鍵松開
  626.                         choose++;
  627.                         if(choose==9)choose=8;//選項(xiàng)最大不能大于8
  628.                 }
  629.                
  630.                 if(KEY1==0)//確定按鍵
  631.                 {
  632.                         delay2(5000);
  633.                         if(KEY1==0)
  634.                         {
  635.                                 _nop_();
  636.                         }
  637.                         while(!KEY1);
  638.                         goto TSB;//跳出當(dāng)前循環(huán),進(jìn)入下一循環(huán)時(shí)間設(shè)置
  639.                 }
  640.                
  641.                 if(KEY2==0)//取消按鍵,直接退出時(shí)間設(shè)置函數(shù)
  642.                 {
  643.                         delay2(5000);
  644.                         if(KEY2==0)
  645.                         {
  646.                                 _nop_();
  647.                         }
  648.                         while(!KEY2);
  649.                         OLED_Clear();
  650.                         goto TIMESETOUT;
  651.                 }
  652.                
  653.                 if(KEY3==0)//上調(diào)按鍵
  654.                 {
  655.                         delay2(5000);
  656.                         if(KEY3==0)
  657.                         {
  658.                                 choose--;
  659.                                 if(choose==0)choose=1;//選項(xiàng)最少不能小于1
  660.                         }
  661.                         while(!KEY3);
  662.                 }
  663.                
  664.                 if(KEY4==0)//下調(diào)按鍵
  665.                 {
  666.                         delay2(5000);
  667.                         if(KEY4==0)
  668.                         {
  669.                                 choose++;
  670.                                 if(choose==9)choose=8;//選項(xiàng)最大不能大于8
  671.                         }
  672.                         while(!KEY4);
  673.                 }
  674.         }
  675.         
  676.         /*第二部分,時(shí)間設(shè)置*/
  677. TSB:        choose=1;//重置顯示位標(biāo)志
  678.         OLED_Clear();
  679.         OLED_Show_CHinese(0,CCTitle13,1);//顯示標(biāo)題:時(shí)間修改
  680.         for(i=0;i<16;i++)
  681.         {
  682.                 OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
  683.         }
  684.         OLED_Show_CHinese(4,CCInfo8,1);//顯示說明文字:請(qǐng)輸入時(shí)鐘:
  685.         while(1)
  686.         {
  687.                 OLED_TimeSet_Display(set_clock,choose);//刷新顯示時(shí)間設(shè)置數(shù)組,該數(shù)組保存設(shè)置的時(shí)間(按位)
  688.                
  689.                 if(KeyScan()<10)//如果在此時(shí)有鍵盤按鍵按下則更改當(dāng)前位的值
  690.                 {
  691.                         delay2(5000);
  692.                         if(KeyScan()<10)
  693.                         {
  694.                                 set_clock[choose-1]=KeyScan();
  695.                         }
  696.                         while(KeyScan()!=16);//等待按鍵松開
  697.                         choose++;
  698.                         if(choose==7)choose=6;//選項(xiàng)最大不能大于6
  699.                 }
  700.                
  701.                 if(KEY1==0)//確定按鍵
  702.                 {
  703.                         delay2(5000);
  704.                         if(KEY1==0)
  705.                         {
  706.                                 _nop_();
  707.                         }
  708.                         while(!KEY1);
  709.                         goto TSC;//跳出當(dāng)前循環(huán),進(jìn)入第三部分
  710.                 }
  711.                
  712.                 if(KEY2==0)//取消按鍵,直接退出時(shí)間設(shè)置函數(shù)
  713.                 {
  714.                         delay2(5000);
  715.                         if(KEY2==0)
  716.                         {
  717.                                 _nop_();
  718.                         }
  719.                         while(!KEY2);
  720.                         OLED_Clear();
  721.                         goto TIMESETOUT;
  722.                 }
  723.                
  724.                 if(KEY3==0)//上調(diào)按鍵
  725.                 {
  726.                         delay2(5000);
  727.                         if(KEY3==0)
  728.                         {
  729.                                 choose--;
  730.                                 if(choose==0)choose=1;//選項(xiàng)最少不能小于1
  731.                         }
  732.                         while(!KEY3);
  733.                 }
  734.                
  735.                 if(KEY4==0)//下調(diào)按鍵
  736.                 {
  737.                         delay2(5000);
  738.                         if(KEY4==0)
  739.                         {
  740.                                 choose++;
  741.                                 if(choose==7)choose=6;//選項(xiàng)最大不能大于6
  742.                         }
  743.                         while(!KEY4);
  744.                 }
  745.         }
  746.         
  747.         /*第三部分,拼接判斷和寫入*/
  748. TSC:if((set_clock[0]*10+set_clock[1])>24||set_clock[0]>2)//對(duì)小時(shí)的判斷
  749.         {
  750.                 en_data=0;
  751.         }
  752.         else
  753.         {
  754.                 if(set_clock[0]==2&&set_clock[1]>4)
  755.                 {
  756.                         en_data=0;
  757.                 }
  758.         }
  759.         if((set_clock[2]*10+set_clock[3])>60||set_clock[2]>5)//對(duì)分鐘的判斷
  760.         {
  761.                 en_data=0;
  762.         }
  763.         if((set_clock[4]*10+set_clock[5])>60||set_clock[4]>5)//對(duì)秒的判斷
  764.         {
  765.                 en_data=0;
  766.         }
  767.         
  768.         if((set_date[4]*10+set_date[5])>12||set_date[4]>1)//對(duì)月份的判斷
  769.         {
  770.                 en_data=0;
  771.         }
  772.         else
  773.         {
  774.                 if(set_date[4]==1&&set_date[5]>2)
  775.                 {
  776.                         en_data=0;
  777.                 }
  778.                 if(set_date[4]==0&&set_date[5]==0)
  779.                 {
  780.                         en_data=0;
  781.                 }
  782.         }
  783.         if((set_date[6]*10+set_date[7])>31||set_date[6]>3)//對(duì)日子的判斷。注意,由于閏年的存在,若出現(xiàn)閏年輸入2.29這樣的情況會(huì)在輸入完年份后判斷退出
  784.         {
  785.                 en_data=0;
  786.         }
  787.         
  788.         if(set_date[0]!=2||set_date[1]!=0)
  789.         {
  790.                 en_data=0;
  791.         }
  792.         
  793.         year_temp=set_date[0]*1000+set_date[1]*100+set_date[2]*10+set_date[3];
  794.         if(!Leap(year_temp))//如果不是閏年
  795.         {
  796.                 if(set_date[4]==0&&set_date[5]==2&&set_date[6]==2&&set_date[7]==9)//對(duì)2.29作出判斷
  797.                 {
  798.                         en_data=0;
  799.                 }
  800.         }
  801.         
  802.         if(en_data)
  803.         {
  804.                 /*拼接寫入數(shù)組*/
  805.                 time_transmission(set_date,set_clock);
  806.                
  807.                 /*寫入新時(shí)間*/
  808.                 TimeReset();
  809.                
  810.                 /*提示成功信息*/
  811.                 OLED_Clear();
  812.                 OLED_Show_CHinese(0,CCTitle13,1);//顯示標(biāo)題:時(shí)間修改
  813.                 for(i=0;i<16;i++)
  814.                 {
  815.                         OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
  816.                 }
  817.                 OLED_Show_CHinese(4,CCInfo15,1);//顯示說明文字:修改成功
  818.                 /*按鍵循環(huán)*/
  819.                 while(1)
  820.                 {
  821.                         if(KEY1==0)//確定按鍵
  822.                         {
  823.                                 delay2(5000);
  824.                                 if(KEY1==0)
  825.                                 {
  826.                                         _nop_();
  827.                                 }
  828.                                 while(!KEY1);
  829.                                 OLED_Clear();
  830.                                 goto TIMESETOUT;
  831.                         }
  832.                         
  833.                         if(KEY2==0)//取消按鍵
  834.                         {
  835.                                 delay2(5000);
  836.                                 if(KEY2==0)
  837.                                 {
  838.                                         _nop_();
  839.                                 }
  840.                                 while(!KEY2);
  841.                                 OLED_Clear();
  842.                                 goto TIMESETOUT;
  843.                         }
  844.                 }
  845.         }
  846.         else
  847.         {
  848.                 /*提示失敗信息*/
  849.                 OLED_Clear();
  850.                 OLED_Show_CHinese(0,CCTitle13,1);//顯示標(biāo)題:時(shí)間修改
  851.                 for(i=0;i<16;i++)
  852.                 {
  853.                         OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
  854.                 }
  855.                 OLED_Show_CHinese(4,CCInfo16,1);//顯示說明文字:輸入不合規(guī)則
  856.                 /*按鍵循環(huán)*/
  857.                 while(1)
  858.                 {
  859.                         if(KEY1==0)//確定按鍵
  860.                         {
  861.                                 delay2(5000);
  862.                                 if(KEY1==0)
  863.                                 {
  864.                                         _nop_();
  865.                                 }
  866.                                 while(!KEY1);
  867.                                 OLED_Clear();
  868.                                 goto TIMESETOUT;
  869.                         }
  870.                         
  871.                         if(KEY2==0)//取消按鍵
  872.                         {
  873.                                 delay2(5000);
  874.                                 if(KEY2==0)
  875.                                 {
  876.                                         _nop_();
  877.                                 }
  878.                                 while(!KEY2);
  879.                                 OLED_Clear();
  880.                                 goto TIMESETOUT;
  881.                         }
  882.                 }
  883.         }
  884. TIMESETOUT:        _nop_();
  885. }
復(fù)制代碼


對(duì)于下載限制的說明:
由于是我個(gè)人的設(shè)計(jì),我認(rèn)為在黑幣上應(yīng)該有一個(gè)價(jià)格,該作品也值得這個(gè)價(jià)格。
對(duì)于下載身份限制的說明:
當(dāng)然要向著站內(nèi)的人了~


密碼鎖第二版 凌凈清河.zip (247.84 KB, 下載次數(shù): 216)
密碼鎖(第二版)說明文檔.pdf (286.06 KB, 下載次數(shù): 171)


好希望你們能夠回復(fù)我呀,回復(fù)這個(gè)帖子能給我?guī)聿簧俟膭?lì)呢!




作者: ssk7793    時(shí)間: 2019-1-7 16:49
好長(zhǎng),謝謝分享,收藏先
作者: Mr.Zd    時(shí)間: 2019-1-7 19:21
加油,多謝分享

作者: 祝云章    時(shí)間: 2019-1-19 13:20
謝謝分享!
作者: zxq9781    時(shí)間: 2019-1-23 20:32
謝謝分享,學(xué)習(xí)一下
作者: hui223    時(shí)間: 2019-1-23 20:54
收藏了
作者: 夢(mèng)園心田    時(shí)間: 2019-1-24 01:15
還有優(yōu)化的地方。比如說記錄開鎖時(shí)間,等等
作者: 凌凈清河    時(shí)間: 2019-1-25 18:33
夢(mèng)園心田 發(fā)表于 2019-1-24 01:15
還有優(yōu)化的地方。比如說記錄開鎖時(shí)間,等等

你這個(gè)提議非常好,我在第四版里加入了這個(gè)功能,。但是遠(yuǎn)沒有完成,所以不能公布出去。除此之外,信息反饋,模塊自檢等功能可以在考慮范圍之內(nèi)
作者: 夢(mèng)園心田    時(shí)間: 2019-1-27 00:47
你好,可以加個(gè)qq嗎。想跟你聊一下
作者: 凌凈清河    時(shí)間: 2019-1-27 11:18
夢(mèng)園心田 發(fā)表于 2019-1-27 00:47
你好,可以加個(gè)qq嗎。想跟你聊一下

QQ有不宜公開的驗(yàn)證問題和答案,加群873434536吧,群主是我。
作者: 643990707    時(shí)間: 2019-1-28 00:03
好強(qiáng)大!
作者: 凌凈清河    時(shí)間: 2019-2-9 11:28
對(duì)于附件的黑幣設(shè)置,現(xiàn)在想來,確實(shí)是扣除的過多了,但是恕我眼拙,忘了怎么重新編輯了。但是對(duì)于所有回復(fù)的人,我都會(huì)給出最高評(píng)分作為黑布補(bǔ)貼,相信大家都能夠看到,兩個(gè)文檔一共需要30黑幣,下載者隨便回復(fù)兩個(gè)帖子,我就能給你們加30黑幣了。里外里你們不會(huì)虧,望周知。
作者: 夢(mèng)園心田    時(shí)間: 2019-2-28 18:10
希望可以用自帶eeprom,24c02感覺多余
作者: 半自由    時(shí)間: 2019-2-28 20:05
厲害吖我的哥,已經(jīng)收藏,感謝分享
作者: 凌凈清河    時(shí)間: 2019-2-28 22:42
夢(mèng)園心田 發(fā)表于 2019-2-28 18:10
希望可以用自帶eeprom,24c02感覺多余

嗯,這個(gè)主要考慮這兩方面。
一,設(shè)計(jì)的時(shí)候盡可能多的使用一些功能,其實(shí)也是自己學(xué)習(xí)的過程,而且對(duì)其他看程序的人可能有一定幫助,所以希望一份作品盡可能的多使用一些器件。
二,本設(shè)計(jì)中,內(nèi)部eeprom用于存放管理員的密碼,外部eeprom用于存放卡的信息和用戶密碼,有助于擴(kuò)展和移植。設(shè)想使用片內(nèi)eeprom很少的單片機(jī)時(shí),全放在內(nèi)部存儲(chǔ)肯定不妥。
基于以上兩點(diǎn),本作品才如此設(shè)計(jì)。
作者: wyf1996119    時(shí)間: 2019-3-7 14:25
很好很強(qiáng)大
作者: SJ-123    時(shí)間: 2019-3-24 22:51
明明扣了20個(gè)幣,記錄上怎么只有10個(gè)呢?這事我該問樓主還是問版主呢?最重要的是沒有下載界面出來呀!
作者: lon7085    時(shí)間: 2019-3-25 09:31
樓主真是強(qiáng)!且宅心仁厚,值得學(xué)習(xí),收藏了。請(qǐng)問會(huì)有跟上位機(jī)聯(lián)機(jī)上傳紀(jì)錄嗎?加入火焰探測(cè)模塊是為了防盜或是消防之考慮?
作者: LYZ5555    時(shí)間: 2019-3-25 12:36
謝分享,大佬仿真能分享一下嗎。。
作者: 凌凈清河    時(shí)間: 2019-3-26 08:20
LYZ5555 發(fā)表于 2019-3-25 12:36
謝分享,大佬仿真能分享一下嗎。。

這個(gè)真不能,因?yàn)槭侵苯雍附映鰜淼,整個(gè)制作過程沒有仿真,都是一次又一次下載運(yùn)行的,因?yàn)镻rotues中沒有這個(gè)型號(hào)的單片機(jī)。
作者: 270497470    時(shí)間: 2019-3-28 21:24
有基于STC89系列的射頻密碼鎖資料?論壇上的資料試過都不能用,管理員啥就全通過了?

提個(gè)建議,加上一卡一密系統(tǒng)使射頻開鎖更安全(滾動(dòng)碼最安全了)
作者: 凌凈清河    時(shí)間: 2019-4-2 20:54
lon7085 發(fā)表于 2019-3-25 09:31
樓主真是強(qiáng)啊!且宅心仁厚,值得學(xué)習(xí),收藏了。請(qǐng)問會(huì)有跟上位機(jī)聯(lián)機(jī)上傳紀(jì)錄嗎?加入火焰探測(cè)模塊是為了防 ...

謝謝認(rèn)可;鹧婺K是為了預(yù)留出一個(gè)防火的功能接口,只是原理性的設(shè)計(jì)而已。
作者: 凌凈清河    時(shí)間: 2019-4-2 20:59
270497470 發(fā)表于 2019-3-28 21:24
有基于STC89系列的射頻密碼鎖資料?論壇上的資料試過都不能用,管理員啥就全通過了?

提個(gè)建議,加上一卡一 ...

通過是保證帖子內(nèi)容的合法,其中是否有用是否錯(cuò)誤似乎不在審核范圍內(nèi)。
STC89系列的密碼鎖的話,資料還是很多的,但是都比較傳統(tǒng),也都是原理性的設(shè)計(jì),為了讓初學(xué)者能夠理解各個(gè)功能電路,掌握一個(gè)作品的整體設(shè)計(jì)思路罷了。
一卡一密需要增加存儲(chǔ)容量或者改變存儲(chǔ)方式,包括隨機(jī)密碼和隨機(jī)鍵位,那種設(shè)計(jì)不僅需要更好的屏幕支持,最好還是需要一個(gè)管理機(jī),和用戶交互的部分僅作為輸入輸出來使用。
作者: wyf1996119    時(shí)間: 2019-4-10 13:39
我也知道做一個(gè)伸手黨不好 但這個(gè)板子 新手也做不出來吧 硬件方面能不能講講
作者: 曦辰    時(shí)間: 2019-4-13 09:21
多謝分享
作者: jy20191218    時(shí)間: 2019-6-3 18:17
謝謝博主分享,我是一個(gè)單片機(jī)新手,雖然程序還有好多看不懂,但從字里行間可以感受到博主很用心的給大家講解,希望博主以后能有更多的好東西跟我們分享,加油!。!
作者: 結(jié)合國(guó)    時(shí)間: 2019-9-19 14:09
謝謝樓主分享
作者: 270497470    時(shí)間: 2019-9-28 20:36
凌凈清河 發(fā)表于 2019-4-2 20:59
通過是保證帖子內(nèi)容的合法,其中是否有用是否錯(cuò)誤似乎不在審核范圍內(nèi)。
STC89系列的密碼鎖的話,資料還 ...

一卡一密不需要增加存儲(chǔ)容量吧?只要讀取卡的序列號(hào),經(jīng)過單片機(jī)計(jì)算出密碼,然后再在卡其它的扇區(qū)讀取密碼比對(duì),這樣就不需存儲(chǔ)了?需要黑名單時(shí)才需要存儲(chǔ)吧?
作者: 大圣3    時(shí)間: 2019-9-30 18:22

很好很強(qiáng)大,
謝謝樓主分享!
作者: denminshen    時(shí)間: 2019-9-30 19:46
謝謝樓主分享!要是有仿真電路圖就完美了!!
作者: 凌凈清河    時(shí)間: 2019-10-14 18:34
270497470 發(fā)表于 2019-9-28 20:36
一卡一密不需要增加存儲(chǔ)容量吧?只要讀取卡的序列號(hào),經(jīng)過單片機(jī)計(jì)算出密碼,然后再在卡其它的扇區(qū)讀取密 ...

有道理,確實(shí)可以。但是要注意,現(xiàn)在只有CPU卡是安全的,全加密卡也有可能被破解。PM3和類似的東西的存在,讓IC卡變得都不安全了。
所以說到安全性,歸根結(jié)底還是“人”的安全。很多設(shè)計(jì)上非常棒的安全系統(tǒng)最后都輸給了社會(huì)工程學(xué)。
作者: 三水客    時(shí)間: 2019-10-17 09:20
牛。〖訌(qiáng)學(xué)習(xí)中!
作者: 270497470    時(shí)間: 2019-10-17 18:38
凌凈清河 發(fā)表于 2019-10-14 18:34
有道理,確實(shí)可以。但是要注意,現(xiàn)在只有CPU卡是安全的,全加密卡也有可能被破解。PM3和類似的東西的存在 ...

沒有什么是安全的,只有相對(duì)安全。PM3只能讀出卡的數(shù)據(jù),一卡一密的算法還是要靠人來解,這個(gè)很不容易。
作者: lon7085    時(shí)間: 2019-10-17 20:25
好資料謝謝分享,學(xué)習(xí)一下
作者: 莫超人    時(shí)間: 2019-10-25 15:45
太感謝樓主的分享了
作者: sZhou    時(shí)間: 2019-10-25 20:17
1、基本功能要人性化   2、多功能要穩(wěn)定可靠;;;;堅(jiān)持就是勝利,看好你
作者: niegang    時(shí)間: 2019-10-26 10:20
樓主邏輯不錯(cuò),優(yōu)化下更完美,
作者: QDMLIT    時(shí)間: 2019-10-31 15:56
實(shí)用性高,謝謝
作者: 我是柔情劍客    時(shí)間: 2019-12-2 12:01
佩服大神
作者: hqpain    時(shí)間: 2019-12-5 11:30
感謝樓主分享,正好需要用
作者: aing123    時(shí)間: 2019-12-5 13:37
tai牛了!
作者: sZhou    時(shí)間: 2019-12-16 12:32
我也是個(gè)單片機(jī)愛好者,也只是會(huì)用16F684做了個(gè)感應(yīng)水龍頭
作者: sZhou    時(shí)間: 2019-12-16 12:33
夢(mèng)園心田 發(fā)表于 2019-1-24 01:15
還有優(yōu)化的地方。比如說記錄開鎖時(shí)間,等等

好主意
作者: 1228060121    時(shí)間: 2019-12-20 13:55
凌凈清河 發(fā)表于 2019-2-9 11:28
對(duì)于附件的黑幣設(shè)置,現(xiàn)在想來,確實(shí)是扣除的過多了,但是恕我眼拙,忘了怎么重新編輯了。但是對(duì)于所有回復(fù) ...


作者: QSM980405    時(shí)間: 2019-12-28 10:35
厲害厲害,謝謝大佬的分享
作者: linnyshow    時(shí)間: 2020-3-20 10:28
功能很齊全,非常詳細(xì)。
作者: zlx137283581    時(shí)間: 2020-3-20 20:40
感謝樓主的分享!非常實(shí)用,現(xiàn)在自己也可以去試試了
作者: luoshi133    時(shí)間: 2020-3-21 05:10
這個(gè)程序看到好長(zhǎng)的代碼,樓主肯定費(fèi)了不少時(shí)間和精力,謝謝分享。
作者: zlx137283581    時(shí)間: 2020-4-15 11:19
樓主,請(qǐng)問有原理圖么?
作者: Sky丶藍(lán)天    時(shí)間: 2020-4-22 13:49
設(shè)計(jì)很好,樓主也在認(rèn)真回復(fù)解答,很棒,給大佬沏茶
作者: 270497470    時(shí)間: 2020-5-14 08:35
今天遇到一張半加密卡,竟然用PM3解密不出來,奇了怪了。等有辦法解出卡數(shù)據(jù)時(shí)再來回復(fù)。如果也采用此卡的加密,則安全多了。
作者: 凌凈清河    時(shí)間: 2020-6-19 18:28
原理圖基本是照著板子手焊的線路畫的(除了ADC鍵盤部分),畫的很差,大家將就看吧,哈哈。



作者: peeta    時(shí)間: 2020-7-1 23:42
牛啊,下來做做看,非常感謝!
作者: 我系_源    時(shí)間: 2020-7-9 10:02
厲害,先收藏了先
作者: SURUBU1976    時(shí)間: 2022-4-10 10:27
是學(xué)習(xí)的,如今都是指紋的了,謝謝分享
作者: 享有生活    時(shí)間: 2022-4-10 15:35
收藏了,學(xué)習(xí)一下,謝謝分享
作者: hyok    時(shí)間: 2022-4-11 14:20
感謝樓主的無(wú)償分享
作者: SURUBU1976    時(shí)間: 2022-5-4 09:34
凌凈清河 發(fā)表于 2020-6-19 18:28
原理圖基本是照著板子手焊的線路畫的(除了ADC鍵盤部分),畫的很差,大家將就看吧,哈哈。

謝謝樓主,在贊黑幣。學(xué)習(xí)編程技能
作者: mcuhui    時(shí)間: 2022-5-5 12:50
不錯(cuò)的設(shè)計(jì),感謝樓主的奉獻(xiàn)
作者: 38337646    時(shí)間: 2024-6-22 19:39
好長(zhǎng),謝謝分享,收藏先
作者: 格式化無(wú)悔    時(shí)間: 2024-8-8 21:06
謝謝啦,你這個(gè)寫的不是一般的水平
作者: Letbygones    時(shí)間: 2024-8-30 01:39
謝分享!




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1