您好,欢迎来到刀刀网。
搜索
您的当前位置:首页单片机实验-计算器

单片机实验-计算器

来源:刀刀网
《单片机实验》实验报告

实验序号: 4 实验项目名称: 简易计算器

学 号 实验地点 27 综合楼 姓 名 指导老师 李泽 刘剑 班 级 实验时间 电子信息1005 一、实验目的及要求 熟悉矩阵键盘的编程和数码管的动态扫描,用汇编语言实现在51单片机上实现一个简易的计算器,能进行两位数的加,减,乘,除运算,并在数码管上显示出来。在Proteus仿真环境下演示可以达到预期的效果。 二、实验设备(环境)及要求 PC机一台、Keil uVision4编译软件、Proteus仿真平台 三、电路原理图 键盘功能示意: 四、实验代码 ORG 0000H SJMP START ORG 0030H START: CLR 00H CLR 01H CLR P3.0 MOV R7, #00H ; 按键次数计数器 LOOP: ACALL KEY CJNE R7, #01H, NEXT1 MOV R0, #30H ;存放第一个数的个位 MOV 31H, @R0 NEXT1: JB 00H,NEXT2 CJNE R7, #02H, NEXT2 MOV R0, #30H ;存放第一个数的十位 MOV A, #09H SUBB A, @R0 MOV32H,#00H ;异常处理 INC R7 JC NEXT2 DEC R7 MOV R2,31H MOV 31H, @R0 MOV 32H,R2 SETB 00H ;重来时要记得清0 NEXT2: CJNE R7, #03H, NEXT3 MOV R0, #30H ; 存放操作数 有 “加减乘除”四种情况 MOV 33H, @R0 NEXT3: CJNE R7, #04H, NEXT4 MOV R0, #30H ;存放第二个数的个位 MOV 34H, @R0 NEXT4: JB 01H,NEXT5 CJNE R7, #05H, NEXT5 MOV R0, #30H ;存放第二个数的十位 MOV A, #09H SUBB A, @R0 MOV 35H,#00H ;异常处理 INC R7 JC NEXT5 DEC R7 MOV R2,34H MOV 34H, @R0 MOV 35H,R2 SETB 01H ;重来时要记得清0 NEXT5: CJNE R7, #06H, NEXT6 MOV R0, #30H ;存放操作数 等于号 0EH MOV 36H, @R0 NEXT6: LCALL DISPLAY CJNE R7, #06H, LOOP MOV R0, #36H CJNE @R0, #0EH, FU;存放开始计算的操作数 等待 等号 的键值 SJMP CK FU: DEC R7 LJMP LOOP ;开始计算 CK: MOV R7, #00H CLR 00H CLR 01H MOV A, 32H MOV B, #0AH MUL AB ;由于只是两位数 不可能超过八位数能表示的值 ADD A, 31H MOV 37H, A ;第一个数整合完毕 MOV A, 35H MOV B, #0AH MUL AB ;由于只是两位数 不可能超过八位数能表示的值 ADD A, 34H MOV 38H, A ;第二个数整合完毕 MOV R1, #33H CJNE @R1, #0CH, DOWN1 ;乘法开始 乘法的算法最难 MOV A, 37H MOV B, 38H MUL AB MOV 39H, A ;LSB MOV 40H, B ;MSB JNB OV, C1 ;高八位没有数据 分离数据 ;高八位有数据 先处理低八位 MOV A, 39H MOV B, #H DIV AB MOV 52H, A ;存放结果的百位 MOV A, B ;余数重新放入被乘数位置 MOV B, #0AH DIV AB MOV 51H, A ;存放结果的十位 MOV A, B ;余数重新放入被乘数位置 MOV 50H, B ;存放结果的个位 MOV A, 40H ;处理高八位 MOV B, #02H ;2*(40H)=需要加上多少个128 MUL AB MOV R6, A ;设置循环的次数 C3: MOV A, 50H ADD A, #08H ;MOV 60H, A CJNE A, #0AH, C4 C4: JC C5 SUBB A, #0AH MOV 50H, A INC 51H ;进位为1 SJMP DO1 C5: MOV 50H, A DO1: MOV A, 51H ADD A, #02H ;MOV 61H, A CJNE A, #0AH, C6 C6: JC C7 SUBB A, #0AH MOV 51H, A INC 52H ;进位为1 SJMP DO2 C7: MOV 51H, A DO2: MOV A, 52H ADD A, #01H CJNE A, #0AH, C8 C8: JC C9 SUBB A, #0AH MOV 52H, A INC 53H ;进位为1 SJMP DO3 C9: MOV 52H, A DO3: DJNZ R6, C3 SJMP DOWN1 C1: MOV A, 39H MOV B, #H MOV 34H,#00H DIV AB MOV 35H,#00H MOV 52H, A ;存放结果的百位 MOV 36H,#00H MOV A, B ;余数重新放入被乘数位置 MOV 37H,#00H MOV B, #0AH MOV 38H,#00H DIV AB MOV 39H,#00H MOV 51H, A ;存放结果的十位 MOV 50H,#00H MOV 50H, B ;存放结果的个位 MOV 51H,#00H ;乘法结束 MOV 52H,#00H ;加法开始 MOV 53H,#00H DOWN1: DEC R7 CJNE @R1, #0AH, DOWN2 ;加法指令 LJMP LOOP MOV A, 37H DISPLAY: MOV R0, #38H ;显示程序开始 ADD A, @R0 MOV DPTR, #TABLE MOV B, #H MOV P2, #0FFH DIV AB MOV 52H, A ;存放结果的百位 MOV A, B ;余数重新放入被乘数位置 MOV B, #0AH DIV AB MOV 51H, A ;存放结果的十位 MOV 50H, B ;存放结果的个位 MOV 53H, #00H ;加法结束 ;减法开始 DOWN2: CJNE @R1, #0BH, DOWN3 ;减法指令 MOV A, 37H MOV R0, #38H SUBB A, @R0 MOV B, #0AH DIV AB MOV 51H, A ;存放结果的十位 MOV 50H, B ;存放结果的个位 MOV 52H, #00H MOV 53H, #00H ;减法结束 ;除法开始 DOWN3: CJNE @R1, #0DH, DOWN4 ;除法指令 MOV A, 38H JZ FUCK ;如果分母等于0 MOV A, 37H MOV B, 38H DIV AB MOV 50H, B ;存放余数 MOV B, #0AH DIV AB MOV 53H, A ;存放结果的十位 MOV 52H, B ;存放结果的个位 MOV 51H, #10H SJMP DOWN4 FUCK: MOV 50H, #10H MOV 51H, #10H MOV 52H, #10H MOV 53H, #10H ;除法结束 DOWN4: LCALL DISPLAY LCALL KEY CJNE R7, #00H, RESTART SJMP DOWN4 RESTART: MOV 30H,#00H MOV 31H,#00H MOV 32H,#00H MOV 33H,#00H MOV R0, #32H MOV A, @R0 MOVC A, @A+DPTR MOV P0, A CLR P2.0 ACALL DL10MS SETB P2.0 MOV R0, #31H MOV A, @R0 MOVC A, @A+DPTR MOV P0, A CLR P2.1 ACALL DL10MS SETB P2.1 MOV R0, #35H MOV A, @R0 MOVC A, @A+DPTR MOV P0, A CLR P2.2 ACALL DL10MS SETB P2.2 MOV R0, #34H MOV A, @R0 MOVC A, @A+DPTR MOV P0, A CLR P2.3 ACALL DL10MS SETB P2.3 MOV R0, #53H MOV A, @R0 MOVC A, @A+DPTR MOV P0, A CLR P2.4 ACALL DL10MS SETB P2.4 MOV R0, #52H MOV A, @R0 MOVC A, @A+DPTR MOV P0, A CLR P2.5 ACALL DL10MS SETB P2.5 MOV R0, #51H MOV A, @R0 MOVC A, @A+DPTR MOV P0, A CLR P2.6 ACALL DL10MS SETB P2.6 MOV R0, #50H MOV A, @R0 MOVC A, @A+DPTR MOV P0, A CLR P2.7 ACALL DL10MS SETB P2.7 RET ;显示程序结束 ;10毫秒延时程序 DL10MS: MOV R5,#2 ;1us DEL: MOV R6,# ;1us DEL1: MOV R4,#18 ;1us DJNZ R4,$ ;2*18=412us DJNZ R6,DEL1 ;2us DJNZ R5,DEL ;2us RET ;2us KEY: MOV P1, #0FFH CLR P1.4 MOV A, P1 CJNE A, #0EFH, N1 ; 第一行有键按下 转N1 MOV P1, #0FFH CLR P1.5 MOV A, P1 CJNE A, #0DFH, N2 ; 第二行有键按下 转N2 MOV P1, #0FFH CLR P1.6 MOV A, P1 CJNE A, #0BFH, N3 ; 第三行有键按下 转N3 MOV P1, #0FFH CLR P1.7 MOV A, P1 CJNE A, #07FH, N4 ; 第四行有键按下 转N4 RET ;NO ANY KEY PRESS GO BACK N1: JNB ACC.0, BUT0 JNB ACC.1, BUT1 JNB ACC.2, BUT2 JNB ACC.3, BUT3 N2: JNB ACC.0, BUT4 JNB ACC.1, BUT5 JNB ACC.2, BUT6 JNB ACC.3, BUT7 N3: JNB ACC.0, BUT8 JNB ACC.1, BUT9 JNB ACC.2, BUT10 JNB ACC.3, BUT11 N4: JNB ACC.0, BUT12 JNB ACC.1, BUT13 JNB ACC.2, BUT14 JNB ACC.3, BUT15 BUT0: MOV 30H, #00H JNB P1.0, $ INC R7 RET BUT1: MOV 30H, #01H JNB P1.1, $ INC R7 RET BUT2: MOV 30H, #02H JNB P1.2, $ INC R7 RET BUT3: MOV 30H, #03H JNB P1.3, $ INC R7 RET BUT4: MOV 30H, #04H JNB P1.0, $ INC R7 RET BUT5: MOV 30H, #05H JNB P1.1, $ INC R7 RET BUT6: MOV 30H, #06H JNB P1.2, $ INC R7 RET BUT7: MOV 30H, #07H JNB P1.3, $ INC R7 RET BUT8: MOV 30H, #08H JNB P1.0, $ INC R7 RET BUT9: MOV 30H, #09H JNB P1.1, $ INC R7 RET BUT10: MOV 30H, #0AH JNB P1.2, $ INC R7 RET BUT11: MOV 30H, #0BH JNB P1.3, $ INC R7 RET BUT12: MOV 30H, #0CH JNB P1.0, $ INC R7 RET BUT13: MOV 30H, #0DH JNB P1.1, $ INC R7 RET BUT14: MOV 30H, #0EH JNB P1.2, $ INC R7 RET BUT15: MOV 30H, #0FH JNB P1.3, $ INC R7 RET ;按键判断返回 TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,40H END 实验效果图: 演示乘法运算 演示除法运算: 总结: 此程序有效的实现了两位数的四则运算,并具有一定的纠错功能,通过本次实验使我对汇编编程以及单片机本部运行机理有了更加深入的理解,由于期末时间仓促,程序在某方面还存在些小小BUG,有待改进。

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

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务