基于51单片机的密码锁设计程序_(编辑修改稿)内容摘要:

3开门 打开继电器 显示倒计时 15s开门 蜂鸣器慢响 提示 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_flag 开门 open_flag //切换的功能跟返回大致相同 ***********************************************************/ include include include // include include include include include define uchar unsigned char define uint unsigned int extern 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[]={ 2020/08/02 000}。 uchar data lcd1602_line2[]={ 10:42:50 }。 uchar data time_data_buff[7]={0x50,0x42,0x10,0x02,0x08,0x06,0x14}。 uchar code Weeks[][3]={{SUN},{MON},{TUE},{WED},{THU},{FRI},{SAT},{SUN}}。 //二维数组 八行三列 bit mod_flag,rst_flag。 uchar code num_to_char[] = {0123456789ABCDEF}。 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=P2^3。 //sbit sda=P2^0。 //IO 口定义 //sbit scl=P2^1。 uchar code table[]={Enter password:}。 uchar code table1[]={Error!try again:}。 uchar code table2[]={Wele 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 succed }。 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。 TH0=(6553646080)/256。 // 由于晶振为 ,故所记次数应为 46080,计时器每隔50000微秒发起一次中断。 TL0=(6553646080)%256。 //46080的来历,为 50000* TH1=(6553646080)/256。 TL1=(6553646080)%256。 EA=1。 ET0=1。 // 定时器进入中断倒计时和进入睡眠 ET1=1。 TR1=1。 EX0=1。 //外部中断用来唤醒睡眠 EX1=1。 } void main(void) { uchar a[6],b[6],p[7],i,num。 uchar table3[6]。 //={1,1,1,1,1,1}。 /*可将值赋予数组 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)。 table3[0]=read_at2402(10)。 table3[1]=read_at2402(11)。 table3[2]=read_at2402(12)。 table3[3]=read_at2402(13)。 table3[4]=read_at2402(14)。 table3[5]=read_at2402(15)。 display()。 set_real_time(time_data_buff)。 //设置时间 等效于 set_real_time(amp。 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】等效于 Curtime[7] get_real_time(p)。 //读出时间 等效于 get_real_time(amp。 p【 0】 )。 lcd1602_line1[3] = num_to_char[p[6]/0x10]。 lcd1602_line1[4] = num_to_char[p[6]%0x10]。 /*年 */ lcd1602_line1[6] = num_to_char[p[4]/0x10]。 lcd1602_line1[7] = num_to_char[p[4]%0x10]。 /*月 */ lcd1602_line1[9] = num_to_char[p[3]/0x10]。 lcd1602_line1[10] = num_to_char[p[3]%0x10]。 /*日 */ for(i=0。 i3。 i++) lcd1602_line1[i+13]=Weeks[p[5]amp。 0x07][i]。 /*星期 */ lcd1602_line2[4] = num_to_char[p[2]/0x10]。 lcd1602_line2[5] = num_to_char[p[2]%0x10]。 /*时 */ lcd1602_line2[7] = num_to_char[p[1]/0x10]。 lcd1602_line2[8] = num_to_char[p[1]%0x10]。 /*分 */ lcd1602_line2[10] = num_to_char[p[0]/0x10]。 lcd1602_line2[11] = num_to_char[p[0]%0x10]。 /*秒 */ for(i=0。 i16。 i++) wtite_lcd_1602_dat(i,0,lcd1602_line1[i])。 for(i=0。 i16。 i++) wtite_lcd_1602_dat(i,1,lcd1602_line2[i])。 if(open_flag) break。 //按下开门键 跳出 while( 1)读时间循环 } /*无论是修改密码还是开 门 之后都要对其成功之前或者 失败之前的标志位清零 否则导致二次扫描时不显示 */ while(1) //进入 while( 1)设置密码 循环 { open_flag=0。 //清零 // count=0。 // keyscan()。 if(!flag3) //防止扫描重复写入 flag3 { write_(0x01)。 write_(0x0f)。 write_(0x80)。 //静态显示 定位光标 闪烁 for(i=0。 i15。 i++) write_data(table[i])。 write_(0xc5)。 flag3=1。 //必须使用标志位保护起来 否则连续扫描闪烁 导致光标暗淡 } if(num=2) //输入密码错误次数 大于三次锁死 倒计时 { //这是个 if else 语句 if(shu_flag) //数字标志位 必须是数字才能采集 { switch(count) //按键次 数 用之前最好将 count进行处理 { case 1:a[count1]=key。 break。 case 2:a[count1]。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。