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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3803|回復: 3
打印 上一主題 下一主題
收起左側

單片機電子鎖的proteus仿真程序

[復制鏈接]
跳轉到指定樓層
樓主
密碼鎖的仿真程序由延時、報警延時、鍵盤掃描、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. #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 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

來自 2#
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 (26.42 KB, 下載次數: 20)

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕在线视频一区二区三区 | 国产999精品久久久久久 | 在线黄色网 | 欧美 日韩 国产 在线 | 成人性视频在线播放 | 国产专区在线 | 国产成人久久精品一区二区三区 | 国产一区二区三区色淫影院 | 在线免费毛片 | 56pao在线 | 日韩欧美中文 | 精品成人69xx.xyz | 水蜜桃久久夜色精品一区 | 精品欧美乱码久久久久久 | 性色av一区二区三区 | 久操亚洲 | 国产午夜精品理论片a大结局 | 国产福利在线看 | 欧美精品成人影院 | 日韩精品一区二区三区中文在线 | 91传媒在线观看 | 日韩亚洲视频 | 成人美女免费网站视频 | 国产精品免费在线 | 久久精品亚洲精品国产欧美 | 欧美一区二区三区四区在线 | 欧美亚洲国产成人 | 亚洲天堂av在线 | 欧美三级三级三级爽爽爽 | 欧美成人自拍视频 | www国产成人免费观看视频,深夜成人网 | 欧洲成人| 中文字幕在线免费 | 欧美一区二区久久 | 男女在线免费观看 | 精品综合在线 | 亚洲 中文 欧美 日韩 在线观看 | 欧美一区二区视频 | 国产精品波多野结衣 | 久久黄色网 | cao视频|