找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3084|回复: 3
收起左侧

单片机电子锁的proteus仿真程序

[复制链接]
ID:644774 发表于 2019-11-19 08:48 | 显示全部楼层 |阅读模式
密码锁的仿真程序由延时、报警延时、键盘扫描、LCD写命令、LCD写函数、LCD初始化、密码显示、erroropen、“*”显示子程序和主程序构成。
延时:一段设定好时间的延时。
报警延时:延时并且报警器工作。
键盘扫描:扫描出键盘上被按下的键,并且对应到AB0~9
LCD写命令:选择指令寄存器。
LCD写函数:选择数据寄存器。
LCD初始化:初始化LCD
密码显示:在LCD上显示键入数值。
ErrorLCD显示error并且红色LED点亮。
OpenLCD显示open并且绿色LED闪烁。
*”显示:将在LCD上显示的数值在一段时间后变化为“*”。
主程序:设定6位数的密码,进行对6位键入数值的和设定数值的对比,并且在前5位数值输入后进行一位位数移动,在第六位密码输入结束后进行密码正误判断。密码正确则显示open,并且绿灯闪烁,密码错误显示error,红灯常亮,报警器报警,在显示open/error一段时间后复位,可再次键入新密码,进行新一轮的密码判断。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
图片1.png

单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. sbit RS=P1^0;                                                                                   //寄存器选择
  5. sbit RW=P1^1;                                                                                  //读写控制
  6. sbit EN=P1^2;                                                                           //使能
  7. sbit ledg=P1^3;                                                                                  //红指示灯
  8. sbit ledr=P1^7;                                                                                  //蓝指示灯
  9. sbit relay=P1^4;                                                                            //锁
  10. sbit buzz=P1^6;                                                                           //报警器

  11. char table0[ ]= "error";                                                              //显示
  12. char table1[ ] = "open";                                                          
  13. char table2[] = "password:";                                                  

  14. int temp,ch,m0 ,m1 ,p,n0 ,n1 ,n2 ,n3 ,n4 ,n5;

  15. void  delay(int z)                                                                           //延时
  16. {
  17.       int x,c;
  18.       for(x=z;x >0;x -- )
  19.       for(c= 100;c >0;c--);
  20. }

  21. void  Tdelay(int z)                                                                           //报警延时
  22. {
  23.       int x,c;
  24.       for(x=z;x >0;x -- )
  25.       for(c= 100;c >0;c--)
  26.           buzz=!buzz;
  27. }

  28.       keyscan( )                                                                           //键盘扫描
  29. {      temp=P2&0xf0;                                                                   //扫描行
  30.       P2=0xfe;
  31.       delay(1);
  32.       temp=P2&0xf0;
  33.       while(temp!=0xf0)
  34. {
  35.       switch(temp)                                                                        //789数字设定
  36. {
  37. case 0xe0:ch='7';break;
  38. case 0xd0:ch='8';break;
  39. case 0xb0:ch='9';break;
  40. default:ch=p;break;
  41. }
  42. while(temp!=0xf0)                                                                   //等待键盘松开
  43. {
  44. temp= P2;
  45. temp = temp&0xf0;
  46. }}
  47. P2=0xfd;                                                                                         //456数字设定
  48. delay(1);
  49. temp = P2&0xf0;
  50. while(temp!=0xf0)
  51. {
  52. switch(temp)
  53. {
  54. case 0xe0:ch='4';break;
  55. case 0xd0:ch='5';break;
  56. case 0xb0:ch='6';break;
  57. default:ch=p;break;
  58. }
  59. while(temp!=0xf0)
  60. {
  61. temp=P2;
  62. temp=temp&0xf0;
  63. }}
  64. P2 = 0xfb;                                                                                  //123数字设定
  65. delay(1);
  66. temp=P2&0xf0;
  67. while(temp!=0xf0)
  68. {
  69. switch(temp)
  70. {
  71. case 0xe0:ch='1';break;
  72. case 0xd0:ch='2';break;
  73. case 0xb0:ch='3';break;
  74. default:ch=p;break;
  75. }
  76. while( temp!=0xf0)
  77. {
  78. temp=P2;
  79. temp=temp&0xf0;
  80. }}
  81. P2=0xf7;                                                                                         //A0B设定
  82. delay(1);
  83. temp=P2&0xf0;
  84. while(temp!=0xf0)
  85. {
  86. switch(temp)
  87. {
  88. case 0xe0:ch='A';break;
  89. case 0xd0:ch='0';break;
  90. case 0xb0:ch='B';break;
  91. default:ch=p;break;
  92. }
  93. while(temp!=0xf0)
  94. {
  95. temp=P2;
  96. temp=temp&0xf0;
  97. }}
  98. return ch;                                                                        //返回键入的值
  99. }

  100. void wcom(uchar com)                                           //LCD写命令
  101. {
  102. RS=0;                                                                           //选择指令寄存器
  103. P3=com;                                                                       
  104. delay(1);
  105. EN=1;                                                                           //使能
  106. delay(1);
  107. EN=0;
  108. }

  109. void wdat(uchar dat)                                              //写函数
  110. {
  111. RS=1;                                                                           //选择数据寄存器
  112. P3 = dat;                                                                       
  113. delay(1);
  114. EN=1;
  115. delay(4);
  116. EN=0;
  117. }

  118. void init( )                                                                //LCD初始化
  119. {
  120. EN=0;
  121. wcom(0x38);
  122. wcom(0x0c);
  123. wcom(0x06);
  124. wcom(0x01);
  125. }

  126. void error( )                                                           //显示密码error
  127. {
  128. char m2;
  129. wcom(0xc6);
  130. for(m2=0;m2<5;m2++)
  131. {
  132. wdat(table0[m2]);
  133. }}

  134. void open( )                                                                //密码open
  135. {
  136. char m2;
  137. wcom(0xc6);
  138. for(m2=0;m2<4;m2++ )
  139. {
  140. wdat(table1[m2]);
  141. }}

  142. void pass()                                                                   //密码显示
  143. {
  144. char m2;
  145. wcom(0x80);
  146. for(m2=0;m2<9;m2++ )
  147. {
  148. wdat(table2[m2]);
  149. }}

  150. change(int m)                                                           //显示“ * ”
  151. {
  152. delay(500);
  153. wcom(m);
  154. wdat('*');
  155. }

  156. main( )                                                                               //主程序
  157. {
  158. RW=0;
  159. ledg=0;
  160. ledr=0;
  161. buzz=1;
  162. init();
  163. delay(5);
  164. pass();
  165. wcom(0x89);
  166. while(keyscan()==p)
  167. {                                                                                      //第一位密码
  168. delay(3);
  169. keyscan();
  170. }
  171. wdat(keyscan());
  172. n0=keyscan();
  173. change(0x89);
  174. delay(10);
  175. ch=p;
  176. while(keyscan()==p)                                                          //第二位密码
  177. {
  178. delay(3);
  179. keyscan();
  180. }
  181. wdat(keyscan());
  182. n1=keyscan();
  183. change(0x8a);
  184. ch=p;
  185. while(keyscan()==p)                                                         //第三位密码
  186. {
  187. delay(3);
  188. keyscan();
  189. }
  190. wdat(keyscan());
  191. n2=keyscan();
  192. change(0x8b);
  193. ch=p;
  194. while(keyscan()==p)                                                    //第四位密码
  195. {
  196. delay(3);
  197. keyscan();
  198. }
  199. wdat(keyscan());
  200. n3=keyscan();
  201. change(0x8c);
  202. ch=p;
  203. while(keyscan()==p)                                                    //第五位密码
  204. {
  205. delay(3);
  206. keyscan();
  207. }
  208. wdat(keyscan());
  209. n4=keyscan();
  210. change(0x8d);
  211. ch=p;
  212. while(keyscan()==p)                                                        //第六位密码
  213. {
  214. delay(3);
  215. keyscan();
  216. }
  217. wdat(keyscan());
  218. n5=keyscan();
  219. change(0x8e);

  220. if(n0=='1'&&n1=='6'&&n2=='3'&&n3=='0'&&n4=='1'&&n5=='8')
  221. //密码设定
  222. {
  223. int m3=1;
  224. open();
  225. while(m3)
  226. {
  227. int m4,m5;
  228. ledg=0;                                                                                                        //亮绿灯
  229. for(m4=200;m4>0;m4--)
  230. {
  231. keyscan( );
  232. if(keyscan()=='A')
  233. {
  234. m4=0;
  235. m3=0;
  236. }}
  237. ledg=1;                                                                                                          
  238. if(m3!=0)
  239. {
  240. for(m5=200;m5>0;m5--)
  241. {
  242. keyscan();
  243. if(keyscan()=='A')
  244. {
  245. m3=0;
  246. }}}}
  247. }
  248. else                                                                                                  //红灯亮,错误显示
  249. {
  250. ledr=1;
  251. error();
  252. buzz=1;
  253. Tdelay(5000);
  254. }
  255. }
复制代码

所有资料51hei提供下载:
电子锁.rar (25.46 KB, 下载次数: 56)

评分

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

查看全部评分

回复

使用道具 举报

ID:328014 发表于 2021-6-20 17:08 | 显示全部楼层
sss9 发表于 2021-6-20 11:08
用不了,下我个锤子

可以用啊,楼主的程序完全正确,我自己建立了一个工程文件 输入楼主的程序后,仿真成功了,你是不是没有建立工程,没有hex?当然不能仿真啦,我建立的工程已经放在附件了
对了楼主的密码是
if(n0=='1'&&n1=='6'&&n2=='3'&&n3=='0'&&n4=='1'&&n5=='8')
51hei.png

电子锁Keil工程.7z

66.32 KB, 下载次数: 8, 下载积分: 黑币 -5

回复

使用道具 举报

ID:655488 发表于 2021-2-23 12:22 | 显示全部楼层
觉得很有用,谢啦
回复

使用道具 举报

ID:940722 发表于 2021-6-20 11:08 | 显示全部楼层
用不了,下我个锤子
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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