久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

80C51用24C04與1602LCD設(shè)計的簡易加密電子密碼鎖Proteus仿真程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:593114 發(fā)表于 2019-7-31 16:01 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
使用80C51用24C04與1602LCD設(shè)計的簡易加密電子密碼鎖,可以實現(xiàn)密碼開鎖功能,同時可以密碼修改,斷電保護(hù)功能。

  1. //-----------------------------------------------------------------
  2. //  名稱: 用1602LCD與24C04設(shè)計的電子密碼鎖
  3. //-----------------------------------------------------------------
  4. //  說明: 初始密碼由24C04.BIN設(shè)定為"111111".
  5. //             按下數(shù)字鍵0-9可輸入密碼,不超過6位,輸入完成后按下A
  6. //             鍵開鎖,密碼正確時LED點亮,液晶屏顯示開鎖成功.
  7. //             其他鍵功能是:B-上鎖 C-重新輸入密碼 D-保存新密碼 E-清除
  8. //             重設(shè)密碼時要求先輸入正確的密碼成功開鎖.
  9. //                     
  10. //-----------------------------------------------------------------
  11. #include <reg51.h>
  12. #include <string.h>
  13. #define INT8U unsigned char
  14. #define INT16U  unsigned int
  15. //上次按鍵和當(dāng)前按鍵序號,該矩陣中序號范圍為0-15,16表示無按鍵
  16. INT8U Pre_KeyNo = 16, keyNo = 16 ;
  17. INT8U DSY_BUFFER[10] = "";                                                        //顯示緩沖
  18. INT8U UserPassword[7] = "";                                                        //用戶輸入的密碼
  19. INT8U IIC_Password[7];                                                                //從IIC存儲器讀取的密碼
  20. extern void Initialize_LCD();                                                //液晶初始化
  21. extern void LCD_ShowString(INT8U, INT8U ,INT8U*);        //顯示字符串
  22. extern void IIC_Init();                                                                //IIC初始化
  23. extern INT8U Random_Read(INT8U,INT16U);                                //從指定地址讀取1字節(jié)
  24. extern void Write_IIC(INT8U,INT16U,INT8U);                        //向指定地址寫入1字節(jié)
  25. extern void delay_ms(INT16U x);                                                //延時函數(shù)
  26. //INT8U Keys_Scan();                                                        //掃描鍵盤返回鍵值
  27. void Beep();                                                                                //蜂鳴器
  28. sbit LED_OPEN =  P2^7;                                                                //開鎖亮燈
  29. sbit BEEP = P3^7;                                                                        //蜂鳴器
  30. // void delay_ms(INT16U ms)
  31. // {
  32. //     INT8U i;
  33. //    while(ms--)
  34. //      for(i=0;i<120;i++);
  35. // }
  36. INT8U Keys_Scan()
  37. {
  38.           //高四位置0,放入四行,掃描四列
  39.     P1=0x0F;delay_ms(1);
  40.     if(P1==0x0F){keyNo=0xFF; return 16;}  //無按鍵時提前返回
  41.     //按鍵后00001111將變成0000XXXX,X中1個為0,3個仍為1
  42.     //下面判斷按鍵發(fā)生于0-3列中的哪一列
  43.     switch(P1)
  44.     {
  45.         case 0x0E:keyNo=0;break;       //按鍵在第0列
  46.         case 0x0D:keyNo=1;break;       //按鍵在第1列
  47.         case 0x0B:keyNo=2;break;       //按鍵在第2列
  48.         case 0x07:keyNo=3;break;       //按鍵在第3列
  49.         default: keyNo=16;return 16;    //無按鍵按下,提前返回
  50.     }
  51.     //低四位置0,放入四列,掃描四行
  52.     P1=0xF0;delay_ms(1);
  53.     //按鍵后11110000將變成XXXX0000,X中1個為0,3個仍為1
  54.     //下面判斷按鍵發(fā)生于0-3列中的哪一行
  55.     //對0-3行分別附加的起始值為:0,4,8,12
  56.     switch(P1)
  57.     {
  58.         case 0xE0:keyNo+=0;break;       //按鍵在第0行
  59.         case 0xD0:keyNo+=4;break;       //按鍵在第1行
  60.         case 0xB0:keyNo+=8;break;       //按鍵在第2行
  61.         case 0x70:keyNo+=12;break;      //按鍵在第3行
  62.         default: keyNo=16;            //無按鍵按下
  63.    }
  64.    return keyNo;
  65. }
  66. //-----------------------------------------------------------------
  67. // 蜂鳴器子程序         
  68. //-----------------------------------------------------------------
  69. void Beep()
  70. {
  71.         INT8U i;for (i = 0; i < 100; i++) { delay_ms(1); BEEP = ~BEEP; }
  72.         BEEP = 0;         
  73. }
  74. //-----------------------------------------------------------------
  75. // 清除密碼
  76. //-----------------------------------------------------------------
  77. void Clear_Pwd() {UserPassword[0]='\0'; DSY_BUFFER[0]='\0';                       }
  78. //-----------------------------------------------------------------
  79. // 讀取密碼字符串(以'\0'為結(jié)束標(biāo)志)
  80. //-----------------------------------------------------------------
  81. void Read_IIC_Pwd()
  82. {
  83.    INT8U i=-1;                          //因為只限于讀取存儲器前半部分,故;類型可設(shè)為INT8U
  84.    //從0x0000地址開始讀取I2C存儲器保存的密碼,長度不超過6個字符
  85.    //下面的循環(huán)最多讀取7個字符(0~6:包括密碼字符串最末尾的'\0')
  86.    do {i++;IIC_Password[i]=Random_Read(0xA0,i);}
  87.    while (IIC_Password[i]!='\0' && i<6);
  88.    //如果循環(huán)結(jié)束后未遇到結(jié)束標(biāo)志,則直接在字符串末尾補(bǔ)上結(jié)束標(biāo)志
  89.    if(IIC_Password[i]!='\0')  
  90.      IIC_Password[i]='\0';


  91. }
  92. //-----------------------------------------------------------------
  93. // 寫密碼字符串(結(jié)束標(biāo)志'\0'注意一并寫入)
  94. //-----------------------------------------------------------------
  95. void Write_IIC_Pwd()
  96. {
  97.     INT8U i=0;
  98.    //循環(huán)寫入密碼字符,字符串末尾的'\0'也要寫入,最多7個字符(0~6)
  99.    while(i<=6)
  100.    {   Write_IIC(0xA0,i,UserPassword[i]);  delay_ms(5);
  101.        if(UserPassword[i]=='\0')  break;
  102.            i++;
  103.    }
  104.    //如果循環(huán)結(jié)束時密碼字符串末尾未遇到'\0'則直接向I2C補(bǔ)充寫入'\0'
  105.    if(UserPassword[i]!='\0')         Write_IIC(0xA0,i,'\0');


  106. }
  107. //-----------------------------------------------------------------
  108. // 主程序
  109. //-----------------------------------------------------------------
  110. void main()
  111. {
  112.      INT8U i=0;
  113.    INT8U IS_Valid_User=0;
  114.    P0=0xFF; P1=0xFF; P2=0xFF;
  115.    delay_ms(10);
  116.    Initialize_LCD();                         //初始化LCD
  117.    LCD_ShowString(0,0,"Your Password...");
  118.    Read_IIC_Pwd();                          //將密碼讀入IIC_Password
  119.    while(1)
  120.    {  P1=0xF0;
  121.           if(P1!=0xF0) keyNo=Keys_Scan();       //掃描鍵盤或許鍵序號
  122.           switch(keyNo)
  123.           { case 0: case 1: case 2: case 3: case 4:
  124.             case 5: case 6: case 7: case 8: case 9:
  125.                      if(i<=5)                       //密碼不超過6位
  126.                            {  //如果i為0則執(zhí)行一次清屏
  127.                              if(i==0)          LCD_ShowString(1,0,"            ");
  128.                                  UserPassword[i]=keyNo+'0';
  129.                                  UserPassword[i+1]='\0';
  130.                                  DSY_BUFFER[i]='*';
  131.                                  DSY_BUFFER[i+1]='\0'; i++;
  132.                                  LCD_ShowString(1,0,DSY_BUFFER);
  133.                            }
  134.                            break;
  135.                  case 10://按A鍵開鎖
  136.                          Read_IIC_Pwd();            //從I2C存儲器讀取密碼
  137.                                  if(strcmp(UserPassword,IIC_Password)==0)
  138.                                  {  LED_OPEN=0;             //點亮LED
  139.                                     Clear_Pwd();
  140.                                         LCD_ShowString(1,0,"UNLOCK OK !      ");
  141.                                         IS_Valid_User=1;
  142.                                  }  
  143.                                  else
  144.                                  {  LED_OPEN=1;             //關(guān)閉LED  
  145.                                      Clear_Pwd();
  146.                                         LCD_ShowString(1,0,"ERROR !      ");
  147.                                         IS_Valid_User=0;
  148.                                  }
  149.                                  i=0;break;
  150.                  case 11://按B鍵上鎖
  151.                                  LED_OPEN=1;
  152.                                  Clear_Pwd();
  153.                                  LCD_ShowString(0,0,"YOUR PASSEORD...");
  154.                                  LCD_ShowString(1,0,"                ");
  155.                                  i=0;  IS_Valid_User=0;break;
  156.                  case 12://按C鍵設(shè)置新密碼
  157.                                  //如果是合法用戶則提示輸入新密碼
  158.                                  if(!IS_Valid_User)
  159.                                      LCD_ShowString(1,0,"NO RIGHTS  !");
  160.                                  else
  161.                                  {  i=0;                                        //密碼輸入緩沖索引歸零
  162.                                         LCD_ShowString(0,0,"NEW PASSEORD:...");
  163.                                         LCD_ShowString(1,0,"                ");
  164.                                  }
  165.                                  break;
  166.                  case 13://按D鍵保存新密碼
  167.                                  if(!IS_Valid_User)
  168.                                          LCD_ShowString(1,0,"NO RIGHTS     !");
  169.                                  else
  170.                                  {   //寫入新設(shè)置的新密碼,并重新讀回
  171.                                          Write_IIC_Pwd();delay_ms(5);Read_IIC_Pwd();
  172.                                      i=0; //密碼輸入緩沖索引歸0
  173.                                          LCD_ShowString(0,0,"YOUR PASSEORD...");
  174.                                          LCD_ShowString(1,0,"PASSWORD SAVED! ");
  175.                                  }
  176.                                  break;
  177.                  case 14://按E鍵清除所有輸入
  178.                                  i=0;          Clear_Pwd();
  179.                                  LCD_ShowString(1,0,"                ");
  180.       }
  181.           Beep();delay_ms(100); P1=0xF0;
  182.           while(P1!=0xF0);                                                //如果有鍵未釋放則等待
  183.           while(P1==0xF0);                                                //如果沒有再次按下按鍵則等待
  184.    }


  185. }



  186. 上面是主函數(shù);

  187. 接下來是1602液晶顯示函數(shù);
  188. //-----------------------------------------------------------------
  189. // 液晶控制與顯示程序
  190. //-----------------------------------------------------------------
  191. #include <reg51.h>
  192. #include <intrins.h>
  193. #define INT8U  unsigned char
  194. #define INT16U unsigned int
  195. sbit RS = P2^0;                //寄存器選擇線
  196. sbit RW = P2^1;                //讀/寫控制線
  197. sbit EN = P2^2;                //使能控制線
  198. //-----------------------------------------------------------------
  199. // 延時
  200. //-----------------------------------------------------------------
  201. void delay_ms(INT16U ms){INT8U i; while(ms--) for(i = 0; i < 120; i++);}
  202. //-----------------------------------------------------------------
  203. // 忙等待
  204. //-----------------------------------------------------------------
  205. void Busy_Wait()
  206. {
  207.    INT8U LCD_Status;
  208.     do
  209.     {
  210.        P0=0XFF;                  //液晶屏端口初始置高電平   
  211.        EN=0;RS=0;RW=1;           //LCD禁止,選擇狀態(tài)寄存器,準(zhǔn)備讀
  212.        EN=1;LCD_Status=P0;       //LCD使能,從P0端口讀取液晶屏狀態(tài)字節(jié)
  213.        EN=0;                     //LCD禁止
  214.     }while(LCD_Status & 0x80);   //液晶屏忙繼續(xù)循環(huán)

  215. }

  216. //-----------------------------------------------------------------
  217. // 寫LCD命令
  218. //-----------------------------------------------------------------
  219. void Write_LCD_Command(INT8U cmd)
  220. {
  221.     Busy_Wait();                //LCD忙等待
  222.     EN=0;RS=0;RW=0;             //LCD禁止,選擇命令寄存器,準(zhǔn)備寫
  223.     P0=cmd;                     //命令字節(jié)放到LCD端口
  224.     EN=1;_nop_();EN=0;          //使能LCD,寫入后禁止LCD

  225. }

  226. //-----------------------------------------------------------------
  227. // 發(fā)送數(shù)據(jù)
  228. //-----------------------------------------------------------------
  229. void Write_LCD_Data(INT8U dat)
  230. {
  231.     Busy_Wait();                //LCD忙等待   
  232.     EN=0;RS=1;RW=0;             //LCD禁止,選擇數(shù)據(jù)寄存器,準(zhǔn)備寫
  233.     P0=dat;                     //數(shù)據(jù)字節(jié)放到LCD端口
  234.     EN=1;_nop_();EN=0;          //使能LCD,寫入后禁止LCD

  235. }

  236. //-----------------------------------------------------------------
  237. // LCD初始化
  238. //-----------------------------------------------------------------
  239. void Initialize_LCD()
  240. {
  241.     Write_LCD_Command(0x38);delay_ms(1);  //置功能,8位,雙行,5*7
  242.     Write_LCD_Command(0x01);delay_ms(1);  //清屏
  243.     Write_LCD_Command(0x06);delay_ms(1);  //字符進(jìn)入模式:屏幕不動,字符后移
  244.     Write_LCD_Command(0x0C);delay_ms(1);  //顯示開,關(guān)光標(biāo)

  245. }

  246. //-----------------------------------------------------------------
  247. // 顯示字符串
  248. //-----------------------------------------------------------------
  249. void LCD_ShowString(INT8U r, INT8U c,INT8U *str)
  250. {
  251.     INT8U i=0;                           
  252.     code INT8U DDRAM[]={0x80,0xC0};       //1602LCD兩行的起始DDRAM地址
  253.     Write_LCD_Command(DDRAM[r] | c);      //設(shè)置顯示起始位置
  254.     for(i=0;str[i]&&i<16;i++)             //輸出字符串
  255.       Write_LCD_Data(str[i]);
  256.     for(;i<16;i++)                        //不足一行時用空格填充
  257.      Write_LCD_Data(' ');

  258. }


  259. 接下來是24C04程序;
  260. //-----------------------------------------------------------------
  261. // 名稱: 24C04 IIC讀寫程序
  262. //-----------------------------------------------------------------
  263. #define INT8U  unsigned char
  264. #define INT16U unsigned int
  265. #include <reg51.h>
  266. #include <intrins.h>
  267. sbit SCL = P3^2;                //串行時鐘
  268. sbit SDA = P3^3;                //串行數(shù)據(jù)
  269. #include "I2C.h"                //IIC總線通用宏及函數(shù)
  270. //-----------------------------------------------------------------
  271. // 向指定的地址寫數(shù)據(jù)
  272. // 器件選擇碼字節(jié)格式 (其中E2,E1為片選位,A8為塊地址位)
  273. // 位: B7 B6 B5 B4 B3 B2 B1 B0
  274. // 值:  1  0  1  0 E2 E1 A8 RW
  275. //-----------------------------------------------------------------
  276. void Write_IIC(INT8U Dev_Addr,INT16U mem_addr,INT8U dat)
  277. {
  278.            IIC_Start();                                                           //啟動總線
  279.     //發(fā)送器件地址
  280.         if(mem_addr<0x0100)   IIC_WriteByte(Dev_Addr);
  281.         else                                  IIC_WriteByte(Dev_Addr | 0x02);
  282.         //寫內(nèi)存地址,或?qū)懗桑篒IC_WriteByte(men_addr&0xFF);
  283.         IIC_WriteByte(mem_addr);
  284.         IIC_WriteByte(dat);                                                   //寫數(shù)據(jù)字節(jié)
  285.         IIC_Stop();                                //總線停止

  286. }

  287. //-----------------------------------------------------------------
  288. // 從任意地址讀取數(shù)據(jù)(器件選擇碼字節(jié)參上一函數(shù)說明)
  289. //-----------------------------------------------------------------
  290. INT8U Random_Read(INT8U Dev_Addr,INT16U mem_addr)
  291. {
  292.            INT8U d;
  293.         IIC_Start();                                                           //總線啟動
  294.         //發(fā)送器件地址
  295.         if(mem_addr<0x0100)   IIC_WriteByte(Dev_Addr);
  296.         else                                  IIC_WriteByte(Dev_Addr | 0x02);
  297.         IIC_WriteByte(mem_addr);                                   //寫器件內(nèi)存地址
  298.         IIC_Start();                                                           //總線重新啟動
  299.         //內(nèi)存地址mem_addr小于256(0x0100)時,讀器件內(nèi)存前半部分
  300.         //否則讀器件內(nèi)存的后半部分,故而有器件地址有:
  301.         //Dev_Addr|0x01及Dev_Addr|0x03這兩種寫法
  302.         if(mem_addr<0x0100)   IIC_WriteByte(Dev_Addr | 0x01);//前半部分
  303.         else                                  IIC_WriteByte(Dev_Addr | 0x03);//后半部分
  304.         d=IIC_ReadByte(); IIC_NAck(); IIC_Stop();//讀取一字節(jié),非應(yīng)答,停止
  305.         return d;


  306. }
復(fù)制代碼

全部資料51hei下載地址:
電子鎖最終核定.zip (90.76 KB, 下載次數(shù): 133)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:585326 發(fā)表于 2019-8-8 10:38 | 只看該作者
運行不了
回復(fù)

使用道具 舉報

板凳
ID:593114 發(fā)表于 2019-8-12 21:16 | 只看該作者

我這邊都是可以的,hex有下載到單片機(jī)里嗎
回復(fù)

使用道具 舉報

地板
ID:639881 發(fā)表于 2019-11-20 20:01 來自手機(jī) | 只看該作者
請問樓主做實物的時候初始密碼寫入
回復(fù)

使用道具 舉報

5#
ID:744168 發(fā)表于 2020-5-17 21:27 | 只看該作者
家厲害 發(fā)表于 2019-8-12 21:16
我這邊都是可以的,hex有下載到單片機(jī)里嗎

我編譯不了,#include "I2C.h" 這個頭文件打不開
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品99久久久久久久久 | 免费精品| 偷拍自拍在线观看 | 日韩毛片中文字幕 | 五月婷六月丁香 | 亚洲 欧美 精品 | 欧美视频1 | 亚洲www. | 亚洲激情网站 | 2一3sex性hd| 色播久久 | 一级毛片观看 | www.精品国产 | 国产精品亚洲一区 | av在线一区二区三区 | 精品伦精品一区二区三区视频 | 国产一区免费 | 国产精品免费一区二区三区四区 | 一区二区不卡视频 | 亚洲精品av在线 | 国产一区二区观看 | 色在线看 | 日韩在线视频观看 | 亚洲一区 中文字幕 | 欧美精品一区二区在线观看 | 国产精品中文字幕在线播放 | 久久中文字幕一区 | 欧美阿v| 日韩二| 妞干网视频| 日韩欧美在线观看 | 亚洲啪啪 | 欧美精品久久 | 亚洲视频中文字幕 | 香蕉二区| 午夜影院网站 | 欧美高清成人 | 人人亚洲 | 午夜在线电影网 | 国产第一页在线观看 | 不卡一二三区 |