单片机课程设计十进制加法计算器设计.doc_第1页
单片机课程设计十进制加法计算器设计.doc_第2页
单片机课程设计十进制加法计算器设计.doc_第3页
单片机课程设计十进制加法计算器设计.doc_第4页
单片机课程设计十进制加法计算器设计.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机课程设计报告十进制加法计算器设计 学院:物理与微电子科学学院 班级:- 姓名:- 学号:- 单片机课程设计报告 目录1、摘 要-22、设计任务和要求-23、单片机简要原理-3 3.1 at89c51的介绍-3 3.2 单片机最小系统-8 3.3 七段共阳极数码管-9 4、硬件设计-9 4.1 键盘电路的设计-9 4.2 显示电路的设计-115、 软件设计-12 5.1 系统设计-12 5.2 显示与按键设计-146、 系统调试.-226.1系统初始状态的调试-22 6.2键盘输入功能的调试-23 6.3系统运算功能的调试-257、心得体会-26参考文献-29附录 系统硬件电路图-29-1、摘要 近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。 本设计是实现两位数的加减运算的简易计算器,实现键盘输入,由七段led数码管输出;程序都是根据教材内和网络中的程序参考编写而成,在功能上还并不十分完善,限制也较多。本设计重在设计构思,使得我们用专业知识、专业技能分析和解决问题,通过设计使得我们对所学知识彻底巩固。2、设计任务和要求本次课程设计,我选题是单片机十进制加法计算器软设计 ,设计任务为: 设计一键盘显示装置,键盘上除需定义10个十进制数字键外还要相应的功能键,其它键不定义无响应。利用此系统可分别可输入十进制被加数与加数,实现两数相加并将结果以十进制形式显示出来。(扩展:多位10进制数相加) 本课程设计的十进制加法计算器的计算范围为0255,计算结果全为整数,计算结果溢出结果不显示。 1、加法:三位加法,计算结果超过255溢出不显示 2、减法:三位减法,计算结果若小于零溢出不显示 3、乘法:三位数乘法 4、除法:整数除法 5、有清零功能3、 单片机简要原理 在该课程设计中,主要用到一个at89c51芯片和串接的共阴数码管。作为该设计的主要部分,下面将对它们的原理及功能做详细介绍和说明。3.1 at89c51的介绍: 图一 at89c51外形结构和引脚分布图芯片at89c51的外形结构和引脚图如图一所示。at89c51是一种带4k字节闪烁可编程可擦除只读存储器(fperomfalsh programmable and erasable read only memory)的低电压,高性能cmos8位微处理器,俗称单片机。该器件采用atmel高密度非易失存储器制造技术制造,与工业标准的mcs-51指令集和输出管脚相兼容。由于将多功能8位cpu和闪烁存储器组合在单个芯片中,atmel的at89c51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。其功能特性描述:at89c51单片机在电子行业中有着广泛的应用。at89c52具有以下标准功能: 8k字节flash,256字节ram, 32 位i/o 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路,8 位微控制器 8k 字节在系统可编程 flash rom。p0 口:p0口是一个8位漏极开路的双向i/o口。作为输出口,每位能驱动8个ttl逻 辑电平。对p0端口写“1”时,引脚用作高阻抗输入端用。 在访问外部数据存储器或程序存储器时,p0口被分时转换地址(低8 位)和数据总线复用,在访问期间激活内部上拉电阻。 在flash 编程时,p0 口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。 p1 口:p1 口是一个具有内部上拉电阻的8 位双向i/o 口,p1 输出缓冲器能驱动4 个ttl 逻辑电平。对p1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(iil)。 此外,p1.0和p1.2分别作定时器/计数器2的外部计数输入(p1.0/t2)和时器/计数器2的触发输入(p1.1/t2ex),具体如下表所示。在flash编程和校验时,p1口接收低8位地址字节。 p1端口引脚号第二功能: p1.0 t2(定时器/计数器t2的外部计数输入),时钟输出 p1.1 t2ex(定时器/计数器t2的捕捉/重载触发信号和方向控制) p2 口:p2 是一个带有内部上拉电阻的8 位双向i/o 口,p2 的输出缓冲级可驱动(吸收或输出电流)4 个ttl逻辑门电路。对端口p2 写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(iil)。 在访问外部程序存储器或16 位地址的外部数据存储器(例如执行movx dptr 指令)时,p2 口送出高8 位地址数据。在访问8 位地址的外部数据存储器(如执行movx ri 指令)时,p2 口输出p2 锁存器的内容。 flash 编程或校验时,p2亦接收高位地址和一些控制信号。p3 口:p3 口是一组带有内部上拉电阻的8 位双向i/o 口。p3 口输出缓冲级可驱动(吸收或输出电流)4 个ttl 逻辑门电路。对p3 口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的p3 口将用上拉电阻输出电流(iil)。 p3 口还接收一些用于flash 闪速存储器编程和程序校验的控制信号。 p3 口除了作为一般的i/o 口线外,更重要的用途是它的第二功能。p3口亦作为at89c52特殊功能(第二功能)使用,如下所示。 在flash编程和校验时,p3口也接收一些控制信号。 p3端口引脚第二功能:p3.0 rxd(串行输入口)p3.1 txd(串行输出口)p3.2 into(外中断0)p3.3 int1(外中断1)p3.4 to(定时/计数器0)p3.5 t1(定时/计数器1)p3.6 wr(外部数据存储器写选通)p3.7 rd(外部数据存储器读选通)rst复位输入。当振荡器工作时,rst引脚出现两个机器周期以上高电平将是单片机复位。ale/prog当访问外部程序存储器或数据存储器时,ale(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ale仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ale脉冲。对flash存储器编程期间,该引脚还用于输入编程脉冲(prog)。如有必要,可通过对特殊功能寄存器(sfr)区中的8eh单元的d0位置位,可禁止ale操作。该位置位后,只有一条movx和movc指令才能将ale激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ale禁止位无效。psen程序储存允许(psen)输出是外部程序存储器的读选通信号,当at89c52由外部程序存储器取指令(或数据)时,每个机器周期两次psen有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次psen信号。ea/vpp外部访问允许,欲使cpu仅访问外部程序存储器(地址为0000h-ffffh),ea端必须保持低电平(接地)。需注意的是:如果加密位lb1被编程,复位时内部会锁存ea端状态。如ea端为高电平(接vcc端),cpu则执行内部程序存储器的指令。flash存储器编程时,该引脚加上+12v的编程允许电源vpp,当然这必须是该器件是使用12v编程电压vpp。引脚使用说明:i/o端口的编程实际上就是根据应用电路的具体功能和要求对i/o寄存器进行编程。具体步骤如下:l. 根据实际电路的要求,选择要使用哪些i/o端口。2. 初始化端口的数据输出寄存器,应避免端口作为输出时的开始阶段出现不确定状态,影响外围电路正常工作。3. 根据外围电路功能,确定po端口的方向,初始化端口的数据方向寄存器。对于用作输入的端口可以不考虑方向初始化,因为po的复位缺省值为输入。4. 用作输入的po管脚,需上拉电阻。5. 最后对i/o端口进行输出(写数据输出寄存器)和输入(读端口)编程,完成对外围电路的相应功能。3.2 单片机最小系统 单片机最小系统就是支持主芯片正常工作的最小部分,包括主控芯片、复位电路和晶振电路。 (一) 复位电路 图二 复位电路 本设计采用上电与手动复位电路,电阻分别选取100和10k,电容选取10uf,系统一上电,芯片就复位,或者中途按按键也可以进行复位。(2) 晶振电路 图三 晶振电路晶振电路是单片机的心脏,它用于产生单片机工作所需要的时钟信号。单片机的晶振选取11.0592mhz,晶振旁电容选取30pf。3.3 七段共阳极数码管 图四 七段共阳数码管 图为七段共阳数码管的引脚图,从左到右数码管的段码分别为a,b,c,d,e,f,g和小数点dp,低电平时点亮,最右边为位选端。4、硬件设计 简易数字计算器系统硬件设计主要包括:键盘电路,显示电路以及其他辅助电路。下面分别进行设计。 4.1 键盘电路的设计 键盘可分为两类:编码键盘和非编码键盘。编码键盘是较多按键(20个以上)和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。通用计算机使用的标准键盘就是编码键盘。当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。但大多数智能仪器和电子产品的按键数目都不太多(20个以内),为了降低成本和简化电路通常采用非编码键盘。非编码键盘的接口电路有设计者根据需要自行决定,按键信息通过接口软件来获取。本课题需要的是16个按键,故选择用非编码键盘。计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的i/o 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。矩阵键盘采用四条i/o 线作为行线,四条i/o 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为44个。这种行列式键盘结构能有效地提高单片机系统中i/o 口的利用率。矩阵键盘的工作原理:计算器的键盘布局如图五所示:一般有16个键组成,在单片机中正好可以用一个p口实现16个按键功能,这种形式在单片机系统中也最常用。具体电路连接如图五所示: 图五 4*4键盘接口电路4.2 显示电路的设计 当系统需要显示少量数据时,采用led数码管进行显示是一种经济实用的方法。数码管显示有静态显示和动态显示两种方法。为了减少端口的使用,故选择动态显示。 电路如下图六所示: 图六 三位数码管的显示电路5、 软件设计在十进制加法计算器的软件规划要求下,简易计算器的程序主要包括以下功能模块:(1) 主模块,为系统的初始化。(2)显示与读键模块,分为判键程序段、运算操作子程序、显示子程序等部分;5.1系统设计(一) 系统模块图 图七 系统模块图 此系统包括晶振电路、复位电路、led显示电路、矩阵按键电路运算法则指示灯以及单片机。其中通过输入键盘模块将数字09和运算符号“+”、“-”、“*”、“/”输入单片机进行运算;运算模块分别根据输入的运算符进行加减乘除运算;显示模块将运算后的数值通过动态扫描使之在数码管上输出。(2) 系统总流程图主程序主要是用来进行初始化的,调用其他子程序,清空各个标志位,清空缓存区,读取键码,判断功能,在led上作出回应,主程序流程图如图六所示。(1)数字送显示缓冲程序设计简易计算器所显示的数值最大位三位。要显示数值,先判断数值大小和位数,如果是超过三位或大于255,将不显示数字。可重新输入数字,再次计算。(2)运算程序的设计首先初始化参数,送led三位显示“0”,其它位不显示。然后扫描键盘看是否有键输入,若有,读取键码。判断键码是数字键、清零键还是功能键,是数值键则送led显示并保存数值,是清零键则做清零处理,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送led显示,若是运算键则保存相对运算程序的首地址。5.2 显示与按键设计(1) led显示程序设计 led显示器由七段发光二极管组成,排列成8字形状,因此也称为七段led显示器。为了显示数字或符号,要为led显示器提供代码,即字形代码。七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。简易计算器用到的数字09的共阳极字形代码如下表:显示字型gfedcba段码001111110c0h100001100f9h210110110a4h310011110b0h4110011099h5110110192h6111110182h700001110f8h8111111180h9110111190h 表一 共阳极数码管段码对照表(2) 读键子程序设计为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个键都对应一个码键码。为了得到被按键的键码,现使用行扫描法识别按键。其程序框图如图八:读键程序使用的是反转法读键,不管键盘矩阵的规模大小,均进行两次读键。第一次所有列线均输出低电平,从所有读入键盘信息(行信息);第二次所有行线均输出低电平,从所有行线读入键盘信息(列信息)。将两次读键信息进行组合就可以得到按键的特征编码,然后通过查表得到按键的顺序编码。将各特征编码按希望的顺序排成一张表,然后用当前读得的特征码来查表。当表中有该特征码时,它的位置就是对应的顺序编码;当表中没有该特征码时,说明这是一个没有定义的键码,与没有按键(0ffh)同等看待。 (3) 流程图 图八 计算键值子程序流程图(4) 源程序result equ60h result1 equ61h functionkey equ62h org 00hstart:mov r3,#0 mov functionkey,#0mov 32h,#00hmov 33h,#00hmov 34h,#00hmloop:call disp ;调显示子程序wait:call testkey ;判断有无按键jz wait call getkey ;读键inc r3 ;按键个数cjne a,#0,next1 ;判断是否数字键ljmp e1 ;转数字键处理next1:cjne a,#1,next2ljmp e1next2:cjne a,#2,next3ljmp e1next3:cjne a,#3,next4ljmp e1next4:cjne a,#4,next5ljmp e1next5:cjne a,#5,next6ljmp e1next6:cjne a,#6,next7ljmp e1next7:cjne a,#7,next8ljmp e1next8:cjne a,#8,next9ljmp e1next9:cjne a,#9,next10ljmp e1next10:cjne a,#10,next11 ;判断是否功能键ljmp e2 ;转功能键处理next11:cjne a,#11,next12ljmp e2next12:cjne a,#12, next13ljmp e2next13:cjne a,#13,next14ljmp e2next14:cjne a,#14,next15ljmp e2next15:ljmp e3 ;判断是否清除键e1:cjne r3,#1,n1 ;判断第几次按键ljmp e11 ;为第一个数字n1:cjne r3,#2,n2ljmp e12 ;为第二个数字n2:cjne r3,#3,n3 ljmp e13 ;为第三个数字n3:ljmp e3 ;第四个数字转溢出e11:mov r4,a ;输入值暂存r4mov 34h,a ;输入值送显示缓存mov 33h,#00hmov 32h,#00hljmp mloop ;等待再次输入e12: mov r7,a ;个位数暂存r7mov b,#10mov a,r4mul ab ;十位数adda,r7mov r4,a ;输入值存r4mov 32h,#00h ;输入值送显示缓存mov 33h,34hmov 34h,r7ljmp mloope13:mov r7,amov b,#10mov a,r4mul abjb ov,e3 ;输入溢出add a,r7jb cy,e3 ;输入溢出mov r4,amov 32h,33h;输入值送显示缓存mov 33h,34hmov 34h,r7ljmp mloope3:mov r3,#0 ;按键次数清零mov r4,#0 ;输入值清零mov result,#0 ;计算结果清零mov functionkey,#0 ;功能键设为零 mov 32h,#00h;显示清空mov 33h,#00hmov 34h,#00hljmp mloope2:mov 34h,#00hmov 33h,#00hmov 32h,#00hmov r0,functionkey ;与上次功能键交换mov functionkey,amov a,r0cjne a,#10,n21 ;判断功能键ljmp jia ;n21: cjne a,#11,n22ljmp jian ;n22: cjne a,#12,n23ljmp cheng ;*n23:cjne a,#13,n24ljmp chu ;/n24:cjne a,#0,n25ljmp first ;首次按功能键n25:ljmp den ;=n4:ljmp e3first:mov result,r4 ;输入值送结果mov r3,#0 ;按键次数清零ljmp disp1 ;结果处理jia:mov a,result;上次结果送累加器add a,r4;上次结果加输入值jb cy,n4;溢出mov result,a;存本次结果mov r3,#0;按键次数清零ljmp disp1jian:mov a,resultsubb a,r4;上次结果减输入值jb cy,n4;负数溢出mov result,amov r3,#0ljmp disp1cheng:mov a,resultmov b,amov a,r4mul ab;上次结果乘输入值jb ov,n4;溢出mov result,aljmp disp1chu:mov a,r4mov b,amov a,resultdiv ab;上次结果除输入值mov result,amov r3,#0ljmp disp1den:mov r3,#0ljmp disp1disp1:movb,#10mova,result;结果送累加器divab;结果除10movresult1,a;暂存商mova,b;取个位数mov34h,a;个位数送显示缓存mova,result1jzdisp11;结果是否为一位数movb,#10mova,result1divabmovresult1,amova,bmov33h,a;十位送显示缓存mova,result1jzdisp11;结果是否为二位数mov32h,a;百位数送显示缓存disp11:ljmpmloopdisp: mov r0,#34hdir1: mov dptr,#segtab mov a,r0 movc a,a+dptr mov p0,a cjne r0,#34h,dir2 setb p2.0 call d1ms clr p2.0 dec r0 sjmp dir1dir2: cjne r0,#33h,dir3 setb p2.1 call d1ms clr p2.1 dec r0 sjmp dir1dir3: setb p2.2 call d1ms clr p2.2 retd1ms: mov r7,#02hdms: mov r6,#0f0h djnz r6,$djnz r7,dms retsegtab:db 0c0h, 0f9h, 0a4h, 0b0h db 99h, 92h, 82h, 0f8h db 80h, 90h, 88h, 83h db 0c6h, 0a1h, 86h, 8ehtestkey:acall dispmovp1,#0fh;读入键状态mova,p1cplaanla,#0fh;高四位不用retkeytable:db0eeh,0edh,0ddh,0bdh;键码定义db0ebh,0dbh,0bbh,0e7hdb0d7h,0b7h,0deh,0behdb07eh,07dh,07bh,077hgetkey:movr6,#10;读键子程序acalldelaymovp1,#0fhmova,p1cjnea,0fh,k12ljmpmloopk12: movb,amovp1,#0efhmova,p1cjnea,#0efh,k13movp1,#0dfhmova,p1cjnea,#0dfh,k13movp1,#0bfhmova,p1cjnea,#0bfh,k13movp1,#07fhmova,p1cjnea,#07fh,k13ljmpmloopk13: anl a,#0f0horla,bmovb,amovr1,#16movr2,#0movdptr,#keytablek14:mova,r2movca,a+dptrcjnea,b,k16movp1,#0fhk15:mova,p1cjnea,#0fh,k15movr6,#10acalldelaymova,r2retk16:incr2djnzr1,k14ajmpmloop ;10ms延时子程序delay:movr7,#10ts1: mov r6,#0ffhts2:nopnop djnzr6,ts2djnzr7,ts1retend6系统调试 6.1系统初始状态的调试 系统初始状态时,2个led显示器显示“0”,运算法则指示灯全灭。调试结果如图9所示。图9 系统初始状态调试结果6.2键盘输入功能的调试通过键盘分别输入“8”、“*”、“9”,led显示电路和运算法则指示电路分别显示相应的结果。调试结果如图11所示。(a)输入“8”(b)输入“*”(c)输入“9”图10 键盘输入功能调试结果6.3系统运算功能的调试当输入“8”、“*”、“9”后,点击“=”可得到运算结果“72”,并通过led显示电路显示。调试结果如图11所示。图11 系统运算功能调试结果7、 心得体会 单片机课程设计终于结束了,通过紧张的工作,完成了我的设计任务-十进制加法计算器。总的来说,这次课程设计是比较成功的。当然,这其中也经历了许多坎坷,但是在我的坚持不懈下,在老师的细心指导下,在同学们的热情帮助下,最终克服了种种困难,取得了成功。 起初我还想从老师所给的四个单片机课程设计题目中选择一题,后来发觉自己自己对计算器挺感兴趣的,所以就决定利用自己所学的单片机知识自己做一个计算器。但由于以前从未做过像这种软硬件相结合的设计,所以我请教了好几个有参加电子竞赛的同学并且在网上和图书馆查阅了不少的有关于单片机课程设计的文献以及计数器的相关资料。我在了解计算机所需要的主体硬件之后决定编写程序,在此过程中,其中键盘扫描和动态扫描显示扫描程序困扰了我很久,经过三四天的辛苦工作,终于初步把所需要的程序编好了,于是keil 开始进行仿真,在仿真期间也发现了许多错误

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论