单片机课程设计报告书课题名称电子计算器姓名学号院、系、部电气系专业指导教师焦咏梅马丽高艳玲2011年7 月3日电子计算器设计一、设计目的简易计算器的原理与设计是单片机课程设计课题中的一个。
在完成理论学习和必要的实验后,我们掌握了单片机的基本原理以及编程和各种基本功能的应用,但对单片机的硬件实际应用设计和单片机完整的用户程序设计还不清楚,实际动手能力不够,因此对该课程进行一次课程设计是有必要的。
我们这次设计的题目是简易加减计算器,实现一位数的加减法,通过键盘扫描第一个数,然后扫描有没有加减功能键按下,如果功能键按下则继续扫描第二个数字,扫完第二个数字之后然后确定是加法键还是减法键按下,然后调用加减法子程序最后扫描有没有等于号按下,如果有等号键按下则结果输出数码管显示。
学习和掌握单片机中常用接口电路的应用和设计技术,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。
通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学的知识的应用能力以及分析问题解决问题的能力得到全面提高。
二、设计要求单片机课程设计既要让我们巩固课本学到的理论,还要学习单片机硬件电路设计和用户程序设计,使所学的知识更深一层的理解,数字计算器原理与硬软件的课程设计主要是通过学生独立设计方案并自己动手用计算机电路设计软件,编写和调试,最后仿真用户程序,来加深对单片机的认识,充分发挥学生的个人创新能力,并提高对单片机的兴趣,同时学习查阅资料、参考资料的方法。
通过实践更好的了解单片机,巩固了键盘扫描,数码管,等一系列单片机的知识。
本次设计我们需要AT89C51芯片,要充分理解各个管脚的用途;还是用了一个四位一体的共阴极的数码管,要知道其位控和字控的引脚位置;还用了4*4的键盘;采用手电复位。
本课程设计要求:1.扩展4*4键盘,其中10个数字,3个功能键,1个清零2.强化对于电路的焊接3.使用四位数码管接口电路4.完成十进制的四则运算(加、减);5.实现结果低于五位的连续运算;6.使用伟福6000 软件编写程序,使用汇编语言;7.最后用ptotel模拟仿真;8.学会对电路的调试三、硬件电路设计四、使用说明本设计是一个实现加、减的计算器,它的硬件主要由七部分组成,一个主单片机芯片,一个四位一体的共阴极的数码管,一个4*4的键盘,一个数码管锁存器74H573,一个复位电路,一个电源电路,一个晶振电路,它可以实现加、减运算。
首先.显示部分,让P2.0口做位扫描,P2.1口做段码输出,设置一个单元用来记录输入数字的位数,这样可以不用循环扫描每一位,而是根据输出位数判断扫描哪些位。
通过键盘扫描第一个数,然后扫描有没有加减功能键按下,如果功能键按下则继续扫描第二个数字,扫完第二个数字之后然后确定是加法键还是减法键按下,然后调用加减法子程序最后扫描有没有等于号按下,如果有等号键按下则结果输出数码管显示。
其次是设计键盘扫描程序,这里采用4*4矩阵键盘,通过软件识别,行和列可接在同个端口上,也可接在不同端口上,本设计行接在P3口的高四位,列接在P1口的低四位,通过循环扫描行,读取列的数据判断是否有键按下,如果有则调用按键识别程序识别是哪个键,执行相应的操作,按键识别是根据按键时得到的列代码与行代码组合,来判断是哪个键的。
按键识别后,如果是数字键则直接放入数码管显示缓冲区,如果再次有数字键按下,则应将缓存区的数字向高位移一位,将刚输入的数放入最低位,并且记录按键次数,每输入一个键值都调用显示程序显示出来,如果是运算符,则执行相应的运算,然后在调用显示程序显示结果。
最后是运算程序的加入,运算程序很简单,只要把+、-分别做成模块,用到时即可调用,本设计的难点是键盘识别和数值显示,因为这里边涉及到键盘输入的数值在内部要转换成10进制运算,运算结果要转换成各个位的显示数字输出。
五、流程图设计小于10 YES 不小于10NO NOYES YES开始调用显示子程序键盘扫描 得键值CJNE OAH 次数标志位置1存第一个数存第二个数 CJNEOFH CJNE OEH CJNE ODH CJNE OCH 相应的标志位置1是ADDD=1还是SUB=1NO NO YESYES 减法SUB=1NOADDD=1加法结果送显示六、程序设计如下:ADDD BIT 00H ;ADDD相当于位寄存器00HSUB BIT 01H ;SUB相当于位寄存器01HCISHU BIT 02H ;CISHU相当于位寄存器02HORG 0000HAJMP STARORG 0030HSTAR:MOV R0,#40H ;存放第一个数地址MOV 30H,#3FH ;没有按键时的数码管值0MOV R5,#00H ;CLR ADDD ;清除寄存器00HCLR SUB ;清除寄存器01HCLR CISHU 清除寄存器02HMAIN: LCALL DISPLAY;调用显示子程序MOV A,#0FFH ;键盘扫描开始LP: MOV P3,#00001111B;扫描子程序MOV A,P3JNB ACC.0,LP0 ;判断0列,是0跳到lLP0得到列键值JNB ACC.1,LP1 ;判断1列......JNB ACC.2,LP2 ;判断2列.....JNB ACC.3,LP3 ;判断3列......LCALL DELAY1 ;调用延时CJNEA,#0FH,XLS1XLS1:AJMP LPLP0:MOV B,#0;得到列值0AJMP LP15;跳到LP15得到判断行值LP1:MOV B,#1;得到列值1AJMP LP15;跳到LP15得到判断行值LP2:MOV B,#2;得到列值2AJMP LP15;....LP3:MOV B,#3;得到列值3LP15:MOV P3,#0FFH 初始化一下P3口MOV P3,#11110000B ;给高四位置一,为下步读值MOV A,P3;读回P3口值LCALL DELAY;调用延时JNB ACC.4,LP4;判断第四位,不唯1时,跳LP4读行值JNB ACC.5,LP5;判断第5位,不唯1时,跳LP5读行值JNB ACC.6,LP6;。
JNB ACC.7,LP7;。
AJMP LP8;都没有按下跳lp8LP4:MOV R3,#0;得到行值0AJMP LP8;跳到算出键值LP5:MOV R3,#4AJMP LP8LP6:MOV R3,#8AJMP LP8LP7:MOV R3,#12LP8:MOV A,BADD A,R3;行列相加LCALL DELAY ;调用延时MOV R4,A ;存键值MOV A,R4 ;键值放到aCJNE A,#0AH,N;和10比较AJMP N1 ;=与10跳到N:JNC N1 ;大于10(功能键)跳n1MOV A,R4 ;小于10存数JB CISHU,LL2 ;是1的话存第二个数MOV R0,#40H ;存第一个数MOV @R0,AAJMP LLLL2:MOV R0,#50H ;存第二数MOV @R0,ALL:LCALL CHABIAO ;查数码管表LCALL DISPLAY;调用显示函数N1:CJNE A,#0FH,NEXT;判断是不是清零键,不是清零键跳转MOV 30H,#3FH;清除数据缓冲区CLR ADDD;清除加号标志位CLR SUB;清除减号标志位MOV 40H,A;清除第1个数缓冲区MOV 41H,AMOV R0,#40H清除第二个数缓冲区MOV A,#3FH;送0的数码管数给显示缓冲区MOV 30H,ASJMP NEXT4;跳到结束NEXT:CJNE A,#0EH,NEXT1;判断是不是加键,不是加键跳转SETB ADDD;置加号标志位SETB CISHU,置次数标志位,为了判断存第二个数SJMP NEXT4;跳到NEXT4NEXT1:CJNE A,#0DH,NEXT2;判断是不是减键,不是减键跳转SETB SUB;置减号标志位SETB CISHUSJMP NEXT4NEXT2:CJNE A,#0CH,NEXT4;判断是不是等于键,不是等于跳转EQUAL:CLR CISHUJB ADDD,JIA;按下的是加号,调用加法子程序JB SUB,JIAN;按下的是减号,调用减法子程序AJMP NEXT4JIA:MOV R1,#40H;加法子程序MOV A,@R1;取第一个数MOV R1,#50H;取第二个数地址ADD A,@R1;两数相加LCALL CHABIAO;调用查表指令AJMP NEXT4;JIAN:CLR C;减法子程序MOV R1,#40HMOV A,@R1;取第一个数MOV R1,#50H;取第二个数地址SUBB A,@R1;两数相加MOV R4,ALCALL CHABIAO;调用查表子程序LCALL DISPLAY;调用显示NEXT4:AJMP MAINCHABIAO:MOV DPTR,#TAB ;查表子程序MOVC A,@A+DPTRMOV 30H,ARETDISPLAY:MOV A,#11110111B;显示子程序SETB P2.1;位选MOV P1,A;传位码MOV A,30H;取要显示的数码管值SETB P2.0;段选MOV P1,ACLR P2.0LCALL DELAY;调用延时DELAY:MOV R7,#0FFH;延时子程序LP11: DJNZ R7,LP11RETDELAY1:MOV R7,#9CHLP12: DJNZ R7,LP12RETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H;数码管值RETEND七、设计总结:我们这次设计的课题是简易加减计算器,要求实现加减运算,由于能力有限我们最后的成果只是可以实现一位数的加减法,在实验过程中我遇到了很多问题。
当我刚刚接到这个课题时,觉得加减计算器就是实现加减法,以前我们都接触过,应该没有什么问题,但是当我真正开始编程时,遇到的第一个问题就是如何进行键盘扫描,经过查阅课本和课外资料我把这个问题解决了。
第二个问题是当我做protel图时也遇到了不少问题,例如我要十分清楚我的加减计数器的各个元件,引脚接线图如何分配,必须对引脚作用什么清楚,我也向同学请教了,与同组的同学进行了讨论,最后做出了protel图。
第三个问题时焊板子,我觉得这是一项考验耐心的实践,如果没有耐心的话你的板子就会出问题,我的板子第一次就出现了问题,最后检查出是由于某处虚焊了,我也总结了教训,做什么事情都要有耐心,很可能就以为粗心的问题整个程序就无法实现了。
最后一个难题也是我自认为遇到的最大问题,在两天时间里,一直在研究这个问题,就是如何把我的程序在板子上实现,因为试验箱和板子是不同的,所以我们的程序必须修改,这真的是一项严峻的考验,要求必须对你的程序和你的引脚什么熟悉,在两天时间里我仔细分析我的程序,对照我的protel图,经过反复实践,反复修改程序,终于在板子上可以实现加减法了,这种喜悦无法言语。