本帖最后由 星期零 于 2018-3-5 20:32 编辑
- ;C8051系列汇编生成九九乘法表并通过软串口发出的实现方法Proteus仿真
- ;晶振频率:11.0592Mhz 波特率:9600 无校验位 停止位1位
- ;单片机型号:AT89C52 Proteus仿真通过
- MOV R0,#0 ;被乘数
- MOV R1,#0 ;乘数
- CALL TXD_ASCII_TABLE ;发送字符串
- A1:
- INC R1 ;乘数+1
-
- A2:
- INC R0 ;被乘数+1
- MOV A,R0 ;被乘数送A
- MOV B,R1 ;乘数送B
- CALL TXD_ONE_MUL ;运算结果并输出
- MOV A,R0 ;R0(被乘数)送A寄存器
- CJNE A,1,A2 ;A(被乘数)不等于R1(乘数)的值,则跳到A2处
- MOV R0,#0 ;被乘数清0
- CALL TXD_ENTER ;发送回车
- CJNE R1,#9,A1 ;乘数不等于9,则跳到A1处
- JMP $ ;输出完毕,在此进入循环
- TXD_DATA: ;将A寄存器里的值通过软串口送出
- PUSH B ;B寄存器压入堆栈
- PUSH PSW ;PSW压入堆栈
- ACALL DELAY_PORT ;延迟1/9600s
- CLR TXD ;发送起始位 低电平
- MOV B,#8 ;1字节有8位,所以这里发8个位
- TXD_BIT: ;发1比特数据
- ACALL DELAY_PORT
- MOV C,ACC.0 ;A寄存器第0位送C标志
- MOV TXD,C ;C标志送TXD(P3.1)
- RR A ;A寄存器循环右移1位,发下1位
- DJNZ B,TXD_BIT ;寄存器B减1,不为0继续发位
- ACALL DELAY_PORT
- SETB TXD ;发送停止位,高电平
- POP PSW ;PSW弹出堆栈
- POP B
- RET
- TXD_ENTER: ;发送回车(换行符)
- PUSH ACC
- MOV A,#0DH
- CALL TXD_DATA
- MOV A,#0AH
- CALL TXD_DATA
- POP ACC
- RET
- ;其他型号以及晶振频率需要修改延迟时间,由软件计算而出。
- DELAY_PORT: ;11.0592Mhz@9600Bps@AT89C52 延迟104.166667Us
- MOV R6,#0DH
- DL0:
- MOV R5,#02H
- DJNZ R5,$
- DJNZ R6,DL0
- RET
- TXD_ASCII_TABLE: ;发送单词
- PUSH ACC
- CLR A ;A=0
- MOV DPTR,#ASCII_TABLE ;设置DPTR为起始地址
- TXD_ASCII:
- PUSH ACC
- MOVC A,@A+DPTR ;A=ROM[A+DPTR]
- CALL TXD_DATA
- POP ACC
- INC A ;A++
- CJNE A,#35,TXD_ASCII
-
- CALL TXD_ENTER
- POP ACC
- RET
- TXD_ONE_NUM: ;将A寄存器中的数字0~9转换成ASCII码0x30~0x39并通过串口发出(只能发一个数字)
- PUSH ACC
- ORL A,#030H
- CALL TXD_DATA
- POP ACC
- RET
- TXD_A_NUMBER: ;将A寄存器里的数字0x00~0x99通过10进制的方式发出(不能包含字母否则会出错)
- PUSH ACC
- SWAP A ;A寄存器半字节交换
- PUSH ACC
- ANL A,#0FH ; A &= 0xF
- JZ TAN_Z ;十位为0则直接跳过不发送
- CALL TXD_ONE_NUM
- TAN_Z:
- POP ACC
- SWAP A
- ANL A,#0FH
- CALL TXD_ONE_NUM
- POP ACC
- RET
- TXD_ONE_MUL: ;生成单个乘法口诀 比如A=8 B=9 则 输出:8*9=72(空格)
- PUSH ACC
- PUSH B
- PUSH ACC ;发送被乘数
- ANL A,#0FH
- CALL TXD_A_NUMBER
- POP ACC
- PUSH ACC ;发送乘号
- MOV A,#02AH ;乘号(星号的)Ascii码为0x2A
- CALL TXD_DATA
- POP ACC
- PUSH ACC ;发送乘数
- PUSH B
- MOV A,B
- ANL A,#0FH
- CALL TXD_A_NUMBER
- POP B
- POP ACC
- PUSH ACC ;发送等于号
- MOV A,#03DH ;等于号Ascii码为0x3D
- CALL TXD_DATA
- POP ACC
- PUSH ACC ;发送结果
- MUL AB ;计算结果 高8位在B 低8位在A
- ;结果是10进制的72,需要调整成0x72才可以发送
- ;B寄存器是存放高8位的,乘积低于256是没有用的
- MOV B,#10 ;将立即数10送B
- DIV AB ;A=A/B B=A%B 调整以后十位在A 个位在B
- PUSH ACC ;此处B(个位)相当于左移了4位
- MOV A,B
- SWAP A
- MOV B,A
-
- POP ACC
- ORL A,B ;A|=B
- SWAP A ;个位与十位交换
- CALL TXD_A_NUMBER ;输出调整好的数字
- POP ACC
- PUSH ACC ;发送空格
- MOV A,#020H ;空格的Ascii码为0x20
- CALL TXD_DATA
- POP ACC
- POP B
- POP ACC
- RET
- ASCII_TABLE:
- DB 'C51 Multiplication Table Generator:' ;上电首先输出这几个词 共35字节
- END
复制代码
九九乘法表.rar
(37.42 KB, 下载次数: 57)
|