找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7676|回复: 3
打印 上一主题 下一主题
收起左侧

基于stc89c52单片机的电子密码锁的图解及源程序

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define KEY P3 //键盘输入端
  5. #define No_key 20 //无按键时返回值
  6. #define lcddata P2 //1602的数据输入端口

  7. sbit lcden=P2^7;
  8. sbit lcdrs=P2^6; //0输入指令,1输入数据
  9. sbit lcdrw=P2^5; //0向LCD写入数据或指令,1从LCD读取信息
  10. sbit light_red=P3^4;
  11. sbit buzzer=P3^5;

  12. uchar j; //用来统计输入个数的全局变量
  13. uchar aa; //用来在定时器中计数的全局变量
  14. uchar code table[]="WELCOME!      ";
  15. uchar code table1[]="LOCK SUCCESS!";
  16. uchar code table3[]="LOCK FAILURE!";
  17. uchar code table2[]="ENTER PASSWORD:";
  18. uchar code key_table[]={1,2,3,10,
  19. 4,5,6,11,
  20. 7,8,9,12,
  21. 0,13,14,15};
  22. uchar password[]={2,0,1,7,1,0};  //设定初始密码
  23. uchar save[6]; //保存输入数据

  24. uchar conflag;
  25. uchar startflag;
  26. uchar lockflag;
  27. void delay(uint z);
  28. void wright_com(uchar com); //写命令函数
  29. void wright_data(uchar date);  //写数据函数

  30. void init();
  31. void display_OK(); //显示OK
  32. void delete();
  33. uchar keyscan();
  34. void enter_code(uchar t); //输入密码,并把输入的数据存入数组中
  35. void confirm();  //输入密码逐一对比
  36. void succeed_an();
  37. void fail_an();
  38. void lockkey();
  39. void reset();
  40. void display_enter();
  41. void display_wrong();

  42. void main(void)
  43. {
  44. uchar temp;
  45. init();
  46. while(1)
  47. {
  48.   if(lockflag)   //输入错误,才会锁存
  49.   {
  50.    temp=keyscan();
  51. if(temp != No_key)
  52. {
  53. aa=0;   //重新计时
  54. if(temp==10)
  55. {
  56. lcdrw=0;  //清屏
  57. lcden=0;
  58. wright_com(0x01);
  59. reset();
  60. light_red=1;
  61. startflag=1; //开始标志置位

  62. }
  63. }

  64.   }
  65.   else
  66.   {
  67.       temp=keyscan();
  68.    if(temp != No_key)
  69.    {
  70.     if(temp==10)
  71. {

  72. lcdrw=0;    //清屏
  73. lcden=0;
  74. wright_com(0x01);
  75. reset();
  76. startflag=1; //开始标志置位

  77. }
  78. if(startflag)
  79. {
  80. enter_code(temp);
  81. if(temp==13)
  82.   {
  83.    confirm();
  84. if(conflag)
  85. {
  86. succeed_an();

  87. }
  88. else
  89. {
  90. fail_an();
  91. }
  92.   }
  93.     if(temp==14)
  94.   {
  95.    delete();

  96.   }

  97. }

  98.    }

  99.   }

  100. }
  101. }
  102. /*显示enter*/
  103. void display_enter()
  104. {
  105. uchar num;
  106. wright_com(0x80);
  107. for(num=0;num<13;num++)
  108. {
  109. wright_data(table2[num]);
  110. }

  111. }
  112. /*显示OK*/
  113. void display_ok()
  114. {
  115. uchar num;
  116. wright_com(0x80);
  117. for(num=0;num<13;num++)
  118. {
  119. wright_data(table1[num]);
  120. }

  121. }
  122. /*显示错误*/
  123. void display_wrong()
  124. {
  125. uchar num;
  126. wright_com(0x80);
  127. for(num=0;num<14;num++)
  128. {
  129. wright_data(table3[num]);
  130. }
  131. }

  132. void delete()
  133. {
  134.    wright_com(0x80+0x40+j);
  135.    wright_data(' ');
  136.    save[--j]=0;
  137.    wright_com(0x80+0x40+j);

  138. }
  139. /*复位各种变量*/
  140. void reset()
  141. {
  142. uchar num;
  143. display_enter();
  144. wright_com(0x80+0x40);
  145. for(num;num<6;num++)
  146. {
  147. save[num]=0;
  148. wright_data(' ');

  149. }
  150. wright_com(0x80+0x40);
  151. lockflag=0;
  152. conflag=0;
  153. j=0;

  154. }
  155. void succeed_an()
  156. {
  157. buzzer=0;
  158. display_ok();
  159. delay(1000);
  160. buzzer=1;

  161. }
  162. void fail_an()
  163. {

  164. display_wrong();
  165. lockkey();
  166. }


  167. void lockkey()
  168. {
  169. lockflag=1;
  170. }

  171. void enter_code(uchar t)
  172. {
  173. if(t>=0&&t<10)
  174. {
  175. if(j==0)
  176. {
  177. wright_com(0x80+0x40);
  178. wright_data('*');
  179. }
  180. else
  181. {
  182. wright_data('*');
  183. }
  184. save[j++]=t;
  185. }

  186. }
  187. void confirm()
  188. {
  189. uchar k;
  190. for(k=0;k<6;k++)
  191. { if(password[k]!=save[k])
  192. {
  193. break;
  194. }
  195. }
  196. if(k==6)
  197. {
  198. conflag=1;
  199. }

  200. }
  201. void timer0() interrupt 1
  202. {
  203. TH0=(65536-50000)/256;
  204. TL0=(65536-50000)%256;
  205. if(lockflag)
  206. {
  207. aa++;
  208. light_red=0;
  209. if(aa>=60)
  210. {
  211. aa=0;
  212. light_red=1;
  213. lockflag=0;
  214. }
  215. }

  216. }
  217. void init()
  218. {
  219.   uchar num;
  220. TMOD=1;
  221. ET0=1;
  222. EA=1;
  223. TR0=1;
  224. lcdrw=0;
  225. lcden=0;
  226. wright_com(0x38);
  227. wright_com(0x0c);
  228. wright_com(0x01);
  229. wright_com(0x80);
  230. for(num=0;num<9;num++)
  231. {
  232. wright_data(table[num]);
  233. delay(1);

  234. }


  235. }
  236. void wright_com(uchar com)
  237. {
  238.   lcdrs=0;
  239. lcddata=com;
  240. delay(1);
  241. lcden=1;
  242. delay(1);
  243. lcden=0;

  244. }

  245. void wright_data(uchar date)
  246. {
  247. lcdrs=1;
  248. lcddata=date;
  249. delay(1);
  250. lcden=1;
  251. delay(1);
  252. lcden=0;

  253. }

  254. void delay(uint z)
  255. {
  256. uint x,y;
  257. for(x=z;x>0;x--)
  258. for(y=110;y>0;y--);
  259. }
  260. /*键盘扫描 逐行扫描*/
  261. uchar keyscan()
  262. {
  263. uchar temp;
  264. uchar num=No_key;
  265. KEY=0xfe;
  266. temp=KEY;
  267. temp=temp&0xf0;
  268. while(temp !=0xf0)
  269. {
  270. delay(5);
  271. temp=KEY;
  272. temp=temp&0xf0;
  273. while(temp!=0xf0)
  274. {
  275. temp=KEY;
  276. switch(temp)
  277. {
  278. case 0xee:num=1;
  279. break;
  280. case 0xde:num=2;
  281. break;
  282. case 0xbe:num=3;
  283. break;
  284. case 0x7e:num=10;
  285. break;

  286. }
  287. while(temp!=0xf0)
  288. {
  289.   temp=KEY;
  290. temp=temp&0xf0;
  291. }

  292. }   

  293. }
  294. KEY=0xfd;
  295. temp=KEY;
  296. temp=temp&0xf0;
  297. while(temp!=0xf0)
  298. {
  299. delay(5);
  300. temp=KEY;
  301. temp=temp&0xf0;
  302. while(temp!=0xf0)
  303. {
  304. temp=KEY;
  305. switch(temp)
  306. {
  307. case 0xed:num=4;
  308. break;
  309. case 0xdd:num=5;
  310. break;
  311. case 0xbd:num=6;
  312. break;
  313. case 0x7d:num=11;
  314. break;
  315. }
  316. while(temp!=0xf0)
  317. {
  318. temp=KEY;
  319. temp=temp&0xf0;
  320. }
  321. }
  322. }
  323. KEY=0xfb;
  324. temp=KEY;
  325. temp=temp&0xf0;
  326. while(temp!=0xf0)
  327. {
  328. delay(5);
  329. temp=KEY;
  330. temp=temp&0xf0;
  331. while(temp!=0xf0)
  332. {
  333. temp=KEY;
  334. switch(temp)
  335. {
  336. case 0xeb:num=7;
  337. break;
  338. case 0xdb:num=8;
  339. break;
  340. case 0xbb:num=9;
  341. break;
  342. case 0x7b:num=12;
  343. break;

  344. }
  345. while(temp!=0xf0)
  346. {
  347. temp=KEY;
  348. temp=temp&0xf0;
  349. }
  350. }

  351. }
  352. KEY=0xf7;
  353. temp=KEY;
  354. temp=temp&0xf0;
  355. while(temp!=0xf0)
  356. {
  357. delay(5);
  358. temp=KEY;
  359. temp=temp&0xf0;
  360. while(temp!=0xf0)
  361. {
  362. temp=KEY;
  363. switch(temp)
  364. {
  365. case 0xe7:num=0;
  366. break;
  367. case 0xd7:num=13;
  368. break;
  369. case 0xb7:num=14;
  370. break;
  371. case 0x77:num=15;
  372. break;
  373. }
  374. while(temp!=0xf0)
  375. {
  376. temp=KEY;
  377. temp=temp&0xf0;
  378. }                                                                              
  379. }
  380. }
  381.    return num;
  382. }
复制代码

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:396478 发表于 2018-9-12 13:49 | 只看该作者
没有protues的图吗?
回复

使用道具 举报

板凳
ID:397024 发表于 2018-9-12 16:50 | 只看该作者
谢谢楼主
回复

使用道具 举报

地板
ID:448260 发表于 2018-12-23 15:29 | 只看该作者
普中的单片机也可以用这个代码吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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