求个51单片机开平方的汇编程序

作者&投稿:致养 (若有异议请与网页底部的电邮联系)
求个51单片机开平方的汇编程序拜托各位了 3Q~

双字节二进制无符号数开平方(快速) 入口条件:被开方数在R2、R3中。 出口信息:平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数。 影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节 SH2: MOV A,R2 ORL A,R3 JNZ SH20 RET ;被开方数为零,不必运算 SH20: MOV R7,#0 ;左规次数初始化 MOV A,R2 SH22: ANL A,#0C0H ;被开方数高字节小于40H否? JNZ SQRH ;不小于40H,左规格化完成,转开方过程 CLR C ;每左规一次,被开方数左移两位 MOV A,R3 RLC A MOV F0,C CLR C RLC A MOV R3,A MOV A,R2 MOV ACC.7,C MOV C,F0 RLC A RLC A MOV R2,A INC R7 ;左规次数加一 SJMP SH22 ;继续左规 SQRH: MOV A,R2 ;规格化后高字节按折线法分为三个区间 ADD A,#57H JC SQR2 ADD A,#45H JC SQR1 ADD A,#24H MOV B,#0E3H ;第一区间的斜率 MOV R4,#80H ;第一区间的平方根基数 SJMP SQR3 SQR1: MOV B,#0B2H ;第二区间的斜率 MOV R4,#0A0H;第二区间的平方根基数 SJMP SQR3 SQR2: MOV B,#8DH ;第三区间的斜率 MOV R4,#0D0H;第三区间的平方根基数 SQR3: MUL AB ;与区间基点的偏移量乘区间斜率 MOV A,B ADD A,R4 ;累加到平方根的基数上 MOV R4,A MOV B,A MUL AB ;求当前平方根的幂 XCH A,R3 ;求偏移量(存放在R2R3中) CLR C SUBB A,R3 MOV R3,A MOV A,R2 SUBB A,B MOV R2,A SQR4: SETB C ;用减奇数法校正一个字节的平方根 MOV A,R4 ;当前平方根的两倍加一存入R5R6中 RLC A MOV R6,A CLR A RLC A MOV R5,A MOV A,R3 ;偏移量小于该奇数否? SUBB A,R6 MOV B,A MOV A,R2 SUBB A,R5 JC SQR5 ;小于,校正结束,已达到一个字节的精度 INC R4 ;不小于,平方根加一 MOV R2,A ;保存新的偏移量 MOV R3,B SJMP SQR4 ;继续校正 SQR5: MOV A,R4 ;将一个字节精度的根存入R2 XCH A,R2 RRC A MOV F0,C ;保存最终偏移量的最高位 MOV A,R3 MOV R5,A ;将最终偏移量的低八位存入R5中 MOV R4,#8 ;通过(R5R6/R2)求根的低字节 SQR6: CLR C MOV A,R3 RLC A MOV R3,A CLR C MOV A,R5 SUBB A,R2 JB F0,SQR7 JC SQR8 SQR7: MOV R5,A INC R3 SQR8: CLR C MOV A,R5 RLC A MOV R5,A MOV F0,C DJNZ R4,SQR6 ;根的第二字节计算完,在R3中 MOV A,R7 ;取原被开方数的左规次数 JZ SQRE ;未左规,开方结束 SQR9: CLR C ;按左规次数右移平方根,得到实际根 MOV A,R2 RRC A MOV R2,A MOV A,R3 RRC A MOV R3,A DJNZ R7,SQR9 SQRE: RET PS:很长 我也是找的你就将就看看吧

求采纳

可见:
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/3e8ba54f75d72003b2de0518.html

汇编程序:用减奇数法开平方(16位)

命题:从 1 开始,把连续 n 项奇数的等差数列,求和,可以得到 n^2。

证明:1 + 3 + 5 + ... + (2n-1) = (1 + (2n-1)) * (n/2) = n^2。


那么,对于任意正整数 M,都会有:

  M = 1 + 3 + 5 + … + ( 2n - 1 ) + ε

    = n^2 + ε

    = N + ε

式中 N 是完全平方数,N = n^2。

式中 ε 是小于 2n - 1 的误差。


由此,可推出“减奇数开平方”的算法。

即:在 M 中依次减去 1、3、5、...,直到不够减为止;

  够减的次数 n,即为 N 的平方根。

程序可见:

这种求平方根的方法,效率很高,远远高于牛顿迭代法。



用黄金分割法查表,
00 0000
01 0001
02 0004
03 0009
04 0010
05 0019
06 0024
07 0031
08 0040
09 0051
0A 0064
0B 0079
0C 0090
0D 00A9
0E 00C4
0F 00E1
10 0100
11 0121
12 0144
13 0169
14 0190
15 01B9
16 01E4
17 0211
18 0240
19 0271
1A 02A4
1B 02D9
1C 0310
1D 0349
1E 0384
1F 03C1
20 0400
21 0441
22 0484
23 04C9
24 0510
25 0559
26 05A4
27 05F1
28 0640
29 0691
2A 06E4
2B 0739
2C 0790
2D 07E9
2E 0844
2F 08A1
30 0900
31 0961
32 09C4
33 0A29
34 0A90
35 0AF9
36 0B64
37 0BD1
38 0C40
39 0CB1
3A 0D24
3B 0D99
3C 0E10
3D 0E89
3E 0F04
3F 0F81
40 1000
41 1081
42 1104
43 1189
44 1210
45 1299
46 1324
47 13B1
48 1440
49 14D1
4A 1564
4B 15F9
4C 1690
4D 1729
4E 17C4
4F 1861
50 1900
51 19A1
52 1A44
53 1AE9
54 1B90
55 1C39
56 1CE4
57 1D91
58 1E40
59 1EF1
5A 1FA4
5B 2059
5C 2110
5D 21C9
5E 2284
5F 2341
60 2400
61 24C1
62 2584
63 2649
64 2710
65 27D9
66 28A4
67 2971
68 2A40
69 2B11
6A 2BE4
6B 2CB9
6C 2D90
6D 2E69
6E 2F44
6F 3021
70 3100
71 31E1
72 32C4
73 33A9
74 3490
75 3579
76 3664
77 3751
78 3840
79 3931
7A 3A24
7B 3B19
7C 3C10
7D 3D09
7E 3E04
7F 3F01
80 4000
81 4101
82 4204
83 4309
84 4410
85 4519
86 4624
87 4731
88 4840
89 4951
8A 4A64
8B 4B79
8C 4C90
8D 4DA9
8E 4EC4
8F 4FE1
90 5100
91 5221
92 5344
93 5469
94 5590
95 56B9
96 57E4
97 5911
98 5A40
99 5B71
9A 5CA4
9B 5DD9
9C 5F10
9D 6049
9E 6184
9F 62C1
A0 6400
A1 6541
A2 6684
A3 67C9
A4 6910
A5 6A59
A6 6BA4
A7 6CF1
A8 6E40
A9 6F91
AA 70E4
AB 7239
AC 7390
AD 74E9
AE 7644
AF 77A1
B0 7900
B1 7A61
B2 7BC4
B3 7D29
B4 7E90
B5 7FF9
B6 8164
B7 82D1
B8 8440
B9 85B1
BA 8724
BB 8899
BC 8A10
BD 8B89
BE 8D04
BF 8E81
C0 9000
C1 9181
C2 9304
C3 9489
C4 9610
C5 9799
C6 9924
C7 9AB1
C8 9C40
C9 9DD1
CA 9F64
CB A0F9
CC A290
CD A429
CE A5C4
CF A761
D0 A900
D1 AAA1
D2 AC44
D3 ADE9
D4 AF90
D5 B139
D6 B2E4
D7 B491
D8 B640
D9 B7F1
DA B9A4
DB BB59
DC BD10
DD BEC9
DE C084
DF C241
E0 C400
E1 C5C1
E2 C784
E3 C949
E4 CB10
E5 CCD9
E6 CEA4
E7 D071
E8 D240
E9 D411
EA D5E4
EB D7B9
EC D990
ED DB69
EE DD44
EF DF21
F0 E100
F1 E2E1
F2 E4C4
F3 E6A9
F4 E890
F5 EA79
F6 EC64
F7 EE51
F8 F040
F9 F231
FA F424
FB F619
FC F810
FD FA09
FE FC04
FF FE01

mark

双字节二进制无符号数开平方(快速)
入口条件:被开方数在R2、R3中。
出口信息:平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数。
影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
SH2: MOV A,R2
ORL A,R3
JNZ SH20
RET ;被开方数为零,不必运算
SH20: MOV R7,#0 ;左规次数初始化
MOV A,R2
SH22: ANL A,#0C0H ;被开方数高字节小于40H否?
JNZ SQRH ;不小于40H,左规格化完成,转开方过程
CLR C ;每左规一次,被开方数左移两位
MOV A,R3
RLC A
MOV F0,C
CLR C
RLC A
MOV R3,A
MOV A,R2
MOV ACC.7,C
MOV C,F0
RLC A
RLC A
MOV R2,A
INC R7 ;左规次数加一
SJMP SH22 ;继续左规
SQRH: MOV A,R2 ;规格化后高字节按折线法分为三个区间
ADD A,#57H
JC SQR2
ADD A,#45H
JC SQR1
ADD A,#24H
MOV B,#0E3H ;第一区间的斜率
MOV R4,#80H ;第一区间的平方根基数
SJMP SQR3
SQR1: MOV B,#0B2H ;第二区间的斜率
MOV R4,#0A0H;第二区间的平方根基数
SJMP SQR3
SQR2: MOV B,#8DH ;第三区间的斜率
MOV R4,#0D0H;第三区间的平方根基数
SQR3: MUL AB ;与区间基点的偏移量乘区间斜率
MOV A,B
ADD A,R4 ;累加到平方根的基数上
MOV R4,A
MOV B,A
MUL AB ;求当前平方根的幂
XCH A,R3 ;求偏移量(存放在R2R3中)
CLR C
SUBB A,R3
MOV R3,A
MOV A,R2
SUBB A,B
MOV R2,A
SQR4: SETB C ;用减奇数法校正一个字节的平方根
MOV A,R4 ;当前平方根的两倍加一存入R5R6中
RLC A
MOV R6,A
CLR A
RLC A
MOV R5,A
MOV A,R3 ;偏移量小于该奇数否?
SUBB A,R6
MOV B,A
MOV A,R2
SUBB A,R5
JC SQR5 ;小于,校正结束,已达到一个字节的精度
INC R4 ;不小于,平方根加一
MOV R2,A ;保存新的偏移量
MOV R3,B
SJMP SQR4 ;继续校正
SQR5: MOV A,R4 ;将一个字节精度的根存入R2
XCH A,R2
RRC A
MOV F0,C ;保存最终偏移量的最高位
MOV A,R3
MOV R5,A ;将最终偏移量的低八位存入R5中
MOV R4,#8 ;通过(R5R6/R2)求根的低字节
SQR6: CLR C
MOV A,R3
RLC A
MOV R3,A
CLR C
MOV A,R5
SUBB A,R2
JB F0,SQR7
JC SQR8
SQR7: MOV R5,A
INC R3
SQR8: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV F0,C
DJNZ R4,SQR6 ;根的第二字节计算完,在R3中
MOV A,R7 ;取原被开方数的左规次数
JZ SQRE ;未左规,开方结束
SQR9: CLR C ;按左规次数右移平方根,得到实际根
MOV A,R2
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
DJNZ R7,SQR9
SQRE: RET
PS:很长 我也是找的你就将就看看吧


求个51单片机开平方的汇编程序
汇编程序:用减奇数法开平方(16位)命题:从 1 开始,把连续 n 项奇数的等差数列,求和,可以得到 n^2。证明:1 + 3 + 5 + ... + (2n-1) = (1 + (2n-1)) * (n\/2) = n^2。那么,对于任意正整数 M,都会有:M = 1 + 3 + 5 + … + ( 2n - 1 ) + ε = n^2 ...

求有51单片机的开平方子程序
;===需要开平方的数入口地址在72~74H中,开方值70~71H中=== KPF:MOV 70H,#03H MOV 71H,#0E8H KPF1:MOV R1,70H MOV R2,71H MOV R3,#00H MOV R4,#00H MOV R5,70H MOV R6,71H LCALL TWOBITMUL MOV A,R2 MOV R1,A MOV A,R3 MOV R2,A MOV A,R4 MOV R3,A MOV R4,72H ...

求51单片机,用1602lcd显示的简易计算器的程序。除了加减乘除,还要有开...
把8位数据线接到单独一个P*口上,其他E,RS,WR,RD分别接到另一个数据口上,再就是电源和地接上。背光控制加一个三极管,BLA 背光电源正极 BLK 接地,Vo是调对比度的,加两个电阻分压,先用电位器调到合适的对比度,量一下电阻,分别焊上就行 ...

单片机编程,汇编语言
A中数据进行开平方,如下即可:;MOV R2, #255 LP1:INC R2 SETB C SUBB A, R2 JC EXIT SUBB A, R2 JNC LP1 EXIT:MOV A, R2 RET ;应用《减奇数法》来开平方。

单片机课程设计电梯程序设计汇编语言
① 单片机编程,汇编语言 A中数据进行开平方,如下即可: ; MOV R2, #255 LP1: INC R2 SETB C SUBB A, R2 JC EXIT SUBB A, R2 JNC LP1 EXIT: MOV A, R2 RET ;应用《减奇数法》来开平方。 ② 单片机编程,求程序(用汇编语言) 汇编语言针对不同单片机不一样,怎么给你编?用C语言通用,其实真的很简单...

关于单片机中sqrt()函数的问题
因为你的a是无符号整数型,而无符号整数型最大值也只能是 65535,你所说的正确值65574已经大于了65535了,所以就只能显示多余的00038了 c语言的书上已经明确的指明出各种类型的值的范围了 uint的范围就是 0~65535

不同型号的单片机,编程是不是不一样啊?
比如同一段用C语言写的计算开平方根的代码,在普通计算机上、C51单片机上、ARM单片机上可能是完全相同的,只不过编译成可执行文件时有了区别。 本回答由提问者推荐 举报| 答案纠错 | 评论 7 0 表碰我的牛崽 采纳率:74% 来自:芝麻团 擅长: 电脑\/网络 电子数码 社会民生 文化\/艺术 商业\/理财 其他回答 不...

51单片机做科学计算器的c语言程序
LCALL FSQR ;进行浮点开平方运算LCALL FLN ;进行浮点对数运算LCALL FTOB ;将结果转换成BCD码浮点数STOP: LJMP STOPEND运行结果,[R0]=804915H,即y=-0.4915,比较精确的结果应该是-0.491437?(1) 标号: FSDT 功能:浮点数格式化入口条件:待格式化浮点操作数在[R0]中?出口信息:已格式化浮点操作数仍在[R0]中?影响...

单片机实现两相异步电机的SVPWM控制
通过软件调用一个开平方函数就可以求得首先令i=N1由图可知匀加速阶段与匀减速阶段的加速度和减速度大小等直到 、T ,这样就可以求出步进电动机匀、、T1TTT21-N3-N2-N111相同,方向相反,加减速的时间相同,因此只需算出加速段走的步加速运行阶段从静止开始每走一步所用的时间。电动机在升速数就可以知道...

中微单片机有开平方根运算吗
有。中微单片机可以用C语言实现数值的开方和平方运算。单片机(Single-ChipMicrocomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU。

留坝县19547566257: 求个51单片机开平方的汇编程序
端木灵儿童: 双字节二进制无符号数开平方(快速) 入口条件:被开方数在R2、R3中. 出口信息:平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数. 影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节 SH2: MOV A,R2 ORL A,R3 JNZ ...

留坝县19547566257: 51单片机汇编语言.求两个数的平方和. -
端木灵儿童: AAA EQU 30HBBB EQU 31HCCC EQU 40HORG 8000H MAIN: MOV R3,#0 ;清零MOV A,AAAACALL SQRT ;调用求平方子程序MOV R3,AMOV A,BBBACALL SQRT ;调用求平方子程序ADD A,R3MOV R3,AMOV CCC,R3SJMP $ SQRT: MOV DPTR,#TABMOVC A,@A+DPTRRET TAB: DB 0,1,4,9,16DB 25,36,49,64,81END

留坝县19547566257: 求有51单片机的开平方子程序哪位朋友有51单片机的汇编开平方子程
端木灵儿童: ;======================需要开平方的数入口地址在72~74H中,开方值70~71H中================== KPF: MOV 70H,#03H MOV 71H,#0E8H KPF1: MOV R1,70H...

留坝县19547566257: 单片机“1的平方加到10的平方编程,用汇编”,紧急求解! -
端木灵儿童: 51单片机的程序如下; PING_FANG: MOV R6, #0 ;乘积先清零. MOV R7, #0 MOV R2, #1 ;从1开始.LOOP: MOV A, R2 MOV B, R2 MUL AB ;平方. ADD A, R7 ;加入到R6 R7中. MOV R7, A MOV A, R6 ADDC A, #0 MOV R6, A INC R2 ;下一个数字. CJNE R2, #11, LOOP RET;完,1的平方加到10的平方,总和放在了R6R7中,R6是高字节.

留坝县19547566257: 求51单片机,用1602lcd显示的简易计算器的程序.除了加减乘除,还要有开平方和平方的 -
端木灵儿童: 电路图:把8位数据线接到单独一个P*口上,其他CS,RS,WR,RD分别接到另一个数据口上,再就是电源和地接上.程序:需要你提供IC型号的,不同的IC指令不同

留坝县19547566257: 单片机编程,汇编语言 -
端木灵儿童: A中数据进行开平方,如下即可:; MOV R2, #255 LP1: INC R2 SETB C SUBB A, R2 JC EXIT SUBB A, R2 JNC LP1 EXIT: MOV A, R2 RET;应用《减奇数法》来开平方.

留坝县19547566257: 求完整的汇编程序:用减奇数法开平方(16位) -
端木灵儿童: 8086 or 8051? ---------------- 命题:从1开始,连续 n 项,奇数等差数列求和,可以得到 n^2.证明:1 + 3 + 5 + ... + (2n-1) = (1 + (2n-1))*(n/2) = n^2 求解思路:从一个数字M(包含一个完全平方数 N + e) 中,依次减去:1、3、5、...,直到不够...

留坝县19547566257: 求高手 用51单片机输出产生方波的程序 -
端木灵儿童: #include"reg52.h" sbit PWM=P1^0;//定义输出脚 void main() { TMOD=0x01; //定时器0工作方式1 TH0=(65536-10000)/256; //12M晶振10MS计时常数 TL0=(65536-10000)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //启动定时...

留坝县19547566257: 51单片机用汇编写方波程序 -
端木灵儿童: db _out_f 0x80;//频率db _out_v 0x81;//幅度 ljmp mainmain: mov _out_f,0xff //设置频率 mov _out_v,0xff //设置幅度loop: mov r0,_out_f mov p1, _o...

留坝县19547566257: 请教51单片机的一个汇编程序 -
端木灵儿童: ORG 0030H MAIN: MOV P1,#0FH MOV P2,#00H JNB P1.3,F1 AJMP MAIN F1: SETB P2.3 ACALL DEL JNB P1.3,G3 JNB P1.0,F2 JNB P1.1,F3 JNB P1.2,F4 AJMP F1 F2: SETB P2.0 ACALL DEL JNB P1.0,G0 JNB P1.1,G1 JNB P1.2,G2 JNB ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网