找回密码
 立即注册

QQ登录

只需一步,快速开始

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

全智能密码锁程序

[复制链接]
跳转到指定楼层
楼主
ID:76127 发表于 2015-4-5 00:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. //-----------------------------------------------
  2. //-----------------密码锁程序--------------------
  3. //-----------------芯片STC89C52RC--晶振11.0592M--
  4. //***********************************************
  5. #include <reg52.h>
  6. #include "AT24C01.C"
  7. #include "LCD1602.C"
  8. //---------------------------
  9. #define uchar unsigned char
  10. #define uint  unsigned int
  11. static uchar c=0;
  12. //---------------------------
  13. sbit K0=P0^0;//0
  14. sbit K1=P0^1;//1
  15. sbit K2=P0^2;//2
  16. sbit K3=P0^3;//确认密码
  17. sbit K4=P0^4;//修改密码
  18. //---------------------------
  19. sbit LE_LED=P3^4;
  20. sbit LED_LDEOKK=P1^3;
  21. sbit LED_LEDOK=P1^4;
  22. sbit LED_OPEN=P1^5;
  23. sbit beep=P3^3;
  24. //---------------------------
  25. uchar tablee [3];  //键值存储器
  26. uchar tablee2[4];  //常规密码存储器
  27. //------------------------------
  28. void delayx(uint i)
  29. {
  30. uint w;
  31. for(w=0;w<i;w++);
  32. }
  33. //------------------------------
  34. void beepo()
  35. {
  36. beep=0;
  37. delayx(5000);
  38. beep=1;
  39. }
  40. //------------------------------数据键盘扫描并返回键值
  41. shuju_jianpan()
  42. {
  43. uchar a=15;
  44. uchar KEY; //
  45. if(!K0) //0
  46. {
  47. delayx(500);
  48. while(K0==0);
  49. beepo();
  50. a=0;

  51. }
  52. //----------------------
  53. if(!K1) //1
  54. {
  55. delayx(500);
  56. while(K1==0);
  57. beepo();
  58. a=1;

  59. }
  60. //----------------------
  61. if(!K2) //2
  62. {
  63. delayx(500);
  64. while(K2==0);
  65. beepo();
  66. a=2;

  67. }
  68. switch (a)
  69. {
  70.   case 0: KEY=0; break;
  71.   case 1: KEY=1; break;
  72.   case 2: KEY=2; break;
  73.   case 15:KEY=15;break;
  74. }
  75. return (KEY);
  76. }
  77. //***********************************************************//
  78. //***********************************************************//
  79. void main()
  80. {
  81. uchar b;
  82. uchar u=0;
  83. uchar e=30;
  84. uchar f=31;
  85. uchar y=32;
  86. uchar nem0=0,nem1=0,nem2=0;
  87. uchar nem3=0,nem4=0,nem5=0;
  88. uchar r=0;
  89. uchar j;
  90. uchar q=0;
  91. uchar h=0;
  92. LE_LED=0;
  93. LCD1602_0(15,0);       //显示PleasePassword
  94. //---------------------------------------------------------

  95. //-----------------------------------------置入初始出厂密码
  96. if(q==0)
  97. {
  98. init(); //24c01初始化
  99. W_AT24C01(e,2); //写入初始密码“111”数据到AT24C01存储器中保存
  100. delayx(500);
  101. //------------------
  102. init();
  103. W_AT24C01(f,2);
  104. delayx(500);
  105. //------------------
  106. init();
  107. W_AT24C01(y,2);
  108. delayx(500);
  109. q=1;
  110. }
  111. //--------------------------------------------------------------------
  112. tablee2[3]=0;
  113. //--------------------------------------------------------------------
  114. while(1)
  115. {
  116. b=shuju_jianpan(); //数据键盘扫描
  117. if(b!=15)    //如果b不等于15说明有键按下
  118. {
  119. tablee2[c++]=b; //密码存储器
  120. LCD1602_0(15,c);
  121. if(c==4)c=0;
  122. b=15;
  123. } //通过计算一下将密码确认复杂化,这样可以解决密码重复按下后确认为错误码密码,
  124. //如当设置密码为222时,当按下2222或更多22222的密码后,可以保证这些是错误密码。
  125.    h=((tablee2[2]*5)+(tablee2[1]*3)+tablee2[0]+tablee2[3]);
  126. //========================================
  127. if(!K3)       //确认输入键 P0.3
  128. {
  129. c=0;   //消除密码累加的现象
  130. delayx(500);
  131. while(K3==0);
  132. beepo();
  133. //----------------开始密码比较------------
  134. init();//AT24C01初始化
  135. nem0=R_AT24C01(e);
  136. init();
  137. nem1=R_AT24C01(f);
  138. init();
  139. nem2=R_AT24C01(y);
  140. delayx(500);  //延迟一下
  141. //----------------------------------------
  142. if(nem0==tablee2[0]&&nem1==tablee2[1]&&nem2==tablee2[2]&&h==((tablee2[2]*5)+(tablee2[1]*3)+tablee2[0]+0))
  143. {
  144. LED_OPEN=0; //开锁
  145. beep=0;
  146. delayx(20000);
  147. beep=1; //长呜一声音表示确认密码正确并开锁
  148. tablee2[0]=0;
  149. tablee2[1]=0;
  150. tablee2[2]=0; //将密码重置一下
  151. LED_OPEN=1; //关锁
  152.    delayx(600);
  153. LCD1602_2(); //welcomeBack
  154. delayx(60000);
  155. delayx(60000);
  156. delayx(60000);
  157. LCD1602_1(15);       //显示PleasePassword
  158. }
  159. else
  160. {
  161. beepo();
  162. delayx(5000);
  163. beepo();
  164. delayx(5000);
  165. beepo();
  166. delayx(5000);    //短响3声音表示密码错误
  167. r++;
  168. tablee2[3]=0;    //清除一下该存储器中的错误数据避免下次持续报错
  169. LCD1602_1(0);       //显示PleasePassword
  170.    }
  171. if(r==4)   //如果错误3次密码则报警2分钟
  172. {
  173. for(j=0;j<30;j++)
  174. {
  175. beepo();
  176. delayx(5000);
  177.     }
  178. r=0;
  179. }
  180. }
  181. //====================================================================
  182. if(!K4)   //修改密码键 P0.4
  183. {
  184. delayx(500);
  185. while(K4==0);
  186. beepo();
  187. //------------------------
  188.     while(u<3)
  189. {
  190.    b=shuju_jianpan();//数据键盘扫描 --先输入旧密码确认主人身份
  191.    if(b!=15)   //如果b不等于15说明有键按下
  192.    {
  193.    u++;
  194. tablee2[c++]=b;   //常规密码存储器
  195. LCD1602_0(15,c);
  196. if(c==4)c=0;
  197. b=15;
  198.    }
  199. }
  200.    u=0;
  201.    h=((tablee2[2]*5)+(tablee2[1]*3)+tablee2[0]+tablee2[3]);  
  202. //----------------开始密码比较----------------------------
  203. init();//AT24C01初始化
  204. nem3=R_AT24C01(e);
  205. init();
  206. nem4=R_AT24C01(f);
  207. init();
  208. nem5=R_AT24C01(y);
  209. delayx(500);  //延迟一下   
  210. //---------------------------------------------------------
  211. if(nem0==tablee2[0]&&nem1==tablee2[1]&&nem2==tablee2[2]&&h==((tablee2[2]*5)+(tablee2[1]*3)+tablee2[0]+0))
  212. {
  213. c=0;
  214. beep=0;
  215. delayx(20000);
  216. beep=1;   //长呜一声音表示开始修改密码
  217. LED_LEDOK=0;   //灯亮表示密码正确
  218. delayx(20000);
  219. LED_LEDOK=1;   //灯亮表示密码正确
  220. LCD1602_1(0);     //显示PleasePassword
  221.     //---------------------------------------------------------
  222. while(c<3)   //密码长度必须为3位
  223. {
  224. b=shuju_jianpan(); //数据键盘扫描
  225. if(b!=15)
  226. {
  227. tablee2[c++]=b;
  228. LCD1602_0(15,c);
  229. b=15;
  230. }
  231. }
  232. c=0;  
  233.     //---------------------------------------------------------
  234.             while(K3==1);
  235. LCD1602_2(); //welcomeBack
  236. delayx(500);
  237. while(K3==0);
  238. delayx(500);
  239. while(K3==0);
  240. init();             //24c01初始化
  241. W_AT24C01(e,tablee2[0]); //写入数据到AT24C01存储器中保存
  242. delayx(500);
  243. //------------------
  244. init();
  245. W_AT24C01(f,tablee2[1]);
  246. delayx(500);
  247. //------------------
  248. init();
  249. W_AT24C01(y,tablee2[2]);
  250. delayx(500);
  251. //------------------
  252. LED_LDEOKK=0; //灯亮表示密码正确
  253. beep=0;
  254. delayx(10000);
  255. beep=1;             //长呜一声音表示确认已输入数据
  256. LED_LDEOKK=1;
  257. u=0;
  258. delayx(50000);
  259. beep=0;
  260.     delayx(50000);
  261.     beep=1;   //长呜一声音表修改密码OK
  262. LCD1602_0(15,0);       //显示PleasePassword
  263. }

  264. }  //修改密码的if语句

  265. } //总的while(1)语句
  266. }
  267. //======================================================
  268. //---IIC AT24C01存储器读写操作程序-----------
  269. #include <reg52.h>
  270. #define uchar unsigned char
  271. sbit SDA=P3^6;
  272. sbit SCL=P3^7;
  273. ///------------------------------------------
  274. void delay()
  275. { ; ; }
  276. ///////////////////////
  277. void start()//起始信号
  278. {
  279. SDA=1;
  280. delay();
  281. SCL=1;
  282. delay();
  283. SDA=0;
  284. delay();
  285. }
  286. ///////////////////////
  287. void stop()//终止信号
  288. {
  289. SDA=0;
  290. delay();
  291. SCL=1;
  292. delay();
  293. SDA=1;
  294. delay();
  295. }
  296. //////////////////////////////////////////////////
  297. //////////////////////////////////////////////////
  298. void respons()//应答信号,等待或者发送一个应答信号
  299. {
  300. uchar i;
  301. SCL=1;
  302. delay();
  303. while((SDA==1)&&(i<250))i++;
  304. SCL=0;
  305. delay();
  306. }
  307. /*************************************************/
  308. void init()//初始化
  309. {
  310. SDA=1;
  311. SCL=1;
  312. }
  313. //////////////////////////////////////////////////
  314. void write_byte(uchar date)//写一字节
  315. {
  316. uchar i;
  317. SCL=0;
  318. for(i=0;i<8;i++)
  319. {
  320. date=date<<1;
  321. SDA=CY;
  322. SCL=1;
  323. delay();
  324. SCL=0;
  325. delay();
  326. }
  327. }
  328. //------------------------------------------------
  329. uchar read_byte()//读数据(也就是接收从器件传来的数据)
  330. {
  331. uchar i,k;
  332. for(i=0;i<8;i++)
  333. {
  334. SCL=1;
  335. delay();
  336. k=(k<<1)|SDA;
  337. SCL=0;
  338. delay();
  339. }
  340. return k;
  341. }
  342. //////////////////////////////////////////////////
  343. //=============AT24C01写操作=====================//
  344. void W_AT24C01(uchar address,uchar date)//写数据
  345. {
  346. start();
  347. write_byte(0xa0);  //器件地址
  348. respons();
  349. write_byte(address);//器件内存地址 address
  350.     respons();
  351. write_byte(date);//数据    date
  352. respons();
  353. stop();
  354. }
  355. //////////////////////////////////////////////////
  356. //==============AT24C01读操作====================//
  357. uchar R_AT24C01(uchar address)
  358. {
  359. uchar date;
  360. start();
  361. write_byte(0xa0);//写器件地址和写指令0XA0=10100000B最后一个零表示写,低电平有效
  362. respons();
  363. write_byte(address);////器件内存地址address
  364. respons();
  365. start();
  366. write_byte(0xa1);//写器件地址和读指令0XA1=10100001B,最后一个1表示读,高电平有效
  367. respons();
  368. date=read_byte();
  369. stop();
  370. return date;
  371. }
  372. //======================================================
  373. //------------------LCD1602显示程序(模块)--------------------
  374. #include <reg52.h>
  375. #define uchar unsigned char
  376. ///////////////LCD1602/////////////
  377. sbit RS=P0^5;
  378. sbit RW=P0^6;
  379. sbit YE=P0^7;

  380. /////////////////////////////////////////////////////////////
  381. uchar code table1[] ={" Welcome   Back"};
  382. uchar code table2[] ={" PleasePassword"};
  383. uchar code table3[] ={"****"};
  384. uchar code table4[] ={"                "};
  385. /////////////////////////////////////////////////////////////
  386. void delayy(unsigned int us)
  387. {
  388. while(us--);
  389. }

  390. /////////////////////////////////////////////////////////////
  391. void delay2()
  392. {
  393. RS=0;
  394. RW=0;
  395. YE=0;
  396. delayy(5);
  397. YE=1;
  398. }
  399. //------------------------------------------
  400. void LCD1602_START()
  401. {
  402. //////////////////////////////////////LCD屏初始化
  403. P2=0x01; //清屏
  404. delay2();
  405. P2=0x38; //显示设定两行
  406. delay2();
  407. P2=0x0f;  //打开显示和光标
  408. delay2();
  409. P2=0x06;  //光标右移
  410. delay2();
  411. P2=0x80;  //光标回到第一行的开头
  412. delay2();
  413. }
  414. /******************************LCD1602液晶显示****************************/
  415. void LCD1602_0(uchar dd0,uchar jj0)//dd是整数
  416. {
  417.    uchar i,nem;
  418.       LCD1602_START();
  419. /////////////////////////////////////////////////////////////
  420.        for(nem=0;nem<dd0;nem++)//温度英文字PleasePassword显示
  421.          {
  422. P2=table2[nem];
  423. RS=1;
  424. RW=0;
  425. YE=0;
  426.    delay2();
  427.      }

  428. ////////////////////////////////////////////////////////////
  429. delay2();
  430.     P2=0xc0; //换行显示***0xc0指令是光标回到第二行的开头
  431. for(i=0;i<jj0;i++)
  432.      {
  433. delay2();   
  434. P2=table3[i];
  435. RS=1;
  436. RW=0;
  437. YE=0;
  438. }
  439. }
  440. //==========================================================================
  441. void LCD1602_1(uchar dd1)//dd是整数
  442. {
  443.    uchar i,nem;
  444.       LCD1602_START();
  445.        for(nem=0;nem<dd1;nem++)//温度英文字PleasePassword显示
  446.          {
  447. P2=table2[nem];
  448. RS=1;
  449. RW=0;
  450. YE=0;
  451.    delay2();
  452.      }
  453. /////////////////////////////////////////////////
  454. delay2();
  455.     P2=0xc0; //换行显示***0xc0指令是光标回到第二行的开头
  456. for(i=0;i<16;i++)
  457.      {
  458. delay2();   
  459. P2=table4[i];
  460. RS=1;
  461. RW=0;
  462. YE=0;
  463. }
  464. }
  465. //==========================================================================
  466. void LCD1602_2()//dd是整数
  467. {
  468.    uchar i,nem;
  469.       LCD1602_START();
  470.        for(nem=0;nem<15;nem++)//温度英文字welcomeback显示
  471.          {
  472. P2=table1[nem];
  473. RS=1;
  474. RW=0;
  475. YE=0;
  476.    delay2();
  477.      }
  478. /////////////////////////////////////////////////
  479. delay2();
  480.     P2=0xc0; //换行显示***0xc0指令是光标回到第二行的开头
  481. for(i=0;i<16;i++)
  482.      {
  483. delay2();   
  484. P2=table4[i];
  485. RS=1;
  486. RW=0;
  487. YE=0;
  488. }
  489. }
复制代码


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

使用道具 举报

沙发
ID:54731 发表于 2015-5-15 10:14 | 只看该作者
下载来试试可以用吗?谢谢!
回复

使用道具 举报

板凳
ID:80284 发表于 2015-6-8 16:19 | 只看该作者
全智能的?挺厉害的呀。
回复

使用道具 举报

地板
ID:52756 发表于 2015-7-10 12:21 | 只看该作者
原理图呢
回复

使用道具 举报

5#
ID:44267 发表于 2015-9-5 14:05 | 只看该作者
太强了,太强了,太强了,太强了,
回复

使用道具 举报

6#
ID:44267 发表于 2015-9-5 14:07 | 只看该作者
太强了,太强了,太强了,太强了,
回复

使用道具 举报

7#
ID:92732 发表于 2015-10-17 16:22 | 只看该作者
这个看着就觉额6
回复

使用道具 举报

8#
ID:94791 发表于 2016-3-19 21:46 | 只看该作者
                          高手                 
回复

使用道具 举报

9#
ID:613605 发表于 2019-11-12 14:22 | 只看该作者
高手!!!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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