基于51单片机的密码锁程序
51单片机密码锁制作的程序和流程图
51单片机密码锁制作的程序和流程图(很详细) 一、基本组成:单片机小系统+4*4矩阵键盘+1602显示+DC电机基本电路:键盘和和显示键盘接P1口,液晶的电源的开、关通过P2.7口控制电机(控制口P2.4)二、基本功能描述:1.验证密码、修改密码a)锁的初始密码是123456(密码最长为10位,最短为1位)。
2.恢复初始密码a)系统可以恢复初始密码,否则一旦忘记密码而又不能恢复初始密码,该锁就永远打不开。
但是又不能让用户自行修改密码,否则其他人也可以恢复该初始密码,使得锁的安全性大大下降。
3.使系统进入低功耗状态a)在实际使用中,锁只有在开门时才被使用。
因而在大多数的时间里,应该让锁进入休眠状态、以降低功耗,这使系统进入掉电状态,可以大大降低系统功耗。
b)同时将LCD背光灯关闭4.DC电机模拟开锁动作。
a)DC电机启动时解除开锁把手的锁定,允许通过把手开锁。
DC电机不直接开锁,使得DC电机的功率不用太大,系统的组成和维护将变得简单,功耗也降了下来。
三、密码锁特点说明:1.0 输入将被以字符形式输入,最长为10位。
超过10位时系统将自动截取前10位、但不作密码长度溢出提示。
2.0 开锁10秒后不允许更改密码、并提示修改超时_进入初始态,需要重新输入密码方可再次修改密码。
3.0 系统未使用存储器存储密码故掉电后密码自动恢复为初始密码。
4.0 若2分钟内无任何操作,系统自动进入省电模式运行,同时关闭液晶显示,以节省电力。
5.0 输入密码正确后、电机允许开锁时间为5秒, 5秒后需要再次输入密码才可以再次开锁。
6.0 修改密码键和恢复初始密码键最好置于室内。
这是Proteus仿真结果:输入密码123456:显示结果:密码正确时电机启动、电机将持续5秒:这是键盘:开锁键是接INT0引脚接的一个独立按键,用于唤醒CPU工作、进而开启整个系统密码正确时可以修改密码:再次输入新密码,两次输入相同时、更改有效当然你可以随时放弃修改密码改进:1.0 密码锁的秘密没有存储,因而在掉电时最新的密码将丢失,重新上电后密码将恢复成为初始密码。
基于51单片机的电子密码锁—1
基于51单⽚机的电⼦密码锁—1这个程序是为了实现基于51单⽚机的电⼦密码锁,⽬前,程序解决了最重要之⼀的输⼊的密码和保存的正确密码相⽐较的问题。
通过定义了两个数组:uchar table2[6]; //临时密码保存uchar password[6]="123456"; //进门密码将输⼊的密码写⼊到table2[]中有⼀点需要特别注意:因为我写到table2[]数组内的是ASCII值的0-9,⽽ASCII值的0-9对应的符号却是NUT,SOH... (省略)所以在刚开始调试时,LCD1602屏幕输出的总是奇怪的字符,⽽不是我想要的0-9,通过查询ASCLL码表可以知道字符(0-9)对应的数值是48-57,所以我通过定义了⼀个新的数组,uchar smgduan[10]={48,49,50,51,52,53,54,55,56,57};以及lcd_write_data(smgduan[table2[i]]);的⽅式,实现了在LCD上输出字符0-9的功能。
在最后做两个数组⽐较时,开始同样出现了这个情况,因为数字1和字符1对应的ASCII值不同,所以password[i]不等于table2[i],需要进⾏转换,我的⽅式的是password[i]==smgduan[table2[i]];罗⾥吧嗦这个多,主要还是给未来的⾃⼰看看,当初犯得错误多么低级。
---------------------------------------------------分割线-----------------------------------------------------------------------------------下⼀版改进考虑把重复按键选择数字改成矩阵按键,加进些其他的功能。
---------------------------------------------------分割线-----------------------------------------------------------------------------------程序部分:/*这个⽅案是我写基于51单⽚机的电⼦密码锁过程中,未完成全部功能的程序。
基于51单片机简易密码锁设计
易密码锁设计摘要:本设计以单片机STC89C52RC作为密码锁监控装置的检测和控制核心,分为主机控制和从机执行机构(本设重点介绍主机设计),实现钥匙信息在主机上的初步认证注册、密码信息的加密、钥匙丢失报废等功能。
根据51单片机之间的串行通信原理,这便于对密码信息的随机加密和保护。
而且采用键盘输入的电子密码锁具有较高的优势。
采用数字信号编码和二次调制方式,不仅可以实现多路信息的控制,提高信号传输的抗干扰性,减少错误动作,而且功率消耗低;反应速度快、传输效率高、工作稳定可靠等。
软件设计采用自上而下的模块化设计思想,以使系统朝着分布式、小型化方向发展,增强系统的可扩展性和运行的稳定性。
测试结果表明,本系统各项功能已达到本设计的所有要求。
关键词:单片机;智能密码锁;串行通信The Design Of The Simple Password LockAbstract:It can carry out the key information to register in the main on board initial attestation, the password information encrypt etc. Go to correspond by letter the principle according to the string between 51 machines, this is easy to encrypt and protect to the passwords information random. Adopt the numerical signal codes,not only can carry out many controls of the road information, raise the anti- interference that signal deliver, reduce the mistake action,but also the power consume is low,Respond quickly,the efficiency deliver is high, work stable credibility etc. The software design adoption the design thought from top to bottom, to make the system toward wear distribute type,turn to the direction development of small, strengthen the system and can expand the stability and circulate.Test the result enunciation, various functions of this system are already all request of this design.Key Words : singlechip; intelligent password lock; Serial communication;目录概述 (1)1 设计目标 (1)2硬件设计与原理 (2)2.1 设计总框图 (2)2.2 硬件设计分析 (2)2.2.1 电源的设计 (2)2.2.2 单片机最小系统 (3)2.2.3 显示系统 (8)2.2.4 矩阵按键模块 (8)2.2.5 蜂鸣器和指示灯电路 (9)3软件设计与分析 (9)3.1 软件设计的组成 (9)3.2 各部分软件分析 (9)3.2.1 延时子函数 (9)3.2.2 矩阵键盘扫描子函数 (10)3.2.3 检验密码正误子函数 (10)3.2.4锁定,鸣笛程序 (11)3.2.5显示子程序 (11)4软件仿真 (14)4.1 PROTEUS简介 (14)4.2仿真图 (15)总结 (19)参考文献 (20)致谢 (28)附录 (29)述随着人们生活水平的提高,传统的机械锁由于其构造的简单,被撬开的事件屡见不鲜,电子锁保密性高,能够防止不法分子多次试探密码;性价比高,因此,电子锁受到了广大的亲昵。
基于51单片机的密码锁设计程序_
uchar temp,count,aa,bb,cc。/*一般将这些变量定义在C文件中
当主函数需要时用extern引用*/
bit shu_flag,modify_flag,rst。
bit fun_flag。//功能键Байду номын сангаас志位没使用
bit down_flag,up_flag,open_flag。
write_ds1302_byte(dat)。
T_CLK=1。
T_EN=0。
}
uchar read_ds1302_data(uchar addr)
{
uchar date。
T_EN=0。
T_CLK=0。
T_EN=1。
write_ds1302_byte(addr)。
date=read_ds1302_byte()。
sda=1。
delay1()。
}
void i2c_ack()
{
uchar i。
scl=1。
delay1()。
while((sda==1)&&(i<250)) i++。
scl=0。
delay1()。
}
void i2c_nack()
{
scl=1。
delay1()。
sda=1。
scl=0。
delay1()。
lcd_rs_port=1。
lcd_rw_port =0。
lcd_en_port=0。
P0=dat。
lcd_en_port=1。
lcd_en_port=0。
}
void wtite_lcd_1602_dat(uchar x_pos,uchar y_pos,uchar dat)
51单片机密码锁程序.
/*停止条件*/ void Stop(void) { Sda=0; Scl=1; Nop(); Sda=1; Nop(); } /*应答位*/ void Ack(void) { Sda=0;
Nop(); Scl=1; Nop(); Scl=0; } /*反向应答位*/ void NoAck(void) { Sda=1; Nop(); Scl=1; Nop(); Scl=0; } /*发送数据子程序,Data 为要求发送的数据*/ void Send(uchar Data) { uchar BitCounter=8; uchar temp; do { temp=Data; Scl=0; Nop(); if((temp&0x80)==0x80) Sda=1; else Sda=0; Scl=1; temp=Data<<1; Data=temp; BitCounter--; } while(BitCounter); Scl=0; } /*读一字节的数据,并返回该字节值*/ uchar Read(void) { uchar temp=0; uchar temp1=0; //判断是否传送完成 //将待发送数据暂存 temp
= {"===Coded Lock==="}; = {" correct "}; = {" error "}; = {" pass "}; = {" open "}; = {"SetNewWordEnable"}; = {"input: "}; = {"ResetPasswordOK "};
unsigned char code initword[] unsigned char code Er_try[] unsigned char code again[]
基于51单片机多功能电子密码锁
#include <reg52.h>#define uint unsigned int#define uchar unsigned char#define KEY P3 //键盘输入端口#define No_key 20 //无按键时的返回值#define lcddata P2 //1602的数据输入端口sbit lcden= P1^2。
sbit lcdrs= P1^0。
sbit lcdrw= P1^1。
sbit light= P1^3。
sbit light1= P1^4。
uchar j 。
//用来统计输入个数的全局变量uchar aa。
//用来在定时器中计数的全局变量uchar code table[]= " Hello!"。
uchar code table1[]=" OK! " 。
uchar code table2[]="Enter please:" 。
uchar code key_table[16] ={1,2,3,10,4,5,6,11,7,8,9,12,0,13,14,15}。
uchar password[]={2,0,1,0,9,3} 。
//设定初始密码uchar save[6]。
//保存输入的数据uchar conflag 。
//确认标志uchar lockflag。
//锁键盘标志uchar startflag。
//开始标志void delay(uint z>。
//延时子函数void wright_com(uchar com>。
//写指令函数void wright_data(uchar date> 。
//写数据函数void init(>。
//初始化void display_OK(>。
// 显示OKvoid delete(>。
//删除输入的最后一个数uchar keyscan(> 。
基于51单片机的电子密码锁系统设计制作,电路图+源程序
基于51单片机的电子密码锁系统设计制作,电路图+源程序这款基于51单片机的电子密码锁系统,单片机用STC89C52RC单片机,电路简单,制作过程中不需要进行调试,支持密码掉电保存功能!密码储存于单片机内部自带的的EEPROM中,不需要外置AT24C01保存密码,是学习电子密码锁比较好的教学试验系统,主要功能如下:1、1602液晶菜单显示。
2、6位密码,密码可重置,重置密码时,先输入原始密密,正确后输入新密码,再交输入新密码,两次输入的密码一致辞时,密码修改成功。
开锁时,密码通过键盘输入,若密码正确,则将锁打开,诺密码不正确时,无法开锁,密码输入错误三次时,蜂鸣器报警并且锁定键盘,10分钟。
3、支持掉电保存密码功能。
单片机中的密码是储存于单片内部的EEPROM中,在密码锁系统断电时,储存在密码锁系统中的密码不会丢失。
4、密码锁系统采用5V继电器模拟开锁过程。
5、输入的正确时,继电器吸合2-3秒,开锁指示灯亮2-3秒,模拟开锁。
6、密码错误报警且有错误提示(显示Error)。
7、密码正确开锁指示。
8、4X4矩阵键盘输入。
9、随时可修改密码存储,支持掉电保存密码功能,功能更为实用。
10、密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。
修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。
源程序如下:1. #include<reg52.h>2. #define uint unsigned int3. #define uchar unsigned char4. void key_scan();5. uchar count0,count1,count3,num,n=0,temp,a,j,count4;6. uchar mima[8]; //初始密码存储区7. uchar tab_key[50]; //输入密码存储区8. uchar code table[]={9. 0x3f,0x06,0x5b,0x4f,10. 0x66,0x6d,0x7d,0x07,11. 0x7f,0x6f,0x77,0x7c,12. 0x39,0x5e,0x79,0x71};13. bit enterflag; //确认键按下与否的标志14. bit mimaflag; //密码正确与否的标志15. bit xiugaiflag; //修改密码标志16. bit enter1flag; //修改密码确认键标志17. sbit red=P3^7;18. sbit bell=P3^6;19. sbit rs=P2^0;20. sbit rw=P2^1;21. sbit lcden=P2^2;22. sbit scl=P3^4;23. sbit sda=P3^5;24. uchar code table1[]="input the passco";25. uchar code table2[]="de: --------";26. uchar code table3[]="*";27. uchar code table4[]="right (^_^) ";28. uchar code table5[]="first error";29. uchar code table6[]="second error";30. uchar code table7[]="third error see ";31. uchar code table8[]="u tomorrow (^_^)";32. uchar code table9[]="define the passc";33. uchar code table10[]="ode: --------";34. uchar code table11[]="code is new";35. //******************************键盘消抖函数*******************************36. void delay1()37. { ;; }38. void delay2(uchar x)39. {40. uchar a,b;41. for(a=x;a>0;a--)42. for(b=100;b>0;b--);43. }44.45. void delay(uint z)46. {47. uint x,y;48. for(x=z;x>0;x--)49. for(y=110;y>0;y--);50. }51.52. //****************************e^2room的初始化*******************************53. void start() //开始信号54. {55. sda=1;56. delay1();57. scl=1;58. delay1();59. sda=0;60. delay1();61. }62.63. void stop() //停止64. {65. sda=0;66. delay1();67. scl=1;68. delay1();69. sda=1;70. delay1();71. }72. //****************************应答信号*************************************73. void respond()74. {75. uchar i;76. scl=1;77. delay1();78. while((sda==1)&&(i<250))i++;79. scl=0;80. delay1();81. }82. //*****************************写字节操作函数**********************************83. void write_byte(uchar date)84. {85. uchar i,temp;86. temp=date;87. for(i=0;i<8;i++)88. {89. temp=temp<<1; //保持最高位,左移到进位CY90. scl=0;91. delay1();92. sda=CY;93. delay1();94. scl=1;95. delay1();96. }97. scl=0;98. delay1();99. sda=1;//总线释放100. delay1();101. }102. //*******************************读字节操作函数***************************** 103. uchar read_byte()104. {105. uchar i,k;106. scl=0;107. delay1();108. sda=1;109. delay1();110. for(i=0;i<8;i++)111. {112. scl=1;113. delay1();114. k=(k<<1)|sda; //或运算,放到最低位115. scl=0;116. delay1();117. }118. return k;119. }120. //**********************************写地址函数****************************** 121. void write_add(uchar address,uchar date)122. {123. start();124. write_byte(0xa0);125. respond();126. write_byte(address);127. respond();128. write_byte(date);129. respond();130. stop();131. }132. //*******************************读地址函数************************************* 133. uchar read_add(uchar address)134. {135. uchar date;136. start();137. write_byte(0xa0);138. respond();139. write_byte(address);140. respond();141. start();142. write_byte(0xa1);143. respond();144. date=read_byte();145. stop();146. return date;147. }148. //****************************LCD1602的初始化******************************* 149. void write_com(uchar com)150. {151. rs=0;152. lcden=0;153. P0=com;154. delay(5);155. lcden=1;156. delay(5);157. lcden=0;158. }159.160. void write_date(uchar date)161. {162. rs=1;163. lcden=0;164. P0=date;165. delay(5);166. lcden=1;167. delay(5);168. lcden=0;169. }170.171. //***************************************密码比较函数******************************** 172. bit mimacmp()173. {174. bit flag;175. uchar i;176. for(i=0;i<8;i++)177. {178. if(mima[i]==tab_key[i])179. flag=1;180. else181. {182. flag=0;183. i=8;184. }185. }186. return(flag); //返回flag187. }188.189. ////**********************************LCD显示函数开始**************************************190. void lcd_display()191. {192. uchar i=0;193. write_com(0x80+0x40+8);194. for(i=0;i<n;i++)195. {196. write_date(table3[0]);197. }198. }199.200. //****************************************键盘功能分配函数群开始****************************201. //** 0 ** 1 **2 ** 3**202. //** 4** 5** 6 **7 **203. //**8** 9** 确认(A) **无效(B)204. //**取消(C)**修改密码键(D)**确认修改键(E)**无效(F)205.206. void key_manage1()207. {208. tab_key[n]=0;209. n++;210. if(xiugaiflag==1)211. {212. mima[count4]=0;213. count4++;214. }215. }216.217. void key_manage2()218. {219.220. tab_key[n]=1;221. n++;222. if(xiugaiflag==1)223. {224. mima[count4]=1;225. count4++;226. }227. }228.229. void key_manage3()230. {231.232. tab_key[n]=2;233. n++;234. if(xiugaiflag==1)235. {236. mima[count4]=2;237. count4++;238. }239. }240.241. void key_manage4() 242. {243. tab_key[n]=3; 244. n++;245. if(xiugaiflag==1) 246. {247. mima[count4]=3; 248. count4++;249. }250. }251.252. void key_manage5() 253. {254. tab_key[n]=4; 255. n++;256. if(xiugaiflag==1) 257. {258. mima[count4]=4; 259. count4++;260. }261. }262.263. void key_manage6() 264. {265. tab_key[n]=5; 266. n++;267. if(xiugaiflag==1) 268. {269. mima[count4]=5; 270. count4++;271. }272. }273. void key_manage7() 274. {275. tab_key[n]=6; 276. n++;277. if(xiugaiflag==1) 278. {279. mima[count4]=6; 280. count4++;281. }282. }283. void key_manage8() 284. {285. tab_key[n]=7; 286. n++;287. if(xiugaiflag==1) 288. {289. mima[count4]=7; 290. count4++;291. }292. }293.294. void key_manage9()295. {296. tab_key[n]=8;297. n++;298. if(xiugaiflag==1)299. {300. mima[count4]=8;301. count4++;302. }303. }304. void key_manage10()305. {306. tab_key[n]=9;307. n++;308. if(xiugaiflag==1)309. {310. mima[count4]=9;311. count4++;312. }313. }314. //**********************************确认键**************************************************************315. void key_manage11()316. {317. enterflag=1; //确认键按下318. if(n==8) //只有输入8个密码后按确认才做比较319. mimaflag=mimacmp();320. else321. mimaflag=0;322. if(enterflag==1)323. {324. enterflag=0;325. n=0;326. //用FFFFFFFF清除已经输入的密码327. for(count3=0;count3<8;count3++)328. {329. delay(5);330. tab_key[count3]=0x0f;331. }332.333. TR1=1; //打开计数器1334. count1=0; //定时器1由50MS累计到1S 所用的计数器335. if(mimaflag==1)336. {337. a=0;338.339. write_com(0x01);340. write_com(0x80);341. for(count3=0;count3<16;count3++)342. {343. write_date(table4[count3]); //密码正确,显示RIGHT,绿灯亮344. delay(5);345. }346. }347.348. else349. {350. n=0;351. red=0;352. bell=0;353. a++;354. if(a==1)355. {356. for(count3=0;count3<8;count3++) //ffffffff清除密码357. {358. delay(5);359. tab_key[count3]=0x0f;360. }361. write_com(0x01); 362. write_com(0x80);363. for(count3=0;count3<16;count3++)364. {365. write_date(table5[count3]); //密码错误,显示 first error,红灯亮366. delay(5);367. }368. TR1=1;369. }370. if(a==2)371. {372. for(count3=0;count3<8;count3++) //ffffffff清除密码373. {374. delay(5);375. tab_key[count3]=0x0f;376. }377. write_com(0x01);378. write_com(0x80);379. for(count3=0;count3<16;count3++)380. {381. write_date(table6[count3]); //密码错误,显示SECOND ERROR,红灯亮382. delay(5);383. }384. TR1=1;385. }386.387. if(a==3)388. {389. for(count3=0;count3<8;count3++) //ffffffff清除密码390. {391. delay(5);392. tab_key[count3]=0x0f;393. }394. write_com(0x01);395. write_com(0x80);396. for(count3=0;count3<16;count3++)397. {398. write_date(table7[count3]); //密码错误,显示third error see,红灯亮399. delay(5);400. }401. write_com(0x80+0x40);402. for(count3=0;count3<16;count3++)403. {404. write_date(table8[count3]);//密码错误,显示 U TOMORROW ,红灯亮405. delay(5);406. }407. TR1=0;408.409. }410.411. }412. }413.414. }415. void key_manage12()416. {417. tab_key[n]=11;418. n++; //密码计数清零419.420. }421. //****************************************************取消键********************************************422. void key_manage13()423. {424.425. n=0; //密码计数清零426. write_com(0x80); //指针所指位置427. for(count3=0;count3<16;count3++)428. {429. write_date(table1[count3]); //第一行显示INPUT THE PASSPORD:430. delay(5);431. }432. write_com(0x80+0x40);433. for(count3=0;count3<16;count3++)434. {435. write_date(table2[count3]); //开机显示--------436. delay(5);437. tab_key[count3]=0x0f; //用FFFFFFFF清楚已经输入的密码438. }439.440. }441. //*******************************************修改密码键********************************** 442. void key_manage14()443. {444. uchar aa=0;445. n=0;446. xiugaiflag=1;447. write_com(0x01);448. write_com(0x80);449. for(count3=0;count3<16;count3++)450. {451. write_date(table9[count3]); //显示define the password452. delay(5);453. tab_key[count3]=0x0f; //用FFFFFFFF清楚已经输入的密码454. }455. write_com(0x80+0x40);456. for(count3=0;count3<16;count3++)457. {458. write_date(table10[count3]); //显示--------459. delay(5);460. }461. TR0=1;462.463. }464. //******************************************修改密码键的确认键********************************465. void key_manage15()466. {467. n=0;468. enter1flag=1;469. if(enter1flag==1)470. {471. enter1flag=0;472. count4=0;473. for(count3=0;count3<16;count3++)474. {475. tab_key[count3]=0x0f; //用FFFFFFFF清楚已经输入的密码476. }477. write_com(0x01);478. write_com(0x80);479. for(count3=0;count3<16;count3++)480. {481. write_date(table11[count3]);482. delay(100);483. }484. TR1=1;485. count1=0;486. }487. }488. void key_manage16()489. {490. tab_key[n]=15;491. n++;492. }493.494. //****************************************定时器1的50MS,共延时1秒*****************************495. void time_1() interrupt 3496. {497.498. TH1=(65536-50000)/256;499. TL1=(65536-50000)%256;500. if(count1<20)501. {502. count1++;503. }504. else //计时到1S505. {506. TR1=0;507. count1=0;508. mimaflag=0;509.510. red=1;511. bell=1;512. //显示FFFFFFFF513. write_com(0x01);514. write_com(0x80);515. for(count3=0;count3<16;count3++)516. {517. write_date(table1[count3]); //显示INPUT THE PASSCODE518. delay(5);519. }520. write_com(0x80+0x40);521. for(count3=0;count3<16;count3++)522. {523. write_date(table2[count3]); //开机显示FFFFFFFF524. delay(5);525. }526. }527.528. }529. //***********************************************定时0**********************************************530. void time_0() interrupt 1531. {532.533. TH0=(65536-50000)/256;534. TL0=(65536-50000)%256;535. if(count4<8)536. {537. key_scan();538. }539. else540. {541. TR0=0;542. count4=0;543. }544. }545.546. //初始化函数547. void init()548. {549.550. uchar i;551. lcden=0;552. write_com(0x38); //打开显示模式设置553. write_com(0x0c); //打开显示,光标等等设置未零554. write_com(0x06); //当读或写一个字符后地址指针加一,且光标加一,当写一个字符后整频显示左移,555. write_com(0x01); //清零指令556. write_com(0x80); //指针所指位置557.558. //定时器初始化559. TMOD=0x11; //T0,T1工作方式1560. TH0=(65536-2000)/256;561. TL0=(65536-2000)%256; //T0初始化2MS563. TH1=(65536-50000)/256;564. TL1=(65536-50000)%256; //T1初始化50MS565.566. TR1=0;567. ET1=1;568. EA=1;569. TR0=0;570. ET0=1;571.572. count0=0; //初始没有密码输入,故为零573. enterflag=0; //没有确认键按下574. mimaflag=0; //密码正确与否键先置零575.576. red=1; //红灯不亮577. //************密码存入EPROM中**********************************578. sda=1;579. delay(5);580. scl=1;581. delay(5);582. for(i=0;i<8;i++)583. {584. write_add(i,8);585. delay2(100);586. }587. for(i=0;i<8;i++)588. {589. mima[i]=read_add(i);590. delay(5);591. }592.593. }594. void main()595. { rw=0;596. init();597. write_com(0x80); //指针所指位置598. for(count3=0;count3<16;count3++)599. {600. write_date(table1[count3]); //第一行显示INPUT THE PASSPORD: 601. delay(5);602. }603. write_com(0x80+0x40);604. for(count3=0;count3<16;count3++)605. {606. write_date(table2[count3]); //开机显示FFFFFFFF607. delay(5);608. }609. while(1)610. {611. key_scan(); //调用键盘扫描函数612. lcd_display();613. }614.615. }616. //**************************************************键盘扫描函数开始********************************619. //**********扫描第一行*********620. P1=0xfe;621. temp=P1;622. temp=temp&0xf0;623. if(temp!=0xf0)624. {625. delay(100);626. if(temp!=0xf0)627. {628. temp=P1;629. switch(temp)630. {631. case 0xee:632. key_manage1();633. break;634.635. case 0xde:636. key_manage2();637. break;638.639. case 0xbe:640. key_manage3();641. break;642.643. case 0x7e:644. key_manage4();645. break;646. }647. while(temp!=0xf0)648. {649. temp=P1;650. temp=temp&0xf0;651. }652. }653. }654. //**************************************************扫描第二行***********************************655. P1=0xfd;656. temp=P1;657. temp=temp&0xf0;658. if(temp!=0xf0)659. {660. delay(100);661. if(temp!=0xf0)662. {663. temp=P1;664. switch(temp)665. {666. case 0xed:667. key_manage5();668. break;669.670. case 0xdd:671. key_manage6();674. case 0xbd:675. key_manage7();676. break;677.678. case 0x7d:679. key_manage8();680. break;681. }682. while(temp!=0xf0)683. {684. temp=P1;685. temp=temp&0xf0;686. }687. }688. }689. //*********************************************扫描第三行***********************************690. P1=0xfb;691. temp=P1;692. temp=temp&0xf0;693. if(temp!=0xf0)694. {695. delay(100);696. if(temp!=0xf0)697. {698. temp=P1;699. switch(temp)700. {701. case 0xeb:702. key_manage9();703. break;704.705. case 0xdb:706. key_manage10();707. break;708.709. case 0xbb:710. key_manage11();711. break;712.713. case 0x7b:714. key_manage12();715. break;716. }717. while(temp!=0xf0)718. {719. temp=P1;720. temp=temp&0xf0;721. }722. }723. }724.725. //***************************************************扫描第四行****************************************727. temp=P1;728. temp=temp&0xf0; 729. if(temp!=0xf0) 730. {731. delay(100);732. if(temp!=0xf0) 733. {734. temp=P1;735. switch(temp) 736. {737. case 0xe7:738. key_manage13(); 739. break;740.741. case 0xd7:742. key_manage14(); 743. break;744.745. case 0xb7:746. key_manage15(); 747. break;748.749. case 0x77:750. key_manage16(); 751. break;752. }753. while(temp!=0xf0) 754. {755. temp=P1;756. temp=temp&0xf0; 757. }758. }759. }760. }复制代码。
51单片机密码锁程序
sbit beep=P2^0; //蜂鸣器,低电平叫
sbit red=P2^1; //红灯,低电平亮
sbit close=P2^7; //锁合指示灯,黄色。低电平亮
1 2 3 确定
0
---------------------------------------------------------------------------------------------------------------------------------------------------------*/
初始密码为四位,1,2,3,4 如果想修改密码的长度,可将程序中的密码长度4改为你想设置的长度值
初始密码1,2,3,4也可在函数init_main()函数中修改
密码锁上电后,锁合灯亮,初始密码为1,2,3,4 。
当输入的四位密码按确定键后,密码正确时锁开灯亮,锁合灯灭。当不正确时,锁合灯继续亮,蜂鸣器短报警
pwflag = 0; // 密码标志先置为0
last_pwflag=0;
close=0; //锁合灯亮,其它灯灭
delay();
red=1;
delay();
delay();
delay();
delay();
red=0;
delay();
delay();
delay();
delay();
red=1;
}
//快闪红灯,重新输入自定义密码
void flashred_S(void)
case 0xdb: return 8;break;
基于51单片机密码锁的汇编程序
基于51单片机密码锁的汇编程序ORG 0000HENTER1 EQU 05HCHECK1 EQU 06HCHECK2 EQU 07HSJMP STARTORG 0080HSTART:ACALL INITIALBEGIN:MOV 20H,#04HMOV 21H,#50HLOOP: ACALL KEYMOV R0,21HMOV @R0,AINC 21HDEC 20HACALL DISPLAYMOV A,20HJNZ LOOPACALL KEYACALL ENTERJB ENTER1,WAY1ACALL ZEROACALL WRONGAJMP BEGINWAY1: ACALL CHECKJB CHECK1,WAY2 AJMP WAY11WAY2: ACALL ZERO CLR P3.3ACALL KEYACALL RESETSETB P3.3ACALL ZEROAJMP BEGINWAY11: ACALL CHECK11 ACALL ZEROJB CHECK2,WAY22 ACALL WRONGAJMP BEGINWAY22: CLR P3.3 ACALL KEYACALL RESET22SETB P3.3ACALL ZEROAJMP BEGINENTER:SUBB A,#0AH JNZ E1SETB ENTER1RETE1: CLR ENTER1 RETINITIAL:MOV R3,#00H MOV 40H,#00H MOV 41H,#01H MOV 42H,#02H MOV 43H,#03HMOV 50H,#00H MOV 51H,#00H MOV 52H,#00H MOV 53H,#00HMOV 60H,#03HMOV 61H,#03H MOV 62H,#03H MOV 63H,#03H RETCHECK:MOV R5,#04H MOV R0,#50HMOV R1,#40HM2: MOV 2EH,@R0 MOV A,@R1CJNE A,2EH,M1INC R0INC R1DEC R5DJNZ R5,M2SETB CHECK1RETM1: CLR CHECK1 RETRESET:SUBB A,#0BHJZ MOD1RETMOD1: MOV 24H,#04H MOV 25H,#70HMOV 26H,#50HLOOP3:ACALL KEYMOV R0,25HMOV @R0,AMOV R1,26HMOV A,#0FHMOV @R1,AINC 26HINC 25HDEC 24HMOV A,24HJNZ LOOP3ACALL KEYACALL ENTERACALL ZEROJB ENTER1,RESETAGAIN ACALL WRONG1AJMP MOD1L3: RETRESETAGAIN:MOV 24H,#04H MOV 25H,#75HMOV 26H,#50HLOOP4: ACALL KEYMOV R0,25HMOV @R0,AMOV R1,26HMOV A,#0FHMOV @R1,AINC 26HINC 25HDEC 24HMOV A,24HJNZ LOOP4ACALL KEYACALL ENTERACALL ZEROJB ENTER1,RESETCHECK ACALL WRONG1AJMP RESETAGAINRESETCHECK:MOV R5,#04H MOV R0,#70HMOV R1,#75HW2: MOV 2EH,@R0MOV A,@R1CJNE A,2EH,W1INC R0INC R1DEC R5DJNZ R5,W2AJMP FINALW1: ACALL WRONG1 AJMP MOD1FINAL: MOV 40H,70H MOV 41H,71HMOV 42H,72HMOV 43H,73HAJMP L3CHECK11:MOV R5,#04H MOV R0,#50HMOV R1,#60HM22: MOV 2EH,@R0MOV A,@R1CJNE A,2EH,M11INC R0INC R1DEC R5DJNZ R5,M22SETB CHECK2RETM11: CLR CHECK2 RETRESET22:SUBB A,#0BH JZ MOD2RETMOD2: MOV 24H,#04H MOV 25H,#70HMOV 26H,#50H LOOP33:ACALL KEY MOV R0,25HMOV @R0,AMOV R1,26HMOV A,#0FHMOV @R1,AINC 26HINC 25HDEC 24HMOV A,24HJNZ LOOP33ACALL KEYACALL ENTERACALL ZEROJB ENTER1,RESETAGAIN2 ACALL WRONG1AJMP MOD2L33: RETRESETAGAIN2:MOV 24H,#04H MOV 25H,#75HMOV 26H,#50HLOOP44: ACALL KEYMOV R0,25HMOV @R0,AMOV R1,26HMOV A,#0FHMOV @R1,AINC 26HINC 25HDEC 24HMOV A,24HJNZ LOOP44ACALL KEYACALL ENTERACALL ZEROJB ENTER1,RESETCHECK2 ACALL WRONG1AJMP RESETAGAIN2RESETCHECK2:MOV R5,#04H MOV R0,#70HMOV R1,#75HW22: MOV 2EH,@R0MOV A,@R1CJNE A,2EH,W11INC R0INC R1DEC R5DJNZ R5,W22AJMP FINAL2W11: ACALL WRONG1 AJMP MOD2FINAL2: MOV 60H,70H MOV 61H,71HMOV 62H,72HMOV 63H,73HAJMP L33KEY: ACALL KS1JNZ LK1ACALL DISPLAYAJMP KEYLK1: ACALL T12MS ACALL KS1JNZ LK2AJMP KEYLK2: MOV A,#0EFH MOV R2,AMOV R4,#00HLK4: MOV A,R2 MOV P1,AMOV A,P1JB ACC.0,LONE MOV A,#00HAJMP LKPLONE: JB ACC.1,LTWO MOV A,#01HAJMP LKP LTWO: JB ACC.2,LTHR MOV A,#02HAJMP LKPLTHR: JB ACC.3,NEXT MOV A,#03H LKP: ADD A,R4 PUSH ACCLK3: ACALL KS1JNZ LK3POP ACCRETNEXT: INC R4INC R4INC R4INC R4MOV A,R2JNB ACC.7, KNDRL AMOV R2,AAJMP LK4KND: RETKS1: MOV A,#0FH MOV P1,AMOV A,P1CPL AANL A,#0FHRETT12MS:MOV R7,#18H TM: MOV R6,#0FFH TM6: DJNZ R6,TM6 DJNZ R7,TMRETDISPLAY:MOV R2,#04H MOV R0,#50HMOV R1,#01H START2: MOV A,@R0 MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,AMOV A,R1MOV P2,AACALL DL1INC R0MOV A,R1RL AMOV R1,ADJNZ R2,START2RETTAB: DB 3FH, 06H,5BH,4FH,66H,6DH,7DH,07H,4FH,6FH,77H,7CH,39H,5EH,79H ,71HDL1: MOV R7,#02HDL: MOV R6,#0FFHDL6: DJNZ R6,DL6DJNZ R7,DLRETWRONG1: CLR P3.2MOV R7,#1EHDL22: MOV R6,#0F9HDL33: DJNZ R6,DL33DJNZ R7,DL22SETB P3.2RETWRONG: CLR P3.2MOV R7,#1EHDL2: MOV R6,#0F9HDL3: DJNZ R6,DL3 DJNZ R7,DL2SETB P3.2 ALARM: INC R3 CJNE R3,#03H,A1 AJMP WARNA1: RETWARN: CLR P3.4 MOVR5,#06HDL10: MOV R7,#0FFH DL8: MOV R6,#0FFH DL9: DJNZ R6,DL9 DJNZ R7,DL8DJNZ R5,DL10 SETB P3.4ACALL ZEROA2: DEC R3DEC R3DEC R3RETZERO: MOV 50H,#00H MOV 51H,#00H MOV 52H,#00H MOV 53H,#00HRETEND。
基于51单片机的密码锁(C语言)
电路:功能描述,开机无显示。
按下除号,开始输入密码,显示短线,初始密码为0000。
输入完后,按下on/c键,确定。
正确显示open,错误显示err。
=键为取消键,输入密码过程中,按下取消键,数码管全亮1s,然后灭掉。
恢复初始状态。
按下乘号,设置密码,此时数码管显示短线。
输入正确密码后,进入更改密码状态,显示全F。
输入更改后密码,按下on/C键,确认。
PS:1输入任意时刻,都可按等号返回初始状态。
2输入时,数字会相应的显示。
通过Protues仿真,电路图为protues输出的。
送给初学者,学习参考。
#include <reg52.h>#define uint8 unsigned char#define uint16 unsigned int//数码管编码。
uint8 code SEG7LED[26] = {0x3f,0x06,0x5b,0X4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40,0xff,0x3f,0x73,0x79,0x37, //open0x79,0x77,0x77}; //err//变量声明uint8 Ge,Shi,Bai,Qian;//数码管各个位uint8 WeiNum=1;uint8 code P1Pin[9] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};uint8 state=0;//记录密码锁状态,0为待机状态,1为输入密码,2,3为设置密码uint8 InputNum=1;//记录输入密码时,目前密码的位数。
uint8 InPassWord[4];uint8 PassWord[4]={0,0,0,0};//函数声明void initTimer0();void display(uint8 WeiNum);uint8 keyscan();void delayms(uint16 Xms);void password(uint8 key);uint8 Compare(uint8 InPassWord[4]);void main(){uint8 key;initTimer0();while(1){key = keyscan();password(key);}}void initTimer0(){EA = 1;ET0 = 1;TMOD = 0X01;TH0 = (65535-5000)/256;TL0 = (65535-5000)%256;TR0 = 1;}void Timer0() interrupt 1{TH0 = (65535-5000)/256;TL0 = (65535-5000)%256;display(WeiNum);WeiNum ++;if(WeiNum==5)WeiNum = 1;}void display(uint8 WeiNum){switch(WeiNum){case 1:{P2 = 0xff;P0 = SEG7LED[Qian];P2 = 0xfe;break;}case 2:{P2 = 0xff;P0 = SEG7LED[Bai];P2 = 0xfd;break;}case 3:{P2 = 0xff;P0 = SEG7LED[Shi];P2 = 0xfb;break;}case 4:{P2 = 0xff;P0 = SEG7LED[Ge];P2 = 0xf7;break;}default:{P2 = 0xff;P0 = 0xff;P2 = 0xff;break;}}}void delayms(uint16 Xms){uint16 i,j;for(i=Xms;i>0;i--)for(j=110;j>0;j--);}uint8 keyscan(){uint8 i=0;uint8 key8=0xff;uint8 key=0xff;uint8 Button;for(i=0;i<4;i++){P1 = P1Pin[i];Button = P1;if(Button != P1Pin[i]){delayms(5);Button = P1;if(Button != P1Pin[i]){key8 = Button;}while(Button != P1Pin[i]){ Button = P1; }}}switch(key8){//0~9数字键,12确定,14取消,10输入密码,11设置密码。
基于51单片机的密码锁(可改密码)
实习报告实习名称:单片机应用实习院(系)名称:电气与信息工程学院专业班级:xxxxxxxxx学生姓名:xxxxxx学号:xxxxxx指导教师:xxxxxxxxxx黑龙江工程学院教务处制2014年7月目录第1章总体设计方案 (4)1.1总体设计方案 (4)第2章硬件电路设计 (5)2.1单片机最小系统电路设计 (5)2.2液晶显示模块 (6)2.3键盘输入模块 (7)2.4 AT24C02密码存储模块 (8)2.5 系统供电电路设计 (9)2.6 蜂鸣器和继电器模块 (10)第3章系统软件设计 (11)3.1软件总体设计思路 (11)3.2主程序流程设计 (12)总结 (13)参考文献 (14)附录 (15)附录一 (15)附录二 (15)实习任务书学生姓名xxxx 系部电气与信息工程学院专业班级测控12-1指导教师姓名xxx 职称副教授讲师是否外聘□是否题目名称键盘式电子密码锁一、设计的内容、目的和意义本次实习是有关于键盘式电子密码锁的设计。
在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。
若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。
随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。
为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。
密码锁具有安全性高、成本低、功耗低、易操作等优点。
本次实习的目的是实现电子密码锁的功能,并运用单片机技术设计一个结构简单,并且相对低成本的密码锁。
二、设计的技术指标要求1、研究方法(1)总体按照最优化的方法进行软件设计和硬件设计,走软件实现道路;(2)对软硬件进行模块划分,并对各单元电路结合EDA工具进行论证设计;(3)在查阅文献基础上展开设计,力求创新。
2、技术要求(1)采用6位密码(2)报警、锁定键盘功能。
基于51单片机简易密码锁程序设计
基于51单片机简易密码锁程序设计//晶振11.0592MHz,T1每250微秒中断,按键P1.0-P1.7,发光二极管接P3.0-P3.3,p3.4 /*变量的定义:show_val[6]: 显示的值init_val[6]: 密码初始值key_val: 返回按键的值255-表示无按键按下key_index: 当前按键是哪一位密码T1_cnt: 定时器计数溢出数cnt_val_15s: 报警计时的数值cnt_val_5s: 待机时间计时cnt_val_4s: 输入正确,等待4秒清除开锁信号cnt_state: 计时状态error_num: 错误次数led_seg_code:数码管7段码*/#include <reg51.h>#define S1 0xEE;#define S2 0xDE;#define S3 0xBE;#define S4 0x7E;#define S5 0xED;#define S6 0xDD;#define S7 0xBD;#define S8 0x7D;#define S9 0xEB;#define S10 0xDB;#define S11 0xBB;//有源蜂鸣器sbit SPEAK=P3^5;unsigned char data cnt_val_15s,cnt_val_5s,cnt_val_4s,cnt_state;unsigned int data T1_cnt;unsigned char data key_val,key_index,key_val_old;unsigned char data state_val,error_num;unsigned char data show_val[7];char code init_val[6]={1,2,3,4,5,6};char code led_seg_code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//--------延时程序----------------void delay(unsigned int i)//延时{ while(--i); }void pw_error()//密码错误信号{int i;for(i=0;i<1000;i++){SPEAK=!SPEAK;delay(1);}}void audio_out()//有源蜂鸣器{ int i;for(i=0;i<5000;i++){SPEAK=!SPEAK;delay(3);}}void init_variant(){unsigned char i;for(i=0;i<7;i++)show_val[i]=11; //led_seg_code[10]=0x00表示数码管不显示任何内容key_index=1; //没有任何输入或清除所有输入时,保存当前键的位置}//---------按键扫描---------------unsigned char scan_key(){unsigned char row,col,key;key=0;P1=0x0f;if(P1==0x0f)return(0xff);delay(10);if(P1==0x0f)return(0xff);switch(P1){case 0x0e:row=0;break;case 0x0d:row=1;break;case 0x0b:row=2;break;case 0x07:row=3;break;}P1=0xf0;switch(P1){case 0xe0:col=0;break;case 0xd0:col=1;break;case 0xb0:col=2;break;case 0x70:col=3;break;}key=row*4+col;while(P1!=0xf0);return(key);}//---------数码管显示--------------- void led_show(){P0=led_seg_code[show_val[1]]; P2=0xdf;delay(500);P0=led_seg_code[show_val[2]]; P2=0xef;delay(500);P0=led_seg_code[show_val[3]]; P2=0xf7;delay(500);P0=led_seg_code[show_val[4]]; P2=0xfb;delay(500);P0=led_seg_code[show_val[5]]; P2=0xfd;delay(500);P0=led_seg_code[show_val[6]];P2=0xfe;delay(500);}//--------定时器T1中断服务程序-----------------void timer1() interrupt 3 //T1中断{T1_cnt++;f(T1_cnt>3999) //如果计数>3999, 计时1sT1_cnt=0;switch (cnt_state){case 1://密码输入正确,需要计时4sif(cnt_val_4s<4){ cnt_val_4s++;}else{ cnt_val_4s=0;init_variant();//密码输入正确,计时到4秒时,清除输入的内容//已开锁信号清零//开锁信号清零cnt_state=0;TR1=0; //停止计时}break;case 2: //密码输入错误3次,计时15sif(cnt_val_15s<15){ cnt_val_15s++;}else{ cnt_val_15s=0;init_variant();//三次密码错误时,计时15秒,清除输入的内容// 清除所有指示和报警cnt_state=0;TR1=0; //停止计时}break;}}}//--------判断键盘输入内容与密码是否一致------unsigned char check_input_pw(){ unsigned char i,k;k=1;for(i=0;i<6;i++){ k=k && (show_val[i]==init_val[i]); }return k;}//---------主程序----------------main(){ //初始化各变量SPEAK=1;P3=0xff;cnt_val_15s=0;cnt_val_5s=0;cnt_val_4s=0;cnt_state=0;//0-待机计时5s状态;1-密码正确,计时4s状态;2-三次密码错误,处于计时15秒状态。
基于51单片机的智能密码锁设计
基于51单片机的智能密码锁设计摘要:目前使用的智能密码锁大多数是基于单片机技术,本次设计以AT89C51作为主控芯片与数据存储单元,结合矩阵键盘的输入、LCD液晶显示、报警、开锁等。
用keil软件编写的控制程序,设计了一款具有设定和修改密码,并且具有报警功能的智能密码锁控制系统。
这种密码锁具有设计简单,易于开发,成本较低,安全可靠,操作方便等特点,可应用于住宅、办公室的保险箱及档案柜等需要防盗的场所,有比较强的实用性。
关键词:矩阵键盘;LCD;电磁锁;报警The design of the intelligent password lock based on 51 single chip microcomputerAbstract:The intelligent password lock most currently used are based on single chiptechnology, the design takes AT89C51 as the main control chip and the data storage unit, combined with the matrix keyboard input, the LCD liquid crystal display, alarm, lock etc.. Control program is compiled with keil software, designed a set and modify the password, and has intelligent cipher alarm lock control system.The cipher lock has the advantages of simple design, easy development, low cost, safe and reliable, convenient, safe and file cabinets need security can be applied to residential, office space, a relatively strong practical.Keywords: matrix keyboard; LCD; electromagnetic lock; alarm目录1、引言.................................. 错误!未定义书签。
51单片机密码锁制作的程序和流程图(很详细)
51单片机密码锁制作的程序和流程图(很详细)展开全文一、基本组成:单片机小系统+4*4矩阵键盘+1602显示+DC电机基本电路:键盘和和显示键盘接P1口,液晶的电源的开、关通过P2.7口控制电机(控制口P2.4)小系统就不贴上来了吧。
二、基本功能描述:1.验证密码、修改密码a)锁的初始密码是123456(密码最长为10位,最短为1位)。
2.恢复初始密码a)系统可以恢复初始密码,否则一旦忘记密码而又不能恢复初始密码,该锁就永远打不开。
但是又不能让用户自行修改密码,否则其他人也可以恢复该初始密码,使得锁的安全性大大下降。
3.使系统进入低功耗状态a)在实际使用中,锁只有在开门时才被使用。
因而在大多数的时间里,应该让锁进入休眠状态、以降低功耗,这使系统进入掉电状态,可以大大降低系统功耗。
b)同时将LCD背光灯关闭4.DC电机模拟开锁动作。
a)DC电机启动时解除开锁把手的锁定,允许通过把手开锁。
DC 电机不直接开锁,使得DC电机的功率不用太大,系统的组成和维护将变得简单,功耗也降了下来。
三、密码锁特点说明:1.0 输入将被以字符形式输入,最长为10位。
超过10位时系统将自动截取前10位、但不作密码长度溢出提示。
2.0 开锁10秒后不允许更改密码、并提示修改超时_进入初始态,需要重新输入密码方可再次修改密码。
3.0 系统未使用存储器存储密码故掉电后密码自动恢复为初始密码。
4.0 若2分钟内无任何操作,系统自动进入省电模式运行,同时关闭液晶显示,以节省电力。
5.0 输入密码正确后、电机允许开锁时间为5秒, 5秒后需要再次输入密码才可以再次开锁。
6.0 修改密码键和恢复初始密码键最好置于室内。
这是Proteus仿真结果:输入密码123456:显示结果:密码正确时电机启动、电机将持续5秒:这是键盘:开锁键是接INT0引脚接的一个独立按键,用于唤醒CPU工作、进而开启整个系统密码正确时可以修改密码:再次输入新密码,两次输入相同时、更改有效当然你可以随时放弃修改密码改进:1.0 密码锁的秘密没有存储,因而在掉电时最新的密码将丢失,重新上电后密码将恢复成为初始密码。
(整理)基于51单片机的电子密码锁设计与应用
1.实验任务根据设定好的密码,采用二个按键实现密码的输入功能,当密码输入正确之后,锁就打开,如果输入的三次的密码不正确,就锁定按键3秒钟,同时发现报警声,直到没有按键按下3种后,才打开按键锁定功能;否则在3秒钟内仍有按键按下,就重新锁定按键3秒时间并报警。
2.电路原理图图4.32.13.系统板上硬件连线(1).把“单片机系统”区域中的p0.0/ad0用导线连接到“音频放大模块”区域中的spk in端子上;(2).把“音频放大模块”区域中的spk out端子接喇叭和;(3).把“单片机系统”区域中的p2.0/a8-p2.7/a15用8芯排线连接到“四路静态数码显示”区域中的任一个abcdefgh端子上;(4).把“单片机系统“区域中的p1.0用导线连接到“八路发光二极管模块”区域中的l1端子上;(5).把“单片机系统”区域中的p3.6/wr、p3.7/rd用导线连接到“独立式键盘”区域中的sp1和sp2端子上;4.程序设计内容(1).密码的设定,在此程序中密码是固定在程序存储器rom中,假设预设的密码为“12345”共5位密码。
(2).密码的输入问题:由于采用两个按键来完成密码的输入,那么其中一个按键为功能键,另一个按键为数字键。
在输入过程中,首先输入密码的长度,接着根据密码的长度输入密码的位数,直到所有长度的密码都已经输入完毕;或者输入确认功能键之后,才能完成密码的输入过程。
进入密码的判断比较处理状态并给出相应的处理过程。
(3).按键禁止功能:初始化时,是允许按键输入密码,当有按键按下并开始进入按键识别状态时,按键禁止功能被激活,但启动的状态在3次密码输入不正确的情况下发生的。
5.c语言源程序#include <at89x52.h>unsigned char code ps[]={1,2,3,4,5};unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};unsigned char pslen=9;unsigned char templen;unsigned char digit; unsigned char funcount; unsigned char digitcount; unsigned char psbuf[9]; bit cmpflag;bit hibitflag;bit errorflag;bit rightflag;unsigned int second3; unsigned int aa; unsigned int bb;bit alarmflag;bit exchangeflag; unsigned int cc; unsigned int dd;bit okflag;unsigned char oka; unsigned char okb;void main(void){unsigned char i,j;p2=dispcode[digitcount]; tmod=0x01;th0=(65536-500)/256;tl0=(65536-500)%256;tr0=1;et0=1;ea=1;while(1){if(cmpflag==0){if(p3_6==0) //function key {for(i=10;i>0;i--)for(j=248;j>0;j--);if(p3_6==0){if(hibitflag==0){if(funcount==pslen+2){funcount=0;cmpflag=1;}p1=dispcode[funcount];}else{second3=0;}while(p3_6==0);}}if(p3_7==0) //digit key{for(i=10;i>0;i--)for(j=248;j>0;j--);if(p3_7==0){if(hibitflag==0){digitcount++;if(digitcount==10){digitcount=0;}p2=dispcode[digitcount];if(funcount==1){pslen=digitcount;templen=pslen;}else if(funcount>1){psbuf[funcount-2]=digitcount; }}else{}while(p3_7==0);}}}else{cmpflag=0;for(i=0;i<pslen;i++){if(ps[i]!=psbuf[i]){hibitflag=1;i=pslen;errorflag=1;rightflag=0;cmpflag=0;second3=0;goto a;}}cc=0;errorflag=0;rightflag=1;hibitflag=0;a: cmpflag=0;}}}void t0(void) interrupt 1 using 0 {th0=(65536-500)/256;tl0=(65536-500)%256;if((errorflag==1) && (rightflag==0)) {bb++;if(bb==800){bb=0;alarmflag=~alarmflag;}if(alarmflag==1){p0_0=~p0_0;}aa++;if(aa==800){aa=0;p0_1=~p0_1;}second3++;if(second3==6400){second3=0;hibitflag=0;errorflag=0;rightflag=0;cmpflag=0;p0_1=1;alarmflag=0;bb=0;aa=0;}}if((errorflag==0) && (rightflag==1)) {p0_1=0;cc++;if(cc<1000){okflag=1;}else if(cc<2000){okflag=0;}else{errorflag=0; rightflag=0; hibitflag=0; cmpflag=0; p0_1=1;cc=0;oka=0;okb=0; okflag=0;p0_0=1;}if(okflag==1) {oka++;if(oka==2) {oka=0;p0_0=~p0_0; }}else{okb++;if(okb==3) {okb=0;p0_0=~p0_0; }}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*************************************************/
void lcd_char(uchar row ,uchar cloum,uchar dat)
{
if(row==1)
{
lcd_writecom(0x80+cloum);
lcd_writedata(dat);
}
else
{
lcd_writecom(0x80+0x40+cloum);
lcd_writedata(dat);
}
}
/*********************************************
名称:lcd_string(uchar row,uchar cloum,uchar *p)
}
/********************************************************************
* 名称 : Delay_xMs()
* 功能 : 延时子程序,经过软件调试,测得延时程序大概为55us.
* 输入 : x
* 输出 : 无
***********************************************************************/
uchar init_password[6]="123456";
uchar a[5]="RIGHT";
uchar b[16]="The new password";
unsigned char code pu[282]={
0x03,0xfb,0x05,0x00,0x00,0x04,
0x03,0xfb,0x02,0x03,0xfb,0x02,
0xab,0xfc,0x04,0xab,0xfc,0x02,
0x43,0xfc,0x02,0x43,0xfc,0x04,
0x43,0xfc,0x04,0x8f,0xfb,0x04,
0xab,0xfc,0x04,0x00,0x00,0x04,
0x08,0xfd,0x02,0xab,0xfc,0x02,
0x08,0xfd,0x04,0xab,0xfc,0x02,
0x43,0xfc,0x02,0xab,0xfc,0x02,
0x43,0xfc,0x02,0x43,0xfc,0x04,
0x08,0xfd,0x04,0x03,0xfb,0x02,
0x8f,0xfb,0x02,0x08,0xfd,0x04,
0x8f,0xfb,0x02,0x08,0xfd,0x02,
0xab,0xfc,0x02,0xab,0xfc,0x05,
0x00,0x00,0x02,0x03,0xfb,0x02,
0x8f,0xfb,0x02,0xab,0xfc,0x04,
0x43,0xfc,0x02,0x43,0xfc,0x05
void lcd_writedata(uchar dat)
{
lcd_rs=1;
lcd_rw=0;
lcd_en=0;
P0=dat;
delay();
lcd_en=1;
delay();
lcd_en=0;
}
/*****************************************
* 名称 : flash()
* 功能 : 延时,时间为2个NOP,大概为2US
* 输入 : 无
* 输出 : 无
**********************************************************************/
void flash(void)
{
_nop_();
_nop_();
}
/********************************************
*名称:delay()
*功能:延时大概140us
*输入:无
*输出:无
*********************************************/
*输入:命令
*输出:无
**********************************************/
void lcd_writecom(uchar com)
{
lcd_rs=0;
lcd_rw=0;
lcd_en=0;
P0=com;
delay();
lcd_en=1;
0x43,0xfc,0x02,0x8f,0xfb,0x02,
0x43,0xfc,0x04,0x8f,0xfb,0x02,
0x03,0xfb,0x02,0x8f,0xfb,0x02,
0x03,0xfb,0x02,0x14,0xfa,0x02,
0x8f,0xfb,0x02,0x03,0xfb,0x05,
* 名称 : delay1()
* 功能 : 短暂延时
* 输入 : x
* 输出 : 无
***********************************************************************/
void delay1(uchar x)
{
uint i;
0x03,0xfb,0x02,0x8f,0xfb,0x02,
0x00,0x00,0x03,0x43,0xfc,0x02,
0x8f,0xfb,0x02,0x43,0xfc,0x02,
0x8f,0xfb,0x02,0x43,0xfc,0x04,
0x8f,0xfb,0x02,0x03,0xfb,0x02,
delay();
lcd_en=0;
}
/**********************************************
*名称:lcd_readdata(uchar dat)
*功能:向1602lcd写入数据
*输入:dat
*输出:无
***********************************************/
0x8f,0xfb,0x02,0x03,0xfb,0x02,
0x8f,0xfb,0x02,0x08,0xfd,0x02,
0xab,0xfc,0x02,0x00,0x00,0x03,
0x08,0xfd,0x02,0xab,0xfc,0x02,
0x08,0xfd,0x02,0xab,0xfc,0x02,
*名称:lcd_init()
*功能:1602lcd初始化
*输入:无
*输出:无
******************************************/
void lcd_init()
{
lcd_writecom(0x38);
lcd_writecom(0x0c);
lcd_writecom(0x06);
};
/*******************************************************************
*名称:delay_music()
*功能:音乐节拍延时
*输入:a a=1,1/16/拍,a=2,1/8拍,a=4,1/4拍
*输出:无
********************************************************************/
0x08,0xfd,0x02,0xab,0xfc,0x02,
0x08,0xfd,0x04,0xab,0xfc,0x02,
0x43,0xfc,0x02,0xab,0xfc,0x02,
0x43,0xfc,0x02,0x43,0xfc,0x02,
0x08,0xfd,0x04,0x03,0xfb,0x02,
/*
密码锁程序,已调试成功
*/
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
sbit lcd_rs=P2^5;//1602lcd数据/命令选择引脚
功能:从第row行 ,第cloum列,把一串字符写入lcd
输入:row cloum p
**********************************************/
void Delay_xMs(uint x)
{
uint i,j;
for(i=0; i<x; i++)
{
for(j=0; j<3; j++);
}
}
/********************************************************************
0x00,0x00,0x03,0x03,0xfb,0x05,
0x00,0x00,0x04,0x03,0xfb,0x02,
0x03,0xfb,0x02,0x43,0xfc,0x02,
0x0b,0xfc,0x02,0x8f,0xfb,0x02,