行列式键盘单片机课程设计报告要点Word下载.docx
《行列式键盘单片机课程设计报告要点Word下载.docx》由会员分享,可在线阅读,更多相关《行列式键盘单片机课程设计报告要点Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
单片机STC89C52、晶振电路、复位电路。
STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
2.1.1主要管脚说明
VCC(40引脚):
电源电压
VSS(20引脚):
接地
P0端口(P0.0~P0.7,39~32引脚):
P0口是一个漏极开路的8位双向I/O口。
作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。
在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线。
此时,P0口内部上拉电阻有效。
在FlashROM编程时,P0端口接收指令字节;
而在校验程序时,则输出指令字节。
验证时,要求外接上拉电阻。
P1端口(P1.0~P1.7,1~8引脚):
P1口是一个带内部上拉电阻的8位双向I/O口。
P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。
对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。
P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流。
此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体参见下表:
在对FlashROM编程和程序校验时,P1接收低8位地址。
P2端口(P2.0~P2.7,21~28引脚):
P2口是一个带内部上拉电阻的8位双向I/O端口。
P2的输出缓冲器可以驱动(吸收或输出电流方式)4个TTL输入。
对端口写入1时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。
P2作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。
在访问外部程序存储器和16位地址的外部数据存储器(如执行“MOVX@DPTR”指令)时,P2送出高8位地址。
在访问8位地址的外部数据存储器(如执行“MOVX@R1”指令)时,P2口引脚上的内容(就是专用寄存器(SFR)区中的P2寄存器的内容),在整个访问期间不会改变。
在对FlashROM编程和程序校验期间,P2也接收高位地址和一些控制信号。
P3端口(P3.0~P3.7,10~17引脚):
P3是一个带内部上拉电阻的8位双向I/O端口。
P3的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。
对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。
P3做输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输入一个电流。
在对FlashROM编程或程序校验时,P3还接收一些控制信号。
P3口除作为一般I/O口外,还有其他一些复用功能。
2.2晶振
图2-2晶振
单片机系统里都有晶振,在单片机系统里晶振作用非常大,全称叫晶体振荡器,它结合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片机的一切指令的执行都是建立在单片机晶振提供的时钟频率。
通常一个系统共用一个晶振,便于各部分保持同步。
有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持同步。
STC89C52RC使用12MHz的晶体振荡器作为振荡源。
2.3行列式键盘的电路介绍
图2-3行列式键盘
STC89C52单片机的并行口P3接4*4矩阵键盘,以P3.0-P3.3作行输入线,以P3.4-P3.7作列输出线;
P3口输出按键信息,在数码管上显示每个按键的行与列的序号。
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口输出给数码管显示。
2.4共阳极数码管的介绍
图2-4共阳极数码管及位驱动
这是一个四位八段的共阳极数码管,STC89C52的P0.0~P0.7为段输出口,P2.0~P2.3为位输出口。
使用ULN2003的4个输出口作为位驱动,用来驱动8段数码管的DS1~DS4。
该数码管内部有8个发光二极管,公共端由8个发光二极管的阳极并接而成,正常显示时公共端接高电平(VCC),各发光二极管是否点亮取决于a-dp各引脚上是否是低电平。
LED数码管的外部有12个引脚,其中6,8,9,12脚为公共端也称位选端,其余8个引脚称为段选端,当要使某一位数码管显示某一数字((0-9中的一个)必须在这个数码管的段选端加上与数字显示数字对应的8位段选码(也称字形码),在位选端加上高电平即可。
由于系统要显示的内容比较简单,显示量不多,所以选用数码管既方便又经济。
2.5发光二极管的介绍
图2-5发光二极管
发光二极管简称LED灯,是一种将电能转化为光能的特殊二极管。
发光二极管和普通的二极管一样,由一个PN结组成。
具有单向导电性。
当发光二极管工作在正向偏置状态下,且有一定大小的电流通过发光二极管时。
它就会发光。
光的颜色视发光二极管的材料而定。
发光二极管正向工作电压为1.5V左右,正向电流为5-15mA.80C51引脚输出低电平可直接驱动LED。
第三章软件设计
3.1设计流程图
图3-1设计流程图
单片机将从程序中键盘按键初始化对应得到的值通过数码管显示行与列的数值,通过LED灯显示0-F的值并伴随蜂鸣器的响声。
3.2程序流程图
图3.2程序流程图
本程序对系统按键进行了初始化,通过对按键的扫描结果进行判断是否有按键按下,同时由数码管显示出当前按键行与列的数值,相应的LED灯作用;
没有按键按下就保持原来的状态。
第四章调试
4.1硬件调试
4.1.1电路电源调试
在通电前,一定要检查电源电压的幅值和极性,否则很容易造成集成块损坏。
加电后检查各插件上引脚的电位,一般先检查VCC与GND之间电位,若在5V~4.8V之间属正常。
若有高压,联机仿真器调试时,将会损坏仿真器等,有时会使应用系统中的集成块发热损坏。
电路电源主要通过USB外部供电,输入+5V电压。
提供单片机电源、数码管电源和ULN2003电源。
将数字电源通电后测试各个数字芯片的电源电压,即可进行电路电源的调试。
4.1.2电路下载调试
正确连接电路,通过USB串口下载相关程序,测试数码管是否能正确显示数字,行列式键盘能否正确响应。
4.2软件调试
第一步要根据硬件连接图和各器件的特性选择本次课程所需的电路,然后根据电路进行软件编程,实现课程的相关要求。
第二步将单片机插入40P的紧缩座,插上12M的晶振以及USB数据线。
第三步在电脑上根据相关资料提示找到STC的驱动程序,进行安装。
第四步装下载软件加载程序,根据相关提示,选择单片机型号,找到软件编程程序,对软件编程程序首先要用KEIL软件进行编译生成hex的格式,然后进行下载。
第五步在程序下载完成后,对开发板进行软件启动,程序就正式下载到单片机中了。
第六步测试载入程序后,单片机系统能不能完成本次课程所需的各个要求。
依次按下4×
4行列式键盘,观察数码管的显示结果。
结果数码管正确显示出了各个按键的行与列的位置信息,验证程序完全正确,不需要修改。
到此,软件调试结束。
第五章总结
5.1课程设计总结
通过本次单片机课程设计,我不仅加深了对单片机理论知识的理解,学会了学以致用的重要性;
而且还学会了如何去加强锻炼创新精神,同时也提高了自身的动手能力,让我深刻的意识到理论与实际结合的重要性。
本次单片机课程设计,主要分为硬件焊接和软件编写这两个部分。
硬件焊接主要看个人的焊接水平和细心程度。
在焊接之前一定要了解各个元器件在整个电路系统中所起到的作用,这样才能正确焊接元器件的位置,避免元器件的错焊。
由于固定思维的影响,很多同学以为排阻没有焊接焊接方向要求导致了错焊,还好我仔细看了焊接说明书,这说明焊接前一定要认真了解相关内容,否则可能会事倍功半。
本次焊接较难的就是贴片的焊接,不仅要正确焊接贴片管脚,不能使管脚相连,还要注意不能使贴片受热时间过长,避免贴片被高温烧坏,导致器件不能正常工作。
焊接过程中,我最小的贴片CH340管脚焊接没有问题,但是软件测试时不能正常烧写程序,我想可能就是焊接过程中温度过高,将芯片给烧坏了,以后一定要注意。
软件编写对我来说确实是个大问题,虽然本次课程设计的题目不是很难,只要通过数码管显示按键行与列的位置。
但是在实际操作过程当中遇到了不少困难,首先是通过程序判别按键所在的行与列,这个需要一系列的计算,还好书上有行列式键盘键值。
之后是按键数值在LED数码管上的显示,确实是不会编写,特别还是要用到位驱动。
之后根据相关问题,我不断地去查找资料,参考类似的程序和询问可能会的同学,这个过程让我开动了自己的脑子,从而也实现了自我的超越,让自己的知识能够得到不断地完善;
同时更重要的是,在这一设计过程当中,让我懂得了在学习的道路上会遇到很多的阻碍,但关键的是能做到坚持不懈,不轻易放弃,最终达到自己想要的目标。
单片机的学习对于我们专业来说非常的重要,通过本次设计也让我更加清晰了对专业的了解,理论知识再丰富,没有实际的操作经验也是不行的;
本次设计也运用到了protel软件进行原理图的绘制,虽然不是单片机这门课需要掌握的内容,但这个软件本学期已经在电子线路CAD这门课进行了系统的学习,所以这让我意识到课与课之间是息息相关的,学好现如今的每一门课可能就是为下面的学习打好坚实的基础,掌握一些软件的开发与应用更是显得尤为重要。
本次课程设计我发现自己在很多方面都有或多或少的不足,首先是硬件的焊接,我感觉自己的焊接能力有待提高。
焊接过程中,焊接速度不够娴熟,而且焊点不够圆润美观,希望自己能在以后多多锻炼自己的动手焊接水平,不断提高自己的焊接工艺水准,最好能达到眼到手到的境界。
软件编程确实是我的短板,一做到相关问题确实有点为难,幸好得到了同学的帮助和老师的提示,这才将符合设计要求的程序编辑出来。
希望我能在寒假里能多花些时间学习单片机的软件编程,提高自己软件编程的能力。
专业知识一定要重视,切不可浑浑噩噩的过日子,要时刻铭记自己的目标,我要学好单片机,我要朝着自己的目标做出切实可行的行动,不做语言上的巨人。
在本次设计过程中,我确实学习到了很多,也对本学期自己的学习状况有了一次深刻而具体点了解和反思,希望我能在接下来的学习生活中改变自己不好的状态,认真学习,不断提高和充实自己,让自己过一个充满意义的大学生活。
在设计过程中我也得到了不少同学们的帮助,要是没有同学不厌其烦的帮助,我想我一个人也不可能在短时间内完成设计要求;
所以在此我非常感谢在设计中给予我帮助的指导老师和同学们。
第六章附录
附录A原理总图
图6-1原理总图
附录B程序代码
//张凯
/****************************************************
功能描述:
系统上电后,按下矩阵键盘的任意按键,蜂鸣器响
,同时数码管3、4两位分别显示按键的行和列,led
灯显示键值。
****************************************************/
#include"
reg52.h"
#include<
intrins.h>
#defineDUANP0
#defineLEDP1
sbitLED1=P2^3;
sbitLED2=P2^2;
sbitLED3=P2^1;
sbitLED4=P2^0;
intnum;
//键值
intx,y;
//行和列
sbitBUZZER=P2^5;
//蜂鸣器引脚
unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//共阳数码管显示0~F
/**************系统初始化****************/
voidsys_init()
{
ET0=1;
TMOD=0X01;
TH0=-10000/256;
TL0=-10000%256;
TR0=1;
EA=1;
}
/**************延时函数500us****************/
voiddelay_s()//@500us
unsignedchari;
_nop_();
i=247;
while(--i);
/**************延时函数500ms****************/
voiddelay()//500ms
unsignedchari,j,k;
i=4;
j=205;
k=187;
do
{
do
{
while(--k);
}while(--j);
}while(--i);
/**************蜂鸣器发声函数****************/
voidfmq()
inti;
for(i=0;
i<
100;
i++)
BUZZER=~BUZZER;
delay_s();
}
/**************矩阵键盘扫描****************/
unsignedcharKeycan()
unsignedcharrcode,ccode;
//rcode存临时值,ccode存计算结果
P3=0xF0;
//行扫描,列线输入
rcode=P3;
if(rcode!
=0xF0)//若有键按下
delay();
//延时去抖动
rcode=P3;
if(rcode!
=0xF0)
{
ccode=P3;
//取行值
P3=0xff;
//行列全部置1,否则会影响列扫描的结果
P3=0x0f;
//列扫描
rcode=P3;
ccode=ccode|rcode;
fmq();
return(ccode);
}
}
return0;
/**************按键键值转换****************/
voidKeychange(unsignedcharkey)
switch(key)
{
case0x7e:
num=0,x=1,y=1;
break;
case0xbe:
num=1,x=1,y=2;
case0xde:
num=2,x=1,y=3;
case0xee:
num=3,x=1,y=4;
case0x7d:
num=4,x=2,y=1;
case0xbd:
num=5,x=2,y=2;
case0xdd:
num=6,x=2,y=3;
case0xed:
num=7,x=2,y=4;
case0x7b:
num=8,x=3,y=1;
case0xbb:
num=9,x=3,y=2;
case0xdb:
num=10,x=3,y=3;
case0xeb:
num=11,x=3,y=4;
case0x77:
num=12,x=4,y=1;
case0xb7:
num=13,x=4,y=2;
case0xd7:
num=14,x=4,y=3;
case0xe7:
num=15,x=4,y=4;
default:
/**************主函数****************/
voidmain()
unsignedcharm;
sys_init();
while
(1)
m=Keycan();
//键盘扫描
Keychange(m);
//键值转换
LED=~num;
//P1口通过led灯显示键值
/**************t0中断处理****************/
voidt0()interrupt1
TR0=0;
DUAN=0x00;
//消隐
LED3=1;
DUAN=~table[x];
//行显示在第3位
delay_s();
DUAN=0;
LED3=0;
LED4=1;
DUAN=~table[y];
//列显示在第4位
LED4=0;
附录C实物图