设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 2227|回复: 4
收起左侧

C8051系列单片机汇编生成九九乘法口诀表并通过软串口发出的实现方法Proteus仿真

[复制链接]
发表于 2018-3-5 20:28:34 | 显示全部楼层 |阅读模式
本帖最后由 星期零 于 2018-3-5 20:32 编辑

运行结果.png



  1. ;C8051系列汇编生成九九乘法表并通过软串口发出的实现方法Proteus仿真
  2. ;晶振频率:11.0592Mhz 波特率:9600 无校验位 停止位1位
  3. ;单片机型号:AT89C52 Proteus仿真通过
  4. MOV R0,#0        ;被乘数
  5. MOV R1,#0        ;乘数

  6. CALL TXD_ASCII_TABLE ;发送字符串

  7.         A1:
  8.         INC R1        ;乘数+1
  9.        
  10.         A2:
  11.         INC R0        ;被乘数+1
  12.         MOV A,R0                ;被乘数送A
  13.         MOV B,R1                ;乘数送B
  14.         CALL TXD_ONE_MUL        ;运算结果并输出
  15.         MOV A,R0        ;R0(被乘数)送A寄存器
  16.         CJNE A,1,A2        ;A(被乘数)不等于R1(乘数)的值,则跳到A2处

  17.         MOV R0,#0        ;被乘数清0
  18.         CALL TXD_ENTER        ;发送回车
  19.         CJNE R1,#9,A1        ;乘数不等于9,则跳到A1处



  20. JMP $        ;输出完毕,在此进入循环

  21. TXD_DATA:                        ;将A寄存器里的值通过软串口送出
  22.         PUSH B                        ;B寄存器压入堆栈
  23.         PUSH PSW                ;PSW压入堆栈
  24.         ACALL DELAY_PORT         ;延迟1/9600s
  25.         CLR TXD                        ;发送起始位 低电平
  26.         MOV B,#8                ;1字节有8位,所以这里发8个位
  27.         TXD_BIT:                ;发1比特数据
  28.         ACALL DELAY_PORT
  29.         MOV C,ACC.0                ;A寄存器第0位送C标志
  30.         MOV TXD,C                ;C标志送TXD(P3.1)
  31.         RR A                         ;A寄存器循环右移1位,发下1位
  32.         DJNZ B,TXD_BIT                ;寄存器B减1,不为0继续发位
  33.         ACALL DELAY_PORT        
  34.         SETB TXD                ;发送停止位,高电平
  35.         POP PSW                        ;PSW弹出堆栈
  36.         POP B
  37.         RET



  38. TXD_ENTER:        ;发送回车(换行符)
  39. PUSH ACC
  40. MOV A,#0DH
  41. CALL TXD_DATA
  42. MOV A,#0AH
  43. CALL TXD_DATA
  44. POP ACC
  45. RET

  46. ;其他型号以及晶振频率需要修改延迟时间,由软件计算而出。
  47. DELAY_PORT:   ;11.0592Mhz@9600Bps@AT89C52 延迟104.166667Us
  48.     MOV R6,#0DH
  49. DL0:
  50.     MOV R5,#02H
  51.     DJNZ R5,$
  52.     DJNZ R6,DL0
  53.     RET


  54. TXD_ASCII_TABLE:        ;发送单词
  55.         PUSH ACC
  56.         CLR A                ;A=0
  57. MOV DPTR,#ASCII_TABLE        ;设置DPTR为起始地址
  58.         TXD_ASCII:       
  59.         PUSH ACC
  60.         MOVC A,@A+DPTR        ;A=ROM[A+DPTR]
  61.         CALL TXD_DATA
  62.         POP ACC
  63.         INC A                ;A++
  64.         CJNE A,#35,TXD_ASCII
  65.        
  66.         CALL TXD_ENTER
  67.         POP ACC
  68. RET

  69. TXD_ONE_NUM:        ;将A寄存器中的数字0~9转换成ASCII码0x30~0x39并通过串口发出(只能发一个数字)
  70. PUSH ACC
  71. ORL A,#030H
  72. CALL TXD_DATA
  73. POP ACC
  74. RET

  75. TXD_A_NUMBER:                ;将A寄存器里的数字0x00~0x99通过10进制的方式发出(不能包含字母否则会出错)
  76.         PUSH ACC
  77.         SWAP A                ;A寄存器半字节交换
  78.         PUSH ACC
  79.         ANL A,#0FH        ; A &= 0xF
  80.         JZ TAN_Z        ;十位为0则直接跳过不发送
  81.         CALL TXD_ONE_NUM       
  82.         TAN_Z:
  83.         POP ACC


  84.         SWAP A       
  85.         ANL A,#0FH
  86.         CALL TXD_ONE_NUM

  87.         POP ACC
  88. RET
  89. TXD_ONE_MUL: ;生成单个乘法口诀 比如A=8 B=9 则 输出:8*9=72(空格)
  90.         PUSH ACC
  91.         PUSH B
  92.                 PUSH ACC        ;发送被乘数
  93.                 ANL A,#0FH
  94.                 CALL TXD_A_NUMBER
  95.                 POP ACC

  96.                 PUSH ACC        ;发送乘号
  97.                 MOV A,#02AH        ;乘号(星号的)Ascii码为0x2A
  98.                 CALL TXD_DATA
  99.                 POP ACC

  100.                 PUSH ACC        ;发送乘数
  101.                 PUSH B
  102.                 MOV A,B
  103.                 ANL A,#0FH
  104.                 CALL TXD_A_NUMBER
  105.                 POP B
  106.                 POP ACC

  107.                 PUSH ACC        ;发送等于号
  108.                 MOV A,#03DH        ;等于号Ascii码为0x3D
  109.                 CALL TXD_DATA
  110.                 POP ACC

  111.                 PUSH ACC        ;发送结果
  112.                 MUL AB                ;计算结果 高8位在B 低8位在A
  113.                                 ;结果是10进制的72,需要调整成0x72才可以发送
  114.                 ;B寄存器是存放高8位的,乘积低于256是没有用的
  115.                 MOV B,#10        ;将立即数10送B
  116.                 DIV AB                ;A=A/B B=A%B   调整以后十位在A 个位在B
  117.                         PUSH ACC        ;此处B(个位)相当于左移了4位
  118.                         MOV A,B
  119.                         SWAP A
  120.                         MOV B,A
  121.                
  122.                         POP ACC
  123.                 ORL A,B                        ;A|=B
  124.                 SWAP A                        ;个位与十位交换
  125.                 CALL TXD_A_NUMBER        ;输出调整好的数字
  126.                 POP ACC

  127.                 PUSH ACC        ;发送空格
  128.                 MOV A,#020H        ;空格的Ascii码为0x20
  129.                 CALL TXD_DATA
  130.                 POP ACC

  131.         POP B
  132.         POP ACC
  133. RET
  134. ASCII_TABLE:
  135. DB 'C51 Multiplication Table Generator:'        ;上电首先输出这几个词 共35字节
  136. END

复制代码

九九乘法表.rar (37.42 KB, 下载次数: 54)

评分

1

查看全部评分

发表于 2018-3-5 21:01:50 | 显示全部楼层
写这玩意表示就像是在写天书
发表于 2018-3-5 23:17:27 | 显示全部楼层
真的绝了,用高级语言写就几行实现,用这玩意写得上百行。
发表于 2018-3-6 11:17:39 | 显示全部楼层
小弟很难看的动
发表于 2018-4-22 15:17:57 | 显示全部楼层
我也和楼上一样
您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-3-29 07:07 , Processed in 0.480027 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表