当前位置:文档之家› 单片机密码锁实验报告

单片机密码锁实验报告

单片机系统设计实训报告专业:生产过程自动化姓名:李某班级学号:。

指导教师:。

实训期间:。

目录一.实验目的: (3)二.实验要求: (3)三.实验基本原理: (3)四.实验设计分析: (4)1.设计思想: (4)五.实验要求实现: (5)1. 电路设计: (5)2.主流程图: (7)3.4x4键盘行列式键盘原理电路图: (8)4. 显示模块 (9)五.总电路设计如下 (9)六.程序 (11)七.实验心得 (16)一.实验目的:1.熟悉单片机定时器的编程方法。

2.灵活运用单片机C语言程序中的字符串、数组、指针。

3.熟悉数码显示、LCM1602液晶显示器、YJD12864液晶显示器的编程方法。

4.熟悉掌握4x4矩阵键盘的C语言编程。

二.实验要求:1:用4×4矩阵键盘组成0-f数字键及。

2:可以自行设定或删除8位密码,3:用8位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则显示PASS,若密码显示错误时,显示ERR.4:自由发挥其他功能.5:要求有单片机硬件系统框图,电路原理图,软件流程图。

三.实验基本原理:这个密码锁的功能是使用矩阵键盘中的十六个键输入密码0到F还有,输入的同时在八位数码管上显示用户所输入的密码,未输入的位置用横杆填补表述未输入。

当输入的密码超出设置的位数时,数据溢出,清零。

用8位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则显示pass,若密码不正确,则显示err;模拟密码锁,密码固化到ROM 不能通过按键输入更改。

四.实验设计分析:1.设计思想:1. 本系统采用单片机AT89S51作为核心元件的一款具有本机开锁,加锁,修改密码和错误2.报警的电子密码锁。

3. 电子密码锁的原理是:从键盘输入一组密码,CPU把该密码和设置密码比较,对则将锁打开,错则要求重新输入,并记录错误次数,如果三次错误,则被强制锁定并报警。

初步设计思路如下:1.输入密码用矩形键盘,数字键,字母键。

2.LED数码管显示输入密码,但是只是输出显示符号8 。

采用动态扫描输出。

3. 输入密码错误时显示ERR,密码正确时显示PASS。

软件的设计主要包括矩形键盘键值的读取、LED动态扫描输出程序、密码判断程序。

电子密码锁工作的主要过程是LED数码管显示密码啊。

通过键盘输入密码,按下确认键后判断密码的正确性,正确显示PASS,错误显示ERR。

程序将分为主程序和中断服务子程序。

主程序负责键盘键值读取,密码判断和开锁,中断服务子程序主要是负责LED数码管显示。

根据程序功能,程序主要分为以下几部分:1.键盘键值读取程序键盘键值读取程序包括键盘扫描、消除抖动、键译码等内容。

按键的识别主要有两种方法:行反转法和行扫描法。

因为键盘为机械开关,容易引入抖动。

为了消除抖动干扰,在程序中要加入消除抖动的部分。

2)LED数码显示程序LED数码显示器是一种应用很普遍的显示器。

程序主要负责把要显示的数字或字母对应的显示码送到相应的LED显示管。

有多位需要同时显示时,可以采用动态刷新的方法,就可以得到稳定的输出。

循环显示8个数码管,可以实现稳定的数字显示。

中断服务程序只负责数据的输出显示,主程序根据所处的状态修正显示数据。

3)密码判断程序密码判断程序放在主程序中,有按键时读取,当确定键按下时作出判断。

在程序中设置6字节的空间存放设定的密码和8字节存放键盘输入的数据。

根据读取的键盘数据和预先设定的密码逐位比较就可以判断输入密码的正确性。

2.密码显示与开锁当密码输出时候,显示屏上逐步显示密码,逐一显示。

4.密码错误报警当用户键入正确密码并按下“确认”键时,屏幕清零会显示PASS。

当用户键入错误密码按下“确认”时,屏幕清零会显示ERR。

五.实验要求实现:1.电路设计:2.主流程图:3.4x4键盘行列式键盘原理电路图:每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N×M个按键的键盘。

本设计发射部分采用4x4键盘,接收部分采用4x4键盘。

键盘扫描时,首先由I/O口低四位输出高电平,高四位输出低电平,假若有键按下,那么在I/O口低四位即可读出低电平,接着延时消抖,再具体判断是何键按下。

4.显示模块五.总电路设计如下六.程序#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换#define KeyPort P1sbit LATCH1=P2^2;//定义锁存使能端口段锁存sbit LATCH2=P2^3;// 位锁存unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~Funsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]; //存储显示值的全局变量unsigned char code password[8]={1,2,3,4,5,6,7,8};//可以更改此密码做多组测试void DelayUs2x(unsigned char t);//us级延时函数声明void DelayMs(unsigned char t); //ms级延时void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数unsigned char KeyScan(void);//键盘扫描unsigned char KeyPro(void);void Init_Timer0(void);//定时器初始化/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char num,i,j;unsigned char temp[8];bit Flag;Init_Timer0();while (1) //主循环{num=KeyPro();if(num!=0xff){if(i==0){for(j=0;j<8;j++)//清屏TempData[j]=0;}if(i<8){temp[i]=dofly_DuanMa[num];//把按键值输入到临时数组中for(j=0;j<=i;j++) //通过一定顺序把临时数组中//的值赋值到显示缓冲区,从右往左输入TempData[7-i+j]=temp[j];}i++; //输入数值累加if(i==9)//正常等于8即可,由于我们需要空一个用于清屏,//清屏时的按键不做输入值{i=0;Flag=1;//先把比较位置1for(j=0;j<8;j++)//循环比较8个数值,//如果有一个不等则最终Flag值为0 Flag=Flag&&(temp[j]==dofly_DuanMa[password[j]]);//比较输入值和已有密码for(j=0;j<8;j++)//清屏TempData[j]=0;if(Flag)//如果比较全部相同,标志位置1{TempData[0]=0x3f; // "o"TempData[1]=0x73; // "p"TempData[2]=0x79; // "E"TempData[3]=0x54; // "n"//说明密码正确,输入对应操作显示"open"}else{TempData[0]=0x79; // "E"TempData[1]=0x50; // "r"TempData[2]=0x50; // "r"//否则显示"Err"}}}}}/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------显示函数,用于动态扫描数码管输入参数FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。

Num表示需要显示的位数,如需要显示99两位数值则该值输入2------------------------------------------------*/void Display(unsigned char FirstBit,unsigned char Num){static unsigned char i=0;DataPort=0; //清空数据,防止有交替重影LATCH1=1; //段锁存LATCH1=0;keyPort=dofly_WeiMa[i+FirstBit]; //取位码LATCH2=1; //位锁存LATCH2=0;DataPort=TempData[i]; //取显示数据,段码LATCH1=1; //段锁存LATCH1=0;i++;if(i==Num)i=0;}/*------------------------------------------------定时器初始化子程序------------------------------------------------*/void Init_Timer0(void){TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响//TH0=0x00; //给定初值//TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}/*------------------------------------------------定时器中断子程序------------------------------------------------*/void Timer0_isr(void) interrupt 1{TH0=(65536-2000)/256; //重新赋值2msTL0=(65536-2000)%256;Display(0,8); // 调用数码管扫描}/*------------------------------------------------按键扫描函数,返回扫描键值------------------------------------------------*/unsigned char KeyScan(void) //键盘扫描函数,使用行列反转扫描法{unsigned char cord_h,cord_l;//行列值中间变量KeyPort=0x0f; //行线输出全为0cord_h=KeyPort&0x0f; //读入列线值if(cord_h!=0x0f) //先检测有无按键按下{DelayMs(10); //去抖if((KeyPort&0x0f)!=0x0f){cord_h=KeyPort&0x0f; //读入列线值KeyPort=cord_h|0xf0; //输出当前列线值cord_l=KeyPort&0xf0; //读入行线值while((KeyPort&0xf0)!=0xf0);//等待松开并输出return(cord_h+cord_l);//键盘最后组合码值}}return(0xff); //返回该值}/*------------------------------------------------按键值处理函数,返回扫键值------------------------------------------------*/ unsigned char KeyPro(void){switch(KeyScan()){case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值case 0x7d:return 1;break;//1case 0x7b:return 2;break;//2case 0x77:return 3;break;//3case 0xbe:return 4;break;//4case 0xbd:return 5;break;//5case 0xbb:return 6;break;//6case 0xb7:return 7;break;//7case 0xde:return 8;break;//8case 0xdd:return 9;break;//9case 0xdb:return 10;break;//acase 0xd7:return 11;break;//bcase 0xee:return 12;break;//ccase 0xed:return 13;break;//dcase 0xeb:return 14;break;//ecase 0xe7:return 15;break;//fdefault:return 0xff;break;}}七.实验心得在科技高度发展的今天,计算机在人们之中的作用越来越突出。

相关主题