单片机课程设计报告简易计算器的设计.doc
-目录摘要1绪论11.设计要求及功能分析11.1设计要求11.2根本功能22.设计方案22.1硬件局部设计方案2 单片机局部2 按键局部2 显示局部22.2软件局部设计方案23.系统的硬件总体设计43.1 系统的总体硬件设计43.2 键盘连接电路43.3 显示屏连接电路53.4 单片机芯片AT89C5163.5 外接电路74.系统的软件总体设计84.1 键盘识别程序设计84.2 显示程序114.3 运算程序115.元器件清单及程序清单125.1 元器件清单125.2 程序清单126.软件仿真186.1 仿真验证186.2 性能分析206.3 出现故障及其原因206.4 解决方法20结论20参考文献21致21附录PCB图22简易计算器的设计学生:飞 马鹏超 舒宏超指导教师:王孝俭摘 要:单片机是指一个集成在一块芯片上的完整计算机系统。尽管他的大局部功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大局部部件:CPU、存、部和外部总线系统,目前大局部还会具有外存。同时集成诸如通讯接口、定时器,实时时钟等外围设备。而现在最强大的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块芯片上。单片机部也用和电脑功能类似的模块,比方CPU,存,并行总线,还有和硬盘作用一样的存储器件,不同的是它的这些部件性能都相对我们的家用电脑弱很多,不过价钱也是低的,一般不超过10元即可,用它来做一些控制电器一类不是很复杂的工作足矣了。我们现在用的全自动滚筒洗衣机、排烟罩、VCD等等的家电里面都可以看到它的身影!它主要是作为控制局部的核心部件。它是一种在线式实时控制计算机,在线式就是现场控制,需要的是有较强的抗干扰能力,较低的本钱,这也是和离线式计算机的比方家用PC的主要区别。单片机比专用处理器最适合应用于嵌入式系统,因此它得到了最多的应用。事实上单片机是世界上数量最多的计算机。现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。手机、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。而个人电脑中也会有为数不少的单片机在工作。汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!单片机的数量不仅远超过PC机和其他计算的综合,甚至比人类的数量还要多。关键词:单片机、计算器、控制电路、仿真。绪论设计要求掌握数码管移位动态扫描显示的编程方法,掌握矩阵扫描的编程方法,掌握数据在部运算的编程方法。设计任务实现最大8位正整数加、减、乘、除,具备清零、等于功能,16个按键功能依次为: 数字0、数字1、数字2、数字3、数字4、数字5、数字6、数字7、数字8、数字9、清零、等于、加、减、乘、除。1设计要求及功能分析1.1设计要求:本次单片微型计算机与接口技术课程设计做的是利用C51单片机为主体的计算器,实现了简单的加、减、乘、除功能。采取的是键盘输入和液晶显示屏的输出结果显示。主要硬件构成局部由四个,一个AT89C51单片机芯片,一个液晶显示屏,一个4*4键盘和一个排阻10K做P0口的上拉电阻,可以实现16位的数值操作计算。1.2根本功能:首先,计算器可现实8位数字,开机运行时,只有数码管最低位显示为“0,其他位全部不显示;其次,可以对计算结果在16位以的;两个无符号数进展加、减、乘、除运算,并显示计算结果,如果输入操作数和输出结果超过16位,则会显示“error,以提示使用者输入错误,应清零后重新输入。最后,运算时,如果按错了可以使用清零键直接清零,重新输入数据,运算过程中,如果运算表达式是加、减、乘、除混合运算,可以进展连续运算,不需要按等号键,运算规则则是从左到右,不区分运算等级。即认为加减乘除是同等级的运算。2.设计方案2.1硬件局部设计方案 单片机局部单片机以AT89C51来作为核心元器件。按键局部方案一:采用4*4行列式键盘,分别设定数字键和功能键,采用查询方式,每次有键按下时,先判断是实数字键还是功能键,但是这种方式采用了大量的I/O口线。方案二:采用独立式按键,独立式按键借口电路配置灵活,软件构造简单。虽然采用独立式按键时每个按键必须占用一根I/O口线,但是在本实验中根据实际的需要采用通过四个按键即只占用四个I/O口线,而如果采用4*4行列式键盘时占用8个I/O口线,所以我们采用一方案。显示局部在单片机应用系统中,使用的显示器主要有LED发光二极管显示器、LCD液晶显示亲以及CRT接口。方案一:使用8位LED数码管来显示,LED显示器是由发光二极管显示字段组成的显示器件,在单片机应用系统常使用的是七段LED,这种显示器有共阴极和共阳极两种,它具有本钱低廉、配置灵活和单片机接口方便等特点。方案二:使用液晶显示器来显示。液晶是介于固态和液态间的有机化合物,将其加热会变成透明液态,冷却后变成结晶的浑浊固态。在电机的作用下,产生冷热变化,从而影响它的透光性,来到达显示的目的。LCD还具有以下优点:1低压、微功耗;2显示信息量大;3长寿命;4无辐射、无污染。2.2软件局部设计方案软件局部的设计思路时将整个程序划分为键盘扫描局部、显示局部、运算程序局部、清屏显示局部。对于其中的键盘扫描局部在编写时又分为动态扫描和静态扫描;运算程序局部包括加、减、乘、除四个子程序。软件流程大致如下:开场,然后是系统的初始化,进展键盘扫描,对扫描的键值进展判断分为数字键和功能键,如果是数字键,执行数字处理子程序,即显示数字并将数值存储;如果是命令键,即先判断是否为清屏,如为清屏键,则执行清屏子程序,假设为加减乘除运算键则显示相应的符号并存储结果,假设都不是则为=键,即要先判断上个符号位,然后调用对应的运算子程序运算,就可以得到需要的结果。8位LCD显示局部51系列单片机时钟电路和复位控制电路4*4键盘图1 系统原理框图3. 系统的硬件总体设计3.1 系统的总体硬件设计硬件系统是指构成微机系统的实际装置,通常是由运算器、控制器、存储器、输入接口电路和输入设备、输出接口电路和输出设备等组成。单片机实质上是一个硬件的芯片,在实际应用中,通常很难直接和被控对象进展电气连接,必须外加各种拓展接口电路、外部设备等才能构成一个单片机应用系统。单片机芯片选择AT89C51,显示区域使用显示屏,键盘是4*4普通矩阵键盘,P0口接上拉电阻,芯片的P0口和P3口的前5脚接入数字显示屏,键盘横行AD接入单片机芯片AT89C51的后四个接口,键盘的竖行14则分别接入单片机芯片AT89C51的P2口的前四个接口。另外12M Hz晶振接入单片机芯片AT89C51的*TAL1接口。系统总接线图如下:图2 系统硬件总接线图3.2 键盘连接电路本设计之中使用的是4*4的普通键盘,我们可以使用其行列号来识别被按下的按键以此来获知被按键的信息,因此将行输出信号和列输出信号分别接入单片机芯片C51的P2口,通过循环扫描,读取行列的数据来判断是否有按键被按下,如果有则调用按键识别程序来识别具体按键,并执行相应的操作,按键识别是根据按键时得到的列代码与行代码的结合,在汇编语言中进展查表来判断是哪个键。键盘如图:图3 数字输入键盘3.3 显示屏连接电路如上所述,当数字输入键盘有键按下的时候,经过程序识别,则会有相应结果被送入显示屏得到显示。如果是数字键则直接放入液晶显示缓冲区,如果再次有数字键按下,则应将缓冲区的数字向高位移动一位,以构成两位数,之前输入的置之高位,并记录按键次数,每输入一个键值都调用显示程序出来;如果是运算符,则执行相应的运算,送入单片机芯片C51进展计算后将结果调用显示程序显示结果。该设计中选取的是LM0202型号液晶显示屏,如下列图:图4 液晶显示屏3.4 单片机芯片AT89C51应本次课程设计的要求,此设计之中选取的是C51芯片,取代了之前设计之中的pic芯片。芯片包含有一个8位CPU;一个片振荡器及时钟电路;4KB ROM程序存储器;128B RAM数据存储器;可寻址64KB外部数据存储器和64KB外部程序存储空间的控制电路;32条可编程的I/O线4个8位并行I/O端口;两个16位的定时/计数器;一个可编程全双工串行口;5个中断源、两个优先级嵌套终端构造。芯片如下列图:图5 单片机芯片AT89C513.5 外接电路为了进一步强化该设计的功能,所以在单片机芯片C51外围添加了时钟脉冲芯片和复位电路,这样就可以对其电路频率进展调节。这个电路当中,是选取的是12M的晶振,对其两头电容接地,并一端接入芯片*ALT1端口输入,调节芯片部频率。另外一端,高电平通过按钮接入单片机芯片RST端口,并接一个电容和一个电阻,降低电流冲击对芯片的影响。时钟脉冲电路和复位电路如下列图:图6 时钟脉冲电路和复位电路由此,就是由以上的键盘连接电路、显示屏连接电路、外部电路和芯片共同构成了整个设计的硬件构造局部。4.系统的软件总体设计编程语言当中,汇编语言比拟接近底层,编程效率高;C语言则语言灵活,在编写算法中会比拟方便。但是我们在学习中是学习的汇编语言,我们还是对于单片机的编程更加熟悉,尽管汇编语言在计算器中涉及到算法之中会比拟繁琐,但是我们还是选择汇编语言。4.1 键盘识别程序设计首先将P2口送0E0H,将P1口弦送1在读P1口的数据当P1口低四位全1时说明没有键按下;再扫描下一行,如果P1口不是全1,则说明有键按下,将P2口高四位和低四位组合成一个字节,放入R5存放器中,通过延迟技术来进展按键去抖,判断按键是否松开,如松开则将得到的键值进展判断是哪一个键。如果是数字键则首先将其对应的数字放入缓冲区30H,同时将键值放入结果缓冲区,并调用显示程序,显示键值。在调用扫描键盘程序,如果再有键值输入则将原来的数值在显示屏高位依次移一位,将刚键入的数值放入最低位,并将原来的数值乘十加上刚键入的键值的数放入结果缓冲区,然后调用显示程序;如果是运算符,则记录运算符标志,加法用01H表示,剑法使用02H表示,乘法使用03H表示,除法使用04H表示,并将结果缓冲区的数转移到中间结果红区,将结果缓冲区清零,等待输入运算数据,当按下等号时,根据记录的运算符标志,判断运算类型,执行运算将结果依次除以10取余数放入结果显示缓冲区,调用显示程序。依次循环执行。键盘识别程序流程图如下:开场扫描键盘是否有键按下是否为等号计算并显示最终结果完毕是否为计算符读进内存之前是否有计算符先计算显示暂时的结果读进内存并调用显示程序YYYYNNNN图 7 键盘识别程序流程图扫描第一行是否有键按下扫描第四行扫描第三行扫描第二行是否有键按下是否有键按下是否有键按下开场完毕图8 键盘扫描程序流程图4.2 显示程序显示程序是将30H37H单元设置成液晶显示屏显示缓冲区,分别存放各个位置的数据,40H单元作为输入数据的计数单元。因为运算结果超出围时应采取报错,使之显示“error即可,将数字09和“error存入列表中,当调用显示程序时,显示程序根据40H单元记录的个数决定显示位数。如果输入错误将在数码管上显示“error。这样就得到了显示程序的入口:30H37H,依次存放各位到千万位;40H,存放输出的数字位数。出口:数码管,P0输出字段码P2输出位选码。开场初始化R0缓冲区指针,R1位控制,RS循环控制次数,R0=30H, R1=*80H, R5=40H数码管显示判断显示是否完毕?完成YN图9 显示程序流程图4.3 运算程序运算程序分四个模块,即加减乘除。分别采用两字节运算,因此运算结果不能超出亮字节,否则会溢出。溢出时显示“error。加法程序:入口是R0被加数低位字节地址指针,R1加数低位字节地址指针,R3字节数。出口R0和值地址指针,R3和值字节数。运算时用R0、R1间接寻址,从低字节算起,高字节采用带进位加ADDC,计算结果回送到R0所指的单元中,并将和字节数放入R3单元中,如果R3大于3说明溢出。减法程序同加法类似,入口R0被减数低位字节地址指针,R1减数低位字节地址指针,R3字节数。出口R0差值低位字节地址指针,R3差值字节数。只是判断溢出时通过CY位,如果运算后CY位有借位,则将07H位置1,否则置0.乘法程序入口R3被乘数低位地址字节,R2被乘数高位地址字节,R7乘数低位地址字节,R6乘数高位地址字节。出口R3,R5,R6,R7结果字节由高到低。通过判断R5是否为零就可以知道运算结果是否溢出,如果溢出就显示“error。除法程序入口被除数放在R4R5R6R7,R4R5容为0,R4高R5低,除数放在R2R3,R2高R3低。出口商放在R6R7,R6高R7低,余数放在R4R5,R4高R5低。5.元器件清单及程序清单5.1元器件清单序号名称型号数量1滑动变阻器3214G-1-100E1251系列单片机AT89C5113按钮BUTTON14电容CAP 22pF25电容CAP-ELEC 20uF16晶振CRYSTAL 12MHz174*4键盘KEYPAD-SMALLCALC18液晶显示器LM020L19电阻RES 1k110上拉电阻RESPACK-81. z.-5.2程序清单 rs equ p1.5 ;确定具体硬件的连接方式 rw equ p1.6 ;确定具体硬件的连接方式 e equ p1.7 ;lcd1602引脚org 0hmain:acall startmov p0,*8fh ;写入显示起始地址第一行第一个位置 acall enable ;调用写入命令子程序movr0,*2fhmov 2fh,*30hmov r6,*1 acall write1mov 55h,*0;运算方式标志main1:mov r0,*20hd: mov r0,*0inc r0 cjne r0,*50h,d ;清理系统存mov50h,*0;被操作数的位数mov51h,*0;操作数的位数mov 52h,*0 ;结果的位数mov 53h,*0;mov 58h,*0;符号标志位d0:mov 56h,*0mov r1,*50hmov 54h,*2fhsjmp test;接收被操作数d1:mov a,50hcjne a,*0,d2mov 50h,*1acall startmov p0,*8fh acall enablemovr0,*2fhmov 2fh,*30hmov r6,*1 acall write1d2:mov r1,*51hmov 54h,*3fhsjmp testtest: mov p2,*0f0h mov a,p2anl a,*0f0h ;anl :与cjne a,*0f0h,have ;a!=f0, sjmp havesjmp testhave:mov a,*0fehne*t:mov b,a mov p2,aread:mov a,p2 anl a,*0f0h ;a=f0cjne a,*0f0h,yesmov a,brl acjne a,*0efh,ne*tyes:acall daymov a,p2anl a,*0f0hcjne a,*0f0h,yes1sjmp testyes1:mov r2,amov a,banl a,*0fhorl a,r2 ;orl 或y0: cjne a,*0e7h,y1 ajmp mainy1: cjne a,*0d7h,y2 mov b,*31h ajmp chay2: cjne a,*0b7h,y3 mov b,*34h ajmp chay3: cjne a,*77h,y4 mov b,*37h ajmp chay4: cjne a,*0ebh,y5mov b,*30h ajmp chay5: cjne a,*0dbh,y6 mov b,*32h ajmp chay6: cjne a,*0bbh,y7 mov b,*35h ajmp chay7: cjne a,*7bh,y8 mov b,*38h ajmp chay8: cjne a,*0edh,y9cjne r1,*50h,y81cjne r1,*0,y81ajmp d0y81:mov a,55hcjne a,*0,y82ajmp d0y82:mov a,5ahcjne a,*0,y87mov a,51hcjne a,*0,y88mov 51h,50hmov r0,*2fhmov r1,*3fhmov r2,*10hy83:mov a,r0mov r1,adec r0dec r1djnz r2,y83mov a,55hcjne a,*1,y84mov a,58hcjne a,*0ffh,y87mov 55h,*2sjmp y87y84:cjne a,*2,y88mov a,58hcjne a,*0ffh,y87mov 55h,*1sjmp y87y88:mov a,55hcjne a,*3,y89sjmp y85y89:cjne a,*4,y87y85:mov a,58hcjne a,*0ffh,y86mov 59h,*0ffhy86:*rl a,59hmov 58h,ay87:acall suanajmp d0y9: cjne a,*0ddh,ya mov b,*33h ajmp chaya: cjne a,*0bdh,yb mov b,*36h ajmp chayb: cjne a,*7dh,yc mov b,*39h ajmp chayc: cjne a,*0eeh,ydmov a,*1mov 59h,*0push accacall fsjmp ygyd: cjne a,*0deh,yemov a,*2mov 59h,*0push accacall fsjmp ygye: cjne a,*0beh,yfmov a,*3mov 59h,*0push accacall fsjmp ygyf: mov a,*4mov 59h,*0push accacall fyg:pop 55hmov 51h,*0mov r0,*30hyg0:mov r0,*0inc r0cjne r0,*40h,yg0ajmp d1cha:mov a,56hcjne a,*0,cha6sjmp cha0cha6:cjne r1,*10,cha0ajmp testcha0:mov 59h,*0;乘法和除法中用cjne r1,*50h,cha2mov 55h,*0mov 58h,*0mov a,56hcjne a,*0,cha2mov 56h,*1mov 50h,*0mov r0,*20hcha1:mov r0,*0inc r0cjne r0,*30h,cha1cha2:cjne r1,*1,cha3mov r0,54hcjne r0,*30h,cha3mov r0,*0mov r1,*0cha3:cjne r1,*51h,cha4mov 5ah,*2cha4:mov r2,*8 ;重要语句cha5:mov a,54hsubb a,r2mov r0,amov a,r0dec r0mov r0,adec r2inc r0mov a,r0cjne a,54h,cha5mov r0,54hmov r0,bacall showajmp test;f:mov 5ah,*0cjne r1,*50h,f3mov 51h,*0mov r0,*30hff:mov r0,*0inc r0cjne r0,*40h,fff2:pop dplpop dplmov dptr,*yg push dpl push dphretf3:mov a,51hcjne a,*0,f4sjmp f2f4:acall suanretshow:acall startmov a,*8fhsubb a,r1mov p0,a ;写入显示起始地址第一行第一个位置 acall enable ;调用写入命令子程序mov a,54hsubb a,r1mov r0,aincr1mova,r1mov r6,a acall write1ret;lcd1602局部start:movp0,*1h;清屏并光标复位acall enable;调用写入命令子程序movp0,*8h;设置显示模式:8位2行5*7点阵acall enable;调用写入命令子程序 movp0,*0ch;显示器开、光标关acall enable;调用写入命令子程序movp0,*6h;文字不动,光标自动右移acall enable;调用写入命令子程序retenable:clr rs ;写入控制命令的子程序clr rwclr eacall delaysetb eretwrite1:mov a,r0lcall write2 ;调用写入数据存放器子程序inc r0 ;取码指针加1djnz r6,write1retwrite2:mov p0,asetb rs ;rs=1clr rw ;rw=0准备写入数据clr e ;e=0执行显示命令acall delay ;判断液晶模块是否忙"(用延时代替)setb e ;e=1retdelay:mov r2,*2fhdl1:mov r3,*0fhdjnz r3,$djnz r2,dl1retday:mov r2,*100 ;按键延时0.1sdl3:mov r3,*250dl2:nopnopdjnz r3,dl2djnz r2,dl3ret;计算局部suan:mov a,55hcjne a,*1,su0mov a,58hcjne a,*0,suacall jiafasjmp suan0su:acall jianfasjmp suan0su0:cjne a,*2,su4mov a,58hcjne a,*0,su1acall jianfasjmp suan0su1:acall jiafasjmp suan0su4:cjne a,*3,su5acall chengfasjmp suan0su5:acall chufasuan0:mov r0,50hcjne r0,*16,suan1suan1:jc suan2su6:mov r0,*20hsu7:mov r0,*0inc r0cjne r0,*30h,su7mov 2ah,*'E'mov 2bh,*'r'mov 2ch,*'r'mov 2dh,*'o'mov 2eh,*'r'mov 2fh,*'!'acall startmov p0,*80hmov r0,*20hmov r6,*10h acall write1pop dplpop dplmov dptr,*main1push dplpush dphretsuan2:mov 53h,*1mov a,50hcjne a,*1,suan3mov a,2fhcjne a,*30h,suan3sjmp suan4suan3:mov a,58hcjne a,*0ffh,suan4mov a,*2fhsubb a,50hmov r1,amov r1,*'-'suan4:acall startmov p0,*80hmov r0,*20hmov r6,*16 acall write1mov r1,*0ret;加法局部jiafa:mov a,50hcjne a,51h,jia1jia1:jc jia2mov r2,50hmov 52h,50hsjmp jia3jia2:mov r2,51hmov 52h,51hjia3:mov 54h,*2fhmov 57h,*3fhmov r1,*4fhjia4:mov r0,54hmov a,r0anl a,*0fhpush accmov r0,57hmov a,r0anl a,*0fhpop badd a,bpush accmov a,r1pop badd a,bacall bcdmov r1,bdec r1mov r1,adec 54hdec 57hdjnz r2,jia4mov a,*4fhsubb a,52hmov r0,acjne r0,*0,jia5sjmp jia6jia5: inc 52hjia6:acall jieguoretjianfa:mov a,50hcjne a,51h,j3j0:mov r2,50hmov a,*2fhsubb a,50hinc amov r0,aadd a,*10hmov r1,aj1: mov a,r0subb a,r1cjne a,*0,j2inc r0inc r1djnz r2,j1mov r0,*20hj5: mov r0,*0inc r0 cjne r0,*2fh,j5mov 58h,*0mov 2fh,*30hmov 50h,*1retj2:mov a,r0subb a,r1j3:jnc j4mov 54h,*3fhmov 57h,*2fhmov r1,*4fhmov r2,51hmov 52h,51hmov a,58hcpl amov 58h,asjmp jianj4: mov 54h,*2fhmov 57h,*3fhmov r1,*4fhmov r2,50hmov 52h,50hjian:mov r0,57hmov a,r0anl a,*0fhpush accpop bmov r0,54hmov a,r0anl a,*0fhclr cpush accpush bsubb a,bpush accjnc jian3pop bpop bpop accadd a,*10subb a,bmov r1,amov a,r2mov r3,adec r3mov r0,54hdec r0jian1:clr cmov a,r0anl a,*0fhpush accsubb a,*1push accjnc jian2clr cpop bpop accadd a,*10subb a,*1orl a,*30hmov r0,adec r0djnz r3,jian1jian2:pop accorl a,*30hmov r0,apop bsjmp jian4jian3:pop accmov r1,apop bpop bjian4:dec 54hdec 57hdec r1djnz r2,jianlcall jieguomov a,*2fhsubb a,50hinc amov r0,ajian5:cjne r0,*30h,jian6mov r0,*0dec 50hinc r0cjne r0,*30h,jian5jian6:ret;乘法局部chengfa:mov a,50hcjne a,*1,cheng4mov a,2fhcjne a,*30h,cheng4retcheng4:mov a,51hcjne a,*1,cheng5mov a,3fhcjne a,*30h,cheng5mov 52h,*1sjmp chengcheng5:mov 57h,*3fhmov r2,*0mov a,50hadd a,51hmov 52h,amov r3,51hcjne a,*17,cheng3cheng3:jc chengmov 50h,*16retcheng:mov 54h,*2fhmov r1,*4fhmov a,r1clr csubb a,r2mov r1,amov r4,50hcheng0:mov r0,54hmov a,r0anl a,*0fhpush accmov r0,57hmov a,r0anl a,*0fhpop bmul abpush accmov a,r1pop badd a,blcall bcdmov r1,bdec r1push accmov a,r1pop badd a,bmov r1,adec 54hdjnz r4,cheng0dec 57hinc r2djnz r3,chengdec 52hmov a,*4fhsubb a,52hmov r0,acjne r0,*0,cheng1sjmp cheng2cheng1: inc 52hcheng2:lcall jieguoret;除法局部chufa:mov a,51hcjne a,*1,chufmov a,3