单片机课程设计简易计算器.docx

上传人:b****5 文档编号:4702866 上传时间:2022-12-07 格式:DOCX 页数:17 大小:1.42MB
下载 相关 举报
单片机课程设计简易计算器.docx_第1页
第1页 / 共17页
单片机课程设计简易计算器.docx_第2页
第2页 / 共17页
单片机课程设计简易计算器.docx_第3页
第3页 / 共17页
单片机课程设计简易计算器.docx_第4页
第4页 / 共17页
单片机课程设计简易计算器.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

单片机课程设计简易计算器.docx

《单片机课程设计简易计算器.docx》由会员分享,可在线阅读,更多相关《单片机课程设计简易计算器.docx(17页珍藏版)》请在冰豆网上搜索。

单片机课程设计简易计算器.docx

单片机课程设计简易计算器

4×4键盘的简易计算器和LED数码管的显示

1、设计要求

1、设计一个十六个按键的矩阵式计算器的模拟系统。

2、该系统具有加减乘除等功能。

3、用Proteus7仿真工作的全过程。

4、有相应的实物图

5、掌握4×4矩阵式键盘程序识别原理,掌握4×4矩阵式键盘按键的设计方法。

2、设计思想

2.1硬件设计思想

用单片机的并行口P1连接4×4矩阵键盘,并以单片机的P1.0-P1.7各管脚作输入线,以单片机的P2.0-P2.7和P0.0—P0.7各管脚作输出线,在数码管上显示每个按键“0-9”的序号。

键盘中对应按键的序号排列如图(1)所示。

数字0、1、2、3接X0;4、5、6、7接X1;8、9、10、11接X2;12、13、14、15接X3。

即16个按钮空接,即十六个键一端低电平,另一端接高电平;当按下任意一个按钮时显示对应数字。

该系统可以实现四则运算,当分别按下2个数字,再按任意一个功能键即可实现相应的运算。

2.2软件设计思想

整个程序可以实现十进制内的加减乘除,其中包含了延时子程序(去抖动),加法、减法、除法、乘法等子程序。

(1)按键的识别

判断键盘上有无按键闭合,先判断行线X0—X3输出低电平“0”,然后判断列线Y0—Y3的状态,若为全1,即列线全为高电平,说明键盘上没有按键闭合,若Y0—Y3不全为1,说明有键按下。

(2)消抖处理

当判断有键按下后,需要进行消除抖动,这里使用了软件方法即程序中采用时间延时0.5秒,待信号稳定后再判别键盘的状态,若有键按下,则再进行键号的计算。

(3)判别键号

先判断行线X0—X3是否有输出低电平“0”,若有键按下,则相应的列线也为低电平“0”,例如行线X1输出为低电平“0”,且列线Y2为低电平,即X1与Y2相交的键被按下,进行键号=行号*4+列号的计算。

(4)显示结果

显示器接高电频,左边显示器接P0,右边显示接P2,当按下一个数字时右显示器显示相应的数字,按第2个数字时左边显示器显示相应数字;当进行除法运算时,除的的数据要看接口P0.7接高还是低电频,低电频则结果为几点几,为高电频则几十几。

其它运算直接看数据即可。

3、电路原理与电路图

3.1电路原理

单片机最小系统。

一个AT89C51单片机做为控制电路,运用其P0、P1口来控制数码管和键盘,通过P0和P2口来显示键值(0~9)。

通过P1口来控制键盘。

3.2电路原理图

 

图3.1电路原理图

4、流程图与算法描述

 

4.1流程图

开始

P1口高四位置一

扫描键盘

按下键?

消除抖动

计算键入的值

十进制?

送入P2口显示第一次键入的值

消除抖动

计算键入的值

十进制?

送入A

按下键?

N

N

Y

Y

Y

Y

N

N

送入P0显示第二次送入的值

再按一次键

加法?

减法?

乘法?

除法?

结束

N

N

Y

Y

Y

Y

N

把结果送入P0,P2口,P0存十位,P2存个位

图4.1主程序流程图

开始

R7送100

R5送10

R6送250

R5减一为0?

R6减一为0?

R7减一为0?

返回

N

N

N

Y

Y

Y

图4.2延时子程序流程图

Y

4.2算法描述

1、设计一个延时子程序,延时0.5s。

本程序通过两个DJNZ的语句来实现。

延时程序的代码段如下:

DELAY:

MOVR7,#100D

DEL1:

MOVR6,#250D

DEL2:

MOVR5,#10D

DJNZR5,$

DJNZR6,DEL2

DJNZR7,DEL1

RET

2、仅实现十进制的加减乘除运算。

CJNE是判断两个数是否相等,不想等则转移,代码段如下:

M0:

CJNER1,#10D,M1

LJMPL1

M1:

CJNER1,#11D,M2

LJMPL1

M2:

CJNER1,#12D,M3

LJMPL1

M3:

CJNER1,#13D,M4

LJMPL1

M4:

CJNER1,#14D,M5

LJMPL1

M5:

CJNER1,#15D,M6

LJMPL1

M6:

RET;返回重新按入新的键号

5、仿真结果

5.1仿真结果

1、加法仿真如下:

(1加2)

 

图5.1加法仿真结果图

 

图5.2加法仿真结果图

2、减法仿真如下:

(2减3)

 

图5.3减法仿真结果图

 

图5.4减法仿真结果图

3、乘法仿真如下:

(3乘以2)

 

图5.5乘法仿真结果图

 

 

图5.6乘法仿真结果图

4、除法仿真如下:

(2除以4)

 

图5.7除法仿真结果图

 

图5.8除法仿真结果图

5、复位仿真如下:

 

图5.10复位仿真结果图

6、源程序

ORG0000H

L1:

LCALLSCAN

MOV40H,32H;将键号保存在40H

MOVR1,40H;暂存在R1

LCALLM0

LCALLXY1

MOVP0,#0FFH;使P0口置1

LCALLSCAN

MOV41H,32H;将键号保存在41H

MOVR1,41H;暂存在R1

LCALLM0

LCALLXY2

L2:

LCALLSCAN

MOV42H,32H

MOVR7,42H

CJNER7,#10D,L3;是否进行加法运算

MOVA,40H

ADDA,41H

MOVB,#10D

DIVAB;商存在A中即十位,余数存在B中即个位

CJNEA,#00H,L8;判断十位是否为0,不为0跳转

MOVP0,#0FFH;置1不显示

LJMPL9

L8:

MOV32H,A

LCALLXY2;商非0则调用显示十位数

L9:

MOV32H,B

LCALLXY1;调用显示个位数

LJMPL1

l3:

CJNER7,#11,l4;是否进行减法运算

MOVA,40H

SUBBA,41H;结果存在A

JBACC.7,N1;判断正负

MOV32H,A

MOVP0,#0FFH

LCALLXY1;减法结果为正

LJMPL1

N1:

MOVP0,#0BFH;显示负号

MOVA,41H

SUBBA,40H

ADDA,#1D

MOV32H,A

LCALLXY1;显示结果

LJMPL1

l4:

CJNER7,#12,l5;是否进行乘法运算

MOVA,40H

MOVB,41H

MULAB;结果存在A中

MOV50H,A

MOVB,#10D

DIVAB;商存在A中即十位,余数存在B中即个位

CJNEA,#00H,L10;判断十位是否为0,不为0跳转

MOVP0,#0FFH;置1不显示

LJMPL11

L10:

MOV32H,A

LCALLXY2

L11:

MOV32H,B

LCALLXY1

LJMPL1

l5:

CJNER7,#13,l6;是否进行除法运算

MOVA,40H

MOVB,41H

DIVAB;X/Y除法

MOVR6,B

CJNER6,#00H,L12;判断余数是否为0,不为0跳转

MOVP0,#0FFH;置1不显示十位

MOV32H,A

LCALLXY1

LJMPL13

L12:

MOV32H,A

LCALLXY2;p0显示小数点前的数

CLRP0.7;有小数点

MOVA,B

MOVB,#10D

MULAB;余数的十倍

MOVB,41H

DIVAB;余数的十倍再除以除数

MOV32H,A;结果保留小数点后一位

LCALLXY1;p2显示小数点后的数

L13:

LJMPL1

l6:

CJNER7,#0D,L7

CJNER7,#1D,L7;屏蔽十进制,实现加减乘除

CJNER7,#2D,L7

CJNER7,#3D,L7

CJNER7,#4D,L7

CJNER7,#5D,L7

CJNER7,#6D,L7

CJNER7,#7D,L7

CJNER7,#8D,L7

CJNER7,#9D,L7

CJNER7,#14D,L7;屏蔽E、F

CJNER7,#15D,L7

L7:

LJMPL2

SCAN:

MOVP1,#0F0H;P1口高4位置1

JNBP1.4,Y0;判断Y0列是否有键按下,有就跳至Y0

JNBP1.5,Y1

JNBP1.6,Y2

JNBP1.7,Y3

LJMPSCAN;无键按下继续扫描

Y0:

MOV31H,#00H;列线Y0有键按下

MOVP1,#0FEH

JNBP1.4,X0;判断X0横是否有键按下

MOVP1,#0FDH

JNBP1.4,X1;判断X1横是否有键按下

MOVP1,#0FBH

JNBP1.4,X2;判断X2横是否有键按下

MOVP1,#0F7H

JNBP1.4,X3;判断X3横是否有键按下

LJMPY0;返回继续判断

Y1:

MOV31H,#01H;列线Y1有键按下

MOVP1,#0FEH

JNBP1.5,X0

MOVP1,#0FDH

JNBP1.5,X1

MOVP1,#0FBH

JNBP1.5,X2

MOVP1,#0F7H

JNBP1.5,X3

LJMPY1

Y2:

MOV31H,#02H;列线Y2有键按下

MOVP1,#0FEH

JNBP1.6,X0

MOVP1,#0FDH

JNBP1.6,X1

MOVP1,#0FBH

JNBP1.6,X2

MOVP1,#0F7H

JNBP1.6,X3

LJMPY2

Y3:

MOV31H,#03H;列线Y3有键按下

MOVP1,#0FEH

JNBP1.7,X0

MOVP1,#0FDH

JNBP1.7,X1

MOVP1,#0FBH

JNBP1.7,X2

MOVP1,#0F7H

JNBP1.7,X3

LJMPY3

X0:

MOV30H,#00H;行线X0有键按下

LCALLDELAY;0.5s延时消除抖动

LJMPJS;跳转键值计算程序

X1:

MOV30H,#01H;行线X1有键按下

LCALLDELAY

LJMPJS

X2:

MOV30H,#02H;行线X2有键按下

LCALLDELAY

LJMPJS

X3:

MOV30H,#03H;行线X3键按下

LCALLDELAY

LJMPJS

JS:

MOVA,30H;计算键入的值

MOVB,#04H

MULAB

ADDA,31H

MOV32H,A

RET

XY1:

MOVA,32H

MOVDPTR,#TAB

MOVCA,@A+DPTR

MOVP2,A;显示第一次按入的键号及结果的个位

RET

XY2:

MOVA,32H

MOVDPTR,#TAB

MOVCA,@A+DPTR

MOVP0,A;显示第二次按入的键号及结果的十位

RET

DELAY:

MOVR7,#100D;延时0.5s子程序

DEL1:

MOVR6,#250D

DEL2:

MOVR5,#10D

DJNZR5,$

DJNZR6,DEL2

DJNZR7,DEL1

RET

M0:

CJNER1,#10D,M1;仅实现十进制的加减乘除运算

LJMPL1

M1:

CJNER1,#11D,M2

LJMPL1

M2:

CJNER1,#12D,M3

LJMPL1

M3:

CJNER1,#13D,M4

LJMPL1

M4:

CJNER1,#14D,M5

LJMPL1

M5:

CJNER1,#15D,M6

LJMPL1

M6:

RET;返回重新按入新的键号

TAB:

DB0C0H,0F9H,0A4H,0B0H,99H,92H

DB82H,0F8H,80H,90H,88H,83H

DB0C6H,0A1H,86H,8EH,0FFH

END

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1