单片机课程设计-简易计算器
物理与电气工程学院课程设计报告
设计名称:简易计算器 院 部:物理与电气工程学院 专业班级:12级电信三班 学生姓名:孔维铮 080212092 指导老师:王陈宁 完成时间:2014年6月8日
摘 要
单片机课程设计是单片机原理课程的实践性环节。是在我们学习了《单片机原理》等课程的基础上进行的综合性训练,我们组这次训练的课题是基于单片机简易计算器,能够进行多位简单的加减运算,同时它能支持2位整数运算。它主要由STC89C52单片机、数码管,键盘等模块组成。本计算器是将键盘输入信息经处理通过缓存,送入数码管显示,键盘采用行列式,数码管采用动态扫描方式,计算功能通过软件实现,用汇编语言对单片机可编程芯片进行编程,实现对计算器的设计。
关键词:单片机;计算器;汇编语言;键盘;数码管
目录
一.课程设计的目的和要求 .......................................... 4
1.1课程设计的目的 ............................................ 4 1.2课程设计要求................................................. 4 二、方案的论证和比较:.............................................. 4
2.1 按键电路设计 ............................................... 4 2.2 4*4键盘扫描电路(扫描式,反转式) . .......................... 5 三.课程设计简述及整体方框图........................................ 5
3.1 方案 ....................................................... 5 3.2、硬件电路设计 ............................................... 5
3.2.1主控电路设计 ........................................... 6 3.2.2键盘电路设计 ........................................... 6 3.2.3数码管显示电路 ......................................... 7 3.3软件设计简述................................................. 7
3.3.1键盘扫描子程序设计 ..................................... 7 3.3.2数码管显示电路 ......................................... 9 3.3.3运算子程序设计 ......................................... 9 3.4程序主框图.................................................. 10 四.仿真软件图..................................................... 11 五.系统功能测试与整体指标......................................... 12 5.1 软件调试步骤................................................... 12
5.2 程序调试步骤 ............................................... 12 5.3 测试结果 ................................................... 13 六、总结与思考及致谢............................................... 13
附录主程序:....................................................... 13
一.课程设计的目的和要求
1.1课程设计的目的
单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。本次设计是设计一个简易计算器,能够进行多位简单的加减运算,同时它能支持2位整数运算。它主要由STC89C52单片机、数码管,键盘等模块组成。本计算器是将键盘输入信息经处理通过缓存,送入数码管显示,键盘采用行列式,数码管采用动态扫描方式,计算功能通过软件实现,用汇编语言对单片机可编 芯片进行编程,实现对计算器的设计。
1.2课程设计要求
① 4*4键盘输入,数码管显示。 ② 完成两位整数的加减
③ 由于键盘只有16个按键,安排如下: +---------------+ |0 | 1 | 2 | 3 | | 4| 5 | 6 | 7 | | 8| 9 |+ | - | |=| c| | | +---------------+
二、方案的论证和比较:
2.1 按键电路设计
方案一:计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此
在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。
方案二:矩阵键盘采用四条I/O线作为行线,四条I/O线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
2.2 4*4键盘扫描电路(扫描式,反转式)
方案一扫描法:对键盘上的某一行送低电平,其他行为高电平,然后读取列值。若列值中有一位是低,则表明该行与低电平对应列的键被按下;否则,扫描下一行。
方案二:反转法:先将所有行扫描线输出低电平,读列值。若列值有一位是低,则表明有键按下,读列值;然后所有列扫描线输出低电平,再读行值。根据读到的值组合就可以查表得到的键码。此设计中我们用反转法。
三.课程设计简述及整体方框图
3.1 方案
按照设计要求,提出方案
。此方案首先通过键盘得到数据,并通过程序对数
据进行处理,最后通过数码管显示出来。结构框图如图1
3.2.1主控电路设计
STC89C52具有如下特点:40个引脚(引脚图如图2所示),4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM ),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器, 2个全双工串行通信口,看门狗(WDT )电路,片内时钟振荡器。 此外STC89C52RC 设计和配置了振荡频率可为0Hz 可通过软件设置省电模式。空闲模式下,CPU 暂停工作,外中断系统可继续工作,掉电模式决结振荡器而保存RAM 的数据,停止芯片其它功能盤至外中断激活戶硬件复位。同时该芯片还具有PDIP 、TQFP 和PLCC 等三种封装形式,以适应不同产品的需求。 STC89C52芯片引脚图如图(2)所示。
图(2)STC89C52芯片引脚图
3.2.2键盘电路设计
计算器所需按键有:
数字键:’1’, ’2’, ’3’, ’4’, ’5’, ’6’, ’7’, ’8’, ’9’, ’0’ 功能键:‘+’,‘-’,‘=’‘c ’(清零)
共计16个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接P3.0~P3.7,这样扫描P3口就可以完成对矩阵
键盘的扫描,通过对16个按键进行编码,从而得到键盘的口地址,对比P3口的扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘扫描的功能。
3.2.3数码管显示电路
图3 LED 数码管
为了显示数字或符号,要为LED 显示器提供代码,即字形代码。七段发光二极管,再加上一个小数点位,共计8段。
图4 LED 数码管显示原理图
3.3软件设计简述
3.3.1键盘扫描子程序设计
要进行数据的计算就必须先进行数据的输入,也就必须确定按键输入的数值是什么,这就需要对键盘进行扫描,从而确定究竟是哪个键按下。
对于键盘的扫描,这里采用行列扫描的方法来完成对键盘的扫描。原理就是先确定按键在哪一行,接着再确定是哪一列,这样就可以知道是哪个按键被按下了。我是将P3口作为按键扫描口的,比如, 先使行线输出全“0”,读列线,再使
列线输出全为“0”,读行线。两次结果再相与,则得到一个值为键值。同理,每个按键都会有一个对应的十六进制值,我把它们列出来进行一一对应就行了,下面是扫描按键图。
图5 扫描按键图
键扫程序的过程为:开始时,先判断是否有键闭合,无键闭合时,返回继续判断,有键闭合时,先去抖动,然后确定是否有键按下,若无键按下,则返回继续判断是否有键闭合,若有键按下,则判断键号,然后释放,若释放按键完毕,则返回,若没有释放按键,则返回继续释放。其流程图如图(6) 所示。
图(6) 键扫程序流程图
3.3.2数码管显示电路
采用2位数码管对计算数据和结果的显示,这里选取共阳数码管,利用NPN 三极管对数码管进行驱动,为了节省I/O资源,采取动态显示的方法来显示计算数据及结果,动态扫描。
为了实现数码管的动态显示,P0口输出显示值,通过P0口的二进制代码送到数码管进行显示。
P2口用来作为位选端,控制哪几位数码管进行显示。比如当P2.3为高电平时,其他位全给0,具体的在软件中会有说明。此时就将扫描的数据送给指定数码管显示。其流程图如图(7) 所示。
图(7) 数码管显示流程图
3.3.3运算子程序设计
算术运算程序的过程为:先判断输入的运算符是+、-、=中的哪一个,若是+或-,则要判断运算结果是否溢出,溢出则显示错误信息,没溢出就显示运算结果,若是=,则直接显示运算结果。其流程图如图8所示。
图8 算术运算程序设计流程图
3.4程序主框图
图9 系统工作总流程
四.仿真软件图
五.系统功能测试与整体指标
5.1 软件调试步骤
1)打开软件后, 在Project 菜单中选择New Project命令,打开一个新项目。保存此项目,输入工程文件名后,并保存工程文件的目录。
2)为项目文件选择一个目标器件,即选择8051的类型。在Data base 列表框中选择“ATML 89C52”,确定。
3)上述设置好后,创建源程序文件并输入程序代码。输入好代码后点击“文件/保存”。
4)把源文件添加到项目中,用鼠标指在目标工作区的目标1,点击右键在弹出的菜单中选择添加文件到源代码组,在弹出的添加文件框中,选择需要添加到项目中的文件。
5)开始编译,对项目文件进行编译。若没有错误后进行硬件调试。
5.2 程序调试步骤
程序调试应一个模块一个模块地进行,首先单独调试各功能子程序,检查程序是否能够实现预期的功能,接口电路的控制是否正常等;最后逐步将各子程序连接起来进行总调试。故调试步骤如下:
1)矩阵4*4键盘的调试
键盘程序是整个程序的基础,我们必须保证其正确。调试方法:先把程序下
载到单片机,让数码管显示,在有键按下时显示的是否为设定的值。
2)数码管程序调试
正确的显示数值是整个程序的关键。调试方法:先把程序下载到单片机,让数码管显示,是否正确的显示数值。
5.3 测试结果
实例测试:将写入程序的单片机插入实验板插座内,程序正确的有0~9数值的显示和正常的四则运算以及判断错误、溢出。
六、总结与思考及致谢
电子设计正在当今社会发挥越来越重要的作用,其采用的软硬件结合技术也逐渐成熟,该模拟系统正是采用软硬相结合的方法实现的。我的题目是简易计算器的设计,对于我们这些实践中的新手来说,这是一次考验。怎样才能找到课堂所学与实际应用的最佳结合点?怎样让自己的业余更接近专业?怎样让自己的计划更具有序性,而不会忙无一用?这都是我们所要考虑和努力的。
通过这次课程设计,最大的一点体会是单片机学的不够扎实,不会的很多啊,当然这次的课程设计做计算器程序用的是汇编,我们互相学习,到处找资料看,问同学,所以我们的软件主程序才能编译成功,系统才能调试出结果。很感谢那些热心教导我的同学和指导我的老师。在其中,很明显我们的计算器处理数据及显示存在太大的局限性,我觉得主要还是我对程序中的运算模块理解不深,这点仍需大大加强。
在此次课程设计中,首先我要感谢王陈宁老师和郭乐老师在课程设计上给予我的指导、提供给我的支持和帮助,这是我能顺利完成这次报告的主要原因,更重要的是老师帮我解决了许多技术上的难题,让我能把系统做得更加完善。在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。
其次,我要感谢帮助过我的同学,他们也为我解决了不少我不太明白的设计商的难题。同时也感谢学院为我提供良好的做课程设计的环境。
最后再一次感谢所有在设计中曾经帮助过我的良师益友和同学!
附录主程序:
YJ EQU 50H ; 结果放
YJ1 EQU 51H ; 中间结果存放
GONG EQU 52H ; 功能键存放
ORG 0000H
LJMP START
ORG 0100H
START:MOV R3,#0 ;初始化显示为空
MOV GONG,#0;功能键清空
MOV 34H,#00H MOV 33H,#00H
LOOP1:LCALL DISP ;调显示子序
LOOP2:LCALL TKEY;判断有无按键
JZ LOOP2
LCALL KEY;读键
INC R3 ;KEY 返回,按键次数自加1 CJNE A,#0,NEXT1 ;判断是否为数字键 LJMP E1 ;转数字键处理
NEXT1:CJNE A,#1,NEXT2
LJMP E1
NEXT2:CJNE A,#2,NEXT3
LJMP E1
NEXT3:CJNE A,#3,NEXT4
LJMP E1
NEXT4:CJNE A,#4,NEXT5
LJMP E1
NEXT5:CJNE A,#5,NEXT6
LJMP E1
NEXT6:CJNE A,#6,NEXT7
LJMP E1
NEXT7:CJNE A,#7,NEXT8
LJMP E1
NEXT8:CJNE A,#8,NEXT9
LJMP E1
NEXT9:CJNE A,#9,NEXT10
LJMP E1
NEXT10:CJNE A,#10,NEXT11 ;判断是否为功能键 LJMP E2 ;转功能键处理
NEXT11:CJNE A,#11,NEXT12
LJMP E2
NEXT12:CJNE A,#12,NEXT13
LJMP E2
NEXT13:LJMP E3 ;判断是否为清除键
E1:CJNE R3,#1,N1 ;判断第几次按键
LJMP E11 ;为第一个数字
N1:CJNE R3,#2,N2 ;
LJMP E12
N2:LJMP E3 ; 为第二个数字 ; 第三个数字转溢出 E11: MOV R4,A ;输入值暂存R4
MOV 34H,A ;输入值送显示缓存
MOV 33H,#00H LJMP LOOP1 ;等待再次输入
E12:MOV R7,A ;个位数暂存R7
MOV B,#10 MOV A,R4 MUL AB ADD A,R7 MOV R4,A ;输入值存R4 ;十位数
MOV 33H,34H MOV 34H,R7 LJMP LOOP1 ;输入值送显示缓存
E3: MOV R3,#0 ; 按键次数清0
MOV R4,#0 ; 输入值清0
MOV YJ,#0 ; 计算结果清0
MOV GONG,#0 ; 功能键设为0 MOV 34H,#00H ; 显示清空 MOV 33H,#00H LJMP LOOP1
E2:MOV 34H,#00H
MOV 33H,#00H
MOV R0,GONG ;与上次功能键交换
MOV GONG,A MOV A,R0 CJNE A,#10,N21 ;判断功能键 LJMP JIA ;“+”
N21:CJNE A,#11,N22
LJMP JIAN ;“-”
N22:CJNE A,#0,N23
LJMP FIRST ;首次按功能键即A=#0 N23:LJMP DENG ;“=”
N4:LJMP E3
FIRST:MOV YJ,R4
MOV R3,#0
JIA:MOV A,YJ ; 上次结果送累加器 ; 输入值送结果 ; 按键次数清0 LJMP DISP1 ; 结果处理
ADD A,R4
JB CY,N4 MOV YJ,A MOV R3,#0 LJMP DISP1 ; 上次结果加输入值 ; 溢出 ; 存本次结果 ; 按键次数清0
JIAN:MOV A,YJ ;上次结果送累加器 SUBB A,R4
DENG:MOV R3,#0;
LJMP DISP1
DISP1: MOV B,#10
MOV A,YJ ;结果送累加器
DIV AB ;结果除10 MOV YJ1,A ;暂存商 MOV A,B ;取个位数 JB CY,N4 MOV YJ,A ; 上次结果减输入值 ; 负数溢出 MOV R3,#0 ;按键次数清零 LJMP DISP1
MOV 34H,A ;个位数送显示缓存
MOV A,YJ1 JZ DISP11;结果是否为一位数 MOV 33H,A ;十位数送显示缓存 DISP11:LJMP LOOP1
DISP: MOV R0,#34H;待显缓冲个位地址 DIR1: MOV DPTR,#LEDCA
MOVC A,@A+DPTR MOV P0,A CJNE R0,#34H,DIR2 SETB P2.0 LCALL DELAY10MS CLR P2.0 DEC R0 SJMP DIR1
DIR2:SETB P2.1
LCALL DELAY10MS
TKEY:ACALL DISP
MOV P3,#0FH;读入键状态 MOV A,P3
CPL A
ANL A,#0FH;高四位不用 RET
KEY: MOV R6,#10
ACALL DELAY10MS
MOV P3,#0FH
MOV A,P3
CJNE A,#0FH,K2
LJMP LOOP1 CLR P2.1 RET
K2:MOV B,A
MOV P3,#0EFH
KEY3:ANL A,#0F0H ORL B,A MOV R1,#16 MOV R2,#0 MOV DPTR,#KTAB MOV A,P3 CJNE A,#0EFH,KEY3 MOV P3,#0DFH MOV A,P3 CJNE A,#0DFH,KEY3 MOV P3,#0BFH MOV A,P3 CJNE A,#0BFH,KEY3 MOV P3,#07FH MOV A,P3 CJNE A,#07FH,KEY3 LJMP LOOP1
KEY4:MOV A,R2
MOVC A,@A+DPTR CJNE A,B,KEY6 MOV P3,#0FH KEY5:MOV A,P3 CJNE A,#0FH,KEY5 MOV R6,#10 ACALL DELAY10MS
RET
KEY6:INC R2
DELAY10MS: MOV R6,#10
DL:MOV R7,#250
DJNZ R7,$
DJNZ R6,DL
RET
DJNZ R1,KEY4 AJMP LOOP1
KTAB:DB 0EEH,0DEH,0BEH,7EH DB 0EDH,0DDH,0BDH,7DH
DB 0EBH,0DBH,0BBH,7BH DB 0E7H,0D7H,0B7H,77H // 按键键值表
LEDCA:DB 0C0H,0F9H,0A4H,0B0H
DB 99H,92H,82H,0F8H DB 80H,90H,88H,83H DB 0C6H,0A1H,86H,8EH //共阳LED 显示码表
END