科研训练论文题目:基于单片机的计算器的设计目录一、概述 (3)1.1设计要求及任务: (3)1.2设计原理: (3)二、系统总体方案及硬件设计 (3)2.1计算器总体思想 (3)2.2硬件的选择与连接 (4)2.2.1硬件选择 (4)2.2.2接口设计 (5)三、软件设计 (7)3.2系统流程总图 (8)3.3显示程序设计 (8)3.4键盘识别程序设计 (9)3.4.1原理与分析 (9)3.4.2流程图 (10)四、设计体会与总结 (11)五、参考文献 (11)附录基于单片机的计算器的设计摘要:本设计是一个实现加减乘除的计算器,它的硬件主要由四部分构成,一个8051单片机芯片,两个八段共阴极数码管,一个4*4键盘,它可以实现一位数的加减乘除运算。
显示部分:采用LED动态显示。
按键部分:采用4*4键盘。
采用软件识别键值,并执行相应的操作。
关键词:LED接口;键盘接口;8255A;汇编语言一、概述1.1设计要求及任务:(1)设计4*4的键盘,其中10个数字键0~9,其余六个键“+”、“—”、“*”、“/”、“=”、和“C”键;(2)设计两位LED接口电路;(3)实现1位数的简单运算1.2设计原理:(1)LED显示器接口技术LED动态显示接口技术(2)键盘显示技术逐行(逐列扫描法)二、系统总体方案及硬件设计2.1计算器总体思想显示部分:采用LED动态显示。
按键部分:采用4*4键盘。
采用软件识别键值,并执行相应的操作。
执行过程:开机显示零,等待键入数值,当键入数字,经通过数码管显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在数码管上输出运算结果。
图1 系统设计框图2.2硬件的选择与连接图二硬件连接总图2.2.1硬件选择(1)由于本设计比较简单,因此选用内部含有4KBE2PROM的89C51单片机作为系统的核心。
(2)扩展输入/输出端口在扩展输入/输出端口时,要求输入口能够缓冲,,输出口能够锁存。
常用小规模集成电路芯片74LS244或74LS245等扩展输入端口,用74LS273、74LS373、 74LS377扩展输出端口。
这种扩展方法的特点是电路简单,但功能单一、灵活性差。
因而常采用中规模的可编程并行接口芯片8255A扩展输入/输出端口。
(3)锁存电路采用74LS3732.2.2接口设计(1)单片机与8255A的接口设计8255A中的数据总线缓冲器为三态双向数据缓冲存储器,用于将8255A的数据线D0~D7和单片机的数据总线(P0口)连接,实现单片机和接口间的数据传送。
读写控制部件的接口设计1、/CS为片选信号,接成低电平表示8255A被选中。
/CS与P2.7相连,用P2口的最高位控制8255A是否工作。
即将P2.7控制为低电平。
2、RESET-复位信号,高电平有效,接在单片机的RST端。
3、/RD和/WR为读写控制信号,低电平有效。
分别将两个端口接单片机的/RD和/WR4、A1和A0-端口选择信号,分别与单片机的低两位地址线P1.1和P1.0相连。
用于选择不同端口。
采用74LS373三态锁存器,用于分离P0口第八位地址线,将它的Q0和Q1口接至8255A的地址输入端A0和A1。
所以若将P1.2~P1.7和P2.0~P2.6全接为高电平,A口地址为07FFCH,B口地址为07FFDH,C口地址为07FFEH,控制字寄存器地址为07FFFH.(2)LED显示电路的设计:简易计算器需要2位8段码LED显示电路。
用8051单片机经8255A扩展2位8段码LED显示器,用8255A的A口作为段码(字形代码)数据口,PB0和PB1作位码口。
图三显示器接口电路(3)键盘接口设计89C51单片机经8255A扩展4*4行列式键盘,8255A的B口和C口用于扩展键盘接口,B口高4位作为输出口,C口低4位作为输入口。
设各口工作于方式零。
则8255A 的工作方式控制字为10000001(81H)键盘接口设计图四键盘接口图三、软件设计3、1软件系统的功能该设计能够实现1位的加减乘除和清零功能,利用实验箱上4*6键盘中前4列,即0-9,A-F键。
A,B,C,D分别为“+”“-”“*”“/”键,E是等于键,F清零。
其他是数字键。
再利用实验箱上的LED显示器,对于即时按下的键和结果进行显示。
3.2系统流程总图图五系统总流程图3.3显示程序设计LED显示器有共阴极和共阳极两种。
共阴极就是把发光二极管的阴极连在一起构成公共阴极,使用时公共阴极接地,某端接高电平时才发亮。
共阳极则是把发光二极管的阳极连在一起构成公共阳极,使用时公共阳接十5V端。
某端接低电平时才发亮。
在此次设计中采用共阴极接法。
LED动态显示接口技术:动态显示中,任意时刻虽只有一位显示器被点亮,但当一个循环周期小于人的视觉暂留时间时,看上去与全部显示器持续点亮的效果相同。
从而提高数码管的利用效率,所以采用LED动态显示接口技术。
多位LED显示器接口电路需要有两个输出口,其中一个用于输出8条段控线(有小数点显示),另一个用于输出位控线,位控线的数目等于显示器的位数。
利用LED动态显示的方法,设置显示缓冲地址和循环次数,让两个数码管从左到右依次显示,之间要调用延时子程序,但延时时间小于人的视觉暂留。
程序流程图如下图六显示程序设计流程图3.4键盘识别程序设计3.4.1原理与分析1、测试是否有键按下:①单片机I/O 口向所有列线输出低电平。
即向列口写入00H。
②然后输入各行线状态,即读输入口的字。
③比较:若行线状态全为高电平,则表明无键按下;若行线状态中有低电平,则表明有键按下。
2、消抖动3、扫描键盘以确定被按键的物理位置4、计算键码如果键号是按从左到右,从上到下的顺序编排的,按这种编排规律,各行的首键号依次是 00H、08H、10H、18H,如列线按0~7的顺序编号,则可选用键码的计算公式为:键码= 首键号十列号5、等待键释放实验箱提供6*4的小键盘,只使用前四列,即0-9,A-F键。
A,B,C,D分别为“+“-”“*”“/”键,E是等于键,F清零。
其他是数字键。
再利用实验箱上的LED显示器,对于即时按下的键和结果进行显示。
向列扫描码逐列输出低电平,然后从行码地址读回。
如果有键按下,则相应的行值应为低,如果无键按下,由于上拉电阻的作用,行码为高。
这样可以通过输出的列码和读取的行码判断按下的是什么键,在判断有键按下后,要有一定的延时,防止键盘抖动。
在接线时将KEY/LED CS 接到 CS0上,则列扫描地址为08002H,行扫描地址为08001H。
为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个键都对应一个码——键码。
为了得到被按键的键码,现使用行扫描法识别按键。
3.4.2流程图该程序可由两部分构成,首先扫描是否有键按下是执行TESTKEY程序,若有键按下则调用GETKEY程序,若无键按下则继续扫描按键程序直到有键按下。
图七键盘扫描程序的流程图四、设计体会与总结通过基于8051单片机简易计算器的设计,加深了我对单片机课程的了解,学以致用,不但回顾了过去所学,更使我了解了现在的不足,弥补了一些知识漏洞。
更重要的是在实际设计和试验中形成了更加科学合理的认识,不断形成更为合理和具有科学性的思想方式。
在这次设计中接住了互联网等途径查询相关信息,并在图书馆查阅了大量单片机资料。
这不但扩展了有关单片机领域的眼界,而且完善了以往的知识体系。
提高了运用知识的综合能力。
五、参考文献【1】郭文川主编. 单片机原理与接口技术[M]. 北京:中国农业出版社,2007【2】何利民。
MCS-51系列单片机应用系统设计【M】。
北京:北京航空航天大学出版社,1990.143.-160。
【3】李华。
MCS-51系列单片机实用接口技术【M】。
北京:北京航空航天大学出版社,1993.148.-158。
附录:PAPORT EQU 07FFCH ; 端控制口 A口PBPORT EQU 07FFDH ; 位控制口和键盘列线输出口 B口PCPORT EQU 07FFEH ; 键盘行码读入口 C口DATA1 EQU 70HDATA2 EQU 71HDIZHI1 EQU 72HDIZHI2 EQU 73HLEDBUF EQU 60H ;置显示缓冲单元首地址LJMP STARTSTART:MOV SP,#40HMOV LEDBUF+0,#0MOV LEDBUF+1,#03FHMLOOP:CALL DISPLAYLED ; 显示CALL TESTKEY ; 有键入?JZ MLOOP ; 无键入,继续显示CALL GETKEY ;读入键码JISUAN:MOV R3,ACJNE R3,#0FH,QU ;判断是否为清零键?MOV R3,#00H ;清零MOV R4,#00HMOV R5,#00HMOV DATA1,#00HMOV DATA2,#00HMOV DIZHI1,#00HMOV DIZHI2,#00HMOV LEDBUF+0,#0MOV LEDBUF+1,#03FHLJMP MLOOPQU: CLR CCJNE R3,#0AH,FOLLOW ; 判断是数字键还是功能键?FOLLOW:JC SHUZI ;R3<10,说明是数字键LJMP GNSHUZI: MOV A,R4 ;判断是否有运算符输入, JNZ SHUZI1 ;有就将数值存在DATA2MOV A,R3MOV DATA1,ALJMP XS ;显示第一次输入的数值SHUZI1:MOV A,R3MOV DATA2,ALJMP XS ;显示第二次输入的数值GN: MOV R4,#01H ;将01H给R4,说明已有运算符输入 CJNE R3,#0EH,JIA ;判断键值是否为“=”?MOV R4, #00h ;将R4清零MOV A,DIZHI1 ;执行“=”MOV DPH,AMOV A,DIZHI2MOV DPL,AMOV A,#00HJMP @A+DPTR ;转到本次输入的算法程序JA: CJNE R3, #0AH, JN ;若键值为“+”则将“+”的程序首地址MOV DPTR,#JIA ;存在DIZHI1和DIZHI2中MOV A,DPHMOV DIZHI1, AMOV A,DPLMOV DIZHI2, ALJMP MLOOPJN: CJNE R3, #0BH, CE ;若键值为“-”则将“-”的程序首地址存MOV DPTR, #JIAN ;DIZHI1和DIZHI2中MOV A, DPHMOV DIZHI1, AMOV A,DPLMOV DIZHI2, ALJMP MLOOPCE: CJNE R3,#0CH, CU ;若键值为“*”则将“*”的程序首地址存在MOV DPTR,#CHENG ;址存在DIZHI1和DIZHI2中MOV A,DPHMOV DIZHI1, AMOV A, DPLMOV DIZHI2, ALJMP MLOOPCu: CJNE R3, #0DH, ZHUAN ;若键值为“/”则将“/”的程序首地址存在MOV DPTR , #CHU ;存在DIZHI1和DIZHI2中MOV A, DPHMOV DIZHI1, AMOV A, DPLMOV DIZHI2, AZHUAN: LJMP MLOOPJIA: MOV A, DATA1 ;加法程序ADD A, DATA2LJMP XSJIAN: MOV A, DATA1 ;减法程序SUBB A, DATA2LJMP XSCHENG: MOV A, DATA1 ;乘法程序MOV B, DATA2MUL ABLJMP XSCHU: MOV A, DATA1 ;除法程序MOV B, DATA2DIV ABXS: MOV B, #10 ;显示个位数字DIV ABMOV R5,AMOV A, BMOV DPTR,#LEDMAPMOVC A, @A+DPTRMOV LEDBUF+1,AMOV A, R5FRIST:CJNE A,#0,NEXTLJMP MLOOP ;运算完后继续扫描键盘NEXT:MOV B,#10 ;显示十位数字DIV ABMOV R5,AMOV A,BMOV DPTR, #LEDMAPMOVC A, @A+DPTRMOV LEDBUF+0, AMOV A,R5LJMP FRISTENDLEDMAP:DB 3FH,06H,5BH,4FH ;八段管显示码DB 66H,6DH,7DH,07HDB 7FH,6FH,77H,7CHDB 39H,5EH,79H,71HDELAY:MOV R7,#0 ;延时子程序DELAYLOOP:DJNZ R7,DELAYLOOPDJNZ R6,DELAYLOOPRET;显示子程序************************************************ DISPLAYLED:MOV R0,#LEDBUFMOV R1,#2 ;共两个八段管MOV R2,#02H ;02H=0000 0010B从左边开始显示LOOP: MOV DPTR,#PBPORT ;位控口地址MOV A,#0MOVX @DPTR,A ;将零输出到位控口,关闭所有八段管 MOV A,@R0ACALL LEDMAPMOV DPTR,#PAPORT ;段控口地址MOVX @DPTR,A ;输出到段控口MOV DPTR,#PAPORTMOV A,R2MOVX @DPTR,A ;显示一位八段管MOV R6,#1 ;1毫秒延时CALL DELAYMOV A,R2 ;显示下一位RR AMOV R2,AINC R0DJNZ R1,LOOPRET;判断是否有键按下子程序**********************************88 TESTKEY:MOV DPTR,#PBPORTMOV A,#0MOVX @DPTR,A ;输出线置零MOV DPTR,#PCPORT ; 读入键状态MOVX A, @DPTRCPL AANL A,#0FH ;高四位不用,将高四位清零RET;定义键码的值***************************************KEYTABLE:DB 0DH, 0CH, 0BH, 0AHDB 0EH, 03H, 06H, 09HDB 0FH, 02H, 05H, 08HDB 00H, 01H, 04H, 07H;若有键按下,找出键码所在位置**************************** GETKEY:MOV DPTR,#PBPORTMOV P2,DPHMOV R0,#LOW(PCPORT)MOV R1,#00001000BMOV R2,#4KLOOP:MOV A,R1 ;找出键所在的列CPL AMOVX @DPTR,ACPL ARR AMOV R1,AMOVX A,@R0CPL AANL A,#0FHJNZ GOON1 ;该列有键入DJNZ R2,KLOOPMOV R2,#0FFH ;没有键按下,返回0FFH SJMP EXITGOON1:MOV R1,A ;键值=列X4+行MOV A,R2DEC ARL ARL AMOV R2,A ;R2=(R2-1)*4MOV A,R1 ;R1中为读入的行值MOV R1,#4LOOPC:RRC A ;移位找出所在行JC EXITINC R2 ;R2=R2+行值 DJNZ R1,LOOPCEXIT:MOV A,R2 ;取出键码 MOV DPTR,#KEYTABLEMOVC A,@A+DPTRMOV R2,AWAITRELEASE:MOV DPTR,#PBPORTCLR AMOVX @DPTR,AMOV R6,#10CALL DELAY ;调用延时程序消抖动CALL TESTKEYJNZ WAITRELEASEMOV A,R2RET。