单片机原理及应用课程设计课程设计报告简易计算器.doc

上传人:laozhun 文档编号:2385853 上传时间:2023-02-17 格式:DOC 页数:28 大小:249KB
返回 下载 相关 举报
单片机原理及应用课程设计课程设计报告简易计算器.doc_第1页
第1页 / 共28页
单片机原理及应用课程设计课程设计报告简易计算器.doc_第2页
第2页 / 共28页
单片机原理及应用课程设计课程设计报告简易计算器.doc_第3页
第3页 / 共28页
单片机原理及应用课程设计课程设计报告简易计算器.doc_第4页
第4页 / 共28页
单片机原理及应用课程设计课程设计报告简易计算器.doc_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《单片机原理及应用课程设计课程设计报告简易计算器.doc》由会员分享,可在线阅读,更多相关《单片机原理及应用课程设计课程设计报告简易计算器.doc(28页珍藏版)》请在三一办公上搜索。

1、湖南人文科技学院课程设计报告 课程名称:单片机原理及应用课程设计 设计题目: 简易计算器 系 别: 通信与控制工程系 专 业: 电子信息工程 班 级: 09级一班 学生姓名: 学 号: 起止日期: 2011年12月19日 2011年12月31日 指导教师: 教研室主任: 指导教师评语: 指导教师签名: 年 月 日成绩评定项 目权重成绩刘伟斌齐敏1、设计过程中出勤、学习态度等方面0.22、课程设计质量与答辩0.53、设计报告书写及图纸规范程度0.3总 成 绩 教研室审核意见:教研室主任签字: 年 月 日教学系审核意见: 主任签字: 年 月 日摘 要单片机的出现是计算机制造技术高速发展的产物,它是

2、嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。本次设计是设计一个简易计算器,能够进行多位简单的加减乘除运算,同时它能支持6位整数运算。它主要由STC89C52单片机、A8255、数码管,键盘等模块组成。本计算器是将键盘输入信息经处理通过缓存,送入数码管显示,键盘采用行列式,数码管采用动态扫描方式,计算功能通过软件实现,用C语言对单片机可编程芯片进行编程,实现对计算器的设计。关键词:单片机;计算器;C语言;键盘;数码管目 录设计要求11、方案论证与对比11.1方案一11.2 方案二21.3 两种方案的对比22、硬件电路设计32.1主控电路设计32

3、.2键盘电路设计62.3显示电路设计73、系统工作流程及流程图94、系统功能测试与整体指标124.1 软件调试步骤124.2 程序调试步骤124.3 测试结果125、详细元件清单136、总结与思考及致谢147、参考文献15附录一 主程序16附录二 键盘程序17附录三 计算程序18附录四 显示程序21简易计算器设计要求 4X4键盘输入,数码管显示。 完成整数的加减乘除,加法和减法要求可以实现连加、连减。 可进行错误判断,溢出、除零等错误将显示一个字符 E 。 由于键盘只有16个按键,安排如下: +-+ | 7 | 8 | 9 | + | | 4 | 5 | 6 | - | | 1 | 2 | 3

4、 | *| | AC | 0| = | /| +-+1、方案论证与对比 按照设计要求,本次设计的简易计算器要能够实现6位的整数运算,因此,这时,我们在这一点的设计上提出了以下两种不同的方案。1.1方案一 此方案首先通过键盘得到数据,通过A8255记录数据,并通过程序对数据进行处理,最后通过数码管显示出来。结构框图如图1:STC89C52A8255数码管显示键盘 图1 方案一方框图1.2 方案二此方案先通过键盘得到数据,通过STC89C52记录数据,并通过程序对数据进行处理,最后通过数码管显示出来。结构框图如图2:STC89C52数码管显示键盘 图2 方案二方框图 1.3 两种方案的对比相同点:

5、两方案的基本的设计思想相同,都是由键盘等到数据,最后数码管显示出来。不同点:方案一是通过扩展芯片A8255对数据进行处理,而方案二则直接由STC89C52对数据进行处理。两者相比,方案一采用的芯片内存大,利于运算处理,所以采用方案一。2、硬件电路设计2.1主控电路设计 STC89C52是一个低功耗,高性能CMOS 8位单片机,片内含4k BytesISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用STC公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构。STC89C52具有如下特点:40个引脚(引脚

6、图如图3所示),4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。 此外,STC89C52RC设计和配置了振荡频率可为0Hz可通过软件设置省电模式。空闲模式下,CPU暂停工作,脌RAM时计異器,串行口,外中断系统可绷续工作,掉电模式决结振荡器而保存RAM的数据,停止芯片其它功能盤至外中断激活戶硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不尌产品的需求。 STC8;

7、C52芯片引脚图如图(1)所示。图3 STC89C52芯片引脚图 VCC(40):5V。GND(r0:接地。P0口(3932):P0口为8位漏极开路双向I/O口,每引脚可吸收8个TTL门电流。 P口(18):P1口是从厅部提供上拉电阻器的8位双向I/O口,P1口缓冲能接收和输出个TTL门电流。 P2口(2128):P2口为内部上拁电阻器的8位双向I/O口,P2口缓冲器可採收和输出$个TTL门电流。 P3口(1017):P3口是8个带内部上拉电阻癨的双向I/O口,可接收和输出4个TTL门电流,P3口也可作为AT8951的特殊功能口。 RST(9):复位输入。当振荡器复位时要保持RST录脚2个机器

8、周期的高电平时间。 ALE/PR_G(30):当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节,在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6,它可用作对外部输出的脉冲或用于定时目的,要注意的是,每当访问外部数据存储器时,将跳过1个ALE脉冲。 PSEN(29):外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期2次PSEN有效,但在访问外部数据存储器时,这2次有效的PSEN信号将不出现。 EA/VPP(31):当EA保持低电平时,外部程序存储器地址为(0000HFFFFH)不管是否有内部

9、程序存储器。FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 XTAL1(19):反向振荡器放大器的输入及内部时钟工作电路的输入。 XTAL2(18):来自反向振荡器的输出。 单片机系统里常用的8255芯片是一个典型的可编程通用并行接口芯片,用来扩展单片机的端口,它具有3个8位的并行口,有三种工作方式,可作为单片机与各种外部设备连接的接口电路。芯片8255引脚图如图(3)所示。RESET:复位输入线,当该输入端外于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。 PA0PA7:端口A输入输出线,一个8位的数据输出锁存器/缓冲器, 一个8位的数据输

10、入锁存器。 PB0PB7:端口B输入输出线,一个8位的I/O锁存器,一个8位的输入输出缓冲器。 PC0PC7:端口C输入输出线,一个8位的数据输出锁存器/缓冲器, 一个8位的数据输入缓冲器。端口C可以通过工作方式设定而分成2个4位的端口, 每个4位的端口包含一个4位的锁存器,分别与端口A和端口B配合使用,可作为控制信号输出或状态信号输入端口。 CS:片选信号线,当这个输入引脚为低电平时,表示芯片被选中,允许8255与CPU进行通讯。 RD:读信号线,当这个输入引脚为低电平时,允许8255通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。 WR:写入信号,当这个输入引脚为

11、低电平时,允许CPU将数据或控制字写8255。 D0D7:三态双向数据总线,8255与CPU数据传送的通道,当CPU 执行输入输出指令时,通过它实现8位数据的读/写操作,控制字和状态信息也通过数据总线传送。图4 8255芯片引脚图2.2键盘电路设计键盘输入采用4*4的矩阵键盘。4*4键盘分别与PC0PC7相连。PC0PC3作为输入口(回送线),PC4PC7作为输出口(扫描线)。16个按键分别用于控制数字“09”以及数学运算符号“+、-、*、/”。 键盘模块电路如图(3)所示。图5 键盘设置图 当进行扫描时,扫描信号由列引脚输入键盘。以1000、0100、0010 和0001 的顺序每次。扫描不

12、同的列,然后读取列引脚的信号就可以判断是哪个键被按下。识别键盘上哪个键被压下的过程的扫描步骤:1.检测是否所有键都都松开了,若没有则反复检测。2.但所有键都松开了,再检测是否有键压下,若无键一下则反复检测。3.如有键压下,要消除键抖动,确认有键压下。4.对压下的键进行编码,将该键的行列信号转换成16 进制码,由此确定哪个键被压下了。如出现多键重按的情况,只有在其它键均释放后,仅剩一个键闭合时,才把此键当作本次压下的键。5.该键释放后,再回到2。2.3显示电路设计LED显示器由七段发光二极管组成,排列成8字形状,因此也成为七段LED显示器,器排列形状如图(4)所示:图6 LED数码管 为了显示数

13、字或符号,要为LED显示器提供代码,即字形代码。七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。简易计算器用到的数字09的共阳极字形代码如表(一)所示:图7 LED数码管显示原理图表一09七段数码管共阳级字形代码显示字型GCdpDEBFA段码010100000a0h110111011bbh20110001062h3001010102ah40011100139h5001011002ch60010010024h710111010bah80010000020h90010100028hE0110010064h3、系统工作流程及流程图系统在开机上电后,系统处于等待状

14、态,没有任何动作。等待输入数字以及运算符号,一旦有相应的按键按下,系统就会执行相应的动作。LED数码管上就会显示对应的数字,符号以及运算结果等。为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个键都对应一个码键码。为了得到被按键的键码,现使用行扫描法识别按键。其程序框图如图8:开始初试和地址参数按照行列计算键值列表扫描信号移位查表得键值输入列表扫描信号读入行信号返回返回等待按键释放该列有键输入4列扫描完?图8 读键输入程序框图开始初始化显示参数读取显示数据输出段码数据输出位选通信号延时位选通信号移位指向下一个显示数据完成返回否是图9 数码管显示程序框图 简易计算器所显示

15、的数值最大位6位。要显示数值,先判断数值是否为6位整数,如果是超过6位,则数码管全显示“E”。程序框图如图9:开始显示6个E正常显示返回数值是否超过6位否是图10 数值送显示缓冲程序框图系统工作总流程图如图(6)所示:图11 系统工作总流程图4、系统功能测试与整体指标4.1 软件调试步骤 1)打开软件后,在Project菜单中选择New Project命令,打开一个新项目。保存此项目,输入工程文件名后,并保存工程文件的目录。2)为项目文件选择一个目标器件,即选择8051的类型。在Data base 列表框中选择“ATML 89C52”,确定。3)上述设置好后,创建源程序文件并输入程序代码。输入

16、好代码后点击“文件/保存”。4)把源文件添加到项目中,用鼠标指在目标工作区的目标1,点击右键在弹出的菜单中选择添加文件到源代码组,在弹出的添加文件框中,选择需要添加到项目中的文件。5)开始编译,对项目文件进行编译。若没有错误后进行硬件调试。4.2 程序调试步骤程序调试应一个模块一个模块地进行,首先单独调试各功能子程序,检查程序是否能够实现预期的功能,接口电路的控制是否正常等;最后逐步将各子程序连接起来进行总调试。故调试步骤如下: 1)矩阵4*4键盘的调试键盘程序是整个程序的基础,我们必须保证其正确。调试方法:先把程序下载到单片机,让数码管显示,在有键按下时显示的是否为设定的值。2)数码管程序调

17、试 正确的显示数值是整个程序的关键。调试方法:先把程序下载到单片机,让数码管显示,是否正确的显示数值。4.3 测试结果实例测试:将写入程序的单片机插入实验板插座内,程序正确的有09数值的显示和正常的四则运算以及判断错误、溢出、除0。5、详细元件清单表格 2 元件清单仪器名称数量芯片82551个STC89C521个LED数码管6个按键16个电源适配线1根串口线1根蜂鸣器1个10电阻1个1000电阻4个电容0.1uF2个6、总结与思考及致谢 电子设计正在当今社会发挥越来越重要的作用,其采用的软硬件结合技术也逐渐成熟,该模拟系统正是采用软硬相结合的方法实现的。STC89C52是一种低功耗、高性能CM

18、OS 8位微控制器,具有8K在系统可编程FLASH存储器,可以为众多嵌入式控制应用系统提供灵活、超有效的解决方案。在键盘设计方面,主要是软件的设计,通过程序编码来完成硬件方面所无法工作的部分,例如关于在扫描键盘时,需要逐行拉低并进行判断、编码。判断时,需要不断的屏蔽字节,来获取所需要的数据,而这一点硬件是无法做到的。此次课程设计是做简易计算器,这个需要对51芯片有足够的理解,能够充分认识每个引脚的详细功能,对于C语言也必须掌握的比较好。正是由于此次设计让我们明白了单片机在实践中的运用。我们的题目是基于单片机设计简易计算器,对于我们这些实践中的新手来说,这是一次考验。这次课程设计我们学到很多很多

19、的东西,学会了怎么在遇到问题时去解决问题。不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简单的编程。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从而提高自己的实际动手能力和独立思考的能力。同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。在此次课程设计中,首先我要感谢谭周文老师和田汉平老师在课程设计上给予我的指导、提供给我的支持和帮助,这是我能顺利完成这次报告的主要原因,更重要的是老师帮我解决了许多技术上的难题,让我能把

20、系统做得更加完善。在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。其次,我要感谢帮助过我的同学,他们也为我解决了不少我不太明白的设计商的难题。同时也感谢学院为我提供良好的做毕业设计的环境。最后再一次感谢所有在设计中曾经帮助过我的良师益友和同学!7、参考文献1 朱定华,戴汝平.单片微机原理与应用M. 北京:清华大学出版社,2003.2 彭介华主编. 电子技术课程设计指导M. 北京:高等教育出版社,1997.3 陈涛 编著. 单片机应用及C51程序设计M. 北京:机械工业出版社,2008.4 张义 陈敌北编著,刘丹等改编.例说8051M.北京:人民邮电出版社,2006.

21、5 候振鹏嵌入式C语言程序设计M北京:人民邮电出版社,20066 戴佳 刘博文编著.51单片机C语言应用程序设计实例精讲M.北京:电子工业出版社,2008.附录一 主程序#include/包函reg52.h头文件,里面有89c52单片机内外部寄存器的所以地址,与位地址(此头文件为keil软件自带的,下面的头文件为自己写的)#includedisplay.h/包函“display“头文件,里面有display函数用于显示输入值与计算结果值;#includekey.h/包函key.h头文件,里面有scankeyboard()函数(用于扫描键值)和checkkeycode()函数(用于定义按键的逻辑

22、功能);#include8255.h/包函8255.h头文件,里面定义有8255的端口地址;#includecalculate.h/包函calculate.h头文件,里面有calculate()函数(用于计算);/*/程序分五部分 / 1:8255初始化/2: 扫描键盘/3: 检测按键的逻辑功能/4: 计算/5: 显示输入与结果/*void main()/主函数。COM8255=0x80;/8255初始化(需添加8255.h头文件)while(1)/死循环scankeyboard();/扫描键盘。(需包函key.h头文件)checkkeycode();/检测按键的逻辑功能。(需包函key.h头

23、文件)calculate();/计算。(需包函calculate.h头文件)display();/显示。(需包函“display“头文件) /函数具体内容见各模块。 (其中scankeyboard();与checkkeycode();函数在key.c中.calculate();函数在calculate.c中.display();函数在display.c中。)附录二 键盘程序/*8/scankeyboard()函数(用于扫描键值)/checkkeycode()函数(用于定义按键的逻辑功能)/*#include#includekey.h#include8255.h#includering.h#in

24、cludedelay.huchar keycode;uchar keynum;uchar scanok,checkok;void scankeyboard()/scankeyboard()函数(用于扫描键值)/反转法测键值。 uchar a,b;PC8255=0x0f;keycode=PC8255;if(keycode!=0x0f)delay_50us(200);/按键闭合消抖。ring();/按键声音。a=keycode;PC8255=0xf0;b=PC8255;keycode=a|b;while(PC8255!=0xf0);delay_50us(200);/按键释放消抖。 P1=keyco

25、de;scanok=1;/键值测完后。scanok置1。void checkkeycode()/checkkeycode()函数(用于定义按键的逻辑功能) if(scanok)/如果键值测完后,则执行以下。 scanok=0;/scanok清零。为下次使用准备switch(keycode)/用开关语句查找键值对应的逻辑功能.case 0xee: keynum=0 ;break;case 0xed: keynum=1 ;break;case 0xdd: keynum=2 ;break;case 0xbd: keynum=3 ;break;case 0xeb: keynum=4 ;break;ca

26、se 0xdb: keynum=5 ;break;case 0xbb: keynum=6 ;break;case 0xe7: keynum=7 ;break;case 0xd7: keynum=8 ;break;case 0xb7: keynum=9 ;break;case 0x77: keynum=10 ;break;/ +case 0x7b: keynum=11 ;break;/ -case 0x7d: keynum=12 ;break;/ *case 0x7e: keynum=13 ;break;/ /case 0xbe: keynum=14 ;break;/ =case 0xde: k

27、eynum=15 ;break;/ .default : ;checkok=1;/查完后,checkok置1.附录三 计算程序/*/calculate()函数(用于计算)/*#include calculate.h#include key.hfloat dat,datA;/定义变量。用于保存计算变量。uchar addflag,subflag,mulflag,divflag,clrflag;/定义加,减,乘,除,等于。标志。uchar overflow;/定义溢出标志。uchar illegal;/定义非法标志(除零时非法)void add();/加法计算函数。void sub();/减法计算

28、函数。void mul();/乘法计算函数。void div();/除法计算函数。void equ();/等于函数。void datpros();/数据处理函数。void calculate()/计算大函数。if(checkok)/如果检测键值完万。则执行以下。checkok=0;/检测完标志清零.switch (keynum)/如果是+,-,*,/,=则进入相应的函数。case 10 : add(); break;/如果是按了“+”,则进入加法函数。case 11: sub(); break;/同上case 12 : mul(); break;case 13 : div(); break;c

29、ase 14: equ(); break;default : datpros();/如果不是,计算符(即为数字),则进入数据处理函数。void datpros()/数据处理函数。 if(clrflag)/清除标志为1,则执行以下。 /说明:比如。当按下加号后,我们需要将第一个加数清掉不显示而显示第二个加数。 /显示的只是加数或是被加数或是结果。所以输出第二个时,第一个加数应不显示。要清掉。 dat=0; clrflag=0;/为下次使用准备。 dat=dat*10+keynum;/将每次按的数字合成一个整体。比如按下1,2,3后就会把它合成“123” if(dat65535) overflow

30、=1;/如果输入值大于65535(所用的为int型数据,最大为65535)的话则溢出标志置1,可供显示程序查询并显示EEEEEEE if(divflag&!dat) illegal=1;/如果做除法时除了零,则非法标志置1,供显示程序查询并显示EEEEEEEvoid add()/加法。 addflag+;/加法标志置1。 subflag=mulflag=divflag=0;/将其它运算标志清零。(一次只能作一种运算) clrflag=1;/清零标标置1,(当按下加号后,再按第二个加数时,这时应该显示第二加数。所以要清掉第一个加数。) if(addflag1)/此处用于边加。 /当连续加的时候。

31、加号应有等于的功能。 dat=dat+datA;/算出和 datA=dat;/和保存,用于下一次连加。 /说明:比如进行“1+2+3”时,当按第二个加时,应该要显示1+2的和。 else datA=dat;/如果不是连加,将输入的第一个加数暂存。(因为显示程序只显示dat变量的值。) void sub()/减法同上。 subflag+; addflag=mulflag=divflag=0; clrflag=1; if(subflag1)/连减。 dat=datA-dat; datA=dat; else datA=dat;void mul()/乘法同上。只是少了连乘。要求没说连乘。此处就不作连乘

32、。要改成连乘像连加连减那像稍加修改就行了。 mulflag+; addflag=subflag=divflag=0; clrflag=1; datA=dat;void div()/除法。同乘法。 divflag+; addflag=subflag=mulflag=0; clrflag=1; datA=dat;void equ()/等于。 if(addflag)/如果些时做加法运算。 dat=dat+datA;/计算各存入dat(显示程序会将dat显示的。) if(subflag)/同上 dat=datA-dat; if(mulflag)/同上 dat=datA*dat; if(divflag)

33、/同上。 dat=datA/dat; addflag=subflag=mulflag=divflag=0;/运算一次完成后将所有运标志清零。为下次运算作准备。附录四 显示程序/*/函数display();/* #include#include display.h#include 8255.h#include delay.h#include key.h#include calculate.h#define uint unsigned int#define uchar unsigned charuint uintdat;/定义dat为无符号int型(最大值65535)void datapros()

34、;/申明数据处理函数(用于拆开要显示的值)uchar code duan_seg=0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28;/数码管“0”“9”段码。uchar code we_seg=0xfe,0xfd,0xfb,0xf7,0xef,0xdf;/数码管位选码。uchar display_data6;/此数组用于保存拆开的数值void display() if(!overflow&!illegal)/如果没有溢出且合法则显示数值。 datapros();/显示前要将数据处理,拆开。(比如123就要拆成1,2,3送到三个管子上显示),以下

35、就是拆开后显示。 PA8255=0xfe;PB8255=duan_segdisplay_data0;/显示最高位。delay_50us(20);PB8255=0xff;PA8255=0xfd;PB8255=duan_segdisplay_data1;/显示次高位delay_50us(20);PB8255=0xff;PA8255=0xfb;PB8255=duan_segdisplay_data2;delay_50us(20);PB8255=0xff;PA8255=0xf7;PB8255=duan_segdisplay_data3;delay_50us(20);PB8255=0xff;PA8255

36、=0xef;PB8255=duan_segdisplay_data4;delay_50us(20);PB8255=0xff;PA8255=0xdf;PB8255=duan_segdisplay_data5;/显示最低位。/delay_50us(20);PB8255=0xff;else/如果溢出或是除零非法。则显示“EEEEE” uchar i; for(i=0;i6;i+)/显示六个E PA8255=we_segi; PB8255=0x64;/送E的段码。 delay_50us(20); PB8255=0xff; void datapros()/显示前的数据处理。 uintdat=(uint)dat;/强致转化成int型 display_data0=uintdat/100000;/拆出最高位送display_data0中。display_data1=uintdat%100000/10000;/拆次高位display_data2=uintdat%10000/1000;/.display_data3=uintdat%1000/100;/。display_data4=uintdat%100/10;/。display_data5=uintdat%10;/拆最低位。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号