1、武汉理工大学单片机原理与应用课程设计说明书1.设计分析 本次课程设计题目是简易键盘与显示功能设计,设计要求:用并行口设计一键盘显示电路,按键为数字0-9和字母A-F,要求当某个按键按下时,能显示出该按键的值。其中数码管显示部分,本设计将采用七段式共阴极数码管,利用单片机的P3口使用静态显示方式。 键盘输入显示数字部分,扩展为44的矩阵式键盘,共16个按键,对应从数字0到9和英文字母AF共16个符号。使用AT89C51的P1口。 完成电路设计后,还需要编写C语言程序,通过Keil软件编译并生成HEX文件,然后通过Proteus仿真软件读入AT89C51仿真芯片中,最后运行仿真。2.数码管显示与键
2、盘设计2.1数码管的连接及显示原理本设计采用七段式共阴极数码管来完成此项功能。七段式数码管LED是由7个条形发光二极管和一个小圆点发光二极管组成,通过控制各个二极管的明灭组成所需要的字符。数码管一共8个接口,分别对应7个条形二极管和一个小圆点发光二极管,联系到单片机及控制程序中,对应一个8位十六进制数,通过该十六进制数的输入,得到相应的所需字符。数码管如图2.1所示: 图2.1 七段式数码管七段式数码管根据内部发光二极管的接线形式,可分为共阳极和共阴极两种类型。其中,COM为公共端。共阳极接法是低电平亮,高电平灭;共阴极接法是高电平亮,低电平灭。内部结构如图2.2所示。本设计将采用共阴极接法。
3、 图2.2 (左)共阴极和(右)共阳极2.2数码管的显示方式数码管的现实方式有静态和动态显示方式两种。静态显示方式:把多个LED显示器的每一段与一个独立的并行口相连接,而公共端则根据具体情况连接到“VCC”或“GND”,这种连接方式的每一个显示器都要占用一个单独的具有锁存功能的I/O口,单片机只需把要显示的字形代码输入进接口电路即可。因此,使用这种方式对I/O的需求较大,电路也较为复杂,但是具有编程简单,显示稳定,单片机效率较高的优点。动态显示方式:其接口电路是把所有显示器的笔划段同名端连接在一起,而每一个显示器的公共端COM与各自独立的I/O口连接。当单片机输送字形码时,所有显示器接受到相同
4、字型码,但具体哪一个显示器亮,则取决于COM端,而这一端由I/O口控制。所谓动态扫描即分时方法,一位一位的控制各个显示器的COM端,是每个显示器每隔一段时间亮一次,点亮时间即为短暂(约1毫秒),由于视觉暂留和二极管的余辉效应,给人的印象即是一组稳定的数据显示。本设计将采用静态显示方式。2.3键盘设计键盘输入显示数字部分,扩展为44的矩阵式键盘,共16个按键,对应从数字0、1、2、3、4、5、6、7、8、9和英文字母A、b、C、d、E、F共16个符号。使用到AT89C51的P1口。键盘设计如图2.3所示: 图2.3 键盘输入电路及对应输出字符具体按键的对应输出字符及延时将在后面的程序编写中实现。
5、3.系统总电路设计及分析本设计在Proteus软件中完成,系统总电路图如图3.1所示: 图3.1 系统总电路图如图3.1所示,P1.0P1.7口用来接矩阵键盘;P2口没有使用,全部置空;P3口用来连接七段式数码管;而P0口,因为内部没有上拉电阻,故利用排阻RP1来作上拉电阻,如图3.2所示: 图3.2 排阻RP1该C51单片机的XTAL1和XTAL2用来接内部晶振电路,如图3.3所示: 图3.3 晶振电路复位电路及单片机端口的使用,低电平时,将锁定RESET,保持高电平时,可访问内部存储器,如图3.4所示: 图3.4 复位电路及4. C语言程序设计4.1程序流程图该程序功能是扫描键盘是否有按键
6、按下并做相应显示。流程图如图4.1所示: 图4.1 程序流程图4.2程序分析程序根据P1口读入的状态,判断是否输出字符,输出具体哪个字符。由于七段式数码管形状类似于数字“8”,故在输出英文字母时,为了显示方便,分别显示为大小写不一的“A”、“b”、“C”、“d”、“E”、“F”。因为采用共阴极数码管,所以列出所要显示的16个数字、字母对应的十六进制数据代码:00x3f;10x06;20x5b;30x4f;40x66;50x6d;60x7d;70x07;80x7f;90x6f;A0x77;b0x7c;C0x39;d0x5e;E0x79;F0x71;因为要扫描P1口的高4位,即判断矩阵键盘的列,固
7、有:选取P1.0口的代码为:P1=0xfe;选取P1.1口的代码为:P1=0xfd;选取P1.2口的代码为:P1=0xfb;选取P1.3口的代码为:P1=0xf7;为了消除键抖动可能带来的影响,还应设计延时程序来去抖动。为了提高程序的效率和可读性,将延时程序、显示程序和键盘扫描程序设计为子函数。并利用while循环,不断检测按键是否被按下。4.3 C语言程序及注释#includereg51.h /51单片机头文件#define uchar unsigned char#define uint unsigned intuchar code table= /共阴极数码管0至9,A至F0x3f,0x0
8、6,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void delay(uint xms) /延时函数uint i,j;for(i=xms;i0;i-) for(j=100;j0;j-); void display(uchar num) /显示函数P3=tablenum;void keyscan() /键盘扫描函数uchar temp,key;P1=0xfe; /P1.0=0,扫描列temp=P1; /读P1口状态给temptemp=temp&0xf0; /与if(temp!=0xf0) /不等于0x
9、f0向下执行 delay(10); /延时去抖动temp=P1; /重读P1口状态给temptemp=temp&0xf0; /再与if(temp!=0xf0) /还是不等于0xf0,说明确实有键按下 temp=P1; /再向temp读入P1口状态switch(temp) case 0xee:key=7;break;case 0xde:key=8;break;case 0xbe:key=9;break;case 0x7e:key=10;break;while(temp!=0xf0) /等待按键释放 temp=P1;temp=temp&0xf0; display(key);P1=0xfd; /P1
10、.1=0,扫描列temp=P1;temp=temp&0xf0;if(temp!=0xf0) delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0) temp=P1;switch(temp) case 0xed:key=4;break;case 0xdd:key=5;break;case 0xbd:key=6;break;case 0x7d:key=11;break; while(temp!=0xf0) temp=P1;temp=temp&0xf0; display(key);P1=0xfb;/P1.2=0,扫描列temp=P1;temp=temp&0xf
11、0;if(temp!=0xf0) delay(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0) temp=P1;switch(temp) case 0xeb:key=1;break;case 0xdb:key=2;break;case 0xbb:key=3;break;case 0x7b:key=12;break; while(temp!=0xf0) temp=P1;temp=temp&0xf0; display(key);P1=0xf7;/P3.0=0,扫描列temp=P1;temp=temp&0xf0;if(temp!=0xf0) delay(10);te
12、mp=P1;temp=temp&0xf0;if(temp!=0xf0) temp=P1;switch(temp) case 0xe7:key=15;break;case 0xd7:key=0;break;case 0xb7:key=14;break;case 0x77:key=13;break;while(temp!=0xf0) temp=P1;temp=temp&0xf0;display(key);void main() P3=0;P3=0xc0; /初始状态设定为“-”符号while(1) keyscan(); 5.电路及程序仿真5.1编译C语言程序为了使AT89C51单片机顺利运行,需要
13、将C语言程序编译为HEX文件,本设计将使用Keil软件进行编译。打开Keil软件,选择Project,新建工程jp.Uv2,则Project Workspace显示如图5.1所示: 图5.1 新建工程新建文件file,输入C语言代码保存,然后再Source Group 1上单击右键,添加保存的C语言文件。如图5.2所示: 图5.2 添加C语言代码 单击Options for target按钮,选择Output选项,在其中勾选上Create HEX File,单击确定。如图5.3所示: 图5.3 勾选Create HEX File 最后选择菜单栏中的Project选项,点击Build targe
14、t,即可在工程目录下生成相应的HEX文件。5.2电路仿真打开Proteus软件,导入所设计的电路图,然后双击图中的AT89C51单片机,在Program File中选中已经编译好的HEX文件,单击确定。如图5.4所示: 图5.4 导入HEX文件此时点击软件左下角的运行按钮,整个系统就开始正常工作了。初始状态为显示“-”符号,如图5.5所示: 图5.5 初始未按任何键时仿真结果:点击各键开关时,数码管均能正确显示相应的字符,如图5.6所示,显示矩阵为: A 9 8 7b 6 5 4C 3 2 1d E 0 F 图5.6 仿真结果6.心得体会 本次课程设计是单片机原理与应用,利用51单片机设计并实
15、现仿真键盘显示电路。因为是单片机原理与应用的课程设计,必须对C51单片机这一部分非常熟悉。所以在动手之前,不得不把课本上这一部分再读一遍。在复习理论知识的过程中,发现自己平时上课时没有高效率的学习,对单片机接口和一些端口功能非常陌生。于是只好从网上找到的C51系列单片机内容开始看,经过一遍遍反复阅读,终于对键盘设计有了一定的理解。搜索资料、阅读课本的过程很繁琐,尤其是没有进展的时候,非常焦急。在慢慢学习的过程中,关于单片机各个接口也有了越来越详细的了解。特别是端口实现数码管明灭的设置。当编写C语言程序的时候,因为实验课用的编辑软件比较不容易编辑,而且版本过旧,遇到了很多的困难,后来查询到了比较
16、流行而且实用的软件Keil。在遇到程序代码方面的困难的时候,一边请教同学,一边不断地找相似的程序配合理解阅读。在这段学习和写报告的时间里,反复经历了着急,欣喜,烦躁,轻松,紧张等等等等一系列的精神状态,于是在最终完成这个课程设计的时候,心里充满了成就感。 同时也更加了解了自己,了解自己在遇到一个接一个难题时的心态和应对方式,这样了解自己,才能有针对性的克服弱点进而提高能力。做课程设计也是一个快乐的过程,自己找教程学习,并和大家一起探讨,相互学习,共同进步,同学们紧密的在一块合作,这是一个完成任务的过程,更是一个合作攻坚,磨砺身心的过程,参与其中的人都受益匪浅。 参考文献1 李群芳. 单片机微型计算机与接口技术,电子工业出版社,2007.2 戴佳. 51单片机应用系统开发典型事例,中国电力出版社,2005.3 赵建领. 51单片机开发与应用技术详解,艺术图书出版社,2008.4 靳硅. 基于51系列单片机的LED显示屏开发技术, 电子工业出版社, 2003.5 刘维. 精通汇编程序设计 ,北京航空航天大学出版社,2005.6 姚燕南. 微型计算机原理与接口技术 ,高等教育出版社,2004.7 唐继弦. 51单片机工程应用事例,机械工业出版社,2003.8 张义和. 例说51单片机,人民邮电出版社,2008.16