第1页共15页基于STC90C516单片机的设计——简易密码锁学院:学号:姓名:专业:班级:指导老师:第2页共15页摘要单片机全称叫单片微型计算机(SingleChipMicrocomputer),是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。单片机内部也用和电脑功能类似的模块,比如CPU,内存,并行总线,还有和硬盘作用相同的存储器件,不同的是它的这些部件性能都相对我们的家用电脑弱很多,不过价钱也是低的,一般不超过10元即可......用它来做一些控制电器一类不是很复杂的工作足矣了。我们现在用的全自动滚筒洗衣机、排烟罩、VCD等等的家电里面都可以看到它的身影!......它主要是作为控制部分的核心部件。它是一种在线式实时控制计算机,在线式就是现场控制,需要的是有较强的抗干扰能力,较低的成本,这也是和离线式计算机的(比如家用PC)的主要区别。单片机是靠程序的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。单片机通过你编写的程序可以实现高智能,高效率,以及高可靠性!目前单片机渗透到我们生活的各个领域,例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。所以以实验开发板来熟悉掌握单片机设计的方法至关重压,不仅能进一步巩固所学知识,达到学以致用的目的,还能培养我们求知探索的精神。本设计主要在于利用单片机编程软件keilC51和实机测试结果来验证设计方案的准确性并以此来学习单片机设计的分析方法和步骤,形成完整成熟的设计思路。本设计以STC89C51芯片开发板为基础,利用开发板上的矩阵键盘和数码管等组件,通过编写相应程序来实现简易密码锁的功能。该功能实现为输入密码与初始设定密码相同时,数码管显示OPEn,若不符则显示Err。第3页共15页目录一、设计综诉1.设计的来源2.设计的意义3.预期的结果4.面对的问题5.涉及的知识二、设计方案1.STC90C516引脚图及引脚功能介绍2.设计思路3.改进三、程序设计1.程序流程图2.程序代码四、设计实现功能1.功能介绍2.结果图示五、总结和体会第4页共15页一、设计综诉1.设计的来源当今社会,这种由单片机芯片控制各种硬件工作的技术也日益成熟,并普及在交通、化工、机械等各个领域。而流水灯这项技术在生活中的应用更是广泛,较为贴近生活。而简易密码锁的设计所需要的知识也正好吻合了我们本学期对于单片机这门课程的学习,所以简易密码锁的这个设计让我们对知识的学习和巩固都有了进一步的加深。2.设计的意义这次单片机设计是为了通过对简易密码锁的设计培养自己综合运用专业及基础知识,解决实际工程技术问题的能力。能够让我深入真实的体会到所学的理论知识和实践相结合的过程。找出自身的不足并加以改正。3.预期的结果按下矩阵键盘的S1-S6按键,数码管显示对应数值,输完8位数字,如果与密码相同,则数码管显示OPEn,否则显示Err,需要重新输入,直至密码正确。4.面对的问题编写正确的程序,开发板的接线正确。5.涉及的知识数码管显示,矩阵键盘控制二、设计方案1.STC90C516单片机引脚图及引脚功能介绍第5页共15页EA/VPP31XTAL119XTAL218RST9P3.7(RD)17P3.6(WR)16P3.2(INT0)12P3.3(INT1)13P3.4(T0)14P3.5(T1)15P1.0(T2)1P1.1(T2EX)2P1.23P1.34P1.45P1.56P1.67P1.78(AD0)P0.039(AD1)P0.138(AD2)P0.237(AD3)P0.336(AD4)P0.435(AD5)P0.534(AD6)P0.633(AD7)P0.732(A8)P2.021(A9)P2.122(A10)P2.223(A11)P2.324(A12)P2.425(A13)P2.526(A14)P2.627(A15)P2.728PSEN29ALE/PROG30(TXD)P3.111(RXD)P3.010GND20VCC40U1AT89C52单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。电源:(1)VCC:芯片电源,接+5V;(2)VSS:接地端;时钟:XTAL1、XTAL2:晶体振荡电路反相输入端和输出端。控制线:控制线共有4根,(1)ALE/PROG:地址锁存允许/片内EPROM编程脉冲ALE功能:用来锁存P0口送出的低8位地址PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。(2)PSEN:外ROM读选通信号。第6页共15页(3)RST/VPD:复位/备用电源。RST(Reset)功能:复位信号输入端。VPD功能:在Vcc掉电情况下,接备用电源。(4)EA/Vpp:内外ROM选择/片内EPROM编程电源。EA功能:内外ROM选择端。Vpp功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源VVpp.I/O线:89C52共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。2.设计思路首先设定好一个初始密码,通过矩阵键盘输入8位数字,输完8位数字按任意数字键进行确认,输入的8位数字与初始密码逐一比较,若完全正确,则数码管显示OPEn,若有一位数字发生错误,则显示Err。实际操作中,要设定好合适的延时时间来保证去抖功能的实现,以便正确显示输入数字。按键输入无效或者输入数字不足8位,都返回按键扫描。错误的输入次数无限制。3.改进还可以添加错误报警功能,输入密码错误时数码管显示Err且蜂鸣器报警,红灯闪烁,密码正确时则显示绿灯;限制输错次数,当错误次数达到设定上限值,键盘锁定一段时间,期间无法再次输入密码。三、程序设计1.程序流程图第7页共15页扫描按键是否有效输入?输入并显示输入8位?与初始密码比较正确?显示OPEn显示Err清屏是否是否是否2.程序代码#includereg52.h//包含头文件,头文件包含特殊功能寄存器的定义第8页共15页#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换#defineKeyPortP1sbitLATCH1=P2^2;//定义锁存使能端口段锁存sbitLATCH2=P2^3;//位锁存unsignedcharcodeDuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示段码值0~FunsignedcharcodeWeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsignedcharTempData[10];//存储显示值的全局变量unsignedcharcodepassword[8]={1,2,3,4,5,6,7,8};//可以更改此密码做多组测试voidDelayUs2x(unsignedchart);//us级延时函数声明voidDelayMs(unsignedchart);//ms级延时voidDisplay(unsignedcharFirstBit,unsignedcharNum);//数码管显示函数unsignedcharKeyScan(void);//键盘扫描unsignedcharKeyPro(void);voidInit_Timer0(void);//定时器初始化/*------------------------------------------------主函数------------------------------------------------*/voidmain(void){unsignedcharnum,i,j;unsignedchartemp[8];bitFlag;第9页共15页Init_Timer0();while(1)//主循环{num=KeyPro();if(num!=0xff){if(i==0){for(j=0;j8;j++)//清屏TempData[j]=0;}if(i8){temp[i]=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;j8;j++)//循环比较8个数值,//如果有一个不等则最终Flag值为0Flag=Flag&&(temp[j]==DuanMa[password[j]]);第10页共15页//比较输入值和已有密码for(j=0;j8;j++)//清屏TempData[j]=0;if(Flag)//如果比较全部相同,标志位置1{TempData[0]=0x3f;//oTempData[1]=0x73;//pTempData[2]=0x79;//ETempData[3]=0x54;//n//说明密码正确,输入对应操作显示open}else{TempData[0]=0x79;//ETempData[1]=0x50;//rTempData[2]=0x50;//r//否则显示Err}}}}}/*------------------------------------------------uS延时函数,含有输入参数unsignedchart,无返回值unsignedchar是定义无符号字符变量,其值的范围是0~255这里使用晶振12M,大致延时长度如下T=tx2+5uS------------------------------------------------*/voidDelayUs2x(unsignedchart)第11页共15页{while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsignedchart,无返回值unsignedchar是定义无符号字符变量,其值的范围是0~255------------------------------------------------*/voidDelayMs(unsignedchart){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------显示函数,用于动态扫描数码管。输入参数FirstBit表示需要显示的第一位,如赋值2表示从第三个数码管开始显示,如输入0表示从第一个显示。Num表示需要显示的位数,如需要显示两位数值则该值输入2------------------------------------------------*/voidDisplay(unsignedcharFirstBit,unsignedcharNum){staticunsignedchari=0;DataPo