单片机矩阵键盘毕业设计摘要矩阵式键盘乃是目前使用较为广泛的一种键盘模式,该系统以N个端口连接控制N*N个按键,即时在LED数码管上。单片机控制的据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。4*4矩阵式键盘采用89C51单片机为核心,主要由矩阵式键盘电路、译码电路、显示电路等组成,软件选用C语言编程,单片机将检测到的按键信号转换成数字量,显示于数码管显示器,系统灵活性强,易于操作,可靠性能好。单片机简介及主系统电路单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换444器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域的广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的32位300M的高速单片机。单片机在工业控制领域广泛应用,它由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中,本次课程设计我们采用的是AT89C51型号的单片机。AT89C51单片机是51系列单片机的一个成员,是8051单片机的简化版。内部自带2K字节可编程FLASH存储器的低电压、高性能COMS八位微处理器,与IntelMCS-51系列单片机的指令和输出管脚相兼容。由于将多功能八位CPU和闪速存储器结合在单个芯片中,因此,AT89C2051构成的单片机系统是具有结构最简单、造价最低廉、效率最高的微控制系统,省去了外部的RAM、ROM和接口器件,减少了硬件开销,提高了系统的性价比。其最小系统电路图如下:单片机最小系统电路图三、矩阵键盘的电路介绍AT89C51单片机的并行口P3接4×4矩阵键盘,以P3.0-P3.3作行输入线,以P3.4-P3.7作列输出线;P3口输出按键信息,在数码管上显示每个按键的“0-F”序号。实际电路图连接如下图所示。矩阵式键盘电路四、数码管显示原理及译码电路本系统输出结果选用8个LED数码管显示。数码管有共阴共阳之分,本系统采用8段共阴型LED,其原理图如下图所示:符号和引脚共阳极共阴极LED数码管结构数码管内部有8个发光二极管,公共端由8个发光二极管的阴极并接而成,正常显示时公共端接低电平(GND),各发光二极管是否点亮取决于a-dp各引脚上是否是高电平。LED数码管的外部有10个引脚,其中3,8脚为公共端也称位选端,其余8个引脚称为段选端,当要使某一位数码管显示某一数字((0-9中的一个)必须在这个数码管的段选端加上与数字显示数字对应的8位段选码(也称字形码),在位选端加上低电平即可。由于系统要显示的内容比较简单,显示量不多,所以选用数码管既方便又经济。LED有共阴极和共阳极两种,二极管的阴极连接在一起,通常此公共阴极接地,而共阳极则将发光二极管的阳极连接在一起,接入+5V的电压。一位显示器由8个发光二极管组成,其中7个发光二极管构成字型“8”的各个笔划(段)a~g,另一个小数点为dp发光二极管。当在某段发光二极管施加一定的正向电压时,该段笔划即亮;不加电压则暗。五、时钟电路与复位电路时钟信号用来提供单片机片内各种微操作的时间基准,时钟信号通常用两种电路形式得到:内部振荡和外部振荡。MCS-51单片机内部有一个用于构成振荡器的高增益反向放大器,引脚XTALl和XTAL2分别是此放大电器的输入端和输出端,由于采用内部方式时,电路简单,所得的时钟信号比较稳定,实际使用中常采用这种方式,如图2-2所示在其外接晶体振荡器(简称晶振)或陶瓷谐振器就构成了内部振荡方式,片内高增益反向放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器并产生振荡时钟脉冲。电路图中外接晶体以及电容C2和C3构成并联谐振电路,它们起稳定振荡频率、快速起振的作用,其值为30pF左右,晶振频率选11.0592MHz。为了初始化单片机内部的某些特殊功能寄存器,必须利用复位电路,复位后可使CPU及系统各部件处于确定的初始状态,并从初始状态开始正常工作。单片机的复位是靠外电路来实现的,在正常运行情况下,只要RST引脚上出现两个机器周期时间以上的高电平,即可引起系统复位,但如果RST引脚上持续为高电平,单片机就处于循环复位状态。复位后系统将输入/输出(1/0)端口寄存器置为FFH,堆栈指针SP置为07H,SBUF内置为不定值,其余的寄存器全部清0,内部RAM的状态不受复位的影响,在系统上电时RAM的内容是不定的。复位操作有两种情况,即上电复位和手动(开关)复位。本系统采用上电复位方式。电路图中R1和Cl组成上电复位电路,其值R取为1KΩ,C取为10pF。六、软件系统设计1、程序流程图:入口扫描一行扫描一列该行该列是否有键按下?延时10ms去抖动再次扫描原列与原值扫描值相符?按键释放根据行号和列号查键码表求键值返回4列全部扫描完?扫描下一行4行全部扫描完?返回0xFF表示无键按下根据键值查数码显示编码表扫描下一行扫描下一行NNNYYNYY扫描下一行2、按键检测与数码管显示P3口的低4位控制行输入,高4位控制列输入当没有按键按下时,P3.0—P3.3与P3.4—P3.7之间开路。当有键闭合时,与闭合键相连的两条I/O口线之间短路。判断有无按键按下的方法是:第一步,置行线P3.0—P3.3为输入状态,从列线P3.4—P3.7输出低电平,读入行线数据,若某一行线为低电平,则该行线上有键闭合。第二步,列线轮流输出低电平,从行线P3.0—P3.3读入数据,若有某一行为低电平,则对应的列线上有键按下。综合一二两步的结果,可确定按键编号。但是按键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的按键操作。当确定了是哪一个按键按下后,通过软件程序的设计,返回键盘扫描的键值,转化成十六进制的数据后由PO口输出给数码管显示。3、LED显示段码表字型共阳极段共阴极段字型共阳极段共阴极段0C0H3FH990H6FH1F9H06HA88H77H2A4H5BHB83H7CH3B0H4FHCC6H39H499H66HDA1H5EH592H6DHE86H79H682H7DHF84H71H7F8H07H空白FFH00H880H7FHP8CH73H七、PROTEUS仿真图八、系统的程序:#includereg52.h#defineuintunsignedint#defineucharunsignedcharucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};ucharcodewe[]={7,6,5,4,3,2,1,0};uinti;sbitdula=P2^6;sbitwela=P2^7;ucharnum,num1,temp;voiddelay(uintz){ucharx,y;for(x=z;x0;x--)for(y=110;y0;y--);}ucharkeyscan();voidmain(){num=17;//打开时数码管什么也不显示dula=1;//关闭数码管P0=0;dula=0;//P2=2;while(1){num1=keyscan();for(i=0;i8;i++){P0=table[num1-1];P2=we[i];delay(1);}}}ucharkeyscan()//带有返回值的函数{P3=0xfe;//检测第一行temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);//延时去抖temp=P3;temp=temp&0xf0;while(temp!=0xf0)//不等于0xf0说明确实是有建按下{temp=P3;//再读回P3口的值switch(temp){case0xee:num=1;break;case0xde:num=2;break;case0xbe:num=3;break;case0x7e:num=4;break;}while(temp!=0xf0)//检测是否松手,不佳松手检测退不出第二个while循环{temp=P3;temp=temp&0xf0;}}}P3=0xfd;//检测第二行temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);//延时去抖temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;//读回P3口的值switch(temp){case0xed:num=5;break;case0xdd:num=6;break;case0xbd:num=7;break;case0x7d:num=8;break;}while(temp!=0xf0)//检测是否松手{temp=P3;temp=temp&0xf0;}}}P3=0xfb;//检测第三行temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);//延时去抖temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;//读回P3口的值switch(temp){case0xeb:num=9;break;case0xdb:num=10;break;case0xbb:num=11;break;case0x7b:num=12;break;}while(temp!=0xf0)//检测是否松手{temp=P3;temp=temp&0xf0;}}}P3=0xf7;//检测第四行temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);//延时去抖temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;//读回P3口的值switch(temp){case0xe7:num=13;break;case0xd7:num=14;break;case0xb7:num=15;break;case0x77:num=16;break;}while(temp!=0xf0)//检测是否松手{temp=P3;temp=temp&0xf0;}}}returnnum;}实验总结与讨论通过这次单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。这个设计过程中,我们由P3.0—P3.3(行)和P3.4—P3.7(列)组成4*4矩阵键盘,P0口接LED数码管静态显示电路。由于P0口内部无上拉电阻,因此必须外部接上拉电阻,其阻值的选择可以根据LED数码管发光电流及其亮度来决定,参考值为560欧姆。编写4*4键盘的驱动程序。编写主程序,当按键按下时,能够在数码管显示器与按键的键值对应的数字。设计结果能够符合题意,成功完成了此次实习要求,我们不只在乎这一结果,更加在乎的,是这个过程。这个过程中,我们花费了大量的时间和精力,更重要的是,我们在学会创新的基础上,同时还懂得合作精神的重要性,学会了与他人合作,也非常感谢老师在实习过程中的指导与帮助。实物演示图元件清单序号器件名称器件数量1AT89S5112插座13单片机开发板141位数码管1512MHZ晶振1630pF电容2720uF电容189脚排阻(470*8)19按钮171010K电阻4111K电阻1200欧姆电阻2电源插孔1电源开关1发光二极管1下载接口1实验电源(220V转