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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機24C04密碼鎖(C程序+Proteus仿真)

[復制鏈接]
跳轉到指定樓層
樓主
由于放假沒有準備,現在做了發現IIC總線不會用,對1602液晶和同類的手冊可以看懂也會使用。不用24存儲,所以就沒有密碼更改的功能。還有,看其他的資料,在使用IIC總線14芯片時,有的使用  .BIN文件,不理解。

24C04密碼鎖仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


根據設定好的密碼, 采用六個按鍵實現密碼的輸入功能
當密碼輸入完后,按確認鍵驗證,正確之后,鎖就打開
如果輸入的三次的密碼不正確, 就鎖定按鍵 3 秒鐘
同時發出報警聲,直到沒有按鍵按下 3 秒后
才打開按鍵鎖定功能否則在 3 秒鐘內仍有按鍵按下,就重新鎖

初值密碼2 0 1 6 5 7
重置密碼在輸入正確的原始密碼后
提示輸入新密碼后按重置保存按鍵保存密碼

單片機源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include<string.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define NOP4() {_nop_();_nop_();_nop_();_nop_();}
  7. sbit lcdrs=P2^0;                         //1602液晶控制端
  8. sbit lcdrw=P2^1;
  9. sbit lcden=P2^2;
  10. sbit Beep=P2^3;
  11. sbit Red=P2^4;
  12. sbit Green=P2^5;
  13. sbit Lamp=P2^6;

  14. sbit SCL=P3^0;
  15. sbit SDA=P3^1;

  16. uchar num=0;                                //按鍵次數
  17. uchar Wrong=0;                         //錯誤次數
  18. uchar Count=0;                          //開鎖次數
  19. uchar Timer=0;                           //中斷計數器
  20. uchar k=0;                                         //數組累加        
  21. uchar Sure_temp,Cancel_temp;//保存按下確認鍵和取消鍵P1的值

  22. /**************************各數組定義*******************************/
  23. //按鍵次數碼表
  24. uchar code Count_Table[]="123456789";
  25. //鍵盤特征碼
  26. uchar code Key_Table[]={0xee,0xde,0xbe,0x7e,
  27.                                                   0xed,0xdd,0xbd,0x7d,
  28.                                                   0xeb,0xdb,0xbb,0x7b,
  29.                                                   0xe7,0xd7,0xb7,0x77};        
  30. uchar Buffer[]={0,0,0,0,0,0};         //按鍵數值緩存數組
  31. uchar Buffer_Reset[]={0,0,0,0,0,0};        //重置密碼緩存
  32. uchar Passedword[]={0,0,0,0,0,0};//密碼數組                         (這里開始出廠密碼為比賽日期201657)
  33. /*************************************************/

  34. //聲光報警
  35. void Alarm()
  36. {
  37.         uchar i;
  38.         Red=0;
  39.         for(i=0;i<120;i++)
  40.         {
  41.                 Beep=~Beep;
  42.                 Delay(2);               
  43.         }
  44. }
  45. void Delay(uchar z)
  46. {
  47.         uchar x,y;
  48.         for(x=z;x>0;x--)
  49.                 for(y=110;y>0;y--);
  50. }
  51. /**********************1602液晶顯示器初始化函數********************/
  52. void write_com(uchar com)
  53. {
  54.         lcdrs=0;                   //發送指令RS置低電平
  55.         lcdrw=0;
  56.         P0=com;
  57.         Delay(5);
  58.         lcden=1;
  59.         Delay(5);
  60.         lcden=0;
  61. }
  62. void write_data(uchar dat)
  63. {
  64.         lcdrs=1;                  //發送數據RS置高電平
  65.         lcdrw=0;
  66.         P0=dat;
  67.         Delay(5);
  68.         lcden=1;                  //EN向下脈沖
  69.         Delay(5);
  70.         lcden=0;
  71. }
  72. void lcd_initial()
  73. {
  74.         lcden=0;
  75.         lcdrw=0;
  76.         write_com(0x38);         //設置16*2顯示,5*7點陣,8為顯示
  77.         Delay(1);
  78.         write_com(0x0c);        //設置開顯示,不顯示光標
  79.         Delay(1);
  80.         write_com(0x06);        //寫一個字符后地址指針加1
  81.         Delay(1);
  82.         write_com(0x01);        //顯示清0,數據指針清0
  83.         Delay(1);
  84. }
  85. void write_string(uchar *str)
  86. {
  87.         uchar i;
  88.         write_com(0x80);                                 //第一行顯示,主要用于密碼重置時的提示
  89.         for(i=0;i<strlen(str);i++)
  90.         {
  91.                  write_data(str[i]);        
  92.         }        
  93. }
  94. /****************IIC24C04A初始化函數****************************/


  95. void Start()
  96. {
  97.          SDA=1;SCL=1;NOP4();SDA=0;NOP4();SCL=0;
  98. }

  99. void Stop()
  100. {
  101.          SDA=0;SCL=0;NOP4();SCL=1;NOP4();SDA=1;NOP4();
  102. }

  103. void RACK()
  104. {
  105.          SDA=1;NOP4();SCL=1;NOP4();SCL=0;
  106. }

  107. void NO_ACK()
  108. {
  109.          SDA=1;SCL=1;NOP4();SCL=0;SDA=0;
  110. }

  111. void Write_A_Byte(uchar b)
  112. {
  113.          uchar i;
  114.         for(i=0;i<8;i++)
  115.         {
  116.                  b<<=1;SDA=CY;_nop_();SCL=1;NOP4();SCL=0;
  117.         }
  118.         RACK();
  119. }

  120. uchar Receive_A_Byte()
  121. {
  122.          uchar i,d;
  123.         for(i=0;i<8;i++)
  124.         {
  125.                  SCL=1;d<<=1;d|=SDA;SCL=0;
  126.         }
  127.         return d;
  128. }

  129. void Write_Random_Address_Byte(uchar add,uchar dat)
  130. {
  131.          Start();
  132.         Write_A_Byte(0xa0);
  133.         Write_A_Byte(add);
  134.         Write_A_Byte(dat);
  135.         Stop();
  136.         Delay(10);
  137. }

  138. uchar Read_Current_Address_Data()
  139. {
  140.          uchar d;
  141.         Start();
  142.         Write_A_Byte(0xa1);
  143.         d=Receive_A_Byte();
  144.         NO_ACK();
  145.         Stop();
  146.         return d;
  147. }

  148. uchar Random_Read(uchar addr)
  149. {
  150.          Start();
  151.         Write_A_Byte(0xa0);
  152.         Write_A_Byte(addr);
  153.         Stop();
  154.         return Read_Current_Address_Data();               
  155. }
  156. /********************按鍵處理函數***********************/
  157. //確認鍵處理 按鍵檢測
  158. void Sure_Key()
  159. {        
  160.         uchar flag;
  161.         uchar i;
  162.         write_com(0x80);                                                 //第一行0x80+0x00
  163.         write_data(Count_Table[Count++]);                                           //顯示輸入次數
  164.         Delay(200);
  165.         if(Count>=10){P0=0XC0;Count=0;}
  166.         for(i=0;i<6;i++)
  167.         {
  168.                 if(Buffer[i]==Passedword[i]){flag=1;continue;}
  169.                 else {flag=0;break;}
  170.         }
  171.         //結果處理
  172.         if(flag==1){k=0;Green=0;Lamp=0;Red=1;write_com(0x80+0x40);for(i=0;i<16;i++)write_data('\0');Delay(200);}                 //正確綠燈亮,鎖打開
  173.         else {k=0;Alarm();Wrong++;Green=1;Lamp=1;write_com(0x80+0x40);for(i=0;i<16;i++)write_data('\0');Delay(200);}         //錯誤則聲光報警
  174.         if(Wrong==3) {Sure_temp=P1;TR0=1;Wrong=0;}                        //錯誤三次則鎖定鍵盤3秒鐘
  175. }
  176. //取消鍵處理
  177. void Cancel_Key()
  178. {        
  179.         uchar i;
  180.         k=0;
  181.         for(i=0;i<6;i++)Buffer[i]=0;Delay(100);
  182.         write_com(0x80+0x40);
  183.         for(i=0;i<16;i++)write_data('\0');
  184. }
  185. //鎖定鍵
  186. void Lock()
  187. {
  188.         uchar i;
  189.         k=0;Alarm();Green=1;Lamp=1;Delay(200);
  190.         Cancel_Key();        
  191. }
  192. //清屏鍵
  193. void Clear_Lcd()
  194. {
  195.         k=0;Cancel_Key();
  196.         write_com(0x01);
  197. }
  198. //重置鍵
  199. void Reset_Key()
  200. {
  201.         uchar i;
  202.         k=0;
  203.         write_com(0x10);
  204.         write_string("Input Passedword:");
  205. }
  206. //重置確認鍵
  207. void Reset_Sure_Key()
  208. {
  209.         uchar i,flag;
  210.         for(i=0;i<6;i++){if(Buffer[i]==Passedword[i]){flag=1;continue;}        else {flag=0;break;}}//輸入老密碼并判斷
  211.                                         if(flag==1)        {write_com(0x01);write_string("Input Newword:");Cancel_Key();}
  212.                                         else {Reset_Key();}
  213.         /*                 最初的想法是用一個按鍵來進行重置鍵處理
  214.         uchar state=1;          //重置按鍵第一次為判斷是否與老密碼一樣,第二次進行新密碼的保存
  215.         state=~state;          //初始為state=1;
  216.         k=0;
  217.         switch(state)
  218.         {
  219.                 case 0:                for(i=0;i<6;i++)                                                                                  //輸入老密碼并判斷
  220.                                         {if(Buffer[i]==Passedword[i]){flag=1;continue;}
  221.                                         else {flag=0;break;}}
  222.                                         if(flag==1)        {write_com(0x01);write_string("Input Newword:");}
  223.                                         else {state=~state;Reset_Key();}break;
  224.                 case 1:     if(flag==1)        {for(i=0;i<6;i++)                                                          //老密碼正確再保存新密碼
  225.                                                                 Write_Random_Address_Byte(i,Buffer[i]);}
  226.         }
  227.         */
  228. }
  229. //重置保存
  230. void Reset_Save()
  231. {
  232.         uchar i;
  233.         k=0;
  234.         for(i=0;i<6;i++) Write_Random_Address_Byte(i,Buffer[i]); //老密碼正確再保存新密碼
  235.         for(i=0;i<6;i++)Passedword[i]=Random_Read(i);
  236.         write_com(0x01);write_string("Succeed!");Delay(1000);write_com(0x01);
  237.                
  238.                                                         
  239. }
  240. /**************************按鍵掃描函數***********************************/
  241. //按鍵掃描
  242. void Key_Play()
  243. {        
  244.         uchar i=0;
  245.         uchar num;
  246.         uchar temp;
  247.         uchar Key,c;
  248.         P1=0xf0;
  249.         if(P1!=0xf0)
  250.         {
  251.                 Delay(5);
  252.                 if(P1!=0xf0)
  253.                 {
  254.                         temp=P1;
  255.                         P1=0x0f;
  256.                         Key=temp|P1;
  257.                         for(i=0;i<16;i++)
  258.                         if(Key==Key_Table[i]) {num=i;break;}
  259.                         Buffer[k++]=num;
  260.                         switch(num)
  261.                         {
  262.                                 case 10:Sure_Key();break;         //確認
  263.                                 case 11:Cancel_Key();break;         //取消
  264.                                 case 12:Reset_Key();break;         //重置
  265.                                 case 13:Reset_Sure_Key();break;//重置確認
  266.                                 case 14:Reset_Save();break;           //上鎖
  267.                                 case 15:Lock();;           //清屏
  268.                         }               
  269.                         write_com(0x80+0x40);        //第二行0x80+0x40
  270.                         for(i=0;i<k;i++)
  271.                         write_data('*');
  272.                 }
  273.                 do{                                           //等待按鍵抬起
  274.                           temp=P1;
  275.                          temp=temp&0x0f;
  276.                  }         
  277.                   while(temp!=0x0f);
  278.         }
  279. }
  280.         
  281. //************************主函數************************//
  282. void main()
  283. {        
  284.         uchar i;
  285.         lcd_initial();
  286.         P0=0x3f;//次數默認為0
  287.         P2=0XFF;//初始全關
  288.         TMOD=0X01;               
  289.         TH0=(65536-50000)/256;               
  290.         TL0=(65536-50000)%256;
  291.         EA=1;
  292.         ET0=1;                                                 //密碼錯誤定時器中斷0
  293.         for(i=0;i<6;i++)Passedword[i]=Random_Read(i);
  294.         while(1)
  295.         {        
  296.                 Key_Play();
  297.                 Delay(2);        
  298.         }
  299. }

  300. //定時器0中斷 鍵盤鎖定3秒
  301. void Inter_Timer0() interrupt 1
  302. {
  303.                 uchar temp;
  304.                 Timer++;
  305.                 TH0=(65536-50000)/256;               
  306.                 TL0=(65536-50000)%256;
  307.                 Beep=~Beep;Delay(20);
  308.                 P1=0xf0;
  309.                 if(P1!=0xf0)
  310.                 {
  311.                         Delay(5);
  312.                         Timer=0;
  313.                 }
  314.                  //如果3秒內無按鍵則回復正常
  315.                 if(Timer==60){Timer=0;Beep=0;Red=1;TR0=0;}
  316. }
復制代碼


所有資料51hei提供下載:
實訓任務-3.zip (1.33 MB, 下載次數: 98)


評分

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

查看全部評分

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

使用道具 舉報

來自 4#
ID:719630 發表于 2020-3-31 16:52 | 只看該作者
這也太黑了吧?不但源程序與設計圖不能用,連芯片手冊的PDF文檔都是壞的?
回復

使用道具 舉報

沙發
ID:408617 發表于 2018-10-12 15:53 | 只看該作者
稍后把題目要求和具體的文檔補充
回復

使用道具 舉報

板凳
ID:719630 發表于 2020-3-31 16:49 | 只看該作者
下載了一個,但是文件被破壞
回復

使用道具 舉報

5#
ID:328014 發表于 2020-3-31 18:07 | 只看該作者
xuweiye 發表于 2020-3-31 16:52
這也太黑了吧?不但源程序與設計圖不能用,連芯片手冊的PDF文檔都是壞的?

推薦這個:http://www.zg4o1577.cn/bbs/dpj-178815-1.html
51hei搜索密碼鎖 至少有好幾百個呢
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美欧美欧美 | 久久精品91久久久久久再现 | 国产精品久久国产精品 | 久久黄色网 | 亚洲精品视频一区 | av在线免费观看网站 | 91精品国模一区二区三区 | 成年网站在线观看 | 成人性视频在线播放 | 呦呦在线视频 | 欧美综合一区二区 | 亚洲免费在线视频 | 国产真实乱全部视频 | 亚洲一区毛片 | 欧美在线资源 | 天天草天天爱 | 国产在线麻豆精品入口 | 国产精品成人久久久久 | 热久久国产 | 欧美一区2区三区3区公司 | 免费激情网站 | 亚洲一区二区三区免费在线观看 | 老子午夜影院 | 日一区二区 | 黑人精品欧美一区二区蜜桃 | 欧美黑人国产人伦爽爽爽 | h视频免费观看 | 欧美乱大交xxxxx另类电影 | 在线观看中文字幕视频 | 亚洲国产成人精品女人 | 亚洲精品国产成人 | 精品一二区 | 国产丝袜一区二区三区免费视频 | 日本精品免费在线观看 | www.久草.com | 欧美成人一级视频 | 91素人| 九九热精品视频在线观看 | 中文字幕一区二区三区精彩视频 | 在线观看www高清视频 | 国产成人精品免高潮在线观看 |