您的当前位置:首页正文

4位数计算器的设计

2021-08-20 来源:爱go旅游网


目录

摘要 ...................................................................... 0 1 总体任务 ................................................................ 1 1.1设计目的 .............................................................. 1

1.2设计内容和要求 ..................................................... 1 1.3 设计思路 .......................................................... 1 2 设计原理分析 ............................................................ 2

2.1 计算器的工作原理 .................................................. 2

2.1.1 计算器的工作流程 ............................................ 2 2.1.2 编程实现控制 ................................................ 2 2.1.3 功能拓展 .................................................... 2 2.2 单片机计算器的基本构成及原理 ...................................... 2 3硬件电路的设计 .......................................................... 4

3.1系统硬件总电路构成及原理 ........................................... 4 3.2硬件电路的部分组成元器件的简介 ..................................... 4

3.2.1AT89C51单片机 ................................................ 4 3.2.2 八段LED数码管 ............................................... 4 3.2.3 矩阵键盘 ..................................................... 6 3.3 元器件清单 ........................................................ 7 3.4 电路原理图 ........................................................ 7 4 系统程序的简单设计 ...................................................... 8

4.1 程序方框图 ........................................................ 8 4.2 计算器程序 ........................................................ 8 5 系统的仿真调试 ......................................................... 15 6 课程设计总结 ........................................................... 16 参考文献 ................................................................. 17

摘要

本文论述了单片机4位数加法计算器的设计,从对设计任务的分析到画电原理图到编程和最后的仿真调试,都进行了一个简单的描述。

在设计过程中,采用Keil软件编写源程序,用Protues 7 professional的ISIS 7 professional软件画电原理图并且仿真,通过对编程时的编译和对仿真结果现象的观察,不断地对源程序以及电原理图的修改,最后成功设计出了一个能够进行4位数加法运算的计算器。该计算器通过4×4的矩阵键盘输入数字及运算符,若运算结果超过4位十进制数,则显示为E;另外,也能进行减法、乘法以及除法的运算,在进行减法运算时,若运算结果小于零,则显示其绝对值;进行除法运算时,若除数等于零,则显示E。

关键词:计算器;单片机;数码管;矩阵键盘

0

1 总体任务

1.1设计目的

1.通过单片机课程设计,熟练掌握c语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力。

2.通过4位数加法计算器的设计,掌握c语言编程的基本语法,和简单程序的编写,最终提高我们的逻辑抽象能力。

1.2设计内容和要求

内容:设计一个4位数加法计算器

要求:该计算器通过4×4的矩阵键盘输入数字和运算符,能进行4位十进制以内的正数的加、减、乘、除的运算,如果运算结果超过4位十进制数,4位数码管全部显示为E。

1.3 设计思路

1.先熟悉实验原理,了解计算器的工作过程及其显示,了解计算器电原理图的组成元器件。

2.了解各元器件的工作原理。

3.在keil软件里编写程序,用Protues 7 professional的ISIS 7 professional软件绘制电原理图,并进行仿真,通过对仿真现象的观察,修改原理图或程序,直到满足设计要求为止。

1

2 设计原理分析

2.1 计算器的工作原理

2.1.1 计算器的工作流程

计算器是对键盘输入的数字及运算符等信号进行分析和处理,最后通过数码管显示出结果的计算工具。当然,在输入数字的同时,数码管也是会显示出输入的数字的,其整个工作流程图如图2.1所示。

外界输入数字或运算符

微处理器处理并运算 显示器显示结果

图2.1 计算器的工作流程图

2.1.2 编程实现控制

通过编写程序,实现对输入信号的识别、输入数字的显示以及运算结果的显示。

2.1.3 功能拓展

在进行减法运算时,若运算结果小于0,数码管显示其绝对值;在进行除法运算时,若除数等于0,数码管显示EEEE。

2.2 单片机计算器的基本构成及原理

AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。它能进行简单的运算,通过编写程序,可以让它完成对输入信号的识别、处理以及显示等功能。它完全能满足4位加法计算器的要求,能够完成对键盘输入信号的识别、处理等功能。

2

据此,本设计系统以单片机位核心,连接成最小系统,由键盘输入模块和4位数码管输出模块等组成,系统放入总体方框图如图2.2所示。

键盘输入

最小系统外围接口电路 单片机

数码管显示

图2.2系统的总体方框图

键盘作为整个系统的输入端口,单片机是整个系统的核心,兼有识别信号和处理等功能,而数码管是整个系统的输出部分,用于显示输入的数字和运算后的结果。

3

3硬件电路的设计

3.1系统硬件总电路构成及原理

实现本设计要求的具体功能,可以选用AT89C51单片机及外围器件构成最小控制系统,4×4的矩阵键盘和4位共阳极的数码管组成。其中4×4的矩阵键盘是用来输入信号的,而4位共阳极的数码管是用来显示输入的数字及运算结果的。

3.2硬件电路的部分组成元器件的简介 3.2.1AT89C51单片机

AT89C51单片机是80C51类型中的一种,其基本型包含CPU系统、存储器系统和I/O口及其他功能单元。单片机的最小控制系统如图3.1所示。

图3.1 单片机及其最小控制系统

3.2.2 八段LED数码管

LED显示屏作为大型显示设备的一种,具有亮度高、价格低、寿命长、维护简便等优点。LED数码管的结构简单,分为七段和八段两种形式,也有共阳极和共阴极之分。以八段共阳管为例,它有8个发光二极管(比七段多一个发光二极管,用来显示sP,即点),每个发光二极管的阳极连在一起。这样,一个LED数码管就有I根位选线和8根段选线,要想显示一个数值,就要分别对它们的高低电平来加以控制。为方便起见,本文主要讨论共阳极八段LED数码显示管,其他类形的显示管与其类似。图3.2即为八段数码管,下面的引脚从左至

4

右一次为a,b,c,d,e,f,g,dp和位选引脚。

图3.2 LED数码管

数码管的显示原理:通过同名管脚上所加电平的高低来控制发光二极管是否点亮而显示不同的字形,如a,b,c,d,e,f,g全亮是显示为8,其中共阳极连接的数码管的驱动代码如表3.1所示。

表3.1 共阳极数码管驱动代码

显示数值 0 1 2 3 4 5 6 7 8 9

dp g f e d c b a 1 1 0 0 0 0 0 0 1 1 1 1 1 0 0 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 1 0 0 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 驱动代码(16进制) C0 F9 A4 B0 99 92 82 F8 80 90 5

4位八段数码显示管是由4个数码管组成,如图3.3所示,其左侧的a,b,c,d,e,f,g,dp

为数码管的驱动引脚,右侧的1,2,3,4为数码管的位选引脚。

图3.3 4位数码显示管

4位数码管显示计算数据的过程:如输入数字4136,当从键盘上输入4时,4位数码管第4位显示4,其他三位不亮;再次输入1时,数码管第3位显示4,同时第4位显示1,其他两位不亮;再次输入3时,数码管第2位显示4,同时第3位显示1,第2位显示3,第一位不亮;再次输入6时,数码管第1位显示4,同时第2位显示1,第3位显示3,第4位显示6。

3.2.3 矩阵键盘

矩阵键盘是由16个按钮组成的, 16个按钮按4行4列的顺序排列构成4×4的矩阵键盘,如图3.4所示,图3.4所示的键盘是Protues 7 professional的ISIS 7 professional软件中的一个元器件,其原理就是16个按钮按4行4列排列构成的。

图3.4 矩阵键盘

在4位计算器的设计中,单片机识别矩阵键盘是通过按列扫描的方式进行的。其具体过程如下:对所有的列加以高电平,对第一行(A行)加以低电平,扫描列的电平变化,如列有高电平变为低电平,则能确定按下的键是哪一个;如第一列没有电平变化,依次对第二行(B行)、第三行(C行)和第四行(D行)加以低电平,分别对列进行扫描,看列

6

的电平变化,来确定按下的键。

3.3 元器件清单

4位加法计算器的硬件电路图主要由表3.2所示的元器件组成

表3.2元器件列表

器件 AT89C51单片机 晶体 电阻 电容 矩阵键盘 4位8段数码管 核心器件 51单片机工作的振荡源 对电流大小进行限制 51单片机复位和振荡源工作的辅助器件 用于输入数字和运算符 用于显示输入的数字及运算结果 说明 3.4 电路原理图

图3.5 系统电路原理图

7

4 系统程序的简单设计

4.1 程序方框图

开始 初始化 显示0 取第一个数 取运算符 取第二个数 取等于号 计算并显示结果 结束 图4.1 计算器程序流程图4.2 计算器程序

#include

8

sbit P3_0=P3^0; sbit P3_1=P3^1; sbit P3_2=P3^2; sbit P3_3=P3^3;

unsigned char sz[12],xs1[4],xs2[4],xs3[4],xs4[4],sj; int i,cs,bb,t1,t2,fh,s1,s2,k; void chushihua() { bb=1;

xs1[0]=10;xs1[1]=10;xs1[2]=10;xs1[3]=10; xs2[0]=10;xs2[1]=10;xs2[2]=10;xs2[3]=10; xs3[0]=11;xs3[1]=11;xs3[2]=11;xs3[3]=11; xs4[0]=0;xs4[1]=10;xs4[2]=10;xs4[3]=10; t1=0;t2=0;s1=s2=0; fh=0; cs=1;

}

void xianshi(unsigned char xs[4]) { int i,j;

unsigned char zy; zy=0xf1; for (i=0;i<4;i++) { P2=(0xff-zy); P1=sz[xs[i]]; zy=(zy>>1);

for (j=0;j<100;j++) ;

/*初始化程序*/

/*显示程序*/

9

}

return;

}

unsigned char saomiao() /*键盘扫描程序*/

{ int i;

unsigned char pp; for(i=0;i<1000;i++); P0=0xfe; P3=0x0f; pp=P3;

if (P3_0==0) {P3=0x0f;pp=P3;while (P3_0==0);for (i=0;i<1000;i++);return 7;} if (P3_1==0) {P3=0x0f;pp=P3;while (P3_1==0);for (i=0;i<1000;i++);return 8;} if (P3_2==0) {P3=0x0f;pp=P3;while (P3_2==0);for (i=0;i<1000;i++);return 9;} if (P3_3==0) {P3=0x0f;pp=P3;while (P3_3==0);for (i=0;i<1000;i++);return 11;}

P0=0xfd; P3=0x0f; pp=P3;

if (P3_0==0) {P3=0x0f;pp=P3;while (P3_0==0);for (i=0;i<1000;i++);return 4;} if (P3_1==0) {P3=0x0f;pp=P3;while (P3_1==0);for (i=0;i<1000;i++);return 5;} if (P3_2==0) {P3=0x0f;pp=P3;while (P3_2==0);for (i=0;i<1000;i++);return 6;} if (P3_3==0) {P3=0x0f;pp=P3;while (P3_3==0);for (i=0;i<1000;i++);return 12;}

P0=0xfb;

P3=0x0f;

10

pp=P3;

if (P3_0==0) {P3=0x0f;pp=P3;while (P3_0==0);for (i=0;i<1000;i++);return 1;} if (P3_1==0) {P3=0x0f;pp=P3;while (P3_1==0);for (i=0;i<1000;i++);return 2;} if (P3_2==0) {P3=0x0f;pp=P3;while (P3_2==0);for (i=0;i<1000;i++);return 3;} if (P3_3==0) {P3=0x0f;pp=P3;while (P3_3==0);for (i=0;i<1000;i++);return 13;}

P0=0xf7; P3=0x0f; pp=P3;

if (P3_0==0) {P3=0x0f;pp=P3;while (P3_0==0);for (i=0;i<1000;i++);return 16;} if (P3_1==0) {P3=0x0f;pp=P3;while (P3_1==0);for (i=0;i<1000;i++);return 0;} if (P3_2==0) {P3=0x0f;pp=P3;while (P3_2==0);for (i=0;i<1000;i++);return 15;} if (P3_3==0) {P3=0x0f;pp=P3;while (P3_3==0);for (i=0;i<1000;i++);return 14;}

return 10;

}

void chuli(unsigned char x) /*运算程序*/

{ int i; if (x==16) { cs=0; k=2; return ;

}

if (x>=0 && x<10) { k=0;

if (bb==1)

11

{ if (s1==4) {cs=0;return ;} else { for (i=3;i>0;i--) xs1[i]=xs1[i-1]; xs1[0]=x; s1++; t1=t1*10+x;

}

} if (bb==2) { if (s2==4) {cs=0;return ;} else { for (i=3;i>0;i--) xs2[i]=xs2[i-1]; xs2[0]=x; s2++; t2=t2*10+x; } }

}

if (x>10) { if (bb==1) {fh=x;bb=2;return;} if (bb==2)

{

12

if(fh==11&&t2==0)t1=10000; if (fh==11) t1=t1/t2; if (fh==12) t1=t1*t2; if (fh==13) t1=t1-t2; if (fh==14) t1=t1+t2; if(t1<0) t1=-t1;

if (t1>=10000) {cs=0;k=1;return;} else {

if (t1>=0 && t1<10)

{xs1[0]=t1;xs1[1]=10;xs1[2]=10;xs1[3]=10;}

if (t1>=10 && t1<100)

{xs1[0]=t1%10;xs1[1]=t1/10;xs1[2]=10;xs1[3]=10;}

if (t1>=100 && t1<1000)

{xs1[0]=t1%10;xs1[1]=(t1-(t1/100)*100)/10;xs1[2]=t1/100;xs1[3]=10;}

if (t1>=1000 && t1<10000)

{xs1[0]=t1%10;xs1[1]=t1%100/10;xs1[2]=(t1-(t1/1000)*1000)/100;xs1[3]=t1/1000;} bb=2; s2=0; t2=0;

xs2[0]=10;xs2[1]=10;xs2[2]=10;xs2[3]=10; fh=x;

}

}

}

}

void main() /*主程序*/

{

sz[0]=0xc0;

13

sz[1]=0xf9; sz[2]=0xa4; sz[3]=0xb0; sz[4]=0x99; sz[5]=0x92; sz[6]=0x82; sz[7]=0xf8; sz[8]=0x80; sz[9]=0x90; sz[10]=0xff; sz[11]=0x86; cs=0; k=2; for (;;) { if (cs==0) chushihua(); if (cs==1) sj=saomiao(); if (cs==1 && sj!=10) chuli(sj);

if (cs==1 &&(bb==1 || bb==2 && s2==0)) xianshi(xs1); if (cs==1 &&(bb==2 && s2!=0)) xianshi(xs2); if(k==1)xianshi(xs3);

if(cs==1&&k==2)xianshi(xs4);

}

}

14

5 系统的仿真调试

进行110+600+9500的加法运算时,在进行前一部分的加法,即110+600是的结果显示如图5.1所示。在其结果上再加上9500时,结果超出了计算器的范围,计算器显示错误,数码管的显示如图5.2所示。

图5.1 110+600的结果显示图

图5.2 超出计算范围显示错误

15

6 课程设计总结

经过两周的努力,4位加法计算器终于设计成功,达到了要求的目标。这两周的课程设计,我过的忙碌且充实着,从上课后对单片机的懵懵懂懂,到现在熟练运用,我都觉得受益颇多。同学们在这为期两个星期的单片机课程设计中,都辛勤的努力着,都在自己的设计课题上都有着一个又一个的进步,大家的脸上都流露出兴奋的喜悦。

在这两周的设计中我们不仅学到了关于自己课程设计题目方面的东西。同时我们也从课程设计中的相互交流和互帮互助中学到了很多关于单片机应用方面的其它知识,这些知识都是我们在这次课程设计实践中一点一滴的积累下来的。

至于设计课题,我选择的是4位加法计算器的设计,在最初设计的时候,还是低估了它的难度,前两天,一次次的碰壁,既不会用proteus软件画图,也不熟悉keil编程的语法,弄好的程序不是这里有错误,就是那时那里有错误。后来在网上学习了相关的知识,并去图书馆借了大量的单片机应用以及c语言编程相关方面的书籍阅读后,对其有了一个很大方面的了解,在后来不断的对程序的修改中,慢慢地就熟练了单片机的编程语法,最后也按要求完成了课题的设计要求。

最终我们圆满的完成了这次非常有意义的课程设计,在最后我想说的是通过这次课程设计我们学到的不仅仅是那些知识,同时我们还学到了很多关于同学之间合作的重要性,同时也加深了我们今后,齐心协力一起解决问题的意识。

16

参考文献

[1]程国钢.案例解说单片机c语言开发.电子工业出版社,2012.

[2]汤竞南,沈国琴. 51单片机C语言开发与实例.人民邮电出版社,2008. [3]李全利.单片机原理与接口技术.高等教育出版社,2009. [4]刘鲲,孙春亮.单片机C语言入门. 人民邮电出版社,2010.

[5]周怀芬.简易计算器的设计与实现.天津职业院校联合校报 NO.6 Vol.15 2013.6 [6]周润景,张丽娜. 基PROTEUS的电路及单片机系统设计与仿真.航空航天大学出版社, 2006 .

[7]姜志海,赵艳雷,陈松.单片机的C语言程序设计与应用.电子工业出版社2011.

17

因篇幅问题不能全部显示,请点此查看更多更全内容