1、1目录1.总体方案选择 .21.1 实验要求: 21.2 方案设计 .22.硬件原理电路图的设计及分析 .22.1 主控模块 .22.1.1 STC89C52 单片机主要特性 32.1.2 STC89C52 单片机管脚图 42.1.3 STC89C52 单片机的中断系统 42.1.4 STC89C52 单片机的定时/计数器 42.2 矩阵键盘模块设计: .52.2.1 矩阵键盘原理介绍 52.2.2 矩阵键盘电路设计 52.3 LCD 液晶显示器简介 .62.3.1 液晶模块简介 62.3.2 液晶显示部分与 89S52 的接口 73 系统软件设计 93.1 系统软件流程图 .93.2 系统整
2、体原理图 .104.系统调试 .114.1 硬件调试 .114.2 软件调试 .114.3 调试结果 .125. 心得体会 .1321.总体方案选择1.1 实验要求:1) 通过小键盘实现数据的输入,并在 LED 数码管上显示2) 实现+、-、*、/ 3) 在 LED 数码管上显示结果4) 并有清零,退出功能1.2 方案设计本系统以 STC89C52 单片机为控制核心,对系统进行初始化,主要完成对键盘的响应、液晶显示灯功能的控制,起到总控和协调各模块之间工作的作用。单片机通过检测键盘读取使用者按下对用功能的按键,然后通过单片机内部运放把运算的结果显示在液晶屏幕上。键盘模块单片机主控模块液晶显示模
3、块图 1-1 系统结构框图本系统结构如图 1-1 所示,本设计可分为以下模块:单片机主控模块、键盘模块、功率放大模块、闹铃模块、按键设置模块。下面对各个模块的设计方案逐一进行论证分析。2.硬件原理电路图的设计及分析2.1 主控模块STC89C52 有 40 个引脚,4 个 8 位并行 I/O 口,1 个全双工异步串行口,同时内含 5 个中断源,2 个优先级,2 个 16 位定时/计数器。STC89C52 的存储器系统由 4K 的程序存储器(掩膜 ROM),和 128B 的数据存储器(RAM)组成。STC89C52 单片机的基本组成框图见图 2-1。3时钟电路R O M / E P R O M
4、/ F l a s h 4 K BR A M 1 2 8 BS F R 2 1 个定时个 / 计数器 2C P U总线控制中断系统5 个中断源2 个优先级串行口全双工 1 个4 个并行口X T A L 2 X T A L 1R S TE AA L EP S E NP 0 P 1 P 2P 3V s sV c c图 2-1 2.1.1 STC89C52 单片机主要特性1. 一个 8 位的微处理器(CPU)。2. 片内数据存储器 RAM(128B),用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据等,SST89 系列单片机最多提供 1K 的RAM。3. 片内程序存储器 ROM(4
5、KB),用以存放程序、一些原始数据和表格。4. 四个 8 位并行 IO 接口 P0P3,每个口既可以用作输入,也可以用作输出。5. 两个定时器计数器,每个定时器计数器都可以设置成计数方式,用以对外部事件进行计数,也可以设置成定时方式,并可以根据计数或定时的结果实现计算机控制。6. 五个中断源的中断控制系统。7. 一个全双工 UART(通用异步接收发送器)的串行 IO 口,用于实现单片机之间或单机与微机之间的串行通信。8. 片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接。最高允许振荡频率为 12MHz。42.1.2 STC89C52 单片机管脚图图 2-2 89S52 单片机管脚图1.
6、时钟电路引脚 XTAL1 和 XTAL2:2. 控制信号引脚 RST,ALE,PSEN 和 EA:3. 输入/输出端口 P0/P1/P2/P3:2.1.3 STC89C52 单片机的中断系统STC89C52 系列单片机的中断系统有 5 个中断源,2 个优先级,可以实现二级中断服务嵌套。由片内特殊功能寄存器中的中断允许寄存器 IE 控制 CPU 是否响应中断请求;由中断优先级寄存器 IP 安排各中断源的优先级;同一优先级内各中断同时提出中断请求时,由内部的查询逻辑确定其响应次序。2.1.4 STC89C52 单片机的定时/计数器在单片机应用系统中,常常会有定时控制需求,如定时输出、定时检测、定时
7、扫描等;也经常要对外部事件进行计数。89C52 单片机内集成有两个可编程的定时/计数器:T0 和 T1,它们既可以工作于定时模式,也可以工作于外部5事件计数模式,此外,T1 还可以作为串行口的波特率发生器。2.2 矩阵键盘模块设计:2.2.1 矩阵键盘原理介绍在键盘中按键数量较多时,为了减少 I/O 口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如 P1 口)就可以构成 4*4=16 个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成 20 键的键盘,而直接用端口
8、线则只能多出一键(9 键) 。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的 I/O 口作为输出端,而列线所接的 I/O 口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。2.2.2 矩阵键盘电路设计 S2W-PB3467810.图 2-3 矩阵键盘硬件连接图首先辨别键盘中有无键按下,有单片机 I/O 口向键盘送全扫描字,然后读入行线状态来判断。
9、方法是:向行线输出全扫描字 00H,把全部列线置为低电平,然后将列线的电平状态读入累加器 A 中。如果有按键按下,总会有一根行线电平被拉至低电平从而使行线不全为 1。6判断键盘中哪一个键被按下使通过将列线逐列置低电平后,检查行输入状态来实现的。方法是:依次给列线送低电平,然后查所有行线状态,如果全为1,则所按下的键不在此列;如果不全为 1,则所按下的键必在此列,而且是在与零电平行线相交的交点上的那个键。2.3 LCD 液晶显示器简介液晶是一种既具有液体的流动性又具有光学特性的有机化合物,它的透明程度和呈现的颜色受外加电场的影响,利用这特点便可做成字符显示器。液晶显示器(LCD)英文全称为 Li
10、quid Crystal Display,它一种是采用了液晶控制透光度技术来实现色彩的显示器。显示接口用来显示系统的状态,命令或采集的电压数据。本系统显示部分用的是 LCD 液晶模块,采用一个 161 的字符型液晶显示模块。 2.3.1 液晶模块简介LCD1602 液晶模块采用 HD44780 控制器,hd44780 具有简单而功能较强的指令集,可以实现字符移动,闪烁等功能,LM016L 与单片机 MCU 通讯可采用 8 位或 4 位并行传输两种方式,hd44780 控制器由两个 8 位寄存器,指令寄存器(IR)和数据寄存器(DR)忙标志(BF) ,显示数 RAM(DDRAM) ,字符发生器R
11、OMA(CGOROM )字符发生器 RAM(CGRAM) ,地址计数器 RAM(AC)。IR 用于寄存指令码,只能写入不能读出,DR 用于寄存数据,数据由内部操作自动写入DDRAM 和 CGRAM,或者暂存从 DDRAM 和 CGRAM 读出的数据,BF 为 1 时,液晶模块处于内部模式,不响应外部操作指令和接受数据,DDTAM 用来存储显示的字符,能存储 80 个字符码, CGROM 由 8 位字符码生成 5*7 点阵字符 160 中和 5*10点阵字符 32 种.8 位字符编码和字符的对应关系,可以查看参考文献(30)中的表 4.CGRAM 是为用户编写特殊字符留用的,它的容量仅 64 字
12、节,可以自定义 8 个 5*7 点阵字符或者 4 个 5*10 点阵字符,AC 可以存储 DDRAM 和 CGRAM 的地址,如果地址码随指令写入 IR,则 IR 自动把地址码装入 AC,同时选择 DDRAM或 CGRAM 但愿,LCD1602 液晶模块的引脚图如图 2-4 所示。7图 2-4 LCD1601 引脚图 寄存器选择控制如表 2-1。表 2-1 寄存器选择控制RS R/W 操作说明0 0 写入指令寄存器(清除屏等)0 1 读 busy flag(DB7),以及读取位址计数器(DB0DB6)值1 0 写入数据寄存器(显示各字型等)1 1 从数据寄存器读取数据2.3.2 液晶显示部分与
13、 89S52 的接口 如图 2-5 所示。用 89C51 的 P2 口作为数据线,用 P3.2、P3.1、P3.0 分别作为 LCD 的 E、R/W、RS。其中 E 是下降沿触发的片选信号,R/W 是读写信号,RS 是寄存器选择信号本模块设计要点如下:显示模块初始化:首先清屏,再设置接口数据位为 8 位,显示行数为 1 行,字型为 57 点阵,然后设置为整体显示,取消光标和字体闪烁,最后设置为正向增量方式且不移位。向 LCD 的显示缓冲区中送字符,程序中采用 2 个字符数组,一个显示字符,另一个显示电压数据,要显示的字符或数据被送到相应的数组中,完成后再统一显示.首先取一个要显示的字符或数据送
14、到 LCD 的显示缓冲区,程序延时 2.5ms,判断是否够显示的个数,不够则地址加一取下一个要显示的字符或数据。8P1.02345/MOSI67CKRET9XALVNUsYpFuW-B排Dlcd图 2-5 LCD1602 与 STC89C52 的接口93 系统软件设计3.1 系统软件流程图初始化液晶开始键盘扫描 存于 X 中按下数字 ?按下操作符 ?键盘扫描 存于 Y 中按下数字 ?按下 ” = ” ?计算并显示结束YNYNYNNY图 3-1 软件流程图103.2 系统整体原理图114.系统调试4.1 硬件调试计算器的电路系统较大,对于焊接方面更是不可轻视,庞大的电路系统中只要出于一处的错误,
15、则会对检测造成很大的不便,而且电路的交线较多,对于各种锋利的引脚要注意处理,否则会刺破带有包皮的导线,则会对电路造成短路现象。在本计算器的设计调试中遇到了很多的问题。回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:(1)程序调试初期液晶一直没有正常显示,总在第一行显示黑条。解决:经调查发现液晶对比度没有调好,旋转液晶调节对比度用的电位器直到液晶显示正常。(2)开始时程序一直不能往单片机下载。解决:检查复位电路,时钟电路,以及单片机的供电系统,后来发现晶振没有起振,最终把晶振的起振电容换了就能够下载程序。4.2 软件调试计算器是多功能的数字型设备,可以根据用户按下的按键记录要计算的数
16、值。并通过单片机内部运算计算出结果并在屏幕上显示。计算器的功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。在软件的调试过程中主要遇到的问题如下:1每次计算一次数值运算后,屏幕上会残留以前换算的结果,进行下一次运算的时候也没有消除。解决:经过分析初步确认是液晶在进行下一次运算的时候没有进行清屏,在上一次运算完成后,进行新一次运算的时候单片机对液晶进行处理使其进行清屏处理,最后解决了此问题。2当用户按下按键的时候,单片机读取的数值跟设定的数值不对。12解决:重新检查矩阵键盘电路的连接,重新建立一个新的
17、对应关系。4.3 调试结果经过一系列的问题查找后系统最终能正常工作,并完成所有的功能。以下为系统仿真图: P2.7P2.6P2.5P2.4P2.3 P2. P2.0P2.1D01D23D45D67P1.01.P1.2D01D23D45D67P2.02.1P2.2.3P2.42.5P2.62.7P1.01.P1.2234567891RP1RESPACK-8C110uR910K X1CRYSTALC23pF C33pF11 1D714613D51241D31029D1807E6RW5S4VS1D2VE3LCD1LM016LXTAL218XTAL119ALE3031PSN29RST9P0./AD03
18、90.1/138P0.2/AD2370.3/336P0.4/AD4350.5/534P0.6/AD630.7/732P1.011.2P1.231.34P1.451.56P1.671.78P3.0/RXD103.1/T1P3.2/IN0123./IT113P3.4/014P3.7/RD173.6/W163.5/T115P2.7/A1528P2.0/A8212.1/92P2./A10232.3/124P2.4/A12252.5/13262.6/1427U1AT89C517 8 9 +4 5 6 -1 2 3 *0 . = /图 4-1 系统仿真图135. 心得体会通过这次课程设计,我学到了不少课本
19、上没有的知识,也锻炼了自己的动手能力,将以前学过的零散的知识串到一起。经过我长时间的设计及调试,本系统基本能实现设定的要求。通过这些我的硬件和软件开发能力都获得了提高。首先硬件方面,基本了解了电子产品的开发流程和所要做的工作。基本掌握了 Protel99SE 原理图的方法,并设计了一个单片机最小系统。通过开发板的设计和硬件搭建的过程,使我对 51 系单片机的接口有了更深层次的理解,熟悉了一些单片机常用的外围电路引脚和连接方法,如 LED 数码管,键盘等。并且我学会了分析问题解决问题的能力,加深了对所学理论知识的理解和运用。我的动手能力得到了很大的提高,创新意识得到了锻炼。在整个设计过程中,虽然
20、忙碌劳累,但也充实快乐,老师每天都会不厌其烦的陪着我们在机房,有任何问题都会对我们倾囊相授,在这我想向陪伴我们三年的老师说声谢谢,你们辛苦了!14参考文献1 彭伟.单片机 C 语言程序设计实训 100 例.电子工业出版社.2009 年2 吴运昌模拟电子线路基础广州:华南理工大学出版社,2004 年3 阎石数字电子技术基础北京:高等教育出版社,1997 年4 张晓丽等数据结构与算法北京:机械工业出版社,2002 年5 马忠梅等 ARM /键盘扫描函数 bit FlagN = 0; /是否有数字按下 ,按下后置 1bit FlagO = 0; /是否有操作符按下,按下后置 1bit FlagD =
21、 0; /是否按下小数点,按下后置 1bit FlagNegX=0;bit FlagNegY=0;double X = 0.0,Y = 0.0,RES = 0.0; /X 为第一个操作数 Y 为第二个操作数 unsigned char OPER = 0; /操作符号 int Num16=0; /存放结果位/-void delay(unsigned int i)unsigned int x,y;for(x= 0;x 3) /RES=0) elseNumtemp+4 = i;if(temp = 0)Y = Y + (double)i/10;if(temp = 1)Y = Y + (double)i
22、/100;18if(temp = 2)Y = Y + (double)i/1000;if(temp = 3)Y = Y + (double)i/10000;if(temp = 4)Y = Y + (double)i/100000;temp+;LCDDispNum(location+,1,i);else if(i = 12 LCDDispChar(location+,1,();LCDDispChar(location+,1,-); if(i = 10) /显示小数点LCDDispChar(location+,1,.); if(!FlagNegY)Y=0-Y;LCDDispChar(location+,1,);if (i = 15)LCDDispChar(location+,1,=);LCDNotCursor();Calculate();connum(RES);while(1);