基于单片机控制的密码锁设计内容摘要:

动信号与已开锁指示信号。 ③密码输入错误 3 次的计时,计时 15s,在则 15s 内无法再次输入密码, 15 秒过后清除所有报警与指示。 中断服务程序流程图如图 311 所示。 图 311 密码锁中断服务程序流程图 单片机资源的分配与变量的定义: 密码的输入与判断需要定义 4 个变量。 原始密码存储在数组 init_val[6]中。 键盘输入的密码存储在数据 show_val[6]中,变量 key_index 的值表示当前按键是六位密码中的哪一位,每输入一个密码数字该变量增一。 密码输入错误的次数暂存在变量 error_num 中。 计时功能需要 5 个变量。 模式变量 t_state 存储计时属于什么状态, 0 表示待机计时, 1 表示密码正确的计时, 2 表示密码错误 3 次的计时。 三个变量( t_val_15s,t_val_5s, t_val_4s)分别实现待机、密码正确和密码错误 3 次后的计时工作。 定时器 T1 每 250ms 产生一次中断,变量 T1_t 记录定时器溢出中断的次数,当记录到 4000 时表示计时 1 秒。 ( 4)设计系统软件调试方案、硬件调试方案及软硬件联合调试方案 软件调试方案:伟福软件中,在“文件 \新建文件”中,新建 C 语言源程序文件,编写相应的程序。 在“文件 \新建项目”的菜单中,新建项目并将 C 语言源程序文件包括在项目文件中。 在 “项目 \编译”菜单中将 C 源文件编译,检查语法错误及逻辑错误。 在编译成 功后,产生以 “ *.hex”和“ *.bin” 后缀的目标文件。 硬件调试方案:在设计平台中,将单片机的 分别与 8 个独立式键盘通过插线连接起来,将 分别与 4 个发光二极管连接起来, 与蜂鸣器的输入连接起来。 在伟福中将程序文件编译成目标文件后,将下载线安装在实验平台的下载线接口上,运行“ MCU 下载程序”,选择相应的 flash 数据文件,点击“编程”按钮,将程序文件下载到单片机的 Flash 中。 然后,上电重新启动单片机,检查所编写的程序是否达到题目的要求,是否全面完整地完成试 题的内容。 程序设计 //晶振 , T1 每 250 微秒中断,按键 ,发光二极管接 , /*变量的定义 : show_val[6]: 显示的值 init_val[6]: 密码初始值 key_val: 返回按键的值 255表示无按键按下 key_index: 当前按键是哪一位密码 T1_t: 定时器计数溢出数 t_val_15s: 报警计时的数值 t_val_5s: 待机时 间计时 t_val_4s: 输入正确,等待 4 秒清除开锁信号 t_state: 计时状态 error_num: 错误次数 led_seg_code:数码管 7 段码 */ include /* 说明 key0=P1^0。 key1=P1^1。 key2=P1^2。 key3=P1^3。 key4=P1^4。 key5=P1^5。 enter=P1^6。 esc=P1^7。 */ sbit relay_open=P3^0。 //电磁锁开锁驱动 sbit pw_error=P3^1。 //密码错误信号 sbit alarm_out=P3^2。 //报警输出 sbit open_lock=P3^3。 //已开锁指示信号 sbit audio_out=P3^4。 //有源蜂鸣器 unsigned char data t_val_15s,t_val_5s,t_val_4s,t_state。 unsigned int data T1_t。 unsigned char data key_val,key_index,key_val_old。 unsigned char data state_val,error_num。 unsigned char data show_val[6]。 char code init_val[6]={1,2,3,4,5,0}。 char code led_seg_code[11]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}。 //led_seg_code[09] 代表 09 led_seg_code[10]=0x00 数码管不显示任何内容 //延时程序 void delay(unsigned int i)//延时 { while(i)。 } //清除输入内容 void init_variant() {unsigned char i。 for(i=0。 i6。 i++) show_val[i]=10。 //led_seg_code[10]=0x00 表示数码管不显示任何内容 key_index=0。 //没 有任何输入或清除所有输入时,保存当前键的位置 } //按键扫描 unsigned char scan_key() { unsigned char i,k。 i=P1。 if (i==0xff amp。 amp。 t_state!=2) { k=255。 } //无键按下 else //有键按下 { delay(500)。 //延时去抖动 if(i!=P1) {k=255。 } else { TR1=1。 //有键按下则开定时器。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。