单片机课程设计简易计算器Word文档格式.docx
《单片机课程设计简易计算器Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机课程设计简易计算器Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
3.1电路原理
单片机最小系统。
一个AT89C51单片机做为控制电路,运用其P0、P1口来控制数码管和键盘,通过P0和P2口来显示键值(0~9)。
通过P1口来控制键盘。
3.2电路原理图
图3.1电路原理图
4、流程图与算法描述
4.1流程图
开始
P1口高四位置一
扫描键盘
按下键?
消除抖动
计算键入的值
十进制?
送入P2口显示第一次键入的值
送入A
N
Y
送入P0显示第二次送入的值
再按一次键
加法?
减法?
乘法?
除法?
结束
把结果送入P0,P2口,P0存十位,P2存个位
图4.1主程序流程图
R7送100
R5送10
R6送250
R5减一为0?
R6减一为0?
R7减一为0?
返回
图4.2延时子程序流程图
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
M2:
CJNER1,#12D,M3
LJMPL1
M3:
CJNER1,#13D,M4
M4:
CJNER1,#14D,M5
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;
LCALLXY2
L2:
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;
是否进行减法运算
SUBBA,41H;
结果存在A
JBACC.7,N1;
判断正负
MOV32H,A
MOVP0,#0FFH
LCALLXY1;
减法结果为正
LJMPL1
N1:
MOVP0,#0BFH;
显示负号
MOVA,41H
SUBBA,40H
ADDA,#1D
MOV32H,A
LCALLXY1;
显示结果
l4:
CJNER7,#12,l5;
是否进行乘法运算
MOVB,41H
MULAB;
结果存在A中
MOV50H,A
MOVB,#10D
DIVAB;
商存在A中即十位,余数存在B中即个位
CJNEA,#00H,L10;
判断十位是否为0,不为0跳转
MOVP0,#0FFH;
置1不显示
LJMPL11
L10:
L11:
LCALLXY1
l5:
CJNER7,#13,l6;
是否进行除法运算
MOVB,41H
DIVAB;
X/Y除法
MOVR6,B
CJNER6,#00H,L12;
判断余数是否为0,不为0跳转
置1不显示十位
MOV32H,A
LJMPL13
L12:
LCALLXY2;
p0显示小数点前的数
CLRP0.7;
有小数点
MOVA,B
MULAB;
余数的十倍
DIVAB;
余数的十倍再除以除数
MOV32H,A;
结果保留小数点后一位
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有键按下
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
JNBP1.6,X1
MOVP1,#0FBH
JNBP1.6,X2
JNBP1.6,X3
LJMPY2
Y3:
MOV31H,#03H;
列线Y3有键按下
JNBP1.7,X0
JNBP1.7,X1
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有键按下
LJMPJS
X3:
MOV30H,#03H;
行线X3键按下
JS:
MOVA,30H;
MOVB,#04H
MULAB
ADDA,31H
RET
XY1:
MOVA,32H
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP2,A;
显示第一次按入的键号及结果的个位
XY2:
MOVDPTR,#TAB
MOVP0,A;
显示第二次按入的键号及结果的十位
MOVR7,#100D;
延时0.5s子程序
MOVR6,#250D
MOVR5,#10D
DJNZR5,$
DJNZR6,DEL2
DJNZR7,DEL1
CJNER1,#10D,M1;
仅实现十进制的加减乘除运算
CJNER1,#11D,M2
CJNER1,#12D,M3
CJNER1,#13D,M4
CJNER1,#14D,M5
CJNER1,#15D,M6
RET;
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H
DB82H,0F8H,80H,90H,88H,83H
DB0C6H,0A1H,86H,8EH,0FFH
END