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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3310|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)電子密碼鎖仿真程序 繼電器表示開(kāi)關(guān)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
繼電器表示開(kāi)關(guān)
蜂鳴器報(bào)警
密碼顯示
修改密碼
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  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數(shù)據(jù)/指令(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;//報(bào)警指示燈
  27. sbit P2_7=P2^7;
  28. sbit P3_7=P3^7; //蜂鳴器
  29. /****************子函數(shù)聲明*/
  30. void delay(uint z);
  31. void init();//初始化子函數(shù)
  32. void write_com(uchar com);//寫指令子函數(shù)
  33. void write_data(uchar dat1);//寫數(shù)據(jù)子函數(shù)
  34. uint keyscan();
  35. void mima();//密碼處理子函數(shù)
  36. void mima1();//修改密碼函數(shù)
  37. void Alarm(uchar t);//報(bào)警函數(shù)
  38. /***************液晶驅(qū)動(dòng)*/
  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) //延時(shí)子函數(shù) 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); //延時(shí)去抖
  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); //等待開(kāi)鎖鍵按下
  175. mima(); //密碼輸入處理函數(shù)
  176. while((pswd[m]==init_pswd[m])&m<4)//密碼比較
  177. {
  178. m++;
  179. }
  180. if(m>=4)//密碼正確
  181. {
  182. P2_7=0;//開(kāi)鎖指示燈亮
  183. keyscan();
  184. while(flag==1&&num==6);//是否修改密碼//
  185. mima1();//修改密碼函數(shù)
  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. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

仿真程序51hei提供下載:
電子密碼鎖.zip (130.92 KB, 下載次數(shù): 36)




評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人自拍视频 | 91色视频在线观看 | 国产精品久久久久久婷婷天堂 | 精品乱人伦一区二区三区 | 国产精品18hdxxxⅹ在线 | 成人免费福利 | 欧美一区二区在线观看 | 81精品国产乱码久久久久久 | 亚洲成人av一区二区 | 天天看逼 | 91久久伊人 | 日日做夜夜爽毛片麻豆 | 久久精品免费一区二区三 | a视频在线观看 | 青青激情网 | 亚洲色片网站 | 国产精品视频在线观看 | 婷婷精品 | 91九色网站 | 久久国产精品精品国产色婷婷 | 91视频88av | 成人欧美一区二区三区黑人孕妇 | 国产在线视频在线观看 | 欧洲亚洲一区二区三区 | 亚洲欧美一区二区三区视频 | 亚洲一区 中文字幕 | 久久久久久国产精品 | 欧美日韩中文在线观看 | 久久99精品久久久久久秒播九色 | 欧美日韩成人一区二区 | 一区二区三区欧美 | 久久精品伊人 | 99热最新网址 | 国产精品一区二区日韩 | 欧美黄色片 | 久久久精品网 | 欧美成人精品一区二区男人看 | 亚洲精品一区二区三区四区高清 | 亚洲精品在线播放 | 午夜久久久 | 欧美自拍一区 |