欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14964|回復: 19
打印 上一主題 下一主題
收起左側

單片機密碼鎖程序+仿真+詳細注釋

  [復制鏈接]
跳轉到指定樓層
樓主
程序名:密碼鎖
編寫人:   
編寫時間:  
硬件支持:STC89C52RC 外部12MHZ晶振
說明備注:
1、輸入密碼時在LCD屏幕上顯示暗碼(*),設置管理員密碼時顯示明碼。
2、用戶密碼3組位5位密碼及管理員密碼1組。
3、斷電保護密碼不消失。
4、可手動復位管理員密碼及用戶密碼。
5、輸入管理員密碼才能修改用戶密碼,密碼不能為6個0,管理員密碼需要按復位鍵進行設置。
6、可指定秀給任意1組的密碼。
7、LCD操作步驟提示。
8、密碼輸入錯誤3次蜂鳴器報警,輸入錯誤5次鍵盤鎖定(需要復位解鎖)。
9、輸入管理員密碼才能修改用戶密碼,密碼不能為6個0,管理員密碼需要按復位鍵進行設置。
10、按鍵提示音,開鎖音,錯誤音,報警音。
11、第一次上電強制要求設置管理員密碼     


此圖片僅供參考

后來用STC12C5A60S2做的 用的是內部集成的eeprom 添加了刷卡開鎖+更換為12864屏
因為很多功能不能仿真 沒有發上來  


單片機主程序:
  1. /********************************************************************************************/
  2. #include "config.h"
  3. #include "lcd1602.h"
  4. #include "eeprom.h"
  5. #include "LOCK.h"
  6. #include "delay.h"
  7. #include "KEY.h"

  8. void Timer0Init(void);        //50毫秒@12.000MHz
  9. void Timer1Init(void);        //1毫秒@12.000MHz
  10. /********************************************************************************************/
  11. //                        主程序                        //
  12. /********************************************************************************************/
  13. void main(void){

  14.         LOCK=0;                                        //初始化鎖關閉狀態
  15.         ALAM=1;
  16.         EA=1;                                        //開啟總中斷
  17.         Timer0Init();                        //50毫秒@12.000MHz
  18.         Timer1Init();                        //1毫秒@12.000MHz
  19.         Delay1ms(400);                 //啟動等待,等LCD講入工作狀態
  20.         Init_LCD1602();         //LCD初始化        
  21.         InitLock();                                 //密碼鎖上電初始化
  22.         while(1){               //進入主循環
  23.                 keyjiance();                //讀取按鍵狀態、確定要執行動作
  24.         }
  25. }
  26. void Timer0Init(void){                //50毫秒@12.000MHz
  27.         TMOD &= 0xF0;                        //設置定時器模式
  28.         TMOD |= 0x01;                        //設置定時器模式
  29.         TL0 = 0xB0;                                //設置定時初值
  30.         TH0 = 0x3C;                                //設置定時初值
  31.         TF0 = 0;                                //清除TF0標志
  32.         TR0 = 0;                                //定時器1停止計時
  33.         ET0 = 1;                                //使能T0中斷
  34. }
  35. void InterruptTimer0() interrupt 1{
  36.         unsigned char countt0;
  37.         TL0=0xB0;
  38.         TH0=0x3C;                   //定時器重新賦初值
  39.         countt0++;              //計時變量加,加1次時50ms
  40.         if(countt0==20){        //加到20次就是1s
  41.                 countt0=0;          //變量清零
  42.                 second++;           //秒加
  43.                 if(key_disable==1){ //鍵盤鎖狀態時
  44.                         if(second==3){  //秒加到1s時
  45.                                 TR0=0;      //關定時器
  46.                                 TL0=0xB0;        //再次賦初值
  47.                                 TH0=0x3C;   //再次賦初值
  48.                                 Cancel0();        //返回--取消所有操作
  49.                                 second=0;   //秒清零
  50.                         }
  51.                 }
  52.                 else{                    //不在鍵盤鎖狀態時
  53.                         if(second==6){  //秒加到5時               
  54.                                 TR0=0;      //關閉定時器
  55.                                 second=0;   //秒清零
  56.                                 Cancel0();        //返回--取消所有操作
  57.                                 TL0=0xB0;        //重新賦初值
  58.                                 TH0=0x3C;   //重新賦初值
  59.                         }
  60.                         else
  61.                                 TR0=1;      //打開定時器
  62.                 }                       
  63.     }        
  64. }
  65. void Timer1Init(void){                //1毫秒@12.000MHz
  66.         TMOD &= 0x0F;                        //設置定時器模式
  67.         TMOD |= 0x10;                        //設置定時器模式
  68.         TL1 = 0x18;                                //設置定時初值
  69.         TH1 = 0xFC;                                //設置定時初值
  70.         TF1 = 0;                                //清除TF1標志
  71.         TR1 = 1;                                //定時器1開始計時
  72.         ET1 = 1;                             //使能T1中斷
  73. }
  74. //*********************************中斷服務函數**************************************
  75. void  time1_int(void) interrupt 3{//定時器T1
  76.         TL1 = 0x18;                                //重置定時初值
  77.         TH1 = 0xFC;                                //重置定時初值
  78.         KeyScan();                                //矩陣鍵盤掃面
  79. }
復制代碼



鎖.c :
  1. #include "config.h"
  2. #include "LCD1602.h"
  3. #include "eeprom.h"
  4. #include "delay.h"
  5. #include "KEY.h"
  6. #include "LOCK.h"


  7. bit  pass=0;                                                                        //密碼正確標志
  8. bit  ReInputIx=0;                                                                          //重置密碼功能標志
  9. bit  ReInputEn=0;                                                                          //重置密碼輸入允許標志        
  10. bit  key_disable=0;                                                                        //鎖定鍵盤標志
  11. unsigned char ReInputBit = 0;                                         //修改密碼第幾組標記
  12. unsigned char InputData[6];                                         //輸入密碼暫存區
  13. unsigned char TempPassword[6];                                                                //修改密碼第一遍暫存
  14. unsigned char N=0;                                                                                        //密碼輸入位數計數
  15. unsigned char ErrorCont = 0;                                        //錯誤次數計數
  16. unsigned char ReInputCont;                                                 //密碼次數輸入計數
  17. unsigned char second;                                                                                //t0中斷計數器,秒計數器
  18. unsigned char code initpassword[6]={0,0,0,0,0,0};                        //初始化密碼
  19. unsigned char CurrentPassword[4][6]={                                                //讀取EEPROM密碼暫存數組
  20.         {0,0,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,0}
  21.         };

  22. unsigned char code start_line[]      = {"password:       "};//密碼
  23. unsigned char code name[]                   = {"===Coded Lock==="};//密碼鎖   
  24. //=================將按鍵值編碼為數值============================
  25. unsigned char coding(unsigned char m){        
  26.         unsigned char k;
  27.         switch(m){
  28.                 case (0x31): k=1;break;
  29.                 case (0x32): k=2;break;
  30.                 case (0x33): k=3;break;
  31.                 case (0x26): k='A';break;
  32.                 case (0x34): k=4;break;
  33.                 case (0x35): k=5;break;
  34.                 case (0x36): k=6;break;
  35.                 case (0x25): k='B';break;
  36.                 case (0x37): k=7;break;
  37.                 case (0x38): k=8;break;
  38.                 case (0x39): k=9;break;
  39.                 case (0x28): k='C';break;
  40.                 case (0x1B): k='*';break;
  41.                 case (0x30): k=0;break;
  42.                 case (0x0D): k='#';break;
  43.                 case (0x27): k='D';break;
  44.         }
  45.         return(k);
  46. }
  47. //====================一聲提示音,表示有效輸入===================
  48. void OneAlam(void){
  49.         ALAM=0;
  50.         Delay1ms(50);
  51.     ALAM=1;
  52. }
  53. //====================二聲提示音,表示操作成功===================
  54. void TwoAlam(void){
  55.         ALAM=0;
  56.         Delay1ms(50);
  57.     ALAM=1;
  58.     Delay1ms(50);
  59.         ALAM=0;
  60.         Delay1ms(50);
  61.     ALAM=1;
  62. }
  63. //====================三聲提示音,表示錯誤========================
  64. void ThreeAlam(void){
  65.         ALAM=0;
  66.         Delay1ms(50);
  67.     ALAM=1;
  68.     Delay1ms(50);
  69.         ALAM=0;
  70.         Delay1ms(50);
  71.     ALAM=1;
  72.     Delay1ms(50);
  73.         ALAM=0;
  74.         Delay1ms(50);
  75.     ALAM=1;
  76. }
  77. //============輸入密碼錯誤超過三過,報警并鎖死鍵盤===============
  78. void Alam_KeyUnable(void){
  79.                 P1=0xFF;
  80.                 ALAM=~ALAM;                                                         //蜂鳴器一直閃爍鳴響
  81.                 Delay1ms(5);
  82. }
  83. //=====================上電初始化=============================
  84. //  1、判斷是否上電復位還是按鍵復位,如果是上電復位 標志位清0退出,
  85. //        2、如果是按鍵復位,管理員密碼及用戶密碼都清0,
  86. //        3、讀出管理員密碼 比較管理員密碼是否是6個0
  87. //        4、如果管理員密碼是6個0,一直等待用戶設置管理員密碼后再進入下一步
  88. void InitLock(void){
  89.         unsigned char x;

  90.         write_1602com(er+9);    //設置光標位置
  91.         write_1602com(0x0f);    //設置光標為閃爍
  92.         Write1602_ZiFuChuan(1,1,"===Coded Lock===");//向液晶屏寫開機畫面--英文“密碼鎖”
  93.         if(0x10==(PCON&0x10)){  //如果上電復位標志為1
  94.                 PCON&=0xEF;                    //上電復位標志清零
  95.         }
  96.         else{                                        //否則判斷為外部按鍵復位,重設管理員密碼
  97.                 for(x=0;x<4;x++){
  98.                         E2Write(initpassword,x*8,6);//強制將初始管理員密碼及3組用戶密碼6個0寫入24C02存儲
  99.                 }               
  100.         }
  101.         Write1602_ZiFuChuan(2,1,"Admin Password: ");//第2行第1位顯示“管理員密碼    ”
  102.         E2Read(CurrentPassword[0],0,6);        //讀出管理員密碼
  103.         while(CurrentPassword[0][0]==0){//判斷24c02中的管理員密碼是否是0---密碼6個0無效 ---目的是停在這里讓用戶修改管理員密碼
  104.                 AdminPassword();        //設置管理員密碼
  105.                 E2Read(CurrentPassword[0],0,6);//讀出管理員密碼---以便比較設置好了嗎
  106.         }
  107.         Write1602_ZiFuChuan(2,1,"password:       ");//第2行第1位顯示“密碼    ”
  108.         N=0;                    //將輸入數據計數器清零,為輸入作準備
  109. }
  110. //====================設置管理員密碼=============================
  111. void AdminPassword(void){
  112.         unsigned char j,y,z;
  113.         y=KeyDriver();                                                                                 //讀按鍵的位置碼
  114.         if(y!=0){
  115.                 z=coding(y);    //根據按鍵的位置將其編碼,編碼值賦值給NUM
  116.                 switch(z){
  117.                         case ('A'):;break;
  118.                         case ('B'):;break;
  119.                         case ('C'):                                                                        //刪除最后一個字符  
  120.                                 if(N>=1) N--;                                                          //定位輸入的字 加上0的位數               
  121.                                 OneAlam();                                                                 //按鍵提示音                                                
  122.                                 for(j=N;j<16;j++){
  123.                                         write_1602com(er+6+j);                                //第二行已輸入的最后一位
  124.                                         write_1602dat(' ');                                        //顯示換成空格
  125.                                 }  
  126.                                 break;                                
  127.                         case ('D'):;break;         
  128.                         case ('*'):;break;                                              //取消當前輸入
  129.                         case ('#'):                                                                        //確認鍵
  130.                                 if(N==6){                                                                //輸入滿6位
  131.                                         E2Write(InputData,0,6);                                //管理員密碼EEPROM存儲
  132.                                         TwoAlam();                                                        //成功提示音
  133.                                         break;                                                                //退出循環
  134.                                 }        
  135.                                 else{                                                                         //小于6位報錯
  136.                                         Write1602_ZiFuChuan(2,1,"      error     ");//顯示錯誤
  137.                                         ThreeAlam();                                //錯誤提示音
  138.                                         }
  139.                         default:{                                           //如果不是功能鍵按下時,就是數字鍵按下
  140.                                 if(N<6){                                        //當輸入的密碼少于6位時,接受輸入并保存,大于6位時則無效。
  141.                                         Write1602_ZiFuChuan(1,1,"====Set Lock====");//第2行第1位顯示“管理員密碼    ”
  142.                                         Write1602_ZiFuChuan(2,1,"input:          ");//顯示輸入畫面--“輸入      ”
  143.                                         OneAlam();                                  //按鍵有效提示音        
  144.                                         InputData[N]=z;                                   //將數字鍵的碼賦值給InputData[]數組暫存
  145.                                         for(j=0;j<=N;j++){                                        //顯示位數隨輸入增加而增加
  146.                                                 Write1602(0xc0+6+j,InputData[j]+0x30);//第2行但顯示實際數字
  147.                                         }
  148.                                         N++;                                        //密碼位數加
  149.                                 }
  150.                                 else{                                           //輸入數據位數大于6后,忽略輸入
  151.                                         N=6;                                            //密碼輸入大于6位時,不接受輸入
  152.                                         break;
  153.                                 }
  154.                         }        
  155.                 }
  156.         }
  157. }
  158. //========================設置密碼===============================
  159. void ResetPassword(void){
  160.         unsigned char i;        
  161.                
  162.         ReInputCont++;      //密碼次數計數        
  163.         if(ReInputCont==2){ //輸入第二次密碼時
  164.                 for(i=0;i<6;){        //循環比較2次6位密碼是否一致
  165.                         if(TempPassword==InputData)       //將兩次輸入的新密碼作對比
  166.                                         i++;
  167.                         else {                                  //如果兩次的密碼不同
  168.                                 Write1602_ZiFuChuan(2,1,"      error     ");//顯示錯誤
  169.                                 ThreeAlam();                        //錯誤提示音
  170.                                 ReInputIx=0;                                         //關閉密碼重置功能      
  171.                                 ReInputEn=0;                        //關閉重置輸入允許
  172.                                 ReInputCont=0;                                                //密碼次數計數清零
  173.                                 break;
  174.                         }
  175.                 }
  176.                 if(i==6){                //2次6位密碼一致   -----等待存入位置選擇 并確認后存入EEPROM
  177.                         ReInputBit = 1;                                                        //"修改密碼第幾組標記"標記為第一組                          
  178.                         write_1602com(0x01);                                         //清屏
  179.                         Write1602_ZiFuChuan(1,1,"Select location:");//第1行第1位顯示“設置位置”--設置儲存在第幾組位置(共3組)
  180.                         Write1602_ZiFuChuan(2,1," [1]   [2]   [3]");//第2行分別顯示 三組供選擇
  181.                         write_1602com(0xc2);                                    //光標在第一組閃爍
  182.                         OneAlam();                              //操作有效提示音
  183.                 }
  184.         ReInputCont=0;                                                                        //密碼次數計數清零
  185.         }
  186.         else{             //輸入一次密碼時                                       
  187.                 OneAlam();                                                                        //操作有效提示音
  188.                 write_1602com(0x01);                                                 //清屏
  189.                 Write1602_ZiFuChuan(1,1,"====Set Lock====");//第1行第1位顯示“設置密碼”
  190.                 Write1602_ZiFuChuan(2,1,"input again:    ");        //第2行第1位顯示“再次輸入”
  191.                 for(i=0;i<6;i++){
  192.                         TempPassword=InputData;               //將第一次輸入的數據暫存起來                                                
  193.                 }
  194.         }
  195.         N=0;                                                                        //輸入數據位數計數器清零
  196. }
  197. //============取消所有操作(定時器0專用)不然有警告================
  198. void Cancel0(void){      
  199.         unsigned char i,j;
  200.                                        
  201.         write_1602com(0x01);                        //清屏
  202.         for(j=0;j<16;j++){        
  203.                 Write1602(yi+j,name[j]);//第1行第1位顯示“密碼鎖”
  204.                 Write1602(er+j,start_line[j]);//第1行第1位顯示“密碼鎖”
  205.         }
  206.         TwoAlam();                          //操作成功提示音
  207.         for(i=0;i<6;i++){        
  208.                 InputData=0;                 //將輸入密碼清零
  209.         }
  210.         LOCK=0;                         //關閉鎖
  211.         ALAM=1;                         //報警關
  212.         pass=0;                         //密碼正確標志清零
  213.         ReInputEn=0;                    //重置輸入充許標志清零
  214.         ReInputIx=0;                    //密碼重置功能標志清零
  215.         ReInputBit=0;                                        //"修改密碼第幾組標記"清零        
  216.         ErrorCont=0;                    //密碼錯誤輸入次數清零
  217.         ReInputCont=0;                  //重置密碼輸入次數清零
  218.         key_disable=0;                  //鎖定鍵盤標志清零
  219.         N=0;                            //輸入位數計數器清零
  220. }
  221. //======================取消所有操作=============================
  222. void Cancel(void){      
  223.         unsigned char i;
  224.                                        
  225.         write_1602com(0x01);                        //清屏
  226.         Write1602_ZiFuChuan(1,1,"===Coded Lock===");//第1行第1位顯示“密碼鎖”
  227.         Write1602_ZiFuChuan(2,1,"password:       ");//第2行第1位顯示“密碼    ”
  228.         TwoAlam();                          //操作成功提示音
  229.         for(i=0;i<6;i++){        
  230.                 InputData=0;                 //將輸入密碼清零
  231.         }
復制代碼

全部資料51hei下載地址:
密碼鎖仿真.zip (67.29 KB, 下載次數: 278)
89C52密碼鎖程序9 24C02 EEPROM.zip (98.06 KB, 下載次數: 279)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏24 分享淘帖 頂2 踩
回復

使用道具 舉報

無效樓層,該帖已經被刪除
板凳
ID:79544 發表于 2019-11-7 15:24 | 只看該作者
感謝分享。學習啦!!!
回復

使用道具 舉報

地板
ID:639516 發表于 2019-11-11 10:13 | 只看該作者
學習一下
回復

使用道具 舉報

5#
ID:634141 發表于 2019-11-24 20:16 | 只看該作者
很好,很喜歡
回復

使用道具 舉報

6#
ID:697920 發表于 2020-2-25 15:15 | 只看該作者
您好,可以發一下12864密碼鎖的程序嗎
回復

使用道具 舉報

7#
ID:630042 發表于 2020-3-3 22:33 | 只看該作者
謝謝分享
回復

使用道具 舉報

8#
ID:777173 發表于 2020-6-12 12:35 | 只看該作者
謝謝分享
回復

使用道具 舉報

9#
無效樓層,該帖已經被刪除
10#
ID:895480 發表于 2021-3-23 14:24 | 只看該作者
這個單片機主程序頭文件不是89c52?
回復

使用道具 舉報

11#
ID:895480 發表于 2021-3-23 14:27 | 只看該作者
這個頭文件51沒有啊
回復

使用道具 舉報

12#
ID:100986 發表于 2021-5-21 06:53 | 只看該作者
程序 是一半 一半 ?
回復

使用道具 舉報

13#
ID:925919 發表于 2021-5-23 16:11 | 只看該作者
感謝感謝
回復

使用道具 舉報

14#
ID:944644 發表于 2021-6-25 15:18 | 只看該作者
hex放在這個目錄的 89C52密碼鎖程序9+24C02 EEPROM\output
回復

使用道具 舉報

15#
ID:328014 發表于 2021-6-25 20:18 | 只看該作者
shuck711 發表于 2021-6-25 15:18
為什么下載了,只有仿真圖,沒有hex文件?

有hex文件,在89C52密碼鎖程序9+24C02 EEPROM這個文件的output目錄里面,如圖

51hei.png (6.62 KB, 下載次數: 129)

51hei.png
回復

使用道具 舉報

16#
無效樓層,該帖已經被刪除
17#
ID:307493 發表于 2021-7-21 15:30 | 只看該作者
讀作者的代碼有點吃力
回復

使用道具 舉報

18#
無效樓層,該帖已經被刪除
19#
無效樓層,該帖已經被刪除
20#
ID:614285 發表于 2021-7-29 09:46 | 只看該作者
博主太膩害了!
回復

使用道具 舉報

21#
無效樓層,該帖已經被刪除
22#
ID:994699 發表于 2021-12-26 21:43 | 只看該作者
#include "STC12C5A60S2.h"
運行不了說沒有這個咋回事呀?誰能告訴我怎么獲取這個文件?
回復

使用道具 舉報

23#
ID:815357 發表于 2022-5-18 14:44 來自觸屏版 | 只看該作者
文件里的代碼是適用STC12C5A60S2芯片的?我STC89C52RC的打開沒反應
回復

使用道具 舉報

24#
ID:815357 發表于 2022-5-18 15:32 來自觸屏版 | 只看該作者
所以這個程序是STC89C52RC的還是STC12C5A60S2.h
回復

使用道具 舉報

25#
ID:262 發表于 2022-5-19 05:32 | 只看該作者
左視 發表于 2022-5-18 14:44
文件里的代碼是適用STC12C5A60S2芯片的?我STC89C52RC的打開沒反應

根據樓主提供的仿真來看是12t的單片機的,你看這個仿真圖上的型號,所以適用于STC89C52RC芯片,慢慢調試吧,檢查你的接線,調整你的LCD的delayd等等

51hei.png (39.96 KB, 下載次數: 120)

51hei.png
回復

使用道具 舉報

26#
ID:1042648 發表于 2022-9-7 01:25 | 只看該作者
謝謝分享!我編譯出錯,郁悶中
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表