单片机矩阵键盘毕业设计资料文档格式.docx
《单片机矩阵键盘毕业设计资料文档格式.docx》由会员分享,可在线阅读,更多相关《单片机矩阵键盘毕业设计资料文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
四、数码管显示原理及译码电路
本系统输出结果选用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、程序流程图:
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显示段码表
字型
共阳极段
共阴极段
C0H
3FH
9
90H
6FH
1
F9H
06H
A
88H
77H
2
A4H
5BH
B
83H
7CH
3
B0H
4FH
C
C6H
39H
4
99H
66H
D
A1H
5EH
5
92H
6DH
E
86H
79H
6
82H
7DH
F
84H
71H
7
F8H
07H
空白
FFH
00H
8
80H
7FH
P
8CH
73H
七、PROTEUS仿真图
八、系统的程序:
#include<
reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]={
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;
x>
0;
x--)
for(y=110;
y>
y--);
}
ucharkeyscan();
voidmain()
{
num=17;
//打开时数码管什么也不显示
dula=1;
//关闭数码管
P0=0;
dula=0;
//P2=2;
while
(1)
{
num1=keyscan();
for(i=0;
i<
8;
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&
while(temp!
=0xf0)//不等于0xf0说明确实是有建按下
{
temp=P3;
//再读回P3口的值
switch(temp)
{
case0xee:
num=1;
break;
case0xde:
num=2;
case0xbe:
num=3;
case0x7e:
num=4;
}
=0xf0)//检测是否松手,不佳松手检测退不出第二个while循环
temp=P3;
temp=temp&
}
}
P3=0xfd;
//检测第二行
//读回P3口的值
case0xed:
num=5;
case0xdd:
num=6;
case0xbd:
num=7;
case0x7d:
num=8;
while(temp!
=0xf0)//检测是否松手
P3=0xfb;
//检测第三行
case0xeb:
num=9;
case0xdb:
num=10;
case0xbb:
num=11;
case0x7b:
num=12;