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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)電子鎖的proteus仿真程序

[復(fù)制鏈接]
ID:644774 發(fā)表于 2019-11-19 08:48 | 顯示全部樓層 |閱讀模式
密碼鎖的仿真程序由延時(shí)、報(bào)警延時(shí)、鍵盤掃描、LCD寫命令、LCD寫函數(shù)、LCD初始化、密碼顯示、erroropen、“*”顯示子程序和主程序構(gòu)成。
延時(shí):一段設(shè)定好時(shí)間的延時(shí)。
報(bào)警延時(shí):延時(shí)并且報(bào)警器工作。
鍵盤掃描:掃描出鍵盤上被按下的鍵,并且對應(yīng)到AB0~9
LCD寫命令:選擇指令寄存器。
LCD寫函數(shù):選擇數(shù)據(jù)寄存器。
LCD初始化:初始化LCD
密碼顯示:在LCD上顯示鍵入數(shù)值。
ErrorLCD顯示error并且紅色LED點(diǎn)亮。
OpenLCD顯示open并且綠色LED閃爍。
*”顯示:將在LCD上顯示的數(shù)值在一段時(shí)間后變化為“*”。
主程序:設(shè)定6位數(shù)的密碼,進(jìn)行對6位鍵入數(shù)值的和設(shè)定數(shù)值的對比,并且在前5位數(shù)值輸入后進(jìn)行一位位數(shù)移動,在第六位密碼輸入結(jié)束后進(jìn)行密碼正誤判斷。密碼正確則顯示open,并且綠燈閃爍,密碼錯(cuò)誤顯示error,紅燈常亮,報(bào)警器報(bào)警,在顯示open/error一段時(shí)間后復(fù)位,可再次鍵入新密碼,進(jìn)行新一輪的密碼判斷。

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

單片機(jī)源程序如下:
  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;                                                                                  //藍(lán)指示燈
  9. sbit relay=P1^4;                                                                            //鎖
  10. sbit buzz=P1^6;                                                                           //報(bào)警器

  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)                                                                           //延時(shí)
  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)                                                                           //報(bào)警延時(shí)
  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數(shù)字設(shè)定
  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數(shù)字設(shè)定
  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數(shù)字設(shè)定
  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設(shè)定
  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)                                              //寫函數(shù)
  110. {
  111. RS=1;                                                                           //選擇數(shù)據(jù)寄存器
  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. //密碼設(shè)定
  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                                                                                                  //紅燈亮,錯(cuò)誤顯示
  249. {
  250. ledr=1;
  251. error();
  252. buzz=1;
  253. Tdelay(5000);
  254. }
  255. }
復(fù)制代碼

所有資料51hei提供下載:
電子鎖.rar (25.46 KB, 下載次數(shù): 56)

評分

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

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:328014 發(fā)表于 2021-6-20 17:08 | 顯示全部樓層
sss9 發(fā)表于 2021-6-20 11:08
用不了,下我個(gè)錘子

可以用啊,樓主的程序完全正確,我自己建立了一個(gè)工程文件 輸入樓主的程序后,仿真成功了,你是不是沒有建立工程,沒有hex?當(dāng)然不能仿真啦,我建立的工程已經(jīng)放在附件了
對了樓主的密碼是
if(n0=='1'&&n1=='6'&&n2=='3'&&n3=='0'&&n4=='1'&&n5=='8')
51hei.png

電子鎖Keil工程.7z

66.32 KB, 下載次數(shù): 8, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

ID:940722 發(fā)表于 2021-6-20 11:08 | 顯示全部樓層
用不了,下我個(gè)錘子
回復(fù)

使用道具 舉報(bào)

ID:655488 發(fā)表于 2021-2-23 12:22 | 顯示全部樓層
覺得很有用,謝啦
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产乱码精品一区二区三区av | 亚洲一区二区三区在线观看免费 | 亚洲精品日韩视频 | av在线免费网站 | 亚洲精品一区二 | 在线啊v | 在线天堂免费中文字幕视频 | 天天操夜夜操 | 亚洲精品日本 | 精品视频一区二区三区四区 | 91精品国产91久久久久久最新 | 日韩久久久久久久 | 精品国产乱码一区二区三区a | 成人免费区一区二区三区 | 国产精品91视频 | 国产在线观看一区二区 | 亚洲精品久久久9婷婷中文字幕 | 国产综合精品一区二区三区 | 欧美黄色免费网站 | 激情五月婷婷在线 | 亚洲日本一区二区 | 五月婷婷激情网 | h片免费看| 色播视频在线观看 | 久久精品国产久精国产 | 黄色片在线网站 | 九九久久久 | 亚欧精品 | 久久国产精品久久久久久 | 91精品国产综合久久久久 | 天堂中文资源在线 | 99久久精品一区二区毛片吞精 | 成人精品免费视频 | 久久亚洲一区 | caoporn免费在线视频 | av网站在线免费观看 | 国产一区二区三区日韩 | 欧美a在线观看 | 久久欧美精品 | 中文字幕一区二区三区在线视频 | 成人免费视频网 |