单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 411|回复: 1
收起左侧

多功能电子密码锁(LCD显示+矩阵按键+24C02存储+报警)

[复制链接]
攀越高峰 发表于 2019-9-21 16:56 | 显示全部楼层 |阅读模式
要求:
1.  本设计为了防止密码被窃取要求在输入密码时在LCD屏幕上显示*号;
2.  设计开锁密码位六位密码的电子密码锁;
3.  能够LCD显示在密码正确时显示OPEN,密码错误时显示 ERROR,输入密码时显示INPUT  PASSWORD;
4.  实现输入密码错误超过限定的三次电子密码锁定;
5.  4×4的矩阵键盘其中包括0-9的数字键和确认、重设、清除以及关锁功能键;
6.  本产品具备报警功能,当输入密码错误时蜂鸣器响并且LED灯亮;
7.  密码可以由用户自己修改设定(只支持6位密码),修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作;

仿真图:
1.jpg
开锁运行图.jpg
程序:
  1. voidStart(void)

  2. {

  3. Sda=1;

  4. Scl=1;

  5. Nop();

  6. Sda=0;

  7. Nop();

  8. }

  9. voidStop(void)

  10. {

  11. Sda=0;

  12. Scl=1;

  13. Nop();

  14. Sda=1;

  15. Nop();

  16. }

  17. voidAck(void)

  18. {

  19. Sda=0;

  20. Nop();

  21. Scl=1;

  22. Nop();

  23. Scl=0;

  24. }

  25. voidNoAck(void)

  26. {

  27. Sda=1;

  28. Nop();

  29. Scl=1;

  30. Nop();

  31. Scl=0;

  32. }

  33. voidSend(uchar Data)

  34. {

  35. ucharBitCounter=8;

  36. uchartemp;

  37. do

  38. {

  39. temp=Data;

  40. Scl=0;

  41. Nop();

  42. if((temp&0x80)==0x80)

  43. Sda=1;

  44. else

  45. Sda=0;

  46. Scl=1;

  47. temp=Data<<1;

  48. Data=temp;

  49. BitCounter--;

  50. }

  51. while(BitCounter);

  52. Scl=0;

  53. }

  54. ucharRead(void)

  55. {

  56. uchar temp=0;

  57. uchar temp1=0;

  58. uchar BitCounter=8;

  59. Sda=1;

  60. do

  61. {

  62. Scl=0;

  63. Nop();

  64. Scl=1;

  65. Nop();

  66. if(Sda)

  67. temp=temp|0x01;

  68. else

  69. temp=temp&0xfe;

  70. if(BitCounter-1)

  71. {

  72. temp1=temp<<1;

  73. temp=temp1;

  74. }

  75. BitCounter--;

  76. }

  77. while(BitCounter);

  78. return(temp);

  79. }

  80. voidWrToROM(uchar Data[],uchar Address,uchar Num)

  81. {

  82. uchar i;

  83. uchar *PData;

  84. PData=Data;

  85. for(i=0;i<Num;i++)

  86. {

  87. Start();

  88. Send(0xa0);

  89. Ack();

  90. Send(Address+i);

  91. Ack();

  92. Send(*(PData+i));

  93. Ack();

  94. Stop();

  95. mDelay(20);

  96. }

  97. }

  98. voidRdFromROM(uchar Data[],uchar Address,uchar Num)

  99. {

  100. uchar i;

  101. uchar *PData;

  102. PData=Data;

  103. for(i=0;i<Num;i++)

  104. {

  105. Start();

  106. Send(0xa0);

  107. Ack();

  108. Send(Address+i);

  109. Ack();

  110. Start();

  111. Send(0xa1);

  112. Ack();

  113. *(PData+i)=Read();

  114. Scl=0;

  115. NoAck();

  116. Stop();

  117. }

  118. }

  119. #defineyi 0x80

  120. #defineer 0x80+0x40

  121. voiddelay(uint xms)

  122. {

  123. uint x,y;

  124. for(x=xms;x>0;x--)

  125. for(y=110;y>0;y--);

  126. }

  127. voidwrite_1602com(uchar com)

  128. {

  129. lcd1602_rs=0;

  130. lcd1602_rw=0;

  131. P0=com;

  132. delay(1);

  133. lcd1602_en=1;

  134. delay(1);

  135. lcd1602_en=0; }

  136. voidwrite_1602dat(uchar dat)

  137. {

  138. lcd1602_rs=1;

  139. lcd1602_rw=0;

  140. P0=dat;

  141. delay(1);

  142. lcd1602_en=1;

  143. delay(1);

  144. lcd1602_en=0;

  145. }

  146. voidlcd_init(void)

  147. {

  148. write_1602com(0x38);

  149. write_1602com(0x0c);

  150. write_1602com(0x06);

  151. write_1602com(0x01);

  152. }

  153. unsignedchar coding(unsigned char m)

  154. {

  155. unsigned char k;

  156. switch(m)

  157. {

  158. case (0x11): k=1;break;

  159. case (0x21): k=2;break;

  160. case (0x41): k=3;break;

  161. case (0x81): k='A';break;

  162. case (0x12): k=4;break;

  163. case (0x22): k=5;break;

  164. case (0x42): k=6;break;

  165. case (0x82): k='B';break;

  166. case (0x14): k=7;break;

  167. case (0x24): k=8;break;

  168. case (0x44): k=9;break;

  169. case (0x84): k='C';break;

  170. case (0x18): k='*';break;

  171. case (0x28): k=0;break;

  172. case (0x48): k='#';break;

  173. case (0x88): k='D';break;

  174. }

  175. return(k);

  176. }

  177. unsignedchar keynum(void)

  178. {

  179. unsignedchar row,col,i;

  180. P1=0xf0;

  181. if((P1&0xf0)!=0xf0)

  182. {

  183. Delay5Ms();

  184. Delay5Ms();

  185. if((P1&0xf0)!=0xf0)

  186. {

  187. row=P1^0xf0;

  188. i=0;

  189. P1=a;

  190. while(i<4)

  191. {

  192. if((P1&0xf0)!=0xf0)

  193. {

  194. col=~(P1&0xff);

  195. break;

  196. }

  197. else

  198. {

  199. i++;

  200. P1=a;

  201. }

  202. }

  203. }

  204. else

  205. {

  206. return 0;

  207. }

  208. while((P1&0xf0)!=0xf0);

  209. return (row|col);

  210. }

  211. elsereturn 0;

  212. }

  213. //=====一声提示音,表示有效输入=====//

  214. voidOneAlam(void)

  215. {

  216. ALAM=0;

  217. Delay5Ms();

  218. ALAM=1;

  219. }

  220. //======二声提示音,表示操作成功=====//

  221. voidTwoAlam(void)

  222. {

  223. ALAM=0;

  224. Delay5Ms();

  225. ALAM=1;

  226. Delay5Ms();

  227. ALAM=0;

  228. Delay5Ms();

  229. ALAM=1;

  230. }

  231. //======三声提示音,表示错误==========//

  232. voidThreeAlam(void)

  233. {

  234. ALAM=0;

  235. Delay5Ms();

  236. ALAM=1;

  237. Delay5Ms();

  238. ALAM=0;

  239. Delay5Ms();

  240. ALAM=1;

  241. Delay5Ms();

  242. ALAM=0;

  243. Delay5Ms();

  244. ALAM=1;

  245. }

  246. //========显示提示输入========//

  247. voidDisplayChar(void)

  248. {

  249. unsigned char i;

  250. if(pass==1)

  251. {

  252. write_1602com(er);

  253. for(i=0;i<16;i++)

  254. {

  255. write_1602dat(LockOpen); }

  256. }

  257. else

  258. {

  259. if(N==0)

  260. {

  261. //DisplayListChar(0,1,Error);

  262. write_1602com(er);

  263. for(i=0;i<16;i++)

  264. {

  265. write_1602dat(Error);

  266. }

  267. }

  268. else

  269. {

  270. write_1602com(er);

  271. for(i=0;i<16;i++)

  272. {

  273. write_1602dat(start_line);

  274. }

  275. }

  276. }

  277. }

  278. //=====重置密码=======//

  279. voidResetPassword(void)

  280. {

  281. unsigned char i;

  282. unsigned char j;

  283. if(pass==0)

  284. {

  285. pass=0;

  286. DisplayChar();

  287. ThreeAlam();

  288. }

  289. else

  290. {

  291. if(ReInputEn==1)

  292. {

  293. if(N==6)

  294. {

  295. ReInputCont++;

  296. if(ReInputCont==2)

  297. {

  298. for(i=0;i<6;)

  299. {

  300. if(TempPassword==InputData)

  301. i++;

  302. else

  303. {

  304. //DisplayListChar(0,1,Error);

  305. write_1602com(er);

  306. for(j=0;j<16;j++)

  307. {

  308. write_1602dat(Error[j]);

  309. }

  310. ThreeAlam();

  311. pass=0;

  312. ReInputEn=0;

  313. ReInputCont=0;

  314. DisplayChar();

  315. break;

  316. }

  317. }

  318. if(i==6)

  319. {

  320. //DisplayListChar(0,1,ResetOK);

  321. write_1602com(er);

  322. for(j=0;j<16;j++)

  323. {

  324. write_1602dat(ResetOK[j]);

  325. }

  326. TwoAlam();

  327. WrToROM(TempPassword,0,6);

  328. ReInputEn=0;

  329. }

  330. ReInputCont=0;

  331. CorrectCont=0;

  332. }

  333. else

  334. {

  335. OneAlam();

  336. //DisplayListChar(0, 1,again);

  337. write_1602com(er);

  338. for(j=0;j<16;j++)

  339. {

  340. write_1602dat(again[j]);

  341. }

  342. for(i=0;i<6;i++)

  343. {

  344. TempPassword=InputData;

  345. }

  346. }

  347. N=0;

  348. }

  349. }

  350. }

  351. }
复制代码

文档:
基于LCD1602和AT24C02的单片机多功能电子密码锁设计.doc (1.68 MB, 下载次数: 15)
回复

使用道具 举报

microhl 发表于 2019-9-27 14:24 | 显示全部楼层
相当有借鉴价值的资料,谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|单片机论坛 |51黑电子论坛技术交流 QQ 管理员QQ:125739409;技术交流QQ群636986012

Powered by 单片机教程网

快速回复 返回顶部 返回列表