1、基于51单片机的密码锁设计程序#include 1302.hvoid write_ds1302_byte(uchar dat) uchar i。 for(i=0。i1。 uchar read_ds1302_byte() uchar i。 for(i=0。i1。 ACC7=T_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。
2、 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 (date)。void set_real_time(uchar *pclock) uchar i,addr=0x80。 EA=0。 write_ds1302_dat(0x8e,0x00)。 for(i=0。i7。i+) write_ds1302_dat(addr,*pclock)。 pclo
3、ck+。 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。j7。j+) Curtimej=read_ds1302_data(address)。 address+=2。 EA=1。#ifndef _1302_H_#define _1302_H_#include #include#define uchar unsigned char#define uint unsigned intsbit T_IO=P
4、25。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_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
5、 1602.hvoid lcd_busy_wait() /*LCD1602 忙等待*/ lcd_rs_port = 0。 lcd_rw_port = 1。 lcd_en_port = 1。 lcd_data_port = 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 = comman
6、d。 lcd_en_port = 1。 lcd_en_port = 0。 void write_data(uchar dat) lcd_busy_wait()。 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) x_pos&=0x0f。 y_pos&=0x01。 if(y_pos=0) x_pos=x_pos+0x80。 else x_pos=x_pos+0x80
7、+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_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
8、)。 write_com(0x06)。 write_com(0x0c)。 lcd_data_port = 0xff。 /*释放数据端口*/#ifndef _1602_H_#define _1602_H_#include #include#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 c
9、ommand)。void write_data(uchar dat)。void wtite_lcd_1602_dat(uchar x_pos,uchar y_pos,uchar dat)。void lcd_init()。#endif#include 2402.h#include delay.hvoid 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
10、 i。 scl=1。 delay1()。 while(sda=1)&(i250) i+。 scl=0。 delay1()。 void i2c_nack() scl=1。 delay1()。 sda=1。 scl=0。 delay1()。 void i2c_write_byte(uchar date)/ / uchar i,temp。 temp=date。 for(i=0。i8。i+)/ / temp=temp1。/ scl=0。 / delay1()。 / sda=CY。/ delay1()。/ scl=1。/ / scl=0。 / delay1()。/ sda=1。/ delay1()。/
11、/uchar i2c_read_byte() uchar i,temp=0。 scl=0。/ delay1()。/ sda=1。 delay1()。 for(i=0。i8。i+) temp=temp1。 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(d
12、at)。 i2c_ack()。 i2c_stop()。 delay3(5000)。uchar read_at2402(uchar addr) uchar temp。 i2c_start()。 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
13、_#include #include#define uchar unsigned char#define uint unsigned intsbit 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#includedelay.
14、hvoid delay(uchar x) uchar a,b。 for(a=x。a0。a-) for(b=200。b0。b-)。void lcd_delay(uchar ms) uchar j。 while(ms-) for(j=0。j250。j+) 。 void delay1() 。 。void delay3(uint q) uint e。 for(e=0。eq。e+)。#ifndef _DELAY_H_#define _DELAY_H_#include #include#define uchar unsigned char#define uint unsigned intvoid dela
15、y(uchar x)。void lcd_delay(uchar ms)。void delay1()。void delay3(uint m)。#endif#include display.hvoid display() P0=0。 dula=1。 dula=0。 P0=0x7f。 wela=1。 wela=0。#ifndef _DISPLAY_H_#define _DISPLAY_H_#include #include#define uchar unsigned char#define uint unsigned intsbit dula=P26。sbit wela=P27。void displ
16、ay()。#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,modify_flag,rst。bit fun_flag。 /功能键标志位 没使用bit down_flag,up_flag,
17、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(count6) count=0。aa=0。bb=0。cc=0。break。 case 0xde: key=1。shu_flag=1。write_data(*)。 count+。if(count6) count=0。aa=0。bb=0。cc=0。bre
18、ak。 case 0xbe: key=2。shu_flag=1。write_data(*)。 count+。if(count6) count=0。aa=0。bb=0。cc=0。break。 case 0x7e: key=3。shu_flag=1。write_data(*)。 count+。if(count6) 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+。 while(temp!=0xf
19、0)。 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(count6) count=0。aa=0。bb=0。cc=0。break。 /aa,bb,cc定时器中使用 case 0xdd: shu_flag=1。key=5。write_data(*)。 /每次按键清零 count+。if(count6
20、) count=0。aa=0。bb=0。cc=0。break。 /保证在按键器件不会自动返回 case 0xbd: shu_flag=1。key=6。write_data(*)。 / count+。if(count6) count=0。aa=0。bb=0。cc=0。break。 case 0x7d: shu_flag=1。key=7。write_data(*)。 count+。if(count6) count=0。aa=0。bb=0。cc=0。break。 while(temp!=0xf0) temp=P1。 temp=temp&0xf0。/ beep=0。 delay(500)。 / 松手检
21、测 屏蔽蜂鸣器 噪音污染 / beep=1。 / write_data(*)。count+。 P1=0xfb。 temp=P1。 temp=temp&0xf0。 if(temp!=0xf0) delay(15)。 if(temp!=0xf0) temp=P1。 switch(temp) /fun_flag 功能键标志位 case 0xeb: key=8。 shu_flag=1。write_data(*)。 count+。if(count6) count=0。aa=0。bb=0。cc=0。break。 case 0xdb: key=9。 shu_flag=1。write_data(*)。 cou
22、nt+。if(count6) 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=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
23、(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+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(
24、)。write_com(0x80+0x40+7)。break。 case 4: write_com(0x80+0x40+8)。write_data( )。write_com(0x80+0x40+8)。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=
25、1。aa=0。bb=0。cc=0。break。 /开门键 case 0xb7: key=14。down_flag=1。fun_flag=1。aa=0。bb=0。cc=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(count0) count-。break。 /清除数字 #ifndef _SCAN_H_#define _SCAN_H_#include
26、 #include#define uchar unsigned char#define uint unsigned intvoid keyscan()。#endif/* 名称:电子密码锁 时间:2014年8月2日 16:33:48 WRITE BY:Kengkeng Today is Valentines Day 程序功能: 1 :开机1302显示时间,按下key15:开门键 进入输入密码界面 2 :输入密码 输入错误超过三次 电子锁锁死 倒计时60s之后重新设置 蜂鸣器快速响 3 :输入正确 进入菜单页面 两个选择 key13:开门 key10:修改密码 4 :修改已输入密码 可由key12键清除 重新输入 5 :选择key13开门 打开继电器 显示倒计时15s开门 蜂鸣器慢响 提示15s内开门 否则15后关门 关闭继电器 并自动返回时间页面 6 :选择key10修改密码 共两次 两次密码一致时设置成功 否则会一直提示输入密码 7 :修改地密码存入2402中 上电读出 8 :修改密码 无限循环 直到输入正确为止 可以使用key11:返回键 返回 9 :在10s内无任何按键按下时 自动返回时间页面 可重新进入 10:在20s内无任何按键按下时 进入