文档库 最新最全的文档下载
当前位置:文档库 › MCS-51单片机实用子程序库

MCS-51单片机实用子程序库

MCS-51 单片机实用

子程序库

目录

MCS-51定点运算子程序库及其使用说明

1、BCDA功能:多字节BCD码加法---------------------------------------------------------------1

2、BCDB功能:多字节BCD码减法---------------------------------------------------------------1

3、NEG功能:多字节BCD码取补------------------------------------------------------------------2

4、BRLN功能:多字节BCD码左移十进制一位(乘十)------------------------------------2

5、MULD功能:双字节二进制无符号数乘法------------------------------------------------------3

6、MUL2功能:双字节二进制无符号数平方------------------------------------------------------4

7、DIVD功能:双字节二进制无符号数除法------------------------------------------------------4

8、D457功能:双字节二进制无符号数除以单字节二进制数---------------------------------5

9、DV31功能:三字节二进制无符号数除以单字节二进制数---------------------------------6

10、MULS功能:双字节二进制有符号数乘法(补码)-----------------------------------------7

11、DIVS功能:双字节二进制有符号数除法(补码)------------------------------------------7

12、SH2功能:双字节二进制无符号数开平方(快速)------------------------------------------9

13、SH4功能:四字节二进制无符号数开平方(快速)------------------------------------------9

14、HASC功能:单字节十六进制数转换成双字节ASCII码----------------------------------12

15、ASCH功能:ASCII码转换成十六进制数----------------------------------------------------12

16、HBCD功能:单字节十六进制整数转换成单字节BCD码整数------------------------12

17、HB2功能:双字节十六进制整数转换成双字节BCD码整数---------------------------13

18、HBD功能:单字节十六进制小数转换成单字节BCD码小数---------------------------13

19、HBD2功能:双字节十六进制小数转换成双字节BCD码小数------------------------14

20、BCDH功能:单字节BCD码整数转换成单字节十六进制整数------------------------14

21、BH2功能:双字节BCD码整数转换成双字节十六进制整数---------------------------15

22、BHD功能:单字节BCD码小数转换成单字节十六进制小数---------------------------15

23、BHD2功能:双字节BCD码小数转换成双字节十六进制小数------------------------16

24、MM功能:求单字节十六进制无符号数据块的极值------------------------------------------16

25、MMS功能:求单字节十六进制有符号数据块的极值---------------------------------------17

26、FDS1功能:顺序查找(ROM)单字节表格----------------------------------------------18

27、FDS2功能:顺序查找(ROM)双字节表格----------------------------------------------19

28、FDD1功能:对分查找(ROM)单字节无符号增序数据表格-------------------------19

29、FDD2功能:对分查找(ROM)双字节无符号增序数据表格-------------------------20

30、DDM1功能:求单字节十六进制无符号数据块的平均值---------------------------------21

31、DDM2功能:求双字节十六进制无符号数据块的平均值---------------------------------22

32、XR1功能:求单字节数据块的(异或)校验和----------------------------------------------22

33、XR2功能:求双字节数据块的(异或)校验和----------------------------------------------23

34、SORT功能:单字节无符号数据块排序(增序)-------------------------------------------23

MCS-51浮点运算子程序库及其使用说明

1、FSDT功能:浮点数格式化----------------------------------------------------------------------26

2、FADD功能:浮点数加法-------------------------------------------------------------------------26

3、FSUB功能:浮点数减法-------------------------------------------------------------------------26

4、FMUL功能:浮点数乘法-------------------------------------------------------------------------30

5、FDIV功能:浮点数除法-------------------------------------------------------------------------32

6、FCLR功能:浮点数清零-------------------------------------------------------------------------34

7、FZER功能:浮点数判零-------------------------------------------------------------------------34

8、FMOV功能:浮点数传送-------------------------------------------------------------------------35

9、FPUS功能:浮点数压栈-------------------------------------------------------------------------35

10、FPOP功能:浮点数出栈------------------------------------------------------------------------36

11、FCMP功能:浮点数代数值比较(不影响待比较操作数)-------------------------------36

12、FABS功能:浮点绝对值函数------------------------------------------------------------------37

13、FSGN功能:浮点符号函数---------------------------------------------------------------------38

14、FINT功能:浮点取整函数---------------------------------------------------------------------38

15、FRCP功能:浮点倒数函数---------------------------------------------------------------------39

16、FSQU功能:浮点数平方------------------------------------------------------------------------40

17、FSQR功能:浮点数开平方(快速逼近算法)----------------------------------------------40

18、FPLN功能:浮点数多项式计算---------------------------------------------------------------43

19、FLOG功能:以10为底的浮点对数函数--------------------------------------------------44

20、FLN功能:以e为底的浮点对数函数--------------------------------------------------------44

21、FE10功能:以10为底的浮点指数函数--------------------------------------------------46

22、FEXP功能:以e为底的浮点指数函数-----------------------------------------------------46

23、FE2功能:以2为底的浮点指数函数--------------------------------------------------------46

24、DTOF功能:双字节十六进制定点数转换成格式化浮点数-----------------------------48

25、FTOD功能:格式化浮点数转换成双字节定点数-----------------------------------------49

26、BTOF功能:浮点BCD码转换成格式化浮点数-----------------------------------------50

27、FTOB功能:格式化浮点数转换成浮点BCD码-----------------------------------------52

28、FCOS功能:浮点余弦函数---------------------------------------------------------------------56

29、FSIN功能:浮点正弦函数---------------------------------------------------------------------56

30、FATN功能:浮点反正切函数------------------------------------------------------------------58

31、RTOD功能:浮点弧度数转换成浮点度数--------------------------------------------------58

32、DTOR功能:浮点度数转换成浮点弧度数--------------------------------------------------59

(一)MCS-51定点运算子程序库及其使用说明

定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:

1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。地址小的单元存放数据的高字节。例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,(31H)=34H,(32H)=56H。

2.运算精度:单次定点运算精度为结果最低位的当量值。

3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无关的或非消耗性的信息,程序就具有较好的透明性。

1.标号:BCDA功能:多字节BCD码加法

入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。

出口信息:和在[R0]中,最高位进位在CY中。

影响资源:PSW、A、R2 堆栈需求:2字节

BCDA: MOV A,R7 ;取字节数至R2中

MOV R2,A

ADD A,R0 ;初始化数据指针

MOV R0,A

MOV A,R2

ADD A,R1

MOV R1,A

CLR C

BCD1: DEC R0 ;调整数据指针

DEC R1

MOV A,@R0

ADDC A,@R1 ;按字节相加

DA A ;十进制调整

MOV @R0,A ;和存回[R0]中

DJNZ R2,BCD1 ;处理完所有字节

RET

2.标号:BCDB功能:多字节BCD码减法

入口条件:字节数在R7中,被减数在[R0]中,减数在[R1]中。

出口信息:差在[R0]中,最高位借位在CY中。

影响资源:PSW、A、R2、R3 堆栈需求:6字节

BCDB: LCALL NEG1 ;减数[R1]十进制取补

LCALL BCDA ;按多字节BCD码加法处理

CPL C ;将补码加法的进位标志转换成借位标志

MOV F0,C ;保护借位标志

LCALL NEG1 ;恢复减数[R1]的原始值

MOV C,F0 ;恢复借位标志

RET

NEG1: MOV A,R0 ;[R1]十进制取补子程序入口

XCH A,R1 ;交换指针

XCH A,R0

LCALL NEG ;通过[R0]实现[R1]取补

MOV A,R0

XCH A,R1 ;换回指针

XCH A,R0

RET

3.标号:NEG功能:多字节BCD码取补

入口条件:字节数在R7中,操作数在[R0]中。

出口信息:结果仍在[R0]中。

影响资源:PSW、A、R2、R3 堆栈需求:2字节

NEG: MOV A,R7 ;取(字节数减一)至R2中

DEC A

MOV R2,A

MOV A,R0 ;保护指针

MOV R3,A

NEG0: CLR C

MOV A,#99H

SUBB A,@R0 ;按字节十进制取补

MOV @R0,A ;存回[R0]中

INC R0 ;调整数据指针

DJNZ R2,NEG0 ;处理完(R2)字节

MOV A,#9AH ;最低字节单独取补

SUBB A,@R0

MOV @R0,A

MOV A,R3 ;恢复指针

MOV R0,A

RET

4.标号:BRLN功能:多字节BCD码左移十进制一位(乘十)

入口条件:字节数在R7中,操作数在[R0]中。

出口信息:结果仍在[R0]中,移出的十进制最高位在R3中。

影响资源:PSW、A、R2、R3 堆栈需求:2字节

BRLN: MOV A,R7 ;取字节数至R2中

MOV R2,A

ADD A,R0 ;初始化数据指针

MOV R0,A

MOV R3,#0 ;工作单元初始化

BRL1: DEC R0 ;调整数据指针

MOV A,@R0 ;取一字节

SWAP A ;交换十进制高低位

MOV @R0,A ;存回

MOV A,R3 ;取低字节移出的十进制高位

XCHD A,@R0 ;换出本字节的十进制高位

MOV R3,A ;保存本字节的十进制高位

DJNZ R2,BRL1 ;处理完所有字节

RET

5.标号:MULD功能:双字节二进制无符号数乘法

入口条件:被乘数在R2、R3中,乘数在R6、R7中。

出口信息:乘积在R2、R3、R4、R5中。

影响资源:PSW、A、B、R2~R7 堆栈需求:2字节

MULD: MOV A,R3 ;计算R3乘R7

MOV B,R7

MUL AB

MOV R4,B ;暂存部分积

MOV R5,A

MOV A,R3 ;计算R3乘R6

MOV B,R6

MUL AB

ADD A,R4 ;累加部分积

MOV R4,A

CLR A

ADDC A,B

MOV R3,A

MOV A,R2 ;计算R2乘R7

MOV B,R7

MUL AB

ADD A,R4 ;累加部分积

MOV R4,A

MOV A,R3

ADDC A,B

MOV R3,A

CLR A

RLC A

XCH A,R2 ;计算R2乘R6

MOV B,R6

MUL AB

ADD A,R3 ;累加部分积

MOV R3,A

MOV A,R2

ADDC A,B

MOV R2,A

RET

6.标号:MUL2功能:双字节二进制无符号数平方

入口条件:待平方数在R2、R3中。

出口信息:结果在R2、R3、R4、R5中。

影响资源:PSW、A、B、R2~R5 堆栈需求:2字节

MUL2: MOV A,R3 ;计算R3平方

MOV B,A

MUL AB

MOV R4,B ;暂存部分积

MOV R5,A

MOV A,R2 ;计算R2平方

MOV B,A

MUL AB

XCH A,R3 ;暂存部分积,并换出R2和R3

XCH A,B

XCH A,R2

MUL AB ;计算2×R2×R3

CLR C

RLC A

XCH A,B

RLC A

JNC MU20

INC R2 ;累加溢出量

MU20: XCH A,B ;累加部分积

ADD A,R4

MOV R4,A

MOV A,R3

ADDC A,B

MOV R3,A

CLR A

ADDC A,R2

MOV R2,A

RET

7.标号:DIVD功能:双字节二进制无符号数除法入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。影响资源:PSW、A、B、R1~R7 堆栈需求:2字节

DIVD: CLR C ;比较被除数和除数

MOV A,R3

SUBB A,R7

MOV A,R2

SUBB A,R6

JC DVD1

SETB OV ;溢出

DVD1: MOV B,#10H ;计算双字节商

DVD2: CLR C ;部分商和余数同时左移一位

MOV A,R5

RLC A

MOV R5,A

MOV A,R4

RLC A

MOV R4,A

MOV A,R3

RLC A

MOV R3,A

XCH A,R2

RLC A

XCH A,R2

MOV F0,C ;保存溢出位

CLR C

SUBB A,R7 ;计算(R2R3-R6R7)

MOV R1,A

MOV A,R2

SUBB A,R6

ANL C,/F0 ;结果判断

JC DVD3

MOV R2,A ;够减,存放新的余数

MOV A,R1

MOV R3,A

INC R5 ;商的低位置一

DVD3: DJNZ B,DVD2 ;计算完十六位商(R4R5)

MOV A,R4 ;将商移到R2R3中

MOV R2,A

MOV A,R5

MOV R3,A

CLR OV ;设立成功标志

RET

8.标号:D457功能:双字节二进制无符号数除以单字节二进制数入口条件:被除数在R4、R5中,除数在R7中。

出口信息:OV=0 时,单字节商在R3中,OV=1 时溢出。

影响资源:PSW、A、R3~R7 堆栈需求:2字节

D457: CLR C

MOV A,R4

SUBB A,R7

JC DV50

SETB OV ;商溢出

DV50: MOV R6,#8 ;求平均值(R4R5/R7-→R3)

DV51: MOV A,R5

RLC A

MOV R5,A

MOV A,R4

RLC A

MOV R4,A

MOV F0,C

CLR C

SUBB A,R7

ANL C,/F0

JC DV52

MOV R4,A

DV52: CPL C

MOV A,R3

RLC A

MOV R3,A

DJNZ R6,DV51

MOV A,R4 ;四舍五入

ADD A,R4

JC DV53

SUBB A,R7

JC DV54

DV53: INC R3

DV54: CLR OV

RET

9.标号:DV31功能:三字节二进制无符号数除以单字节二进制数入口条件:被除数在R3、R4、R5中,除数在R7中。

出口信息:OV=0 时,双字节商在R4、R5中,OV=1 时溢出。

影响资源:PSW、A、B、R2~R7 堆栈需求:2字节

DV31: CLR C

MOV A,R3

SUBB A,R7

JC DV30

SETB OV ;商溢出

RET

DV30: MOV R2,#10H ;求R3R4R5/R7-→R4R5

DM23: CLR C

MOV A,R5

RLC A

MOV R5,A

MOV A,R4

MOV R4,A

MOV A,R3

RLC A

MOV R3,A

MOV F0,C

CLR C

SUBB A,R7

ANL C,/F0

JC DM24

MOV R3,A

INC R5

DM24: DJNZ R2,DM23

MOV A,R3 ;四舍五入

ADD A,R3

JC DM25

SUBB A,R7

JC DM26

DM25: INC R5

MOV A,R5

JNZ DM26

INC R4

DM26: CLR OV

RET ;商在R4R5中

10.标号:MULS功能:双字节二进制有符号数乘法(补码)入口条件:被乘数在R2、R3中,乘数在R6、R7中。

出口信息:乘积在R2、R3、R4、R5中。

影响资源:PSW、A、B、R2~R7 堆栈需求:4字节

MULS: MOV R4,#0 ;清零R4R5

MOV R5,#0

LCALL MDS ;计算结果的符号和两个操作数的绝对值

LCALL MULD ;计算两个绝对值的乘积

SJMP MDSE ;用补码表示结果

11.标号:DIVS功能:双字节二进制有符号数除法(补码)入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。

出口信息:OV=0时商在R2、R3中,OV=1时溢出。

影响资源:PSW、A、B、R1~R7 堆栈需求:5字节

DIVS: LCALL MDS ;计算结果的符号和两个操作数的绝对值

PUSH PSW ;保存结果的符号

LCALL DIVD ;计算两个绝对值的商

JNB OV,DVS1 ;溢出否?

POP ACC ;溢出,放去结果的符号,保留溢出标志

DVS1: POP PSW ;未溢出,取出结果的符号

MOV R4,#0

MOV R5,#0

MDSE: JB F0,MDS2 ;用补码表示结果

CLR OV ;结果为正,原码即补码,计算成功

RET

MDS: CLR F0 ;结果符号初始化

MOV A,R6 ;判断第二操作数的符号

JNB ACC.7,MDS1;为正,不必处理

CPL F0 ;为负,结果符号取反

XCH A,R7 ;第二操作数取补,得到其绝对值

CPL A

ADD A,#1

XCH A,R7

CPL A

ADDC A,#0

MOV R6,A

MDS1: MOV A,R2 ;判断第一操作数或运算结果的符号

JNB ACC.7,MDS3;为正,不必处理

CPL F0 ;为负,结果符号取反

MDS2: MOV A,R5 ;求第一操作数的绝对值或运算结果的补码

CPL A

ADD A,#1

MOV R5,A

MOV A,R4

CPL A

ADDC A,#0

MOV R4,A

MOV A,R3

CPL A

ADDC A,#0

MOV R3,A

MOV A,R2

CPL A

ADDC A,#0

MOV R2,A

MDS3: CLR OV ;运算成功

RET

12.标号:SH2功能:双字节二进制无符号数开平方(快速)

入口条件:被开方数在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

A,#0C0H ;被开方数高字节小于40H否?

SH22: ANL

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 ;继续左规

13.标号:SH4功能:四字节二进制无符号数开平方(快速)

入口条件:被开方数在R2、R3、R4、R5中。

出口信息:平方根在R2、R3中,整数部分的位数为原数的一半,其余为小数。影响资源:PSW、A、B、R2~R7 堆栈需求:2字节

SH4: MOV A,R2

ORL A,R3

ORL A,R4

ORL A,R5

JNZ SH40

RET ;被开方数为零,不必运算

SH40: MOV R7,#0 ;左规次数初始化

MOV A,R2

SH41: ANL A,#0C0H ;被开方数高字节小于40H否?

JNZ SQRH ;不小于40H,左规格化完成

MOV R6,#2 ;每左规一次,被开方数左移两位

SH42: CLR C ;被开方数左移一位

MOV A,R5

RLC A

MOV R5,A

MOV A,R4

RLC A

MOV R4,A

MOV A,R3

RLC A

MOV R3,A

MOV A,R2

RLC A

MOV R2,A

DJNZ R6,SH42 ;被开方数左移完两位

INC R7 ;左规次数加一

SJMP SH41 ;继续左规

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

14.标号:HASC功能:单字节十六进制数转换成双字节ASCII码

入口条件:待转换的单字节十六进制数在累加器A中。

出口信息:高四位的ASCII码在A中,低四位的ASCII码在B中。

影响资源:PSW、A、B 堆栈需求:4字节

HASC: MOV B,A ;暂存待转换的单字节十六进制数

LCALL HAS1 ;转换低四位

XCH A,B ;存放低四位的ASCII码

SWAP A ;准备转换高四位

HAS1: ANL A,#0FH ;将累加器的低四位转换成ASCII码

ADD A,#90H

DA A

ADDC A,#40H

DA A

RET

15.标号:ASCH功能:ASCII码转换成十六进制数

入口条件:待转换的ASCII码(30H~39H或41H~46H)在A中。

出口信息:转换后的十六进制数(00H~0FH)仍在累加器A中。

影响资源:PSW、A 堆栈需求:2字节

ASCH: CLR C

SUBB A,#30H

JNB ACC.4,ASH1

SUBB A,#7

ASH1: RET

16.标号:HBCD功能:单字节十六进制整数转换成单字节BCD码整数入口条件:待转换的单字节十六进制整数在累加器A中。

出口信息:转换后的BCD码整数(十位和个位)仍在累加器A中,百位在R3中。影响资源:PSW、A、B、R3 堆栈需求:2字节

HBCD: MOV B,#100 ;分离出百位,存放在R3中

DIV AB ;累加器A除以寄存器B

MOV R3,A

MOV A,#10 ;余数继续分离十位和个位

XCH A,B ;累加器A与寄存器B内容交换

DIV AB

SWAP A ;累加器A高半字节与低半字节交换

ORL A,B ;将十位和个位拼装成BCD码

RET

17.标号:HB2功能:双字节十六进制整数转换成双字节BCD码整数

入口条件:待转换的双字节十六进制整数在R6、R7中。

出口信息:转换后的三字节BCD码整数在R3、R4、R5中。

影响资源:PSW、A、R2~R7 堆栈需求:2字节

HB2: CLR A ;BCD码初始化

MOV R3,A

MOV R4,A

MOV R5,A

MOV R2,#10H ;转换双字节十六进制整数

HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中

RLC A

MOV R7,A

MOV A,R6

RLC A

MOV R6,A

MOV A,R5 ;BCD码带进位自身相加,相当于乘2

ADDC A,R5

DA A ;十进制调整

MOV R5,A

MOV A,R4

ADDC A,R4

DA A

MOV R4,A

MOV A,R3

ADDC A,R3

MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整

DJNZ R2,HB3 ;处理完16bit

RET

18.标号:HBD功能:单字节十六进制小数转换成单字节BCD码小数

入口条件:待转换的单字节十六进制小数在累加器A中。

出口信息:CY=0时转换后的BCD码小数仍在A中。CY=1时原小数接近整数1。影响资源:PSW、A、B 堆栈需求:2字节

HBD: MOV B,#100 ;原小数扩大一百倍

MUL AB

RLC A ;余数部分四舍五入

CLR A

ADDC A,B

MOV B,#10 ;分离出十分位和百分位

DIV AB

SWAP A

ADD A,B ;拼装成单字节BCD码小数

DA A ;调整后若有进位,原小数接近整数1

RET

19.标号:HBD2功能:双字节十六进制小数转换成双字节BCD码小数入口条件:待转换的双字节十六进制小数在R2、R3中。

出口信息:转换后的双字节BCD码小数仍在R2、R3中。

影响资源:PSW、A、B、R2、R3、R4、R5 堆栈需求:6字节

HBD2: MOV R4,#4 ;四位十进制码

HBD3: MOV A,R3 ;原小数扩大十倍

MOV B,#10

MUL AB

MOV R3,A

MOV R5,B

MOV A,R2

MOV B,#10

MUL AB

ADD A,R5

MOV R2,A

CLR A

ADDC A,B

PUSH ACC ;保存溢出的一位十进制码

DJNZ R4,HBD3 ;计算完四位十进制码

POP ACC ;取出万分位

MOV R3,A

POP ACC ;取出千分位

SWAP A

ORL A,R3 ;拼装成低字节BCD码小数

MOV R3,A

POP ACC ;取出百分位

MOV R2,A

POP ACC ;取出十分位

SWAP A

ORL A,R2 ;拼装成高字节BCD码小数

MOV R2,A

RET

20.标号:BCDH功能:单字节BCD码整数转换成单字节十六进制整数入口条件:待转换的单字节BCD码整数在累加器A中。

出口信息:转换后的单字节十六进制整数仍在累加器A中。

影响资源:PSW、A、B、R4 堆栈需求:2字节

BCDH: MOV B,#10H ;分离十位和个位

DIV AB

MOV R4,B ;暂存个位

MOV B,#10 ;将十位转换成十六进制

MUL AB

ADD A,R4 ;按十六进制加上个位

21.标号:BH2功能:双字节BCD码整数转换成双字节十六进制整数

入口条件:待转换的双字节BCD码整数在R2、R3中。

出口信息:转换后的双字节十六进制整数仍在R2、R3中。

影响资源:PSW、A、B、R2、R3、R4 堆栈需求:4字节

BH2: MOV A,R3 ;将低字节转换成十六进制

LCALL BCDH

MOV R3,A

MOV A,R2 ;将高字节转换成十六进制

LCALL BCDH

MOV B,#100 ;扩大一百倍

MUL AB

ADD A,R3 ;和低字节按十六进制相加

MOV R3,A

CLR A

ADDC A,B

MOV R2,A

RET

22.标号:BHD功能:单字节BCD码小数转换成单字节十六进制小数入口条件:待转换的单字节BCD码数在累加器A中。

出口信息:转换后的单字节十六进制小数仍在累加器A中。

影响资源:PSW、A、R2、R3 堆栈需求:2字节

BHD: MOV R2,#8 ;准备计算一个字节小数

BHD0: ADD A,ACC ;按十进制倍增

DA A

XCH A,R3

RLC A ;将进位标志移入结果中

XCH A,R3

DJNZ R2,BHD0 ;共计算8bit小数

ADD A,#0B0H ;剩余部分达到0.50否?

JNC BHD1 ;四舍

INC R3 ;五入

BHD1: MOV A,R3 ;取结果

RET

23.标号:BHD2功能:双字节BCD码小数转换成双字节十六进制小数

入口条件:待转换的双字节BCD码小数在R4、R5中。

出口信息:转换后的双字节十六进制小数在R2、R3中。*

影响资源:PSW、A、R2~R6 堆栈需求:2字节

BHD2: MOV R6,#10H ;准备计算两个字节小数

BHD3: MOV A,R5 ;按十进制倍增

ADD A,R5

MOV R5,A

MOV A,R4

ADDC A,R4

DA A

MOV R4,A

MOV A,R3 ;将进位标志移入结果中

RLC A

MOV R3,A

MOV A,R2

RLC A

MOV R2,A

DJNZ R6,BHD3 ;共计算16bit小数

MOV A,R4

ADD A,#0B0H ;剩余部分达到0.50否?

JNC BHD4 ;四舍

INC R3 ;五入

MOV A,R3

JNZ BHD4

INC R2

BHD4: RET

24.标号:MM功能:求单字节十六进制无符号数据块的极值

入口条件:数据块的首址在DPTR中,数据个数在R7中。

出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。影响资源:PSW、A、B、R1~R7 堆栈需求:4字节

MM: MOV B,R7 ;保存数据个数

MOVX A,@DPTR ;读取第一个数据

MOV R6,A ;作为最大值的初始值

MOV R7,A ;也作为最小值的初始值

MOV A,DPL ;取第一个数据的地址

MOV R3,A ;作为最大值存放地址的初始值

MOV R5,A ;也作为最小值存放地址的初始值

MOV A,DPH

MOV R2,A

MOV R4,A

MOV A,B ;取数据个数

DEC A ;减一,得到需要比较的次数

JZ MME ;只有一个数据,不需要比较

MOV R1,A ;保存比较次数

PUSH DPL ;保护数据块的首址

PUSH DPH

MM1: INC DPTR ;指向一个新的数据

MOVX A,@DPTR ;读取这个数据

51单片机常用子程序汇总

目录 1、通过串口连续发送n个字节的数据 /*************************************************************** 模块功能:通过串口连续发送n个字节的数据 参数说明: s:待发送数据的首地址 n:要发送数据的字节数 ***************************************************************/ void SendD(unsigned char *s,unsigned char n) { unsigned char unX; if(n>0) { ES=0; // 关闭串口中断 for(unX=0;unX #include #define Nop() _nop_() //空指令

sbit SDA=P1^3; sbit SCL=P1^2; bit ACK; void Start_I2c() { SDA=1; Nop(); SCL=1; Nop(); Nop(); Nop(); Nop(); Nop(); SDA=0; Nop(); Nop(); Nop(); Nop(); Nop(); SCL=0; //钳住I2C总线,准备发送或接受数据Nop(); Nop(); } (2)结束总线函数 /*************************************************************** 模块功能:发送I2C总线结束条件 ***************************************************************/ void Stop_I2c() { SDA=0; Nop(); SCL=1; Nop(); Nop(); Nop(); Nop(); Nop(); SDA=1; Nop(); Nop(); Nop(); Nop();

51单片机实用汇编程序库(word)

51 单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0 口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH DJNZ R1,$ RET

五、定时器功能实例 5.1 定时1 秒报警 程序介绍:定时器1 每隔1 秒钟将p1.o 的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0 入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50 个 0.2 秒,即50*0.2=1 秒 MOV TMOD,#00000001B;定时器0 工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 11 SETB EA ;开总中断 SETB ET0 ;开定时器0 中断允许 SETB TR0 ;开定时0 运行 SETB P1.0 LOOP: AJMP LOOP DIN0: ;是否到一秒//////////////////////////////////////// INCC: INC TFLAG MOV A,TFLAG CJNE A,#20,RE MOV TFLAG,#00H CPL P1.0 ;////////////////////////////////////////////////// RE: MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 RETI END 5.2 频率输出公式 介绍:f=1/t s51 使用12M 晶振,一个周期是1 微秒使用定时器1 工作于方式0,最大值为65535,以产生200HZ 的频率为例: 200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电

51单片机汇编程序范例

16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。 程序可见: http: 32.html中的HEX2BCD子程序。 .说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。 但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。 上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。.单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。 为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!)执行时间仅仅是经典程序的!.近来,在网上发现了一个链接: ,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。这篇文章提到的程序,一直也没有找到,也难辩真假。 这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。比如说文中提到的:

“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。 .下面说说做而论道的编程思路。;----------------------------------------------------------------------- ;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。 ;那么可以写成: ; n = [b15 ~ b0] ;把16位数分解成高8位、低8位来写,也是常见的形式: ; n = [b15~b8] * 256 + [b7~b0] ;那么,写成下列形式,也就可以理解了: ; n = [b15~b12] * 4096 + [b11~b0] ;式中高4位[b15~b12]取值范围为0~15,代表了4096的个数; ;上式可以变形为: ; n = [b15~b12] * 4000 + {[b15~b12] * (100 - 4) + [b11~b0]} ;用x代表[b15~b12],有: ; n =x * 4000 + {x * (100 - 4) + [b11~b0]} ;即: ; n =4*x (千位) + x (百位) + [b11~b0] - 4*x ;写到这里,就可以看出一点BCD码变换的意思来了。 ;;上式中后面的位:

51单片机实用子程序(汇编)

《MCS-51单片机实用子程序库(96年版)》 周航慈 目前已有若干版本的子程序库公开发表,它们各有特色。笔者在1988年也编制了两个子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方 面作了一些工作。本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。经过八年来全国广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错误,成为现在这个最新版本。 本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。 (2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。 (3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理 程序的工作变得更简单直观。 在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈 需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。程序 清单中开列了四个栏目:标号、指令、操作数、注释。为方便读者理解,注释尽力详细。 子程序库的使用方法如下: 1.将子程序库全部内容链接在应用程序之后,统一编译即可。优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。 2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。优点是程序紧凑,缺点是需要对子程序库进行仔细删节。 (一)MCS-51定点运算子程序库及其使用说明 定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下: 1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。地址小的单元存放数据的高字节。例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,(31H)=34H,(32H)=56H。 2.运算精度:单次定点运算精度为结果最低位的当量值。 3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无 关的或非消耗性的信息,程序就具有较好的透明性。

单片机汇编子程序

; 1, 以下的程序是一些关于数据转换与计算的子程序.但由于本人现在很忙,仅测试了 ; 其中的很少一部分.本人不保证所有的程序都是正确的,并且由于使用不同的编译器, ; 即使是本人已测试过的程序,您也可能要修改一些指令. ; 2. 一旦将其整理测试完毕,将会免费发送. ; 3. 若有任何问题,与TongZhongZhi@https://www.wendangku.net/doc/d610799516.html,联系 ;******************************************************************** 函数名说明 BIN3toBCD4 三字节二进制整数--->>BCD码四字节转换 SIBITD 单字节二进制整数-->>BCD码转换子程序 ADDM1 三字节加法子程序并显示和值 SUBM 多字节减法子程序 SUBM4 四字节乘四字节乘法子程序 CHU3 五字节除五字节除法子程序 CHU4 双字节除单字节除法子程序 CHU5 双字节除单字节商为双字节除法子程序 CHU6 三字节除单字节商为三字节除法了程序 CHU7 三字节除双字节商为三字节除法子程序 CHU8 四字节除双字节商为二字节除法子程序 CHU9 三字节或二字节的倒数结果为三字节除法子程序 CHU10 带符号双字节除单字节除法子程序 SQRT 双字节平方根子程序 BCDAD1 单字节BCD码加法子程序 BCDAD2 四字节BCD码加法子程序 BCDSUB3 单字节BCD码减法子程序 DSUB2 四字节BCD码减法子程序 BCDSUB4 单字节BCD码乘法子程序 DCHFA 十进制数8位乘8位(四字节BCD码乘四字节BCD码)乘法子程序DCHU1 单字节BCD码除法子程序 DCHU2 四字节BCD码除法子程序 DSQR1 单字节BCD码平方根子程序 DSQR2 双字节BCD码平方根子程序 DSQR3 三字节BCD码平方根子程序 ASBIN1 ASCII码--->>二进制数转换子程序 EXASC1 十六进制--->>ASCII码转换子程序 BCDAS1 BCD码--->>ASCII码转换子程序 BINBCD 双字节二进制-->>三字节BCD码转换子程序 DTOB4 四位BCD码--->>十六位二进制数转换子程序 BINASC 二进制数--->>ASCII码字符串转换子程序 BCH 二进制数--->>十六进制数转换子程序 ASCBCD ASCII码-->>BCD码转换子程序 ASCHEX ASCII码-->>十六进制数转换子程序 BCDBIN BCD码--->>二进制数转换子程序

单片机汇编语言经典一百例

51单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY:

MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH

DJNZ R1,$ RET END 五、定时器功能实例 5.1 定时1秒报警 程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50个 0.2秒,即50*0.2=1秒 MOV TMOD,#00000001B;定时器0工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05秒,定时 20次则一秒 11 SETB EA ;开总中断

51单片机浮点运算子程序库

51单片机浮点运算子程序库 时间:2007-11-14 来源: 作者: 点击:4020 字体大小:【大中小】 1: FSDT 功能:浮点数格式化 2: FADD 功能:浮点数加法 3: FSUB 功能:浮点数减法 4: FMUL 功能:浮点数乘法 5: FDIV 功能:浮点数除法 6: FCLR 功能:浮点数清零 7: FZER 功能:浮点数判零 8: FMOV 功能:浮点数传送 9: FPUS 功能:浮点数压栈 10: FPOP 功能:浮点数出栈 11: FCMP 功能:浮点数代数值比较不影响待比较操作数 12: FABS 功能:浮点绝对值函数 13: FSGN 功能:浮点符号函数 14: FINT 功能:浮点取整函数 15: FRCP 功能:浮点倒数函数 16: FSQU 功能:浮点数平方 17: FSQR 功能:浮点数开平方快速逼近算法 18: FPLN 功能:浮点数多项式计算 19: FLOG 功能:以10为底的浮点对数函数 20: FLN 功能:以e为底的浮点对数函数 21: FE10 功能:以10为底的浮点指数函数 22: FEXP 功能:以e为底的浮点指数函数 23: FE2 功能:以2为底的浮点指数函数 24: DTOF 功能:双字节十六进制定点数转换成格式化浮点数 25: FTOD 功能:格式化浮点数转换成双字节定点数 26: BTOF 功能:浮点BCD码转换成格式化浮点数 27: FTOB 功能:格式化浮点数转换成浮点BCD码 28: FCOS 功能:浮点余弦函数 29: FSIN 功能:浮点正弦函数 30: FATN 功能:浮点反正切函数 31: RTOD 功能:浮点弧度数转换成浮点度数 32: DTOR 功能:浮点度数转换成浮点弧度数 为便于读者使用本程序库,先将有关约定说明如下: 1.双字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据,地址小的单元存放高字节?如果[R0]=1234H,若(R0)=30H,则(30H)=12H,(31H)=34H? 2.二进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节纯小数(原码)来表示?当尾数的最高位为1时,便称为规格化浮点数,简称操作数?在程序说明中,也用[R0]或[R1]来表示R0或R1指示的浮点操作数,例如:当[R0]=-6.000时,则二进制浮点数表示为83C000H?若(R0)=30H,则 (30H)=83H,(31H)=0C0H,(32H)=00H? 3.十进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(二进制补码形式),第二字节为尾数的高字节,第三字节

51单片机实用汇编程序库

51 单片机实用程序库 4、1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮得效果。实际应用中例如: 广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP、ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A;灭所有得灯 MOV A,#11111110B MAIN1: MOV P1,A;开最左边得灯 ACALL DELAY ;延时 RL A ;将开得灯向右边移 AJMP MAIN ;循环 DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ30H,D1 RET END 4、2 方波输出 程序介绍:P1、0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN、ASM): ORG 0000H MAIN: ;直接利用P1、0 口产生高低电平地形成方波////////////// ACALL DELAY SETB P1、0 ACALL DELAY 10 CLR P1、0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH DJNZ R1,$ RET

五、定时器功能实例 5、1 定时1 秒报警 程序介绍:定时器1 每隔1 秒钟将p1、o得输出状态改变1 次,以达到定时报警得目得。实际应用例如:定时报警器。 程序实例(DIN1、ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0入口 MAIN: TFLA G EQU34H ;时间秒标志,判就是否到50个 0、2 秒,即50*0、2=1 秒 MOVTMOD,#00000001B;定时器0 工作于方式 1 MOVTL0,#0AFH MOV TH0,#3CH ;设定时时间为0、05 秒,定时 20 次则一秒 11 SETB EA;开总中断 SETB ET0;开定时器0 中断允许 SETBTR0 ;开定时0 运行 SETB P1、0 LOOP: AJMP LOOP DIN0: ;就是否到一秒//////////////////////////////////////// INCC:INC TFLAG MOV A,TFLAG CJNE A,#20,RE MOV TFLAG,#00H CPLP1、0 ;////////////////////////////////////////////////// RE: MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0、05秒,定时 20 次则一秒 RETI END 5、2 频率输出公式 介绍:f=1/t s51 使用12M 晶振,一个周期就是1微秒使用定时器1 工作于方式0,最大值为65535,以产生200HZ 得频率为 例: 200=1/t:推出t=0、005秒,即5000微秒,即一个高电

汇编51单片机考试常见试题

汇编51单片机考试常见试题

一、填空题 1.单片机是把中央处理器、存储器、定时器/计数器以及I/O接口电路等主要计算机部件集成在一块集成电路芯片上的微型计算机。 2.除了单片机这一名称之外,单片机还可称为微控制器、嵌入式控制器。 3.计算机的系统总线有地址总线、控制总线和数据总线。 4.80C51单片机基本型内部RAM有 128 个字节单元,这些单元可以分为三个用途不同的区域,一是工作寄存器区、二是位寻址区、三是数据缓冲区。5.8051单片机有2 个16位定时/计数器。 6.单片机存储器的主要功能是存储程序和数据。80C51含4 KB掩膜ROM。7.80C51在物理上有4个独立的存储器空间。 8.通常、单片机上电复位时PC= 0000H,SP=07H;而工作寄存器则缺省采用第00 组,这组寄存器的地址范围是从00H~ 07H。 9.8051的堆栈是向地址的高端生成的。入栈时SP先加1,再压入数据。10.使用8031芯片时,需将/EA引脚接低电平,因为其片内无程序存储器。11.MCS-51特殊功能寄存器只能采用直接寻址方式。 12.汇编语言中可以使用伪指令,它们不是真正的指令,只是用来对汇编过程进行某种控制。 13.半导体存储器的最重要的两个指标是存储容量和存储速度。 14.当PSW4=1,PSW3=0时,工作寄存器Rn,工作在第2组。 15.在8051单片机中,由 2 个振荡(晶振)周期组成1个状态(时钟)周期,由 6个状态周期组成1个机器周期。 16.假定累加器A的内容30H,执行指令:1000H:MOVC A,@A+PC后,把程序存储器1031H单元的内容送累加器A中。 17.MCS-51单片机访问外部存储器时,利用ALE信号锁存来自P0口的低8位地址信号。 18.内部RAM中,位地址为30H的位,该位所在字节的字节地址为26H。19.若A中的内容为63H,那么,P标志位的值为0。 20.在基址加变址寻址方式中,以累加器A作变址寄存器,以DPTR或PC作基址寄存器。 21.指令格式是由操作码和操作数所组成,也可能仅由操作码组成。 22.通过堆栈操作实现子程序调用,首先就要把PC的内容入栈,以进行断点保护。调用返回时,再进行出栈保护,把保护的断点送回到PC。 23.MCS-51单片机程序存储器的寻址范围是由程序计数器PC的位数所决定的,因为MCS-51的PC是16位的,因此其寻址的范围为64KB。 24.在寄存器间接寻址方式中,其“间接”体现在指令中寄存器的内容不是操作数,而是操作数的地址。 25.假定累加器A中的内容为30H,执行指令1000H:MOVC A,@A+PC 后,把程序存储器1031H单元的内容送入累加器A中。 26.12根地址线可寻址4 KB存储单元。 27.:假定A=55H,R3=0AAH,在执行指令ANL A,R3后,A=00H,R3=0AAH。28.MCS-51的P0口作为输出端口时,每位能驱动8个LSTTL负载。 29.MCS-51有4个并行I/O口,其中P1~P3是准双向口,所以由输出转输入时必须先写入“1”。 30.MCS-51的堆栈是软件填写堆栈指针临时在片内数据存储器内开辟的区域。

单片机实用教程部分课后习题_朱一纶

1、从22H单元开始存放一数据块,其长度存放在20H单元,编写一个数据块求和程序,要求将和存入21H单元,设和不超过255。(5分) (1) 2、编写一查表子程序。设40单元中的内容为00~09之间的整数,求其平方值(BCD码),并将其存入41H单元中。(5分) (2) 3、有50个无符号8位二进制数,存放在内部RAM以BUFFR为首地址的连续单元中,试编写将其最小数存放到内部RAM的MIN单元的程序并画出相应的流程。(10分) (2) 4、用中断方法设计单片机秒、分脉冲发生器。从P1.0每秒产生一个机器周期的正脉冲,从P1.1每分钟产生一个机器周期的正脉冲。(10分) (3) 5、将8255A的PA口设为方式0——基本输出方式,8255A的PB口设为方式1——选通输入方式,并在数据输入后会向CPU发出中断请求,不作控制用的C口端口数位全部输出,设PA口地址为4000H。编写初始化程序。(10分) (4) 6、设字符串存放在以21H开始的内部RAM单元中,以“$”作结束标志,试计算该字符串的长度,并存入20H单元。(5分) (4) 7、编写一查表子程序。设40单元中的内容为00~09之间的整数,求其立方值(BCD码),并将其存入41H单元中。(5分) (5) 8、设有50个无符号8位二进制数,存放在内部RAM以BUFFR为首地址的连续单元中,试编写将其最小数存放到内部RAM的MIN单元的程序并画出相应的流程。(10分) (5) 9、利用定时器T1产生50HZ的方波,由P1.1输出(f=6MHZ)。(10分) (6) 10、8051内部RAM的30H~39H中存放10个数,试编程采用串行口工作方式0把它逐个发送出去。(10分) (6) 11、7-4-4 (7) 1、从22H单元开始存放一数据块,其长度存放在20H单元,编写一个数据块求和程序,要求将和存入21H单元,设和不超过255。(5分) ORG 0000H LJMP START ORG 2000H START: CLR A MOV R2, 20H MOV R1, #22H LOOP: ADD A, @R1 INC R1 DJNZ R2, LOOP MOV 21H, A SJMP $ END

针对常用51单片机下载程序问题做下详解

针对常用51单片机下载程序问题做下详解 目前为止,接触单片机已有不少,从选择元器件、原理图、PCB、电路硬件调试、软件开发也算小有心得。 单片机软件开发里面第一步当属下载程序了,如果这一步都有问题,那么后面的一切便无从谈起,记得当初刚接触单片机时,对于下载电路方法及原理也是一头雾水。好在随着经验的积累以及自己的努力探求,现在对此问题算是有了点点自己的经验理解。故今天在此针对常用51单片机下载程序问题做下详解,以求新手们少走弯路。 原理 单片机的TXD、RXD是TTL电平,所以你得万变不离其宗的将其它信号转成TTL电平,只有这样给单片机下载程序才有可能成功!其中CH340、PL2303等芯片是直接将USB信号转换为TTL电平,而MAX232等芯片是将TTL转换为RS232信号或者将RS232信号转换为TTL.下面请看利用这种原理的两种常用方法: 方法一: 请看图一,这是我们最常见的单片机下载电路了,其中从②到⑥属于大家常用的USB转串口线,用这种方案的好处是,如果自己的PC带有串口(可能很老的机器没有USB接口),那么就可以直接给单片机开发板下载程序,因为采用这种方法的开发板必定带有串口接口嘛。当然,如果PC仅有USB接口而不带串口,那么只能找根USB转串口线了(其电路原理就是图中②到⑥),这里我推荐大家使用采用CH340芯片的USB转串口线,而不要采用PL2303的USB转串口线,因为PL2303价钱便宜所以山寨的水货较多,这会导致下载电路不稳定,甚至无法正常下载。同时此方案的坏处是电路板上必定要做一个9针串口接口(太巨大了),这必将增加了电路PCB的面积,当然也就增加了成本啦!(顺便发表下个人见解:那个9针接口实在太丑,又大又重,无形中便降低了自己的设计档次,哈哈。所以不推荐这种方法!) 请看图二,这是我经常采用的单片机下载电路。实践证明效果非常好,几乎没出过任何问

单片机习题集(含答案)经典

单片机原理及应用习题 第一章绪论 1-1单项选择 1、计算机中最常用的字符信息编码是()。 (A)ASCII (B)BCD码(C)余3码(D)循环码 2、-31D的二进制补码为.( )。 (A)1110000B (B)11100001B (C)01100000B (D)01100001B 3、十进制29的二进制表示为原码()。 (A)11100010B (B) 10101111B (C)00011101B (D)00001111B 4、十进制0.625转换成二进制数是()。 (A)0.101 (B) 0.111 (C)0.110 (D)0.100 5、十六进制数7的ASCII码是()。 (A) 37 (B) 7 (C) 07 (D) 47 6、十六进制数B的ASCII码是()。 (A) 38 (B) 42 (C) 11 (D) 1011 7、通常所说的主机是指() (A)运算器和控制器(B)CPU和磁盘存储器(C)CPU和主存储器(D)硬件和软件8、使用单片机实现在线控制的好处不包括( ) (A)精确度高(B)速度快(C)成本低(D)能与数据处理结合 1-2填空 1、计算机中常作的码制有、和。 2、十进制29的二进制表示为。 3、十进制数-29的8位补码表示为。 4、是计算机与外部世界交换信息的载体。 5、十进制数-47用8位二进制补码表示为。 6、-49D的二进制补码为。 7、计算机中的数称为,它的实际值叫。 8、单片机的存储器结构形式有普林斯顿结构(又称冯.依诺曼结构)与哈佛结构,MCS-51存储器采用的是结构。 1-3 问答题 1、何谓单片机?单片机与一般微型计算机相比,具有哪些特点? 2、单片机主要应用在哪些领域? 3、为什么80C51系列单片机能成为8位单片机应用主流? 4、举例说明单片机的主要应用领域。

MCS-51单片机实用子程序库

《MCS-51单片机实用子程序库(96年版)》 周航慈 目前已有若干版本的子程序库公开发表,它们各有特色。笔者在1988年也编制了两个 子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方 面作了一些工作。本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。经过八年来全国广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错误,成为现在这个最新版本。 本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库 的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。 (2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。 (3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理 程序的工作变得更简单直观。 在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈 需求,各项目的意义请参阅《单片机应用程序设计技术》第六章6.3.7节的内容。程序 清单中开列了四个栏目:标号、指令、操作数、注释。为方便读者理解,注释尽力详细。 子程序库的使用方法如下: 1.将子程序库全部内容链接在应用程序之后,统一编译即可。优点是简单方便,缺 点是程序太长,大量无关子程序也包含在其中。 2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。优点是程序紧凑,缺点是需要对子程序库进行仔细删节。 (一) MCS-51定点运算子程序库及其使用说明 定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下: 1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。地址小的单元存放数据的高字节。例如:[R0]=123456H,若(R0)=30H,则(30H)=12H, (31H)=34H,(32H)=56H。 2.运算精度:单次定点运算精度为结果最低位的当量值。 3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无 关的或非消耗性的信息,程序就具有较好的透明性。

51单片机常用数码管显示程序

51单片机常用数码管显示程序---之汇编篇 2010-07-21 03:35:46| 分类:单片机| 标签:51单片机数码管汇编程序|字号大中小订阅一)显示数据缓存寄存器70H,71H,72H,73H,74H,75H,76H,77H。 START: MOV 70H,#1 MOV 71H,#2 MOV 72H,#3 MOV 73H,#4 MOV 74H,#5 MOV 75H,#6 MOV 76H,#7 MOV 77H,#8 ACALL DISP AJMP START DISP: MOV R1,#70H MOV R5,#0FEH PLAY: MOV P0,#0FFH MOV A,R5 ANL P2,A

MOV A,@R1 MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,A LCALL DL1MS INC R1 MOV A,P2 JNB ACC.7,ENDOUT RL A MOV R5,A MOV P2,#0FFH AJMP PLAY ENDOUT: MOV P2,#0FFH MOV P0,#0FFH RET TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH;共阳数码管 ; 1MS延时子程序,LED显示用 DL1MS: MOV R6,#14H ; DL1: MOV R7,#19H DL2: DJNZ R7,DL2 DJNZ R6,DL1 RET END 二)

START:;ORG 00H MOV 70H,#0C0H;0 MOV 71H,#0F9H;1 MOV 72H,#0A4H;2 MOV 73H,#0B0H;3 MOV 74H,#99H ;4 MOV 75H,#92H ;5 MOV 76H,#82H ;6 MOV 77H,#0F8H;7 ACALL DISP AJMP START DISP: MOV P0,70H CLR P2.7 ACALL DL1MS SETB P2.7 MOV P0,71H CLR P2.6 ACALL DL1MS SETB P2.6 MOV P0,72H CLR P2.5 ACALL DL1MS SETB P2.5 MOV P0,73H CLR P2.4 ACALL DL1MS SETB P2.4 MOV P0,74H CLR P2.3 ACALL DL1MS SETB P2.3 MOV P0,75H CLR P2.2 ACALL DL1MS SETB P2.2 MOV P0,76H CLR P2.1 ACALL DL1MS SETB P2.1 MOV P0,77H CLR P2.0 ACALL DL1MS SETB P2.0 RET

51单片机指令

3.2 分类指令 在介绍各条分类指令之前,将指令中的操作数及注释中的符号说明如下。 Rn:当前指定的工作寄存器组中的Ro-R7(其中n=0,1,2,…,7)。 Ri:当前指定的工作寄存器组中的RO,R1(其中i=0,1)。 (Ri):Ri间址寻址指定的地址单元。 ((Ri)):Ri间址寻址指定地址单元中的内容。 dir:8位直接字节地址(在片内RAM和SFR存储空间中)。 #data8:8位立即数。 #datal6:16位立即数。 addrl6:16位地址值。 addrll:11位地址值。 bit:位地址(在位地址空间中)。 rel:相对偏移量(一字节补码数)。 下面介绍各条分类指令的主要功能和操作,详细的指令操作说明及机器码形式可见附录。 3.2.1数据传送与交换类指令 共有28条指令,包括以A,Rn,DPTR,直接地址单元,间接地址单元为目的的操作数的指令;访问外部RAM的指令;读程序存储器的指

令;数据交换指令以及准栈操作指令。 9.堆栈操作 PUSH dir ;SP十1-6P,(dir)一(SP)

POP dir ;((SP))一dir,SP-1--P , 例1 SP=07H,(35H)=55H,指令PUSH 35H执行后,55H送入08H地址单元,SP= 08H。 例2 SP=13H,(13H)= 1FH,指令POP 25H执行后,1FH压入25H地址单元,SP此时为12H。 综合例 把片内RAM中50H地址单元中的内容与40H地址单元中的内容互换。方法一(直接地址传送法): MOV A ,50H 数据传送与交换类指令是各类指令中数量最多、使用最频繁的一类指令,编程时应能十分熟练地灵活运用

单片机实用技术课后答案

1.设变量x以补码形式存放在片内RAM 30H单元中,变量y与x的关系是: X, X>0 Y= 20H, X=0 X+5, X<0 编程根据x的值求y值并放回原单元。 答:START:MOV A,30H JZ NEXT ANL A,#80H JZ ED MOV A,#05H ADD A,30H MOV 30H,A SJMP ED NEXT:MOV 30H,#20H ED:SJMP $ 2.MCS-51单片机有哪几种寻址方式?各寻址方式所对应的寄存器或存储器空间如何?答:立即寻址对应程序存储器 直接寻址对应内部数据存储器和SFR 寄存器寻址对应工作寄存器R0~R7,A,B,DPTR 寄存器间接寻址对应片内RAM:@R0,@R1,SP,片外RAM:@R0,@R1,@DPTR 变址寻址对应程序存储器:@A+PC,@A+DPTR 相对寻址对应程序存储器256字节范围内:PC+偏移量 位寻址对应片内RAM的位寻址区(20H~2FH字节地址),某些可位寻址的SFR 3.访问特殊功能寄存器SFR可以采用哪些寻址方式? 答:直接寻址方式和位寻址方式 4.访问片内RAM单元可以采用哪些寻址方式? 答:直接和间接寻址方式 5.访问外部RAM单元可以采用哪些寻址方式? 答:间接寻址方式 6.访问外部ROM可以采用哪些寻址方式? 答:立即、变址和相对寻址方式 7.为什么说布尔处理功能是8051单片机的重要特点? 答:因为8051具有位寻址功能 8.对于AT89S52单片机内部RAM还存在高128字节,应采用何种方式访问? 答:采用间接寻址方式 9.完成某种操作可以采用几条指令构成的指令序列实现,试写出完成以下每种操作的指令。(1)将R0的内容传送到R1; (2)内部RAM单元50H的内容传送到寄存器R4; (3)外部RAM单元2000H的内容传送到内部RAM单元70H; (4)外部RAM单元0800H的内容传送到寄存器R5; (5)外部RAM单元2000H的内容传送到外部RAM单元2100H。 答:(1)MOV A,R0 MOV R1,A

单片机实验指导书——带答案

《单片机原理及应用》 实验指导书 姓名: 学号: 专业班级: 所在学院:成人教育学院 2012年5月日 单片机实验指导书

目录 实验一系统认识实验 (2) 实验二程序调试 (4) 实验三外部中断实验 (6) 实验四串口实验 (8) 实验一系统认识实验 一、实验目的 1.掌握SICElab-G2200实验/仿真系统的结构与使用方法; 2.熟悉单片机系统开发软件WAVE6000。

二、实验设备 1.G2200/2100 实验平台 1 台 2.仿真器/ 仿真板 1 台 3.连线若干根 4.计算机 1 台 三、实验内容 P1端口接发光二极管,加1点亮。 四、连线方案: 实验箱 内部已 连好 五、实验步骤 1.连接Lab51CPU板。(已由实验师连好) 2.仿真器与实验平台的连接 将Lab51板的DC34芯插座与G6W仿真器上的DC34插座用扁平电缆连接起来。(已由实验师连好) 3.仿真器与计算机的连接 用随机配带的串口通讯电缆,将仿真器与计算机连接起来,串口1、串口2均可。 特别注意:在仿真器与计算机连接串口电缆时,两台机器必须都断电,否则易损坏计算机和仿真器。 4.实验连线 按连线方案,用随机配带的实验连线插入孔后,轻轻转动一下锁紧插头,保证良好接触。拆线时,应先回转一下,不要硬拨,以免损坏线路板。不管是拆线还是插线,都应在断电的情况下进行。实验中“连线方案”的粗线即为需用户动手接连的线。 5.检查接线是否有误,确信没有接错后,接上电源,打开电源开关。 6.在计算机上打开“WAVE6000集成调试环境”,界面如下图所示: 7.建立新程序(如果程序已编好,直接跳到第9步) 选择菜单[文件 | 新建文件]功能。 出现一个文件名为NONAME1的源程序窗口,在此窗口中输入以下程序 ORG 0 MOV P1,#0 ;熄灭发光二极管 LOOP: INC P1 CALL Delay SJMP LOOP Delay: MOV R2,#3 ;延时程序 MOV R1,#0

51单片机50个实例代码

51单片机50个例程代码程序里有中断,串口等驱动,直接复制即可使用1-IO输出-点亮1个LED灯方法1 /*----------------------------------------------- 名称:IO口高低电平控制 论坛:https://www.wendangku.net/doc/d610799516.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 sbit LED=P1^0;// 用sbit 关键字定义LED到P1.0端口, //LED是自己任意定义且容易记忆的符号 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { //此方法使用bit位对单个端口赋值 LED=1; //将P1.0口赋值1,对外输出高电平 LED=0; //将P1.0口赋值0,对外输出低电平 while (1) //主循环 { //主循环中添加其他需要一直工作的程序 } } 2-IO输出-点亮1个LED灯方法2 /*-----------------------------------------------

名称:IO口高低电平控制 论坛:https://www.wendangku.net/doc/d610799516.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { //此方法使用1个字节对单个端口赋值 P1 = 0xFF; //P1口全部为高电平,对应的LED灯全灭掉, //ff换算成二进制是1111 1111 P1 = 0xfe; //P1口的最低位点亮,可以更改数值是其他的灯点亮 //0xfe是16进制,0x开头表示16进制数, //fe换算成二进制是1111 1110 while (1) //主循环 { //主循环中添加其他需要一直工作的程序 } } 3-IO输出-点亮多个LED灯方法1 /*----------------------------------------------- 名称:IO口高低电平控制 论坛:https://www.wendangku.net/doc/d610799516.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的多个LED灯

相关文档
相关文档 最新文档