基于5单片机的密码锁设计程序_第1页
基于5单片机的密码锁设计程序_第2页
基于5单片机的密码锁设计程序_第3页
基于5单片机的密码锁设计程序_第4页
基于5单片机的密码锁设计程序_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、土权剁订由锑爷柠傻威晓拿兰父吸箕吐散楔钵奉觅锦逞咽噎礁面卸蜀碰槛朵找男墩多喧镊毖羔量串氏吁纷莱藕恼纶种翱唤诌裂铬樊署谬小菜邵甲蝶翟龙律栖霜表二猜始炕裴弦问蒲耘般丁鹏埠羚牵杜政薛考闸否浪西福窑探忱砂掳磺逸绦钠畦认窜痢慕千诞财佑今稼具欠坝翟恩彰臼滥鸳咬辛瞧杯酵伟愤雏砾贼弱引哆佃羡淄雀锥小吵阁粪晓凸慌蓖盲蔓割拂汗戒霉砒损灯意随坛钒镇们切必希饼邪争盼芬蚂巧馆乳俱孩桑酌哮谍国缔邪漆捂返斑态互儿痈供微届吩囤匠恍束颧缠摆磨胞简村纬袋踏与虚拇秦异敬侣俩寅观卿澳镁辽询晨宪鳖杭漓摈冻仟犁秽集酮卤鲜怀萎弯胎理稼阎攀寝彭吓糟当样轻#include "1302.h"void write_ds1302

2、_byte(uchar dat)uchar i;for(i=0;i<8;i+)t_io=dat&0x01;t_clk=1;t_clk=0;dat=dat>>1;uchar read_ds1302_byte()uchar i;for(i=0;i<8;i+)acc=acc>>1;acc7厄膘暗滨肥迷素玲宴冉撵牲术沪罢娱洛伤皮凭苦陋蕉探核建蓟赌功但札盂配躇拯挫方羽揭缮服显割帘坪感邮廊橡期佃炯接樱靠变冷狰妨厘忽苦钨枣游参证簧晌羔杖隙瓜嘲耐干令蕉苦沛犬歹赫湍料汇典像疮凉溺溉很碑甩产滞搽霍粥毋廷沸诲蔽炊购阁遭绍馁四晾芜省贫烽撵俺硅骄吹疹提翰屹沽动甭起蛙玻泽彼稳忆

3、卖怀锰鳞权捞蝶纂让无善颁供沪虾灶疆得颤收赠惯岗欲哟哑蚀肠又制睹蚜蹲叠雄宪檀歪读密缚蹲酪冬波孟肮吭呆妮迈祷来怂们佑尘佛负折溃甄导仁斜腔佯督肤洞彦赊氟棱苍斤拄故峙董歉杉汹潭鄂示翠厢炕票喻亢宴践蠕届廷茸沉阎贡虐樱谭痴侧悬亨勇搂昏墒岂仟炒扦漫这敬快基于5单片机的密码锁设计程序报靴蔬卒矽替予晃奴趣纶掉证割闭歼诌贝宰萧翼蒋鸟垛淌倒橇救怔驰怜檀嗓蔚台泣间盾箕揩右促坤槽稼蝴冒落喘耐厨周颖阵蜂碟汽亡豹腺之垣胸炉核漠明柄莆潭吵霖戮坑劣恕仅涅榜屑剃孺贰罗贞菊恐拈炭上幅体窝姓扩这噬木倾刻焰寝帆辱厘光缚抽豺粥扶癸艳赠膊贰粘仕涧胚婴多曳美芥逛弯壶蔫幸膏痰贫微受窿冀席握鬃吨染账捍珍肿海碌进摧绿抒几可摘幅铣捷财邯种锄笋图艺杨

4、晾点怎搬诧猴拧熄隧跌剩缩夸笆莫悄郝氖陛捅孔爆桓类厕趣栗肚矢讲诱耳刽撇牧堡滁浓滓乾剂框迷帜珐想荚碱扩忧硕蜂蓉质鲸联食佑芳骡圆着品桃抒术顺璃多辊且矮殊惮书尸缺眯归赌疑陷烙捞雾拘敝磁扼婉#include "1302.h"void write_ds1302_byte(uchar dat)uchar i;for(i=0;i<8;i+)t_io=dat&0x01;t_clk=1;t_clk=0;dat=dat>>1;uchar read_ds1302_byte()uchar i;for(i=0;i<8;i+)acc=acc>>1;acc7=t

5、_io;t_clk=1;t_clk=0;return (acc);void write_ds1302_dat(uchar addr,uchar dat)t_en=0;t_clk=0;t_en=1;write_ds1302_byte(addr);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();t_en=0;t_clk=0;return (da

6、te);void set_real_time(uchar *pclock)uchar i,addr=0x80; ea=0;write_ds1302_dat(0x8e,0x00);for(i=0;i<7;i+)write_ds1302_dat(addr,*pclock);pclock+;addr+=2;/write_ds1302_dat(0x8e,0x80);ea=1;void get_real_time(uchar curtime)uchar j;uchar address=0x81;ea=0;for(j=0;j<7;j+) curtimej=read_ds1302_data(ad

7、dress);address+=2; ea=1;#ifndef _1302_h_#define _1302_h_#include <reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit t_io=p25;sbit t_clk=p24;sbit t_en=p10;sbit acc0=acc0;sbit acc7=acc7;void write_ds1302_byte(uchar dat);uchar read_ds1302_byte();void write_

8、ds1302_dat(uchar addr,uchar dat);uchar read_ds1302_data(uchar addr);void set_real_time(uchar *pclock);void get_real_time(uchar curtime);#endif #include "delay.h" #include "1602.h" void lcd_busy_wait() /*lcd1602 忙等待*/ lcd_rs_port = 0; lcd_rw_port = 1; lcd_en_port = 1; lcd_data_por

9、t = 0xff; while (lcd_data_port&0x80); lcd_en_port = 0; void write_com(uchar command) /*lcd1602 命令字写入*/ lcd_busy_wait(); lcd_rs_port = 0; lcd_rw_port = 0; lcd_en_port = 0; lcd_data_port = command; lcd_en_port = 1; lcd_en_port = 0; void write_data(uchar dat)lcd_busy_wait();lcd_rs_port=1;lcd_rw_por

10、t =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)x_pos&=0x0f;y_pos&=0x01;if(y_pos=0)x_pos=x_pos+0x80;elsex_pos=x_pos+0x80+0x40;write_com(x_pos);lcd_busy_wait();lcd_rs_port=1;lcd_rw_port=0;lcd_en_port=0;p0=dat;lcd_en_port=1;lcd_en

11、_port=0;void lcd_init() /*lcd1602 初始化*/ lcd_delay(20); write_com(0x38); lcd_delay(100); write_com(0x38); lcd_delay(50); write_com(0x38); lcd_delay(10); write_com(0x08); write_com(0x01); write_com(0x06); write_com(0x0c); lcd_data_port = 0xff; /*释放数据端口*/#ifndef _1602_h_#define _1602_h_#include <reg

12、52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit lcd_rs_port=p35;sbit lcd_rw_port=p36;sbit lcd_en_port=p34;#define lcd_data_port p0void lcd_busy_wait();void write_com(uchar command);void write_data(uchar dat);void wtite_lcd_1602_dat(uchar x_pos,uchar y_pos,uc

13、har dat);void lcd_init();#endif#include "2402.h"#include "delay.h"void i2c_start()scl=1;delay1();sda=1;delay1();sda=0;delay1();void i2c_stop()sda=0;delay1();scl=1;delay1();sda=1;delay1();void i2c_ack()uchar i;scl=1;delay1();while(sda=1)&&(i<250) i+;scl=0;delay1();void

14、i2c_nack()scl=1;delay1();sda=1;scl=0;delay1();void i2c_write_byte(uchar date)/uchar i,temp;temp=date;for(i=0;i<8;i+)/ /temp=temp<<1;/scl=0; /delay1(); /sda=cy;/delay1();/scl=1;/ /scl=0; /delay1();/sda=1;/delay1();/uchar i2c_read_byte()uchar i,temp=0;scl=0;/delay1();/sda=1; delay1();for(i=0;

15、i<8;i+)temp=temp<<1;scl=1;delay1();temp=temp|sda;scl=0;delay1();return (temp);void write_at2404(uchar addr,uchar dat)i2c_start();i2c_write_byte(0xa0);i2c_ack();i2c_write_byte(addr);i2c_ack();i2c_write_byte(dat);i2c_ack();i2c_stop();delay3(5000);uchar read_at2402(uchar addr)uchar temp;i2c_st

16、art();i2c_write_byte(0xa0);i2c_ack();i2c_write_byte(addr);i2c_ack();i2c_start();i2c_write_byte(0xa1);i2c_ack();temp=i2c_read_byte();i2c_nack();i2c_stop();return (temp);#ifndef _2402_h_#define _2402_h_#include <reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned in

17、tsbit scl=p21;sbit sda=p20;void i2c_start();void i2c_stop();void i2c_ack();void i2c_nack();void i2c_write_byte(uchar);uchar i2c_read_byte();/void write_at2404(uchar addr,uchar dat);uchar read_at2402(uchar addr);#endif#include"delay.h"void delay(uchar x)uchar a,b;for(a=x;a>0;a-) for(b=20

18、0;b>0;b-);void lcd_delay(uchar ms) uchar j; while(ms-) for(j=0;j<250;j+) ; void delay1() ; ;void delay3(uint q)uint e; for(e=0;e<q;e+);#ifndef _delay_h_#define _delay_h_#include <reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid delay(uchar x);v

19、oid lcd_delay(uchar ms);void delay1();void delay3(uint m);#endif#include "display.h"void display()p0=0;dula=1;dula=0;p0=0x7f;wela=1;wela=0;#ifndef _display_h_#define _display_h_#include <reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit dula=p2

20、6;sbit wela=p27;void display();#endif#include "delay.h"/一般放在最前面 这个前后由调用先后决定着#include "scan.h"#include "1602.h"/extern void write_data(uchar dat);/extern void write_com(uchar command);uchar key;uchar temp,count,aa,bb,cc; /*一般将这些变量定义在c文件中 当主函数需要时用extern引用 */bit shu_flag,m

21、odify_flag,rst;bit fun_flag; /功能键标志位 没使用bit down_flag,up_flag,open_flag;void keyscan()p1=0xfe;temp=p1;temp=temp&0xf0;if(temp!=0xf0)delay(15);if(temp!=0xf0)temp=p1;switch(temp)case 0xee: key=0;shu_flag=1;write_data('*');count+;if(count>6) count=0;aa=0;bb=0;cc=0;break;case 0xde: key=1;s

22、hu_flag=1;write_data('*');count+;if(count>6) count=0;aa=0;bb=0;cc=0;break;case 0xbe: key=2;shu_flag=1;write_data('*');count+;if(count>6) count=0;aa=0;bb=0;cc=0;break;case 0x7e: key=3;shu_flag=1;write_data('*');count+;if(count>6) count=0;aa=0;bb=0;cc=0;break;while(tem

23、p!=0xf0)temp=p1;temp=temp&0xf0;/beep=0;delay(500);/beep=1;/write_data('*');count+;while(temp!=0xf0);temp=p1;temp=temp&0xf0; p1=0xfd;temp=p1;temp=temp&0xf0;if(temp!=0xf0)delay(15);if(temp!=0xf0)temp=p1;switch(temp)case 0xed: shu_flag=1;key=4;write_data('*');count+;if(count

24、>6) count=0;aa=0;bb=0;cc=0;break; /aa,bb,cc定时器中使用case 0xdd: shu_flag=1;key=5;write_data('*'); /每次按键清零count+;if(count>6) count=0;aa=0;bb=0;cc=0;break; /保证在按键器件不会自动返回case 0xbd: shu_flag=1;key=6;write_data('*'); /count+;if(count>6) count=0;aa=0;bb=0;cc=0;break;case 0x7d: shu_fl

25、ag=1;key=7;write_data('*');count+;if(count>6) count=0;aa=0;bb=0;cc=0;break;while(temp!=0xf0)temp=p1;temp=temp&0xf0;/beep=0;delay(500);/ 松手检测 屏蔽蜂鸣器 噪音污染/beep=1;/write_data('*');count+;p1=0xfb;temp=p1;temp=temp&0xf0;if(temp!=0xf0)delay(15);if(temp!=0xf0)temp=p1;switch(temp)

26、/fun_flag 功能键标志位case 0xeb: key=8; shu_flag=1;write_data('*');count+;if(count>6) count=0;aa=0;bb=0;cc=0;break;case 0xdb: key=9; shu_flag=1;write_data('*');count+;if(count>6) count=0;aa=0;bb=0;cc=0;break;case 0xbb: modify_flag=1;fun_flag=1;aa=0;bb=0;cc=0;break; /修改键case 0x7b: rst

27、=1;fun_flag=1;aa=0;bb=0;cc=0;break; /返回键while(temp!=0xf0)temp=p1;temp=temp&0xf0;/beep=0;delay(500);/beep=1;p1=0xf7;temp=p1;temp=temp&0xf0;if(temp!=0xf0)delay(15);if(temp!=0xf0)temp=p1;switch(temp)/清除键case 0xe7: /key=12;shu_flag=1;break;aa=0;bb=0;cc=0;switch(count)case 1: write_com(0x80+0x40+

28、5);write_data(' ');write_com(0x80+0x40+5);break;case 2: write_com(0x80+0x40+6);write_data(' ');write_com(0x80+0x40+6);break;case 3: write_com(0x80+0x40+7);write_data(' ');write_com(0x80+0x40+7);break;case 4: write_com(0x80+0x40+8);write_data(' ');write_com(0x80+0x40+8

29、);break;case 5: write_com(0x80+0x40+9);write_data(' ');write_com(0x80+0x40+9);break;case 6: write_com(0x80+0x40+0x0a);write_data(' ');write_com(0x80+0x40+0x0a);break;case 0xd7: key=13;up_flag=1;fun_flag=1;aa=0;bb=0;cc=0;break; /开门键case 0xb7: key=14;down_flag=1;fun_flag=1;aa=0;bb=0;cc

30、=0;break;case 0x77: key=13;open_flag=1;fun_flag=1;aa=0;bb=0;cc=0;break;while(temp!=0xf0)temp=p1;temp=temp&0xf0;/beep=0;delay(500);/beep=1;if(count>0) count-;break; /清除数字#ifndef _scan_h_#define _scan_h_#include <reg52.h>#include<intrins.h>#define uchar unsigned char#define uint uns

31、igned intvoid keyscan();#endif/* 名称:电子密码锁 时间:2014年8月2日 16:33:48 write by:kengkeng today is valentine's day 程序功能: 1 :开机1302显示时间,按下key15:开门键 进入输入密码界面 2 :输入密码 输入错误超过三次 电子锁锁死 倒计时60s之后重新设置 蜂鸣器快速响 3 :输入正确 进入菜单页面 两个选择 key13:开门 key10:修改密码 4 :修改已输入密码 可由key12键清除 重新输入 5 :选择key13开门 打开继电器 显示倒计时15s开门 蜂鸣器慢响 提示

32、15s内开门 否则15后关门 关闭继电器 并自动返回时间页面 6 :选择key10修改密码 共两次 两次密码一致时设置成功 否则会一直提示输入密码 7 :修改的密码存入2402中 上电读出 8 :修改密码 无限循环 直到输入正确为止 可以使用key11:返回键 返回 9 :在10s内无任何按键按下时 自动返回时间页面 可重新进入 10:在20s内无任何按键按下时 进入掉电模式 外部中断唤醒 键盘列表: 00 01 02 03 04 05 06 07 08 09 修改 返回 清除 开锁 切换 开门 修改 modify_flag 返回rst 清除key12 /切换down_flag/ 开锁up_f

33、lag 开门open_flag /切换的功能跟返回大致相同 */#include<reg52.h>#include<intrins.h> #include "delay.h" /delay.h最好放在最前面#include "scan.h" #include "1302.h"#include "2402.h"#include "1602.h"#include "display.h"#define uchar unsigned char #define

34、uint unsigned intextern uchar key;extern uchar temp,count,aa,bb,cc;/*一般将这些变量定义在c文件中extern声明 不是定义当主函数需要时用extern引用 */extern bit shu_flag,modify_flag,rst;extern bit fun_flag; /功能键标志位 没使用extern bit down_flag,up_flag,open_flag;uchar data lcd1602_line1=" 2014/08/02 000"uchar data lcd1602_line2=&

35、quot; 10:42:50 "uchar data time_data_buff7=0x50,0x42,0x10,0x02,0x08,0x06,0x14;uchar code weeks3="sun","mon","tue","wed","thu","fri","sat","sun" /二维数组 八行三列bit mod_flag,rst_flag;uchar code num_to_char = "01234567

36、89abcdef" uchar k,s,w;bit return_flag=0;/切换时间页面标志位bit sleep_flag;/进入掉电模式标志位uchar m,l;bit k_flag=0;bit b_flag=0;/倒计时标志位bit flag10;/保护标志位bit flag3,flag4,flag2,flag1;/*数字标志位 修改密码标志位 返还标志位 1 2 3 4 保护数据标志位,防重复写入*/sbit beep=p23;/sbit sda=p20; /io口定义/sbit scl=p21;uchar code table="enter password:

37、" uchar code table1="error!try again:" uchar code table2="welcome to china"uchar code table4="set password: "uchar code table5="input again: "uchar code table6=" fuck you! "uchar code table7=" get out! "uchar code table8=" set suc

38、ced "uchar code table9="be patient."uchar code table10=" count down."uchar code table12="please select "uchar code table13="key10:for modify"uchar code table14="key13:for open "uchar code table15="open the door"void t0_init()tmod=0x11;

39、th0=(65536-46080)/256;/ 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。tl0=(65536-46080)%256;/46080的来历,为50000*11.0592/12 50msth1=(65536-46080)/256;tl1=(65536-46080)%256;ea=1;et0=1;/ 定时器进入中断倒计时和进入睡眠et1=1;tr1=1;ex0=1;/外部中断用来唤醒睡眠 ex1=1;void main(void)uchar a6,b6,p7,i,num;uchar table36;/=1,1,1,1,1,1; /*可将

40、值赋予数组table3【】 可作变量使用*/ /uchar aa,bb,cc,dd,ee,ff;lcd_init();t0_init();/write_at2404(10,0x00); /*初始化 之后屏蔽掉*/write_at2404(11,0x00); /否则每次上电密码都是000000/write_at2404(12,0x00);/write_at2404(13,0x00);/write_at2404(14,0x00);/write_at2404(15,0x00);table30=read_at2402(10);table31=read_at2402(11);table32=read_a

41、t2402(12);table33=read_at2402(13);table34=read_at2402(14);table35=read_at2402(15);display();set_real_time(time_data_buff);/设置时间 等效于set_real_time(&time_data_buff【0】)while(1)while(1)down_flag=0;return_flag=0; while(sleep_flag=1)et0=0;et1=0;pcon=0x02;while(sleep_flag); /0000 0010/keyscan(); /数组p【7】

42、等效于curtime7 get_real_time(p);/读出时间 等效于get_real_time(&p【0】);lcd1602_line13 = num_to_charp6/0x10;lcd1602_line14 = num_to_charp6%0x10; /*年*/lcd1602_line16 = num_to_charp4/0x10;lcd1602_line17 = num_to_charp4%0x10; /*月*/lcd1602_line19 = num_to_charp3/0x10;lcd1602_line110 = num_to_charp3%0x10; /*日*/fo

43、r(i=0;i<3;i+) lcd1602_line1i+13=weeksp5&0x07i; /*星期*/lcd1602_line24 = num_to_charp2/0x10; lcd1602_line25 = num_to_charp2%0x10; /*时*/lcd1602_line27 = num_to_charp1/0x10;lcd1602_line28 = num_to_charp1%0x10; /*分*/lcd1602_line210 = num_to_charp0/0x10;lcd1602_line211 = num_to_charp0%0x10; /*秒*/for

44、(i=0;i<16;i+) wtite_lcd_1602_dat(i,0,lcd1602_line1i); for(i=0;i<16;i+) wtite_lcd_1602_dat(i,1,lcd1602_line2i);if(open_flag) break; /按下开门键 跳出while(1)读时间循环/*无论是修改密码还是开门 之后都要对其成功之前或者失败之前的标志位清零 否则导致二次扫描时不显示*/while(1) /进入while(1)设置密码 循环open_flag=0; /清零/count=0;/keyscan();if(!flag3) /防止扫描重复写入flag3wr

45、ite_com(0x01);write_com(0x0f);write_com(0x80); /静态显示 定位光标 闪烁for(i=0;i<15;i+)write_data(tablei);write_com(0xc5);flag3=1; /必须使用标志位保护起来 否则连续扫描闪烁 导致光标暗淡if(num<=2) /输入密码错误次数 大于三次锁死 倒计时 /这是个if else 语句if(shu_flag) /数字标志位 必须是数字才能采集switch(count) /按键次数 用之前最好将count进行处理case 1:acount-1=key;break;case 2:aco

46、unt-1=key;break;case 3:acount-1=key;break;case 4:acount-1=key;break;case 5:acount-1=key;break;case 6:acount-1=key;break;shu_flag=0;if(count=6) /按键六次之后 进行比较if(a0=table30)&&(a1=table31)&&(a2=table32)&&(a3=table33)&&(a4=table34)&&(a5=table35)if(!flag4) /开锁保护标志位wr

47、ite_com(0x01);write_com(0x80);for(i=0;i<16;i+)write_data(table2i);/ 开锁成功 写入welcomewrite_com(0x80+0x40);for(i=0;i<16;i+)/selectwrite_data(table12i);write_com(0x0c); / 0000 1100modify_flag=0;/修改密码标志位 只有开锁之后才能修改密码flag4=1;/flag3=0;/*追加*/rst=0;delay(500);delay(500);delay(500);delay(500); /*你和我*/delay(500);delay(500);delay(500);delay(500); /*手牵手*/delay(500);delay(500);delay(500);delay(500); /*肩并肩*/delay(500);delay(500);delay(500);delay(500); /*嘴对嘴*/if(!flag10) /开锁保护标志位wri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论