基于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]。基于51单片机的密码锁设计程序_(编辑修改稿)
相关推荐
码。 64 位 ROM 和ROM操作控制部分允许 DS18B20作为一个单线器件工作并遵循 “单线总线系统 ”一节中所详述的单线协议。 直到 ROM 操作协议被满足, DS18B20 控制部分的功能是不可访问的。 MSB LSB MSB LSB MSB LSB 图 35 64 位 ROM 结构框图 ( 3)运用 —报警信号 TH 或 TL的最高比较位对应于 16 位温度寄存器符号位。 若
制。 对单片机的指令系统不要求了解,仅要求对 51 的存储器结构有 基本 了解;可由编译器管理寄存器 的 分配、不同存储器的寻址及数据类型等细节; 用 C 语言编写的 程序有规范的结构。 这种程序结构化方式 , 改善了程序的可读性; 程序 编 译和 调试时间短,效率从 而提高;提供的库包含许多标准子程序,具有较强的数据处理能力;可移植性好 ,因为它具有方便的模块化编程技术。 C
rol system controlled by 8051, traffic light display, LED countdown. Traffic detection and adjustment, such as wireless transmission module. In addition to the basic function of traffic light also
子程序、和键盘扫描 子程 序四个模块,下面对每一块进行介绍。 系统主程序 本设计中,软件设计采用模块化操作,利用各个模块之间的相互联系,在设计中采用主程序调用各个子程序的方法,使程序通俗易懂,我们设计了整体程序流程图。 在 main函数编写开始,要进行初始化,包括对系统初始化和对硬件设备进行初始化,并使硬件处于就绪状态。 在主程序模块中,需要完成对各接口芯片的初始化、出租车起价和单价的初始化
其中 VCC1 为后备电源, VCC2 为主电源。 在主电源关闭的情况下,也能保持时 钟的连续运行。 DS1302 由 VCC1 或 VCC2 两者中的较大者供电。 当 Vcc2 大于 Vcc1+ 时, Vcc2 给 DS1302 供电。 当 Vcc2 小于VCC1 时, DS1302 由 VCC1 供电。 X1 和 X2 是振荡源,外接 晶振。 RST 是复位 /片选线,通过把 RST
低功耗、高性能微控制器,具有 8K 字节可编程可擦出只读存储器。 使得 STC89C52 为众多控制应用系统提供高灵活、超有效的解决方案。 它与 MCS- 51 指令系统兼容。 STC89C52 是一个功能强大的单片机,但它只有 40 个引脚,其中 P1 是一个完整的8 位 双向 I/O 口 ,此外,从 STC89C52 内部结构图也可看出,其内部结构与 8051 内部结构基本一致,引脚 RST