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

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

QQ登錄

只需一步,快速開(kāi)始

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

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:408617 發(fā)表于 2018-10-12 15:53 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
由于放假?zèng)]有準(zhǔn)備,現(xiàn)在做了發(fā)現(xiàn)IIC總線不會(huì)用,對(duì)1602液晶和同類的手冊(cè)可以看懂也會(huì)使用。不用24存儲(chǔ),所以就沒(méi)有密碼更改的功能。還有,看其他的資料,在使用IIC總線14芯片時(shí),有的使用  .BIN文件,不理解。

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


根據(jù)設(shè)定好的密碼, 采用六個(gè)按鍵實(shí)現(xiàn)密碼的輸入功能
當(dāng)密碼輸入完后,按確認(rèn)鍵驗(yàn)證,正確之后,鎖就打開(kāi)
如果輸入的三次的密碼不正確, 就鎖定按鍵 3 秒鐘
同時(shí)發(fā)出報(bào)警聲,直到?jīng)]有按鍵按下 3 秒后
才打開(kāi)按鍵鎖定功能否則在 3 秒鐘內(nèi)仍有按鍵按下,就重新鎖

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

單片機(jī)源程序如下:
  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;                                //按鍵次數(shù)
  17. uchar Wrong=0;                         //錯(cuò)誤次數(shù)
  18. uchar Count=0;                          //開(kāi)鎖次數(shù)
  19. uchar Timer=0;                           //中斷計(jì)數(shù)器
  20. uchar k=0;                                         //數(shù)組累加        
  21. uchar Sure_temp,Cancel_temp;//保存按下確認(rèn)鍵和取消鍵P1的值

  22. /**************************各數(shù)組定義*******************************/
  23. //按鍵次數(shù)碼表
  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};         //按鍵數(shù)值緩存數(shù)組
  31. uchar Buffer_Reset[]={0,0,0,0,0,0};        //重置密碼緩存
  32. uchar Passedword[]={0,0,0,0,0,0};//密碼數(shù)組                         (這里開(kāi)始出廠密碼為比賽日期201657)
  33. /*************************************************/

  34. //聲光報(bào)警
  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液晶顯示器初始化函數(shù)********************/
  52. void write_com(uchar com)
  53. {
  54.         lcdrs=0;                   //發(fā)送指令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;                  //發(fā)送數(shù)據(jù)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);         //設(shè)置16*2顯示,5*7點(diǎn)陣,8為顯示
  77.         Delay(1);
  78.         write_com(0x0c);        //設(shè)置開(kāi)顯示,不顯示光標(biāo)
  79.         Delay(1);
  80.         write_com(0x06);        //寫一個(gè)字符后地址指針加1
  81.         Delay(1);
  82.         write_com(0x01);        //顯示清0,數(shù)據(jù)指針清0
  83.         Delay(1);
  84. }
  85. void write_string(uchar *str)
  86. {
  87.         uchar i;
  88.         write_com(0x80);                                 //第一行顯示,主要用于密碼重置時(shí)的提示
  89.         for(i=0;i<strlen(str);i++)
  90.         {
  91.                  write_data(str[i]);        
  92.         }        
  93. }
  94. /****************IIC24C04A初始化函數(shù)****************************/


  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. /********************按鍵處理函數(shù)***********************/
  157. //確認(rèn)鍵處理 按鍵檢測(cè)
  158. void Sure_Key()
  159. {        
  160.         uchar flag;
  161.         uchar i;
  162.         write_com(0x80);                                                 //第一行0x80+0x00
  163.         write_data(Count_Table[Count++]);                                           //顯示輸入次數(shù)
  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.         //結(jié)果處理
  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);}                 //正確綠燈亮,鎖打開(kāi)
  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);}         //錯(cuò)誤則聲光報(bào)警
  174.         if(Wrong==3) {Sure_temp=P1;TR0=1;Wrong=0;}                        //錯(cuò)誤三次則鎖定鍵盤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. //重置確認(rèn)鍵
  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.         /*                 最初的想法是用一個(gè)按鍵來(lái)進(jìn)行重置鍵處理
  214.         uchar state=1;          //重置按鍵第一次為判斷是否與老密碼一樣,第二次進(jìn)行新密碼的保存
  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. /**************************按鍵掃描函數(shù)***********************************/
  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;         //確認(rèn)
  263.                                 case 11:Cancel_Key();break;         //取消
  264.                                 case 12:Reset_Key();break;         //重置
  265.                                 case 13:Reset_Sure_Key();break;//重置確認(rèn)
  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. //************************主函數(shù)************************//
  282. void main()
  283. {        
  284.         uchar i;
  285.         lcd_initial();
  286.         P0=0x3f;//次數(shù)默認(rèn)為0
  287.         P2=0XFF;//初始全關(guān)
  288.         TMOD=0X01;               
  289.         TH0=(65536-50000)/256;               
  290.         TL0=(65536-50000)%256;
  291.         EA=1;
  292.         ET0=1;                                                 //密碼錯(cuò)誤定時(shí)器中斷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. //定時(shí)器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秒內(nèi)無(wú)按鍵則回復(fù)正常
  315.                 if(Timer==60){Timer=0;Beep=0;Red=1;TR0=0;}
  316. }
復(fù)制代碼


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


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久亚洲一区二区 | 少妇一级淫片免费播放 | 精品一区二区三区在线视频 | 中文字幕成人免费视频 | 欧美一区二区三区在线观看 | 国产一区在线视频 | 亚洲免费高清 | 久久小视频 | 久久精品久久久 | 喷水毛片 | 欧美高清性xxxxhdvideosex | 国产亚洲成av人在线观看导航 | 少妇一区二区三区 | www.狠狠干| 久久久激情视频 | 午夜影院视频在线观看 | 久久久久国产精品人 | 在线天堂免费中文字幕视频 | 草久在线视频 | 欧美老少妇一级特黄一片 | 久久四虎 | 国产精品视频在线播放 | 欧美日本在线观看 | 国产一区二区三区在线观看免费 | 日韩免费三级 | 天天干免费视频 | 日韩欧美国产电影 | 欧美日韩精品区 | 日韩欧美国产一区二区 | 91久久精品国产91久久性色tv | 一级a性色生活片久久毛片 午夜精品在线观看 | 久久精品久久久久久 | 99精品视频免费在线观看 | 国产亚洲精品91 | 亚洲一区二区中文字幕 | 久草高清视频 | 成人乱人乱一区二区三区软件 | 欧美色综合一区二区三区 | 七七婷婷婷婷精品国产 | 黄色一级大片视频 | 色又黄又爽网站www久久 |