4x4键盘实验报告.docx
《4x4键盘实验报告.docx》由会员分享,可在线阅读,更多相关《4x4键盘实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
4x4键盘实验报告
单片机及DSP课程设计报告
专业:
班级:
姓名:
学号:
指导教师:
时间:
一、设计目的
为了进一步巩固学习的理论知识,增强学生对所学知识的实际应用能力和运用所学的知识解决实际问题的能力,开始为期两周的课程设计。
通过设计使学生在巩固所学知识的基础之上具有初步的单片机系统设计与应用能力。
1、通过本设计,使学生综合运用《单片机技术原理与应用》、《DSP原理与应用》《C语言程序设计》以及《数字电路》、《模拟电路》等课程的内容,为以后从事电子产品设计、软件编程、系统控制等工作奠定一定的基础。
2、学会使用KEILC和PROTEUS等软件,用C语言或汇编语言编写一个较完整的实用程序,并仿真运行,保证设计的正确性。
3、了解单片机接口应用开发的全过程:
分析需求、设计原理图、选用元器件、布线、编程、调试、撰写报告等。
二、硬件电路方案设计
1、4X4键盘设计
4x4键盘工作原理:
每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:
确定有无键按下,判断哪一个键按下,键的功能是什么?
还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
2、数码管显示电路设计
数码管显示原理:
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。
这样一来,就没有必要每一位数码管配一个锁存器,从而大大地简化了硬件电路。
选亮数码管采用动态扫描显示。
所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
3、晶振和复位电路设计
4、系统总电路图
三、程序设计
1、程序流程图
(1)键盘扫描
第一行扫描第二行扫描第三行扫描第四行扫描
仿真过程:
1、在keil中运行程序,并生成hex文件保存。
2、proteus元件库中选择系统中所需的各元件,按设计的电路原理图进行连接。
3、连接好电路后鼠标双击AT89C52芯片,在“File”菜单中打开生成hex文件,下载完成后,点击运行按钮。
注意:
1、在原理图的绘制过程中对数码管的选择要注意考虑所写程序,无法点亮时应考虑共阳极数码管或共阴极数码管的选择。
2、P0口接数码管时应接上拉电阻,否则无法点亮
参考文献
1、单片接口技术李航电子科学出版社;
2、模拟电子技术基础童诗白华成英高等教育出版社;
3、数字电子技术基础阎石高等教育出版社;
4、51单片机设计与仿真原理程候渊北方工业出版社;
5、课程设计总结
心得体会:
由于我没有过硬的技术,所以选择了《键盘接口和显示设计》这个相对于其他比较简单题目,望老师见谅。
做完了本次课程设计,我收获颇多,无论是学习上还是其他方面,都有所感悟。
在学习上:
我对单片机有关知识有了更深刻的了解,学到了许多以前书本上没有的知识开阔了眼界和见识,“通信深似海”,只是单片机一门就让我深有体会。
,并把理论运用到实践中去,体会到了实践的重要性。
这次课程设计又为我们提供了一次自己动手操作实践的机会。
在上次的8路呼叫器的知识基础上,我这次完成的很顺利,对以往未完全掌握的知识进行了补充,对以往掌握的知识加深了了解。
这次课程设计起到着承上启下的作用,加深了过去的知识,打好了未来的实践基础每位同学对这次课程设计都付出了自己辛劳的汗水,这也使得他们的个人编程能力、电路设计能力、仿真调试能力都得到了一定程度的提高。
替他方面:
做事一定要认真,在仿真时候由于一个什么什么选错了,导致仿真不能实现,检查了很多次才发现,实属不该;在编程时,也是由于一个不该犯的低级错误,导致了整个程序不能完美运行,这些都是不细心犯下的错误,以后一定要认真去做好每一件事,不让不该犯的错误导致满盘皆输。
此外,这次课程设计让我对对Keil和Proteus两款软件有了更进一步认识,了解了单片机的电路图的绘制、仿真方法,为以后的学习工,作打下了基础。
这次实习也暴露了我很多弱项,比如数电、模电学得不好,很多东西都是靠请教同学才懂。
总之这次课程设计使我对通信专业有了更深一步的认识,极大地增加了我对该专业的兴趣,相信我以后在通信这条道路上会走的更好!
主程序:
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharnum,temp;
ucharkeyscan();
voiddelay(uintz);
voiddisplay(ucharaa);
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
//****************主函数*****************//
voidmain()
{
while
(1)
{
keyscan();
display(num);
}
}
//***************延时函数***************//
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
//***************键盘扫描**************//
ucharkeyscan()
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay
(2);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xee:
num=11;
break;
case0xde:
num=12;
break;
case0xbe:
num=13;
break;
case0x7e:
num=14;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay
(2);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xed:
num=21;
break;
case0xdd:
num=22;
break;
case0xbd:
num=23;
break;
case0x7d:
num=24;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay
(2);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xeb:
num=31;
break;
case0xdb:
num=32;
break;
case0xbb:
num=33;
break;
case0x7b:
num=34;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay
(2);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xe7:
num=41;
break;
case0xd7:
num=42;
break;
case0xb7:
num=43;
break;
case0x77:
num=44;
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
returnnum;
}
//**************************显示函数**********************//
voiddisplay(ucharaa)
{uintnum1,num2;
num1=aa/10;
num2=aa%10;
P2=0xfe;
P0=table[num1];
delay(5);
P2=0xfd;
P0=table[num2];
delay(5);
P0=0;
}
教师评语:
教师:
日期:
设计过程30﹪
课设报告40﹪
答辩30﹪
总成绩