找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2394|回复: 0
收起左侧

单片机电子密码锁仿真程序 继电器表示开关

[复制链接]
ID:942360 发表于 2021-7-10 23:16 | 显示全部楼层 |阅读模式
继电器表示开关
蜂鸣器报警
密码显示
修改密码
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif

单片机源程序如下:
  1. #include<reg51.h>
  2. #define ulong unsigned long
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. uchar temp,num,flag,r;
  6. uchar code table1[]="Please        ";
  7. uchar code table2[]="enter password";
  8. uchar code table3[]="012345";
  9. uchar code table4[]="code is wrong!";
  10. uchar code table5[]="you are right!";
  11. uchar code table6[]="the second time!";
  12. uchar code table7[]="the last time!";
  13. uchar code table8[]="Input new code:";
  14. uchar code table9[]="calling.....";
  15. uchar code table10[]="password";
  16. uchar code table11[]="    ";
  17. uchar code table12[]="Modify right!!!";
  18. uchar code table13[]="Input again:";
  19. uchar code table14[]="Modify error!!!";
  20. uchar init_pswd[4]={2,3,0,5};
  21. uchar pswd[4]={0};
  22. sbit lcdrs=P2^0; //LCD数据/指令(H/L)选择端
  23. sbit lcdrw=P2^1;
  24. sbit lcden=P2^2; //LCD使能
  25. sbit P1_6=P1^6;
  26. sbit P2_6=P2^6;//报警指示灯
  27. sbit P2_7=P2^7;
  28. sbit P3_7=P3^7; //蜂鸣器
  29. /****************子函数声明*/
  30. void delay(uint z);
  31. void init();//初始化子函数
  32. void write_com(uchar com);//写指令子函数
  33. void write_data(uchar dat1);//写数据子函数
  34. uint keyscan();
  35. void mima();//密码处理子函数
  36. void mima1();//修改密码函数
  37. void Alarm(uchar t);//报警函数
  38. /***************液晶驱动*/
  39. void init()
  40. {
  41. lcden=0;
  42. write_com(0x38);
  43. write_com(0x0e);
  44. write_com(0x06);
  45. write_com(0x01);
  46. write_com(0x80);
  47. }
  48. void write_com(uchar com)
  49. {
  50. lcdrs=0;
  51. lcdrw=0;
  52. P0=com;
  53. delay(5);
  54. lcden=1;
  55. delay(5);
  56. lcden=1;
  57. delay(5);
  58. lcden=0;
  59. }
  60. void write_data(uchar dat1)
  61. {
  62. lcdrs=1;
  63. lcdrw=0;
  64. P0=dat1;
  65. delay(5);
  66. lcden=1;
  67. delay(5);
  68. lcden=0;
  69. }
  70. void delay(uint z) //延时子函数 z*1ms
  71. {
  72. uint x,y;
  73. for(x=z;x>0;x--)
  74. for(y=110;y>0;y--);
  75. }
  76. uint keyscan() //键盘扫描程序
  77. {
  78. P1=0xfe; //先选定第一行
  79. temp=P1;
  80. temp=temp&0xf8; //列线全为1,行线为0
  81. while(temp!=0xf8)
  82. {
  83. delay(15); //延时去抖
  84. temp=P1;
  85. temp=temp&0xf8;
  86. while(temp!=0xf8)
  87. {
  88. temp=P1;
  89. switch(temp) //判断哪列按下
  90. {
  91. case 0xf6:num=0;flag=1;break;//第一列按下
  92. case 0xee:num=1;flag=1;break;//第二列按下
  93. case 0xde:num=2;flag=1;break;//第三列按下
  94. }
  95. while(temp!=0xf8)
  96. {
  97. temp=P1;
  98. temp=temp&0xf8;
  99. }
  100. }
  101. }
  102. P1=0xfd; //选定第二行,列线为1
  103. temp=P1;
  104. temp=temp&0xf8;
  105. while(temp!=0xf8)
  106. {
  107. delay(15);
  108. temp=P1;
  109. temp=temp&0xf8;
  110. while(temp!=0xf8)
  111. {
  112. temp=P1;
  113. switch(temp) //判断哪列按下
  114. {
  115. case 0xf5:num=3;flag=1;//第一列按下
  116. break;
  117. case 0xed:num=4;flag=1;//第二列按下
  118. break;
  119. case 0xdd:num=5;flag=1;//第三列按下
  120. break;
  121. }
  122. while(temp!=0xf8)
  123. {
  124. temp=P1;
  125. temp=temp&0xf8;
  126. }
  127. }
  128. }
  129. P1=0xfb;//选定第三行
  130. temp=P1;
  131. temp=temp&0xf8;
  132. while(temp!=0xf8)
  133. {
  134. delay(15);
  135. temp=P1;
  136. temp=temp&0xf8;
  137. while(temp!=0xf8)
  138. {
  139. temp=P1;
  140. switch(temp)
  141. {
  142. case 0xf3:num=6;flag=1;break;
  143. case 0xeb:num=7;flag=1;break;
  144. case 0xdb:num=8;flag=1;break;
  145. }
  146. while(temp!=0xf8)
  147. {
  148. temp=P1;
  149. temp=temp&0xf8;
  150. }
  151. }
  152. }
  153. return(num);
  154. }
  155. void main()
  156. {
  157. uchar m=0,w=0;
  158. init();//LCD初始化
  159. write_com(0x80); //第一行显示
  160. for(r=0;r<15;r++)
  161. {
  162. write_data(table1[r]);
  163. delay(5);
  164. }
  165. write_com(0x80+0x40);//第二行显示
  166. for(r=0;r<15;r++)
  167. {
  168. write_data(table2[r]);
  169. delay(5);
  170. }
  171. write_com(0x0c);
  172. do
  173. {keyscan();}
  174. while(num!=8); //等待开锁键按下
  175. mima(); //密码输入处理函数
  176. while((pswd[m]==init_pswd[m])&m<4)//密码比较
  177. {
  178. m++;
  179. }
  180. if(m>=4)//密码正确
  181. {
  182. P2_7=0;//开锁指示灯亮
  183. keyscan();
  184. while(flag==1&&num==6);//是否修改密码//
  185. mima1();//修改密码函数
  186. }
  187. else//密码有误
  188. {
  189. m=0;
  190. write_com(0x80+0x40);//显示第二行
  191. for(r=0;r<14;r++)
  192. {
  193. delay(20);
  194. write_data(table4[r]);
  195. }
  196. delay(500);
  197. init();
  198. for(r=0;r<16;r++)
  199. {
  200. delay(20);
  201. write_data(table6[r]);
  202. }
  203. delay(500);
  204. mima();
  205. while((pswd[m]==init_pswd[m])&m<4)
  206. {m++;}
  207. if(m>=4)
  208. {
  209. P2_7=0;
  210. mima1();
  211. }
  212. else
  213. {
  214. m=0;
  215. write_com(0x80+0x40);
  216. for(r=0;r<14;r++)
  217. {
  218. delay(20);
  219. write_data(table4[r]);
  220. }
  221. delay(500);
  222. init();
  223. for(r=0;r<14;r++)
  224. {
  225. delay(20);
  226. write_data(table7[r]);
  227. }
  228. delay(500);
  229. mima();
  230. while((pswd[m]==init_pswd[m])&m<4)
  231. {m++;}
  232. if(m>=4)
  233. {
  234. P2_7=0;
  235. mima1();
  236. }
  237. else
  238. {
  239. init();
  240. write_com(0x80+0x40);
  241. for(r=0;r<13;r++)
  242. {
  243. delay(20);
  244. write_data(table9[r]);
  245. }
  246. write_com(0x0c);
  247. while(1)
  248. {
  249. P2_6=~P2_6;
  250. delay(30);
  251. Alarm(90);
  252. Alarm(120);
  253. }
  254. }
  255. }
  256. }
  257. }
  258. void mima()//密码输入程序
  259. {
  260. uchar w=0;
  261. init();
  262. for(r=0;r<9;r++)
  263. {
  264. delay(20);
  265. write_data(table10[r]);
  266. }
  267. do
  268. {
  269. flag=0;
  270. keyscan();
  271. write_com(0x80+9+w);
  272. if(flag==1&&num<=5)
  273. {
  274. pswd[w]=num;
  275. write_data(table3[num]);
  276. w++;//输入密码
  277. if(w==4)
  278. write_com(0x0c);
  279. }
  280. if(flag==1&&num==7) //删除误输入的密码,即返回上一步.
  281. {
  282. w--; //删除密码
  283. if(w==255)//删除完密码
  284. w=w+1;
  285. write_com(0x80+9+w);
  286. write_data(table11[w+1]);
  287. if(flag==1&&num<=3)
  288. {
  289. pswd[w]=num;
  290. write_data(table3[num]);
  291. }
  292. }
  293. }
  294. while(w<=3);
  295. }
  296. void mima1()
  297. {
  298. uchar f=0,n=0,d=0;
  299. write_com(0x80+0x40);
  300. for(r=0;r<14;r++)
  301. {
  302. delay(20);
  303. write_data(table5[r]);
  304. }
  305. delay(500);
  306. do
  307. {
  308. num=9;//按键不显示,锁住按键
  309. keyscan();
  310. }
  311. while(num!=6);
  312. if(flag==1&&num==6)
  313. {
  314. init();
  315. P2_7=0;
  316. for(r=0;r<15;r++)
  317. {
  318. delay(20);
  319. write_data(table8[r]);
  320. }
  321. write_com(0x0c);
  322. write_com(0x80+0x40+n);
  323. write_com(0x0e);
  324. }
  325. do
  326. {
  327. num=9;//按键不显示, 锁住按键
  328. keyscan();
  329. write_com(0x80+0x40+n);
  330. if(flag==1&&num<=5)
  331. {
  332. init_pswd[n]=num;
  333. write_data(table3[num]);
  334. n++;
  335. if(n==4)
  336. write_com(0x0c);
  337. }
  338. if(flag==1&&num==7)//删除 误输入的密码,即返回上一步
  339. {
  340. n--;
  341. if(n==255)
  342. n=n+1;
  343. write_com(0x80+0x40+n);
  344. write_data(table11[n]);
  345. if(flag==1&&num<=3)//显示0-5键值
  346. {
  347. pswd[n]=num;

  348. write_data(table3[num]);
  349. }
  350. }
  351. }
  352. while(n<=3);
  353. init();
  354. for(r=0;r<12;r++)
  355. {
  356. delay(20);
  357. write_data(table13[r]);
  358. }
  359. do
  360. {
  361. flag=0;//锁住按键
  362. keyscan();
  363. write_com(0x80+0x40+d);
  364. if(flag==1&&num<=5)
  365. {
  366. pswd[d]=num;
  367. write_data(table3[num]);
  368. d++;
  369. if(d==4)
  370. write_com(0x0c);
  371. }
  372. if(flag==1&&num==7)//删除误输入的密码,即返回上一步.
  373. {
  374. d--;
  375. if(d==255)
  376. d=d+1;
  377. write_com(0x80+0x40+d);
  378. write_data(table11[d+1]);
  379. if(flag==1&&num<=3)
  380. {
  381. pswd[d]=num;
  382. write_data(table3[num]);
  383. }
  384. }
  385. }
  386. while(d<=3);
  387. while((pswd[f]==init_pswd[f])&f<4)
  388. {
  389.         f++;
  390. }
  391. if(f>=4)//密码正确
  392. {
  393. init();
  394. for(r=0;r<15;r++)
  395. {
  396. ……………………

  397. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

仿真程序51hei提供下载:
电子密码锁.zip (130.92 KB, 下载次数: 36)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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