找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16314|回复: 1
收起左侧

单片机4*4键盘的电路设计以及源代码课程设计报告

[复制链接]
ID:219228 发表于 2017-7-12 20:59 | 显示全部楼层 |阅读模式

单片机及接口课程设计报告

          专    业: 电子信息工程

          班    级:    信息143

          姓    名:      杨荣庆

          学    号: 201427187   

          指导教师: 李恩玉、吴则举、王辛杰

          时    间: 2017-01-02~2017-01-13

         通信与电子工程学院


目录

  • 课程设计及任务要求
1.1设计任务…………………………………………………………………………2
1.2设计要求…………………………………………………………………………2
1.3设计目的…………………………………………………………………………2
  • 总体方案介绍
2.1键盘接口…………………………………………………………………………2
2.2显示接口…………………………………………………………………………3
  • 硬件设计
3.1总体设计框图…………………………………………………………………4
3.2部分硬件设计及其原理 …………………………………………………4
  • 软件设计
4.1程序流程图……………………………………………………………………6
4.2程序源代码……………………………………………………………………7
  • 调试
5.1仿真结果截图…………………………………………………………………11
5.2实物图……………………………………………………………………………12
5.3设计及调试过程………………………………………………………………12
  • 总结
6.1在设计中遇到的困难………………………………………………………13
6.2课程设计总结…………………………………………………………………13
6.3收获和体会 ……………………………………………………………………14




一 课程设计及任务要求

1.1 设计任务

键盘接口和显示设计,设计并实现一4×4键盘的接口,并在两个数码管上显示键盘所在的行与列。

1.2设计要求

① 掌握原理图的画法,在PROTEUS平台上用单片机完成所选题目的原理图设计;

② 在KEIL C平台上使用C语言编程实现编程,并调试通过;

③ 在PROTEUS平台上利用设计好的原理图和调试好的程序完成整个仿真;

④ 在单片机最小系统板上实现仿真后软硬件设计;

1.3设计目的

    为了进一步巩固学习的理论知识,增强对所学知识的实际应用能力和运用所学的知识解决实际问题的能力,进行本次课程设计。通过设计使我在巩固所学知识的基础之上具有初步的单片机系统设计与应用能力。

① 通过本设计,综合运用《单片机技术原理与应用》、《DSP原理与应用》《C语言程序设计》以及《数字电路》、《模拟电路》等课程的内容,为以后从事电子产品设计、软件编程、系统控制等工作奠定一定的基础。

② 学会使用KEIL C和PROTEUS等软件,用C语言或汇编语言编写一个较完整的实用程序,并仿真运行,保证设计的正确性。

③ 了解单片机接口应用开发的全过程:分析需求、设计原理图、选用元器件、布线、编程、调试、撰写报告等。

总体方案介绍

2.1键盘接口

    键盘可以分为独立式和矩阵式两类,每一类有可根据对键盘的译码方法分为编码键盘和非编码键盘两种类型。编码键盘是键盘按下直接获取按键的键号,当有按键按下时,能直接得到按下键的键号,这种键盘使用方便,但硬件电路复杂,常常不被微型计算机采用。在非编码键盘中,利用按键直接与单片机的I/O口线(或外部扩展的I/O口线)相连接,键盘按下时不能直接得到按键号,还要通过编写程序判断I/O口线的电平求得键号。因此,非编码键盘硬件电路极为简单。

对于4×4键盘,共有十六个按键。如果每个按键与单片机的一个引脚相连,就会占用16个引脚,这样会使的单片机的接口不够用(即使够用,也是对单片机端口的极大浪费)。因此我们应该行列式的接法。行列式非编码键盘是一种把所有按键排列成行列矩阵的键盘。在这种键盘中,每根行线和列线的交叉处都接有一个按键,每当某个按键被按下时,与这个按键相连的行线和列线就会接通,否则是断开状态。。因此4×4行列式非编码键盘只需4条行线和4条列线,总共占用8条I/O端口线。大大减少了I/O端口线的利用。

去除按键的抖动,当判别出可能有键按下时,软件延时一段时间(10ms左右)再判别键盘的状态,若仍有键闭合,则认为键盘上有确定的键按下,否则是键抖动。

矩阵式键盘的线反转法扫描,主要操作步骤为:(1)让行线编程为输入线,列线编程为输出线,并使输出线输出为全低电平,则行线中电平由高变低的所在行为按键的所在行;(2)再把行线编程为输出线,列线编程为输入线,并使输出线输出为全低电平,则列线中电平由高变低的所在行为按键的所在列。综合上述两步的结果,可确定按键所在的行和列,从而识别出所按的键。

2.2显示接口:

实现4×4键盘的接口需要用到单片机并编写相应的程序来识别键盘的十六个按键中哪个按键被按下。要求将被按下的按键显示出来,因此可以用两个数码管来分别显示被按下的按键的行与列。单片机控制LED数码管有两种显示方式:静态显示和动态扫描显示。静态显示方式就是指无论多少位LED数码管,都同时处于显示状态,多位LED数码管工作于静态显示方式时,各位的共阴极(或共阳极)连接在一起并接地(或接+5V),每位数码管的段码线分别与一个单片机控制的8位I/O口锁存器输出相连,如果送往各个LED数码管所显示的字符的段码一经确定,则相应的I/O口锁存器锁存的段码输出将维持不变,直至送入下一个显示字符的段码。因此,静态显示方式送往显示无闪烁,亮度较高,软件控制比较容易。动态显示用于显示位数较多时,将所有的LED数码管显示器的段码线的相应段并联在一起,由一个8位I/O端口控制,而各显示位的公共端分别由另一单独的I/O端口线控制。 每隔一段时间逐位的轮流点亮各数码管(扫描),由于数码管的余晖和人眼的“视觉暂留”作用,只要控制好每位数码管点亮显示的时间和间隔,则可造成“多位同时亮”的假象。发光二极管从导通到发光有一定的延时,如果点亮时间太短,发光太弱,人眼无法看清;时间太长,产生闪烁现象,而且此时间越长,占用单片机的时间也越多。另外,显示位数增多,也将占用单片机的大量时间,因此动态现实的实质是以执行程序的时间来换取I/O端口数目的减少。因此选用静态显示,并且选择共阴极数码管,直接接地,不需要上拉电阻,方便了电路的连接。


三 硬件设计
3.1总体设计框图

1.001.jpg

图3-1总电路图

3.2部分硬件设计及其原理

1.002.jpg

图3-2  4*4按键硬件图

每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键。


1.003.jpg

图3-3 数码管硬件图

两位数码管静态显示,并且采用共阴极数码管,直接接地,避免采用上拉电阻,与AT89C52的P2、P3口相连,按行列显示按键,静态显示,显示无闪烁,亮度较高,软件控制较容易。

1.004.jpg

图3-4 STC89C52芯片

(1)8位CPU

(2)数据存储器(256RAM)程序存储器(8KB Flash ROM)

(3)4个八位可编程并行I/O口(P0口、P1口、P2口、P3口)

(4)3个可编程的16位定时器/计数器(T0、T1、T2)

(5)1个全双工的通用异步收发串行口(UART)

(6) 中断系统具有6个中断源、6个中断向量

  • 特殊功能寄存器(SFR)32个

(8)1个看门狗定时器(WDT)


四 软件设计

4.1程序流程图

(在51hei附件里面)


  图4-1 总程序流程图

1.043.jpg

                 图4-3  键盘扫描流程图

4.2程序源代码

五 调试

5.1仿真结果截图

1.044.jpg

图5-1 初始状态数码管显示为“00”

1.045.jpg

图5-2 第三行第四列按键按下,显示为“34”

5.2实物图
1.046.jpg

图5-3 第三行第二列按键按下,显示为“32”

1.047.jpg

图5-4 第四行第三列按键按下,显示为“43”

5.3设计及调试过程
  • 首先在keil软件中编写设计的程序,并通过编译调试使程序能够完全展现实验要求,不断修改直至没有错误,编译通过以后生成往单片机里下载的hex文件。
  • 打开proteus软件,设计硬件电路,根据自己设计的电路原理图选择元器件,并按照电路原理图布局和连线。
  • 电路连接好以后,并且检查没有任何错误,点击STC89C52芯片,在“Program File”中选择生成的hex文件,点击OK,退出以后,点击运行按钮,调试电路是否能够正常工作,并且检查按键是否对应数码管上的数字。
六 总结
6.1设计中遇到的困难
  • 在编写程序的时候,考虑用汇编语言还是C语言编写,最后选择了C语言,在之前的各种实验及设计中都是用的C语言进行编程,对C语言的理解比较深刻,汇编语言是单片机的主要设计语言,但由于刚刚接触到这一语言,对各种指令、寻址方式的理解不太深刻,用错各种指令,相对比而言,C语言更加得心应手。

在用C语言进行编程的时候,也遇见了许多的问题,各种函数的调用,实体名、变量名的定义,通过对C语言课本的查阅,在老师的帮助下都解决了。

  • 另外一个最大的难点就是在proteus中对原理图的绘制,由于是第一次使用这个软件,之前都是用的Multisim进行仿真,这次进行的是基于单片机的设计,所以在进行软件仿真的时候有很大的困难,本次设计的大部分时间都用在了系统的仿真上,器件的选取、参数值的改动,还有最后下载完hex文件后的各种错误的修改。这些问题都对设计造成了很大的影响,通过对《单片机原理及应用》附带光盘的观看,对proteus软件的介绍及实际操作,使我对这个软件有了一定的了解,通过上网查阅资料,了解了各种元器件的名称及在软件中的位置,通过不懈的努力,终于完成了设计的系统仿真。

6.2课程设计总结

通过本次课程设计,我运用所学知识,完成了整个课程设计的内容,从电路原理图的设计到硬件电路图的连接,再到程序的编写、电路原理图的仿真,最后通过焊接完成了实物的设计,在这次课程设计中,运用了许多课程的内容,通过查阅资料,以及与同学的探讨,最终完成了4×4键盘的设计及按键的显示。  

通过本次单片机与接口课程设计,我学会了使用proteus软件和keil软件,基本上完成了所设计的课题,设计出了4×4键盘的接口,并且在两个数码管上能够显示键盘所在的行值与列值。通过本次课设,首先,使我能够综合运用《单片机技术原理与应用》、《DSP原理与应用》《C语言程序设计》以及《数字电路》、《模拟电路》等课程中学到的知识做一些电路的仿真,其次,使我对C语言有了更好的掌握和运用,用其进行软件编程更加得心应手。初步掌握了keil 和proteus等软件,可以用C语言编写一个完整的程序,并且能够在proteus中完成电路图的设计,且能够使程序与电路图吻合,达到设计的目的,实现设计的要求,本次课设使我了解单片机接口应用开发的全过程:分析需求、设计原理图、选用元器件、布线、编程、调试、撰写报告等。

6.3收获和体会

这次课设,使我认识到:无论是设计硬件电路还是编写相应的软件程序,我们应该极其认真的进行设计,在这个过程中哪怕是出现一个小小的错误,都会导致不能仿真出正确的结果甚至根本不会出结果。本专业要求我们应该有基本的专业知识和较强的动手操作能力。因此能够熟练使用proteus和keil等软件对于我们未来的就业非常重要。本次课设仅仅使我们对proteus和keil等软件有了一个简单的了解,我们应该利用业余时间了解一些对我们专业有用的软件,做到能够掌握并熟练使用。课余时间多多做一些电路的仿真,这对我们将来找工作有很大的方便。

通过这次课程设计我发现了自己有很大的不足,书本上的知识固然重要,但是真正应用到实际当中才是最主要的。现在学习专业知识,只是为运用到实际中打下坚实的基础,我们应该多锻炼自己的动手能力,多练习自己的焊接技术、排版能力、接线技巧等,这对以后的工作将会是一个巨大的帮助,通过本次课程设计,对我各方面都具有一定的影响,在以后的学习生活中,我会更加努力的去学习各种关于专业的知识,充实自己,使自己有充分的的提高。

参考文献

[1] 张毅刚. 单片机原理及应用 [M]. 北京:高等教育出版社,2016

[2] 陈峰. DSP原理与系统设计 [M]. 北京:电子工业出版社,2010

[3] 张敏霞. C语言程序设计教程 [M]. 北京:电子工业出版社,2013

[4] 闫石. 数字电子技术基础 [M]. 北京: 高等教育出版社,1998

[5] 童诗白. 模拟电子技术基础 [M]. 北京: 高等教育出版社,2015                                                                                                                                      

教师评语:

单片机源程序如下:
  1. #include
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar num,temp;
  5. uchar keyscan();
  6. void delay(uint z);
  7. void display(uchar aa);
  8. uchar code table[]={0x3f,0x06,0x5b,0x4f,
  9.                     0x66,0x6d,0x7d,0x07,
  10.                     0x7f,0x6f};
  11. //****************主函数*****************//
  12. void main()
  13. {
  14. while(1)
  15. {
  16. keyscan();
  17. display(num);
  18. }
  19. }
  20. //***************延时函数***************//
  21. void delay(uint z)
  22. {
  23. uint x,y;
  24. for(x=z;x>0;x--)
  25. for(y=100;y>0;y--);
  26. }
  27. //***************键盘扫描***************//
  28. uchar keyscan()
  29. {
  30. P1=0xfe;
  31. temp=P1;
  32. temp=temp&0xf0;
  33. while(temp!=0xf0)
  34. {
  35. delay(2);
  36. temp=P1;
  37. temp=temp&0xf0;
  38. while(temp!=0xf0)
  39. {
  40. temp=P1;
  41. switch(temp)
  42. {
  43. case 0xee:num=11;
  44. break;
  45. case 0xde:num=12;
  46. break;
  47. case 0xbe:num=13;
  48. break;
  49. case 0x7e:num=14;
  50. break;
  51. }
  52. while(temp!=0xf0)
  53. {
  54. temp=P1;
  55. temp=temp&0xf0;
  56. }
  57. }
  58. }
  59. P1=0xfd;
  60. temp=P1;
  61. temp=temp&0xf0;
  62. while(temp!=0xf0)
  63. {
  64. delay(2);
  65. temp=P1;
  66. temp=temp&0xf0;
  67. while(temp!=0xf0)
  68. {
  69. temp=P1;
  70. switch(temp)
  71. {
  72. case 0xed:num=21;
  73. break;
  74. case 0xdd:num=22;
  75. break;
  76. case 0xbd:num=23;
  77. break;
  78. case 0x7d:num=24;
  79. break;
  80. }
  81. while(temp!=0xf0)
  82. {
  83. temp=P1;
  84. temp=temp&0xf0;
  85. }
  86. }
  87. }
  88. P1=0xfb;
  89. temp=P1;
  90. temp=temp&0xf0;
  91. while(temp!=0xf0)
  92. {
  93. delay(2);
  94. temp=P1;
  95. temp=temp&0xf0;
  96. while(temp!=0xf0)
  97. {
  98. temp=P1;
  99. switch(temp)
  100. {
  101. case 0xeb:num=31;
  102. break;
  103. case 0xdb:num=32;
  104. break;
  105. case 0xbb:num=33;
  106. break;
  107. case 0x7b:num=34;
  108. break;
  109. }
  110. while(temp!=0xf0)
  111. {
  112. temp=P1;
  113. temp=temp&0xf0;
  114. }
  115. }
  116. }
  117. P1=0xf7;
  118. temp=P1;
  119. temp=temp&0xf0;
  120. while(temp!=0xf0)
  121. {
  122. delay(2);
  123. temp=P1;
  124. temp=temp&0xf0;
  125. while(temp!=0xf0)
  126. {
  127. temp=P1;
  128. switch(temp)
  129. {
  130. case 0xe7:num=41;
  131. break;
  132. case 0xd7:num=42;
  133. break;
  134. case 0xb7:num=43;
  135. break;
  136. case 0x77:num=44;
  137. break;
  138. }
  139. ……………………

  140. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


完整论文下载(word格式 可编辑):
杨荣庆.docx (686.28 KB, 下载次数: 35)
回复

使用道具 举报

ID:219299 发表于 2017-7-13 09:43 | 显示全部楼层
编程有误
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表