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

QQ登錄

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

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

可以改密碼的單片機(jī)電子密碼鎖

[復(fù)制鏈接]
ID:104835 發(fā)表于 2016-2-2 04:12 | 顯示全部樓層 |閱讀模式
   4*4鍵盤輸入,可以更改密碼,有24C02存儲(chǔ)密碼。我用的是6位。也可以多幾位,更改相應(yīng)變量即可。很簡(jiǎn)單。24C02里面我事先寫入了初始密碼2 3 4 6 7  0  。調(diào)試成功,可以直接用。STC89C51RC單片機(jī) ,萬(wàn)能板焊接
  1. #include<REG52.H>
  2. #include <intrins.H>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. char code SKEY[16]={4,8,11,15,3,7,10,14,2,6,0,13,1,5,9,12};
  6. char code act[4]={0xfe,0xfd,0xfb,0xf7};
  7. char data rd[6]={1,9,8,5,1,1};
  8. char ct=0;
  9. sbit contel=P2^1;
  10. sbit cin=P0^3;
  11. sbit set=P0^4;
  12. sbit wrong=P0^5;  
  13. sbit SDA=P2^6;
  14. sbit SCL=P2^7;
  15. bdata char com_data;
  16. sbit mos_bit=com_data^7;
  17. sbit low_bit=com_data^0;
  18. void delay_iic(int n);
  19. uchar rd_24c01(char a);
  20. void wr_24c01(char a,char b);
  21. void wtsec();
  22. /**************************************/
  23. void delay_iic(int n)
  24. {
  25. int i;
  26. for(i=1;i<n;i++){}
  27. }
  28. void delay(unsigned int k)
  29. {
  30. unsigned int data i,j;
  31. for(i=0;i<k;i++)
  32. {
  33. for(j=0;j<121;j++)
  34. {;}
  35. }
  36. }
  37. //*************************************
  38. void start()
  39. {
  40. SDA=1;_nop_();_nop_();_nop_();_nop_();
  41. SCL=1;_nop_();_nop_();_nop_();_nop_();
  42. SDA=0;_nop_();_nop_();_nop_();_nop_();
  43. SCL=0;_nop_();_nop_();_nop_();_nop_();
  44. }
  45. //*****************************************
  46. void stop()
  47. {
  48. SDA=0;_nop_();_nop_();_nop_();_nop_();
  49. SCL=1;_nop_();_nop_();_nop_();_nop_();
  50. SDA=1;_nop_();_nop_();_nop_();_nop_();
  51. }
  52. //***********************
  53. void ack()
  54. {
  55. SCL=1;_nop_();_nop_();_nop_();_nop_();
  56. SCL=0;_nop_();_nop_();_nop_();_nop_();
  57. }
  58. //***********************
  59. void shift8(char a)
  60. {
  61. data uchar i;
  62. com_data=a;
  63. for(i=0;i<8;i++)
  64. {
  65. SDA=mos_bit;
  66. SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  67. SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  68. com_data=com_data*2;
  69. }
  70. }
  71. //******************
  72. uchar rd_24c01(char a)
  73. {
  74. data uchar i,command;
  75. SDA=1;_nop_();_nop_();_nop_();_nop_();
  76. SCL=0;_nop_();_nop_();_nop_();_nop_();
  77. start();
  78. command=160;
  79. shift8(command);
  80. ack();
  81. shift8(a);
  82. ack();
  83. start();
  84. command=161;
  85. shift8(command);
  86. ack();
  87. SDA=1;_nop_();_nop_();_nop_();_nop_();
  88. for(i=0;i<8;i++)
  89. {
  90. com_data=com_data*2;
  91. SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  92. low_bit=SDA;
  93. SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  94. }
  95. stop();
  96. return(com_data);
  97. }
  98. //*****************
  99. void wr_24c01(char a,char b)
  100. {
  101. data uchar command;
  102. _nop_();_nop_();_nop_();_nop_();_nop_();
  103. SDA=1;_nop_();_nop_();_nop_();_nop_();
  104. SCL=0;_nop_();_nop_();_nop_();_nop_();
  105. start();
  106. command=160;
  107. shift8(command);
  108. ack();
  109. shift8(a);
  110. ack();
  111. shift8(b);
  112. ack();
  113. stop();
  114. _nop_();_nop_();_nop_();_nop_();_nop_();
  115. }
  116. //鍵盤掃描
  117. char scan_key(void)
  118. {
  119. char i,j,in,ini=0,inj=0,temp,del;
  120. bit find=0;
  121. P1=0x0f;
  122. temp=P1;
  123. if(temp!=0x0f)        //按鍵有松開(kāi)過(guò)
  124. for(del=10;del>0;del--);     //鍵盤去抖延遲
  125. if(temp!=0x0f)
  126. {
  127. for(i=0;i<4;i++)
  128. {
  129. P1=act[i];
  130. in=P1;
  131. in=in>>4;
  132. in=in|0xf0;
  133.   for(j=0;j<4;j++)
  134.   {
  135.     if(act[j]==in)
  136.     {find=1;
  137.     inj=j;ini=i;
  138.     }
  139.   }
  140. }
  141. }
  142. if(find==0)return -1;
  143. return (ini*4+inj);
  144. }
  145. //輸入函數(shù)
  146. void put_secret()
  147. {
  148. char wrt[6];
  149. char et,ft;
  150. char wt,x=1;
  151. char *p,*t;
  152. p=rd;
  153. t=wrt;
  154. for(wt=0;wt<6;)
  155. {
  156. et=scan_key();
  157. if(et!=-1)
  158. {
  159. wrt[wt]=SKEY[et];
  160. wt=wt+x;
  161. cin=0;
  162. delay(200);
  163. cin=1;
  164. }
  165. }
  166. ct=0;
  167. for (ft=0;ft<6;)
  168. {
  169. if(wrt==rd)
  170. {ct=ct+x; }
  171. ft=ft+x;
  172. }
  173. if(ct==6)
  174. contel=1;
  175. else
  176. wrong=0;
  177. }
  178. void  wtsec()
  179.   {
  180. char t[6];
  181. char e,f,i=10;
  182. char w,x=1;
  183. char *m,*n;
  184. m=rd;
  185. n=t;
  186. for(w=0;w<6;)
  187. {
  188. e=scan_key();
  189. if(e!=-1)
  190. {
  191. t[w]=SKEY[e];
  192. w=w+x;
  193. cin=0;
  194. delay(200);
  195. cin=1;
  196. }      
  197. }
  198. for (f=0;f<6;)
  199. {
  200. wr_24c01(i,t[f]);
  201. delay_iic(250);
  202. rd[f]=rd_24c01(i);
  203. delay_iic(250);
  204. f=f+x;
  205. i=i+x;
  206. }      
  207.   }
  208. //============================
  209. void main(void)
  210. {
  211. char c,f, key_val,x=1,ii=10;
  212. contel=0;
  213. wrong=1;
  214. cin=1;
  215. set=0;
  216. delay(2000);
  217. for (f=0;f<6;)
  218. {
  219. rd[f]=rd_24c01(ii);
  220. delay_iic(250);
  221. f=f+x;
  222. ii=ii+x;
  223. }
  224. set=1;
  225. delay(1000);
  226. while(1)
  227. {  
  228. c=scan_key();
  229.    if(c!=-1)
  230.    key_val=SKEY[c];
  231.    switch(key_val)  
  232.     {  
  233.    case 12:cin=0;delay(1000);cin=1;put_secret();break ;
  234.       case 13:ct=0;wrong=1;contel=0;cin=1;set=1;break;  
  235.       case 14:if(ct==6){set=0;wtsec();set=1;} set=1;ct=0;break;
  236.       default:break;
  237. }
  238. }
  239. }
復(fù)制代碼

    //實(shí)驗(yàn)板上24C02已寫入數(shù)據(jù) {2,3,4,6,7,0}

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:121495 發(fā)表于 2016-5-21 13:51 | 顯示全部樓層
有沒(méi)有仿真圖  或者原理圖呢
回復(fù)

使用道具 舉報(bào)

ID:234643 發(fā)表于 2017-9-28 10:37 | 顯示全部樓層
有圖嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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