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

QQ登錄

只需一步,快速開始

搜索
查看: 11642|回復(fù): 17
收起左側(cè)

單片機(jī)電子密碼鎖電路程序帶仿真,調(diào)試通過(guò)lcd1602+24C02

  [復(fù)制鏈接]
ID:58924 發(fā)表于 2016-4-23 18:06 | 顯示全部樓層 |閱讀模式
調(diào)試通過(guò),,,電子密碼鎖,,,資料,,,,分享
lcd1602液晶屏顯示 并且用24c02保存數(shù)據(jù)
0.png
仿真圖 電路圖(proteus仿真文件可以從51黑本貼附件下載)

0.png
全部資料(壓縮包)下載:
密碼鎖單片機(jī)源程序仿真.zip (128 KB, 下載次數(shù): 383)



S0-S9為密碼數(shù)字鍵;
S10為刪除鍵,刪除上一次輸入的數(shù)字;
S11為清除鍵,清除所有輸入的數(shù)字;
S12為確認(rèn)鍵,輸入密碼后按確認(rèn)鍵確認(rèn)密碼是否輸入正確;
S13為密碼修改鍵。
S1-S10鍵按下5秒后,沒(méi)有其他鍵按下,則發(fā)出報(bào)警聲,聲音持續(xù)10s;
輸入密碼后按確認(rèn)鍵,若密碼正確,則綠燈亮,否則則紅燈亮。

下面是部分程序預(yù)覽(完整版本請(qǐng)下載本帖附件):
  1. //S1-S9為數(shù)字密碼輸入鍵0-9
  2. //S10-S13為功能鍵
  3. //S10為單個(gè)數(shù)字刪除鍵,S11為所以數(shù)字清除鍵,S12為密碼確認(rèn)鍵,S13為修改密碼鍵
  4. #include<reg52.h>   //包含頭文件
  5. #include"IIC.h"     //包含IIC總線頭文件
  6. #include"1602.h"    //包含1602頭文件
  7. #include"keyboard.h"    //包含鍵盤掃描頭文件

  8. sbit led_red=P2^5;  //位定義綠燈,密碼輸入正確時(shí)顯示
  9. sbit led_gre=P2^6;  //位定義紅燈,密碼輸入錯(cuò)誤時(shí)顯示
  10. sbit spk=P2^7;

  11. uchar ASC[]={'0','1','2','3','4','5','6','7','8','9'};  //將數(shù)字轉(zhuǎn)換成字符型數(shù)據(jù)供1602顯示

  12. uchar one=0,two=1,three=2,four=3;      //初始密碼0123

  13. uint t0,t1;     //定時(shí)器0、1分別溢出的次數(shù)

  14. void Init_time0(void)   //定時(shí)器0初始化函數(shù)   
  15. {
  16.     TMOD=0x11;
  17.     TH0=(65535-50000)/256;
  18.     TL0=(65535-50000)%256;
  19.     TH1=(65535-2000)/256;
  20.     TL1=(65535-2000)%256;
  21.     EA=1;
  22.     ET0=1;
  23.     ET1=1;
  24.     TR0=0;
  25.     TR1=0;
  26. }

  27. void main(void)     //主函數(shù)
  28. {
  29.     uchar flag=0,cflag=0;
  30. //flag、cflag分別為修改密碼標(biāo)志和修改密碼時(shí)初始密碼輸入正確標(biāo)志(輸入新密碼標(biāo)志)
  31.     uchar i=0,k=0;
  32. //i為輸入密碼時(shí)輸入數(shù)字密碼的個(gè)數(shù)
  33. //k為修改密碼時(shí)輸入數(shù)字密碼的個(gè)數(shù)
  34.     uchar j=0,t=0,shu=1;
  35. //j用于for循環(huán)中判斷輸入密碼和存儲(chǔ)密碼對(duì)比
  36. //t=0為進(jìn)入修改密碼狀態(tài),只要是為了修改密碼時(shí)的初始顯示
  37. //shu用于輸入新密碼時(shí),四位密碼的地址
  38.     uchar num,newpassword[4];
  39. //num為按鍵值,newpassword數(shù)組存放每次輸入的數(shù)字密碼S0-S13和0-13對(duì)應(yīng)
  40.     Init_IIC();     //初始化IIC
  41.     Init_1602();    //初始化1602
  42.     Init_time0();   //初始化定時(shí)器0

  43.     led_red=0;      //熄滅綠燈和紅燈
  44.     led_gre=0;
  45.     spk=0;

  46.     write_add(1,one);   //寫入初始密碼0123到E2PROM
  47.     delay_ms(5);
  48.     write_add(2,two);
  49.     delay_ms(5);
  50.     write_add(3,three);
  51.     delay_ms(5);
  52.     write_add(4,four);
  53.     delay_ms(5);

  54.     displaylistchar(0,0,"Input Password:");     //1602初始化后顯示Input Password:

  55.     while(1)
  56.     {
  57. /*檢測(cè)是否有按鍵按下,若沒(méi)有則不停掃描*/
  58.         num=KeyPro();   //掃描按鍵

  59.         if(num!=0xff)   //如果有鍵按下
  60.         {
  61. /*******************************************************************************************/
  62. /*輸入密碼*/
  63.             if((num!=13)&&(flag==0))    //S13為修改密碼鍵,flag為修改密碼標(biāo)志,flag=1時(shí)修改密碼,判斷是否修改密碼
  64.             {
  65.                 displaylistchar(0,0,"Input Password:");

  66.                 if(num>=0&&num<=9)  //如果是0-9按下,則輸入0-9并在液晶上顯示0-9
  67.                 {
  68.                     TR0=~TR0;   //若按鍵后五秒內(nèi)沒(méi)有打開鎖,則報(bào)警
  69.                     t0=0;
  70.                     displayonechar(i,1,ASC[num]);   //顯示輸入的數(shù)字密碼
  71.                     newpassword[i++]=num;        
  72.                 }
  73.    
  74.                 if(num==10)     //如果10按下,在有數(shù)字輸入的情況下刪除上次輸入的數(shù)字
  75.                 {
  76.                     TR0=~TR0;   //若按鍵后五秒內(nèi)沒(méi)有打開鎖,則報(bào)警
  77.                     t0=0;
  78.                     if(i>0)
  79.                     {
  80.                         i=i-1;
  81.                         displayonechar(i,1,' ');
  82.                     }
  83.                 }
  84.    
  85.                 if(num==11)     //如果是11按下,清除所有輸入的數(shù)據(jù),重新輸入
  86.                 {
  87.                     TR0=0;
  88.                     i=0;
  89.                     displaylistchar(0,1,"                ");//清除該行
  90.                 }
  91.    
  92.                 if(num==12)     //確認(rèn)鍵,如果密碼正確,則綠燈亮紅燈熄,否則則紅燈亮綠燈熄
  93.                 {
  94.                     TR0=0;
  95.                     if(i==4)    //四位密碼,所以只在輸入四個(gè)密碼的情況下檢測(cè)密碼是否正確
  96.                     {
  97.                         for(j=0;j<4;j++)
  98.                         {
  99.                             if(newpassword[j]!=read_add(j+1))   //輸入的密碼和存儲(chǔ)的密碼對(duì)比,若有一個(gè)錯(cuò)誤,則跳出密碼對(duì)比
  100.                                 break;
  101.                         }
  102.                         if(j==i)    //若j=i成立,則密碼正確
  103.                         {                                               
  104.                             led_gre=1;  //亮綠燈
  105.                             led_red=0;
  106.                             displaylistchar(0,1,"Right Open!");     //顯示輸入正確
  107.                             delay_ms(1000);
  108.                             i=0;    //按鍵輸入數(shù)置0
  109.                             displaylistchar(0,1,"                ");//清除該行
  110.                         }
  111.                         else        //若不成立則密碼不正確
  112.                         {
  113.                             led_gre=0;      //亮紅燈
  114.                             led_red=1;
  115.                             displaylistchar(0,1,"Wrong Retry!");     //顯示輸入錯(cuò)誤
  116.                             delay_ms(1000);
  117.                             i=0;    //按鍵輸入數(shù)置0
  118.                             displaylistchar(0,1,"                ");//清除該行
  119.                         }
  120.                     }

  121.                     else        //若按鍵輸入數(shù)i不等于4,則密碼肯定錯(cuò)誤
  122.                     {
  123.                         led_gre=0;      //亮紅燈
  124.                         led_red=1;
  125.                         displaylistchar(0,1,"Wrong Retry!");        //顯示輸入錯(cuò)誤
  126.                         delay_ms(1000);
  127.                         i=0;     //按鍵輸入數(shù)置0
  128.                         displaylistchar(0,1,"                ");//清除該行
  129.                     }
  130.                 }
  131.    
  132.                 if(i==6)    //虛設(shè)六位密碼,數(shù)字按鍵輸入六次后還沒(méi)有按確定的話,則提示密碼錯(cuò)誤
  133.                 {
  134.                     TR0=0;
  135.                     led_gre=0;        //亮紅燈
  136.                     led_red=1;
  137.                     displaylistchar(0,1,"Wrong Retry!");        //顯示輸入錯(cuò)誤
  138.                     delay_ms(1000);
  139.                     i=0;       //按鍵輸入數(shù)置0
  140.                     displaylistchar(0,1,"                ");//清除該行
  141.                 }
  142.             }
  143. /*******************************************************************************************/
  144. /*******************************************************************************************/
  145. /*修改密碼*/
  146.             else               //有S13鍵按下或修改密碼標(biāo)志flag置1
  147.             {
  148.                 if(cflag==0)    //修改密碼時(shí)初始密碼輸入正確標(biāo)志cflag置0時(shí)為輸入初始密碼檢測(cè)狀態(tài),類似前面的密碼輸入   
  149.                 {
  150.                     i=0;        //按鍵輸入數(shù)置0
  151.                     flag=1;     //S13鍵按下,修改密碼標(biāo)志置1
  152.                     if(t==0)    //t=0為進(jìn)入修改密碼狀態(tài),只要是為了修改密碼時(shí)的初始顯示
  153.                     {
  154.                         displaylistchar(0,0,"Change Password:");
  155.                         delay_ms(500);
  156.                         displaylistchar(0,1,"Old Password:");
  157.                         delay_ms(500);     
  158.                         displaylistchar(0,1,"                ");//清除該行
  159.                     }
  160.                     t++;        //正在修改密碼狀態(tài),則不用再次進(jìn)入修改密碼狀態(tài)
  161.                     if(num>=0&&num<=9)  //如果是0-9按下,則輸入0-9并在液晶上顯示0-9
  162.                     {
  163.                         TR0=~TR0;   //若按鍵后五秒內(nèi)沒(méi)有打開鎖,則報(bào)警
  164.                         t0=0;
  165.                         displayonechar(k,1,ASC[num]);
  166.                         newpassword[k++]=num;        
  167.                     }
  168.         
  169.                     if(num==10)     //單個(gè)密碼刪除鍵,和輸入密碼時(shí)一樣
  170.                     {
  171.                         TR0=~TR0;   //若按鍵后五秒內(nèi)沒(méi)有打開鎖,則報(bào)警
  172.                         t0=0;
  173.                         if(k>0)
  174.                         {
  175.                             k=k-1;
  176.                             displayonechar(i,1,' ');
  177.                         }
  178.                     }
  179.         
  180.                     if(num==11)     //所以密碼清除鍵,和輸入密碼時(shí)一樣
  181.                     {
  182.                         TR0=0;
  183.                         k=0;
  184.                         flag=0;
  185.                         displaylistchar(0,1,"                ");//清除該行
  186.                     }  
  187.    
  188.                     if(num==12)     //確認(rèn)鍵,和輸入密碼時(shí)一樣
  189.                     {
  190.                         TR0=0;
  191.                         if(k==4)
  192.                         {
  193.                             for(j=0;j<4;j++)
  194.                             {
  195.                                 if(newpassword[j]!=read_add(j+1))
  196.                                     break;
  197.                             }
  198.                             if(j==k)        //若初始密碼輸入正確后提示輸入新密碼,并將輸入新密碼標(biāo)志cflag置1
  199.                             {                                               
  200.                                 led_gre=1;
  201.                                 led_red=0;
  202.                                 displaylistchar(0,1,"Right Open!");
  203.                                 delay_ms(500);
  204.                                 displaylistchar(0,1,"                ");//清除該行
  205.                                 displaylistchar(0,1,"New Password:");
  206.                                 delay_ms(500);
  207.                                 displaylistchar(0,1,"                ");//清除該行
  208.                                 k=0;
  209.                                 cflag=1;
  210.                             }
  211.                             else        //若輸入錯(cuò)誤,則跳出密碼修改,flag=0
  212.                             {
  213.                                 led_gre=0;
  214.                                 led_red=1;
  215.                                 displaylistchar(0,1,"Wrong Retry!");
  216.                                 delay_ms(1000);
  217.                                 k=0;
  218.                                 flag=0;
  219.                                 displaylistchar(0,1,"                ");//清除該行
  220.                                 displaylistchar(0,0,"                ");//清除該行
  221.                                 displaylistchar(0,0,"Input Password:");
  222.                             }
  223.                         }
  224.                         else    //修改密碼時(shí)輸入原密碼數(shù)不等于4,顯然密碼錯(cuò)誤,跳出密碼修改
  225.                         {
  226.                             led_gre=0;
  227.                             led_red=1;
  228.                             displaylistchar(0,1,"Wrong Retry!");
  229.                             delay_ms(1000);
  230.                             k=0;
  231.                             flag=0;
  232.                             displaylistchar(0,1,"                ");//清除該行
  233.                             displaylistchar(0,0,"                ");//清除該行
  234.                             displaylistchar(0,0,"Input Password:");
  235.    
  236.                         }
  237.                     }
  238.                     if(k==6)    //數(shù)字按鍵輸入六次后還沒(méi)有按確定的話,則提示密碼錯(cuò)誤 ,跳出密碼修改
  239.                     {
  240.                         TR0=0;
  241.                         led_gre=0;
  242.                         led_red=1;
  243.                         displaylistchar(0,1,"Wrong Retry!");
  244.                         delay_ms(1000);
  245.                         k=0;
  246.                         flag=0;
  247.                         displaylistchar(0,1,"                ");//清除該行
  248.                         displaylistchar(0,0,"                ");//清除該行
  249.                         displaylistchar(0,0,"Input Password:");
  250.                     }
  251.                 }   
  252.                 else        //輸入新密碼標(biāo)志置1,輸入新密碼并顯示新輸入的密碼
  253.                 {
  254.                     if(num>=0&&num<=9)
  255.                     {
  256.                         write_add(shu,num);
  257.                         displayonechar(shu-1,1,ASC[num]);
  258.                         shu++;
  259.                         if(shu==5)
  260.                         {
  261.                             t=0;
  262.                             shu=1;
  263.                             cflag=0;
  264.                             flag=0;
  265.                             displaylistchar(0,1,"Change Success!");
  266.                             delay_ms(500);
  267.                             displaylistchar(0,0,"                ");//清除該行
  268.                             displaylistchar(0,1,"                ");//清除該行
  269.                             displaylistchar(0,0,"Input Password:");
  270.                         }
  271.                     }
  272.                 }                 
  273.             }

  274.         }
  275.                     
  276.     }
  277. }

  278. void time0(void) interrupt 1
  279. {
  280.     TH0=(65535-50000)/256;
  281.     TL0=(65535-50000)%256;
  282.     t0++;
  283.     if(t0==100)
  284.     {
  285.         t0=0;
  286.         TR0=0;
  287.         TR1=1;      
  288.     }
  289. }

  290. void time1(void) interrupt 3
  291. {
  292.     TH1=(65535-2000)/256;
  293.     TL1=(65535-2000)%256;
  294.     t1++;
  295.     spk=~spk;
  296.     if(t1==5000)
  297.     {
  298.         t1=0;
  299.         TR1=0;
  300.     }
  301. }

復(fù)制代碼


相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:75472 發(fā)表于 2016-12-20 11:25 | 顯示全部樓層
還差1分 才能下
回復(fù)

使用道具 舉報(bào)

ID:89286 發(fā)表于 2017-2-28 09:17 | 顯示全部樓層
thanks for sharing
回復(fù)

使用道具 舉報(bào)

ID:89286 發(fā)表于 2017-2-28 09:21 | 顯示全部樓層
thanks for sharing
回復(fù)

使用道具 舉報(bào)

ID:183867 發(fā)表于 2017-3-27 17:12 | 顯示全部樓層

thanks for sharing
回復(fù)

使用道具 舉報(bào)

ID:202896 發(fā)表于 2017-5-21 10:23 | 顯示全部樓層
下載不了
回復(fù)

使用道具 舉報(bào)

ID:234518 發(fā)表于 2017-11-20 15:17 | 顯示全部樓層
謝謝分享!不過(guò)積分不夠~~~
回復(fù)

使用道具 舉報(bào)

ID:339176 發(fā)表于 2018-5-28 06:11 | 顯示全部樓層
下載不了,求補(bǔ)附件
回復(fù)

使用道具 舉報(bào)

ID:346735 發(fā)表于 2018-6-7 10:57 | 顯示全部樓層
不錯(cuò)我可以學(xué)習(xí)到真正意義上的知識(shí)了
回復(fù)

使用道具 舉報(bào)

ID:7922 發(fā)表于 2018-6-7 18:01 | 顯示全部樓層

thanks for sharing
回復(fù)

使用道具 舉報(bào)

ID:138664 發(fā)表于 2018-7-18 16:01 | 顯示全部樓層
學(xué)習(xí)下24c02存儲(chǔ)程序
回復(fù)

使用道具 舉報(bào)

ID:216962 發(fā)表于 2018-10-9 15:36 | 顯示全部樓層
多謝。。。。。。。
回復(fù)

使用道具 舉報(bào)

ID:222956 發(fā)表于 2018-10-12 18:08 | 顯示全部樓層
很好謝謝
回復(fù)

使用道具 舉報(bào)

ID:304790 發(fā)表于 2018-12-30 22:54 | 顯示全部樓層
樓主厲害
回復(fù)

使用道具 舉報(bào)

ID:465706 發(fā)表于 2019-1-10 12:23 | 顯示全部樓層
還差點(diǎn)分,加油
回復(fù)

使用道具 舉報(bào)

ID:477709 發(fā)表于 2019-2-27 11:59 | 顯示全部樓層
這是六位密碼嗎,有仿真的圖和程序的嗎
回復(fù)

使用道具 舉報(bào)

ID:865733 發(fā)表于 2020-12-22 19:32 | 顯示全部樓層

學(xué)習(xí)24c02存儲(chǔ)程序
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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