51单片机函数库

51单片机函数库
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)标号: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

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

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 ;溢出

RET

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

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 ;商溢出

RET

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

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

RLC A

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

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 ;溢出,放去结果的符号,保留溢出标志

RET

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

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

; (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

MOV R3,A

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

XCH A,B

DIV AB

SWAP 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 ;按十六进制加上个位

RET

; (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

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

DA A

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

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 ;读取这个数据

MOV B,A ;保存

SETB C ;与最大值比较

SUBB A,R6

JC MM2 ;不超过当前最大值,保持当前最大值

MOV R6,B ;超过当前最大值,更新最大值存放地址

MOV R2,DPH ;同时更新最大值存放地址

MOV R3,DPL

SJMP MM3

MM2: MOV A,B ;与最小值比较

CLR C

SUBB A,R7

JNC MM3 ;大于或等于当前最小值,保持当前最小值

MOV R7,B ;更新最小值

MOV R4,DPH ;更新最小值存放地址

MOV R5,DPL

MM3: DJNZ R1,MM1 ;处理完全部数据

POP DPH ;恢复数据首址

POP DPL

MME: RET

; (25)标号:MMS功能:求单字节十六进制有符号数据块的极值

;

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

;出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。

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

MMS: 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 MMSE ;只有一个数据,不需要比较

MOV R1,A ;保存比较次数

PUSH DPL ;保护数据块的首址

PUSH DPH

MMS1: INC DPTR ;调整数据指针

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

MOV B,A ;保存

SETB C ;与最大值比较

SUBB A,R6

JZ MMS4 ;相同,不更新最大值

JNB OV,MMS2 ;差未溢出,符号位有效

CPL ACC.7 ;差溢出,符号位取反

(完整版)51单片机实现双机通信(自己整理的)

1号机程序 #in clude #defi ne uint un sig ned int #defi ne uchar un sig ned char sbit p10=P1 A 0; uchar a,b,kk; //uchar code d_c[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; void delay_ms(uchar y) { uchar i; while(y__) for(i=0;i<120;i++) 5 } void put(uchar x) // 发送函数 { SBUF=x; //SBUF:串行口数据缓冲器 while (TI==0); 〃等待发送结束 TI=0; } P £j £fA>l3 旳 4阳 1370 丘阳 H 鮎口 PDLWAJil- PDSA>f POfiAME PQ TiJT FZ^KS 畑 阳pz- A A-m FZW11 PZ.AtZ FZj9jAl4 PZ.TW? P3£VR : iD paimcc P3.sii nrn pjjfflrn F3.WTI] M*Tl pgtjgQIH F3.7/IF 1E 11 左边1号机,右边2号机, ,功能实现 帕叶DO ■ 口 IJApi FDJ H [I Z — 观旧 IP 口 .hQKD* *QAADf H ^ 弓 H.Lta RQfMM FZJWS pz. iwe F2JKA-IDI P2JTA11I F2.HW1Z P2JSM13 F2W.14 F2JM1S F3Ji nHX& gj.im:& riaiWTO rjjfWTT F3.1/W f3AT1 P3JillW F3JMF ■T2 1E

51单片机实现双机通信(自己整理的)

左边1号机,右边2号机,,功能实现 1号机程序 #include #define uint unsigned int #define uchar unsigned char sbit p10=P1^0; uchar a,b,kk; //uchar code d_c[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; void delay_ms(uchar y) { uchar i; while(y--) for(i=0;i<120;i++) ; } void put(uchar x) //发送函数 { SBUF=x; //SBUF:串行口数据缓冲器 while(TI==0); //等待发送结束 TI=0; } void main() { uchar j; SCON=0x40; //串行口工作方式1,8位通用异步发送器

— TMOD=0x20; //定时器1工作方式2 PCON=0x00; //波特率不倍增 TH1=0xf4; TL1=0xf4; //波特率2400 TR1=1; //定时器1开始计时 P2=0xc0; while(1) { if(p10==0&&j==0) { delay_ms(15); while(p10==0); kk=1; P2=0xf9; j=1; } if(p10==0&&j==1) { delay_ms(15); while(p10==0); kk=2; P2=0xa4; j=2; } if(p10==0&&j==2) { delay_ms(15); while(p10==0); kk=3; P2=0xb0; j=0; } if(kk==1) put('A'); if(kk==2) put('B'); if(kk==3) put('C'); delay_ms(10); } }

51单片机与PC机通信资料

《专业综合实习报告》 专业:电子信息工程 年级:2013级 指导教师: 学生:

目录 一:实验项目名称 二:前言 三:项目内容及要求 四:串口通信原理 五:设计思路 5.1虚拟串口的设置 5.2下位机电路和程序设计 5.3串口通信仿真 六:电路原理框图 七:相关硬件及配套软件 7.1 AT89C51器件简介 7.2 COMPIN简介 7.3 MAX232器件简介 7.4友善串口调试助手 7.5 虚拟串口软件Virtual Serial Port Driver 6.9八:程序设计 九:proteus仿真调试 十:总结 十一:参考文献 一:实验项目名称:

基于51单片机的单片机与PC机通信 二:前言 在国内外,以PC机作为上位机,单片机作为下位机的控制系统中,PC机通常以软件界面进行人机交互,以串行通信方式与单片机进行积极交互,而单片机系统根据被控对象配置相应的前向,后向信息通道,工作时作为主控机测对象,作为被控机接受PC机监督,指挥,定期或受命向上位机提供对象及本身的工作状态信息。 目前,随着集成电路集成度的增加,电子计算机向微型化和超微型化方向发展,微型计算机已成为导弹,智能机器人,人类宇宙和太空和太空奥妙复杂系统不可缺少的智能部件。在一些工业控制中,经常需要以多台单片机作为下位机执行对被控对象的直接控制,以一台PC机为上位机完成复杂的数据处理,组成一种以集中管理、分散控制为特点的集散控制系统。 为了提高系统管理的先进性和安全性,计算机工业自动控制和监测系统越来越多地采用集总分算系统。较为常见的形式是由一台做管理用的上位主计算机(主机)和一台直接参与控制检测的下位机(单片机)构成的主从式系统,主机和从机之间以通讯的方式来协调工作。主机的作用一是要向从机发送各种命令及参数:二是要及时收集、整理和分析从机发回的数据,供进一步的决策和报表。从机被动地接受、执行主机发来的命令,并且根据主机的要求向主机回传相应烦人实时数据,报告其运行状态。 用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。同时,系统的更改和扩充极为容易。MCS-51系列单片机,由于内部带有一个可用于异步通讯的全双工的穿行通讯接口,阴齿可以很方便的构成一个主从式系统。 串口是计算机上一种非常通用的设备通讯协议,大多数计算机包容两个基于RS232的串口。串口同时也是仪器仪表设备通过用的通讯协议,很多GPIB兼容的设备也带有RS-232口。同时串口通讯协议也可以用于获取远程采集设备数据。所以,深入的理解学习和研究串口通信相关知识是非常必要的。此次毕业设计选题为“PC机与MCS-51单片机的串口通讯”,使用51单片机来实现一个主从式

状态机思路在单片机程序设计中的应用

状态机思路在单片机程序设计中的应用 状态机的概念 状态机是软件编程中的一个重要概念。比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。 比如说一个按键命令解析程序,就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态;再触发另一个键后切换到C状态,或者返回到A状态。这就是最简单的按键状态机例子。实际的按键解析程序会比这更复杂些,但这不影响我们对状态机的认识。 进一步看,击键动作本身也可以看做一个状态机。一个细小的击键动作包含了:释放、抖动、闭合、抖动和重新释放等状态。 同样,一个串行通信的时序(不管它是遵循何种协议,标准串口也好、I2C也好;也不管它是有线的、还是红外的、无线的)也都可以看做由一系列有限的状态构成。 显示扫描程序也是状态机;通信命令解析程序也是状态机;甚至连继电器的吸合/释放控制、发光管(LED)的亮/灭控制又何尝不是个状态机。 当我们打开思路,把状态机作为一种思想导入到程序中去时,就会找到解决问题的一条有效的捷径。有时候用状态机的思维去思考程序该干什么,比用控制流程的思维去思考,可能会更有效。这样一来状态机便有了更实际的功用。 程序其实就是状态机。 也许你还不理解上面这句话。请想想看,计算机的大厦不就是建立在“0”和“1”两个基本状态的地基之上么? 状态机的要素 状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下: ①现态:是指当前所处的状态。 ②条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。 ③动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。 ④次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

51单片机实现的485通讯程序

51单片机实现的485通讯程序 #ifndef __485_C__ #define __485_C__ #include #include #define unsigned char uchar #define unsigned int uint /* 通信命令*/ #define __ACTIVE_ 0x01 // 主机询问从机是否存在 #define __GETDATA_ 0x02 // 主机发送读设备请求 #define __OK_ 0x03 // 从机应答 #define __STATUS_ 0x04 // 从机发送设备状态信息 #define __MAXSIZE 0x08 // 缓冲区长度 #define __ERRLEN 12 // 任何通信帧长度超过12则表示出错uchar dbuf[__MAXSIZE]; // 该缓冲区用于保存设备状态信息uchar dev; // 该字节用于保存本机设备号 sbit M_DE = P1^0; // 驱动器使能,1有效 sbit M_RE = P1^1; // 接收器使能,0有效

void get_status(); // 调用该函数获得设备状态信息,函数代码未给出 void send_data(uchar type, uchar len, uchar *buf); // 发送数据帧 bit recv_cmd(uchar *type); // 接收主机命令,主机请求仅包含命令信息 void send_byte(uchar da); // 该函数发送一帧数据中的一个字节,由send_data()函数调用void main() { uchar type; uchar len; /* 系统初始化*/ P1 = 0xff; // 读取本机设备号 dev = (P1>>2); TMOD = 0x20; // 定时器T1使用工作方式2 TH1 = 250; // 设置初值 TL1 = 250; TR1 = 1; // 开始计时 PCON = 0x80; // SMOD = 1 SCON = 0x50; // 工作方式1,波特率9600bps,允许接收 ES = 0; // 关闭串口中断 IT0 = 0; // 外部中断0使用电平触发模式 EX0 = 1; // 开启外部中断0

基于51单片机的双机串行通信

机电高等专科学校2015-2016学年第1学期通信实训报告 系别:电子通信工程系 班级: xxxxxx 学号: 13xxxxxxxxx : xxxxxxx 2015年12月

基于51单片机的双机串行通信 摘要:串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。在通信过程中,使用通信协议进行通信。 关键字:通信双机 一、总体设计 1设计目的 1.通过设计相关模块充分熟悉51单片机的最小系统的组成和原理; 2.通过软件仿真熟悉keil和proteus的配合使用; 3.通过软件编程熟悉51的C51编程规; 4.通过实际的硬件电路搭设提高实际动手能力。 2.设计要求: 两片单片机之间进行串行通信,A机将0x06发送给B机,在B机的数码管上静态显示1,B机将0~f动态循环发送到A机,并在其数码管上显示。 3.设计方案: 软件部分,通过通信协议进行发送接收,A机先送0x06(B机数码管显示1)给B机(B机静态显示),当从机接收到后,向B机发送代表0-f的数码管编码数组。B收到0x06后就把数码表TAB[16]中的数据送给从机。 二、硬件设计 1.51单片机串行通信功能 计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。51单片机用4个接口与外界进行数据输入与数据输出就是并行通信,并行通信的特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。串行通信的特点是只用两条信号线(一条信号线,再加一条地线作为信号回路)即可完成通信,成本低,传输的距离较远。 51单片机的串行接口是一个全双工的接口,它可以作为UART(通用异步接受和发送器)用,也可以作为同步移位寄存器用。51单片机串行接口的结构如下:

基于51单片机的多机通信系统设计

单片机多机通信系统 一、引言 随着单片机技术的不断发展,单片机的应用已经从单机向多机互联化方向发展。单片机在实时数据采集与数据处理方面,有着成本低、能满足一般要求、开发周期短等优点,其在智能家居、计算机的网络通信与数据传输、工业控制自动化等方面有着广泛的应用。 本系统就是面向智能家居应用而设计的。在初期,采用红外无线通信方式,其传输距离短,适于一般家庭应用,且成本相对较低;待方案成熟、成本允许,可以改用GSM无线通信方式。 二、系统原理及方案设计 1 、系统框架介绍 本系统为基于51单片机的多机红外无线通信系统,由三个51单片机模块组成。其中一个作为主机(即上位机),负责接收来自从机1(即下位机)采集的数据信息,以及向从机2(即下位机)发送控制信息。从机1就是数据采集模块,采集温度、光强等室内数据,并将其发送给主机。主机经分析处理,作出相应判断,并给从机2发送控制信息,使由从机2控制的电机作出相应反应,调节室内环境状况。 系统总体框图如下图1所示,图2为红外收发模块简图:

图1 系统总体框图 图2 红外收发模块简图 2 、多机通信原理介绍 在多机通信系统中,要保证主机与从机间可靠的通信,必须要让通信接口具有识别功能,51单片机串行口控制寄存器SCON中的控制位SM2正就是为了满足这一要求而设置的。当串行口以方式2或方式3工作时,发送或接收的每一帧信息都就是11位的,其中除了包含SBUF 寄存器传送的8位数据之外,还包含一个可编程的第9位数据TB8或RB8。主机可以通过对TB8赋予1或0,来区别发送的就是数据帧还就是地址帧。 根据串行口接收有效条件可知,若从机的SCON控制位SM2为1,则当接收的就是地址帧时,接收数据将被装入SBUF并将RI标志置1,向

51单片机的结构及其组成

51单片机的结构及其组成 在前面的五节课当中,我们讲述的都是一些基础概念的知识,从这节开始,我们就正式的切入到我们所在学习的对象--51单片机。 学习单片机的内部结构之前,我们先了解下我们现在正在使用的计算机的几大组成部份: 计算机的五个组成部份: 运算器:用于实现算术和逻辑运算。计算机的运算和处理都在这里进行; 控制器:是计算机的控制指挥部件,使计算机各部份能自动协调的工作; 存储器:用于存放程序和数据;(又分为内存储器和外存储器,内存储器就如我们电脑的硬盘,外存储器就如我们的U盘) 输入设备:用于将程序和数据输入到计算机(例如我们电脑的键盘、扫描仪); 输出设备:输出设备用于把计算机数据计算或加工的结果以用户需要的形式显示或保存(例如我们的打印机)。 注: 1、通常把运算器和控制器合在一起称为中央处理器(Central Processing Unit),简称CPU。 2、通常把外存储器、输入设备和输出设备合在一起称之为计算机的外部设备。 上面讲的是我们的个人办公计算机,那么51单片机的内部又有些什么部件组成呢? 1、中央处理单元(8位) 数据处理、测试位,置位,复位位操作 2、只读存储器(4KB或8KB) 永久性存储应用程序,掩模ROM、EPROM、EEPROM 3、随机存取内存(128B、128B SFR) 在程序运行时存储工作变量和资料 4、并行输入/输出口(I / O)(32条) 作系统总线、扩展外存、I / O接口芯片 5、串行输入/输出口(2条) 串行通信、扩展I / O接口芯片 6、定时/计数器(16位、加1计数) 计满溢出、中断标志置位、向CPU提出中断请求,与CPU之间独立工作 7、时钟电路 内振、外振。

51单片机多机通信课程设计

《单片机应用与仿真训练》设计报告 单片机多机通信 姓名: 学号: 专业班级: 指导老师: 所在学院: 2011年7月5日

摘要 本设计是基于AT89S52单片机温度检测传输的三机通信系统,有三个单片机组成,其中一个作为主机(上位机),控制并负责接收来自从机1号和从机2号采集的数据信息,并显示在数码管上。由主机发送控制信息(通过按键控制),确定是接收来自想要得到各从机数据。从机1号和2号是数据采集模块,用来采集室内或室外温度信息,并通过通信协议传送给主机。为保证三机通信可靠性,通信口要有识别功能,51单片机串行口控制寄存器SCON中SM2位正是满足这一要求而设置的。当串行口以工作方式三工作时,接收和发送的信息都是11位数据,既包含SBUF寄存器传送的8位数据,还包括SCON中可编程第9位数据即TB8或RB8,主机可通过设定TB8是0或1,来区别发送的是地址还是数据。从机都先将SCON中的SM2设置为1,待主机发送地址信息,与本身的地址对照,如果是,则令从机SM2为0,准备接收主机信息并发送温度信息,如果不是,则继续等待。主机通过中断口接收数据,处理后显示在数码管上。此次设计由于只有一个18b20温度传感器,这里用三个任意的数据代替从机2采集温度数据,由于传输距离较短,这里不用MAX232,直接将主机的发送端接从机接收端,主机接收端连接从机发射端,仿真结果正常显示,实验结果正常。

目录 1概述 (1) 1.1设计概述 (1) 1.2多机通信基本原理 (1) 1.3 通信协议 (2) 2系统总体方案及硬件设计 (3) 2.1总体设计方案 (3) 2.2硬件电路设计 (3) 3软件设计 (7) 3.1控制流程图 (7) 3.2串行口采集步骤 (7) 3.3软件流程图 (8) PROTEUS仿真 (9) 课程设计体会 (11) 参考文献: (12) 附件1:主机A源程序代码 (13) 附件2:原理图 (24)

80C51单片机的引脚功能

1.1 80C51单片机的引脚功能 80C51系列中,用CHMOS工艺制造的单片机都采用双列直插式(DIP)40脚封装,引脚信号完全相同。图2-9为引脚图,这40根引脚大致可分为:电源(V CC、V SS、V PP、V PD)、时钟(XTAL1、XTAL2)、I/O口(P0~P3)、地址总线(P0口、P2口)和控制总线(ALE、RST、、、 )等几部分。它们的功能简述如下: 1.电源 Vcc(引脚号40),芯片电源,接+5V;Vss(引脚号20),电源接地端。 2.时钟 XTAL1(引脚号18)内部振荡电路反相放大器的输入端,是外接晶振的一个引脚。当采用外部振荡器时,此引脚接地。 XTAL2(引脚号19)内部振荡器的反相放大器输出端,是外接晶振的另一端。当采用外部振荡器时,此引脚接外部振荡源。 3.控制总线 (1)ALE/(引脚号30):正常操作时为ALE功能(允许地址锁存),用来把地址的低字节锁存到外部锁存器。ALE引脚以不变的频率(振荡器频率的 1/6)周期性地发出正脉冲信号。因此,它可用作对外输出的时钟信号或用于定时。但要注意,每当访问外部数据存储器时,将跳过一个ALE脉冲。ALE端可以驱动(吸收或输出电流)8个LSTTL电路。在8751单片机EPROM编程期间,此 引脚接编程脉冲(功能)。 (2)(引脚号29):外部程序存储器读选通信号。在从外部程序存储器取指令(或数 据)期间,在每个机器周期内两次有效。可以驱动8个LSTTL电路。 (3)RST/VPD(引脚号9):复位信号输入端。振荡器工作时,该引脚上持续2个机器周期的高 电平可实现复位操作。此引脚还可接上备用电源。在Vcc掉电期间,由向内部RAM提供电源,以保持内部RAM中的数据。 (4)/Vpp(引脚号31):为内部程序存储器和外部程序存储器的选择端。当 为高电平时,访问内部程序存储器(PC值小于4K);当为低电平时,访问外部程序存储器。对于87C51单片机,在EPROM编程期间,此端为21V编程电源输入端。

51单片机多任务的原理及其实现

51单片机多任务操作系统的原理与实现 51单片机多任务操作系统的原理与实现 -- 一个超轻量级的操作系统 前言 想了很久,要不要写这篇文章?最后觉得对操作系统感兴趣的人还是很多,写吧. 我不一定能造出玉,但我可以抛出砖. 包括我在内的很多人都对51使用操作系统呈悲观态度,因为51的片上资源太少.但对于很多要求不高的系统来说,使用操作系统可以使代码变得更直观,易于维护,所以在51上仍有操作系统的生存机会. 流行的uCos,Tiny51等,其实都不适合在2051这样的片子上用,占资源较多,唯有自已动手,以不变应万变,才能让51也有操作系统可用.这篇贴子的目的,是教会大家如何现场写一个OS,而不是给大家提供一个OS版本.提供的所有代码,也都 是示例代码,所以不要因为它没什么功能就说LAJI之类的话.如果把功能写全了,一来估计你也不想看了,二来也失去灵活性没有价值了. 下面的贴一个示例出来,可以清楚的看到,OS本身只有不到10行源代码,编译后 的目标代码60字节,任务切换消耗为20个机器周期.相比之下,KEIL内嵌的 TINY51目标代码为800字节,切换消耗100~700周期.唯一不足之处是,每个任务要占用掉十几字节的堆栈,所以任务数不能太多,用在128B内存的51里有点难度,但对于52来说问题不大.这套代码在36M主频的STC12C4052上实测,切换任务仅需2uS. #include #define MAX_TASKS 2 //任务槽个数.必须和实际任务数一至 #define MAX_TASK_DEP 12 //最大栈深.最低不得少于2个,保守值为12. unsigned char idata task_stack[MAX_TASKS][MAX_TASK_DEP]; //任务堆栈. unsigned char task_id; //当前活动任务号 //任务切换函数(任务调度器) void task_switch(){ task_sp[task_id] = SP; if(++task_id == MAX_TASKS) task_id = 0; SP = task_sp[task_id]; } //任务装入函数.将指定的函数(参数1)装入指定(参数2)的任务槽中.如果该槽中原来就有任务,则原任务丢失,但系统本身不会发生错误. void task_load(unsigned int fn, unsigned char tid) {

MCS-51单片机的结构与原理

第1章MCS-51单片机的结构与原理主要内容:典型单片机( MCS-51, MSP430, EM78, PIC, Motorola, AVR )的性能,MCS-51内部结构、特点、工作方式、时序和最小应用系统。为学生后续学习单片机应用系统设计、利用单片机解决工程实际问题打下坚实的基础。重点在于基本概念、组成原理、特点及MCS-51的最小应用系统,难点在于时序。 1.1 典型单片机性能概览 典型单片机有MCS-51、MSP430、EM78、PIC、Motorola、AVR等。MSP430为低功耗产品,功能较强。EM78为低功耗产品,价格较低。PIC为低电压、低功耗、大电流LCD驱动、低价格产品。Motorola是世界上最大的单片机生产厂家之一,品种全、选择余地大、新产品多。其特点是噪声低,抗干扰能力强,比较适合于工控领域及恶劣的环境。AVR为高速、低功耗产品,支持ISP、IAP,I/O口驱动能力较强。 1.2 MCS-51单片机硬件结构及引脚 MCS-51系列单片机都是以Intel公司最早的典型产品8051为核心,增加了一定的功能部件后构成的,因此,本章以8051为主介绍MCS-51系列单片机。 1.2.1 MCS-51单片机的内部结构 MCS-51单片机的组成: CPU(进行运算、控制)、RAM(数据存储器)、ROM(程序存储器)、I/O口(串口、并口)、内部总线和中断系统等。组成框图如下: 内部结构如下:

1. 中央处理器(CPU) 组成:运算器、控制器。8051的CPU包含以下功能部件: (1)8位CPU。 (2)布尔代数处理器,具有位寻址能力。 (3)128B内部RAM数据存储器,21个专用寄存器。 (4)4KB内部掩膜ROM程序存储器。 (5)2个16位可编程定时器/计数器。 (6)32个(4×8位)双向可独立寻址的I/O口。 (7)1个全双工UART(异步串行通信口)。 (8)5个中断源、两级中断优先级的中断控制器。 (9)时钟电路,外接晶振和电容可产生1.2MHz~12 MHz的时钟频率。 (10)外部程序/数据存储器寻址空间均为64KB。 (11)111条指令,大部分为单字节指令。 (12)单一+5V电源供电,双列直插40引脚DIP封装。 (1)运算器 组成:8位算术逻辑运算单元ALU(Arithmetic Logic Unit)、8位累加器A(Accumulator)、8位寄存器B、程序状态字寄存器PSW(Program Status Word)、8位暂存寄存器TMP1和TMP2 等。

基于51单片机的双机串行通信课程设计 1000110061

基于AT89C51单片机的双机串行通信设计 姓名:杨应伟 学号:100110061 专业:机械设计制造及其制动化 班级:机电二班

前言 单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域随着计算机技术的发展及工业自动化水平的提高, 在许多场合采用单机控制已不能满足现场要求,因而必须采用多机控制的形式,而多机控制主要通过多个单片机之间的串行通信实现。串行通信作为单片机之间常用的通信方法之一, 由于其通信编程灵活、硬件简洁并遵循统一的标准, 因此其在工业控制领域得到了广泛的应用。 在测控系统和工程应用中,常遇到多项任务需同时执行的情况,因而主从式多机分布式系统成为现代工业广泛应用的模式。单片机功能强、体积小、价格低廉、开发应用方便,尤其具有全双工串行通讯的特点,在工业控制、数据采集、智能仪器仪表、家用电器方面都有广泛的应用。同时,IBM-PC机正好补充单片机人机对话和外围设备薄弱的缺陷。各单片机独立完成数据采集处理和控制任务,同时通过通信接口将数据传给PC机,PC机将这些数据进行处理、显示或打印,把各种控制命令传给单片机,以实现集中管理和最优控制。串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。 在通信过程中,使用通信协议进行通信。在测控系统和工程应用中,常遇到多项任务需同时执行的情况,因而主从式多机分布式系统成为现代工业广泛应用的模式。单片机功能强、体积小、价格低廉、开发应用方便,尤其具有全双工串行通讯的特点,在工业控制、数据采集、智能仪器仪表、家用电器方面都有广泛的应用。同时,IBM-PC机正好补充单片机人机对话和外围设备薄弱的缺陷。各单片机独立完成数据采集处理和控制任务,同时通过通信接口将数据传给PC机,PC机将这些数据进行处理、显示或打印,把各种控制命令传给单片机,以实现集中管理和最优控制。 串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。在通信过程中,使用通信协议进行通信。

80C51单片机引脚图及引脚功能介绍

80C51单片机引脚图及引脚功能介绍 首先我们来介绍一下单片机的引脚图及引脚功能(如下图所示),引脚的具体功能将在下面详细介绍 单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。 ⒈ 电源: ⑴ VCC - 芯片电源,接+5V; ⑵ VSS - 接地端; ⒉ 时钟:

XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。 ⒊ 控制线:控制线共有4根, ⑴ ALE/PROG:地址锁存允许/片内EPROM编程脉冲 ① ALE功能:用来锁存P0口送出的低8位地址 ② PROG功能:片内有EPROM的芯片,在EPROM 编程期间,此引脚输入编程脉冲。 ⑵ PSEN:外ROM读选通信号。 ⑶ RST/VPD:复位/备用电源。 ① RST(Reset)功能:复位信号输入端。 ② VPD功能:在Vcc掉电情况下,接备用电源。 ⑷ EA/Vpp:内外ROM选择/片内EPROM编程电源。 ① EA功能:内外ROM选择端。 ② Vpp功能:片内有EPROM的芯片,在EPROM 编程期间,施加编程电源Vpp。 ⒋ I/O线

80C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。 P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。 拿到一块单片机,想要使用它,首先必须要知道怎样去连线,我们用的一块89C51的芯片为例,我们就看一下如何给它连线。 1、电源:这当然是必不可少的了。单片机使用的是5V电源,其中正极接40管脚,负极(地)接20管脚。 2、振蒎电路:单片机是一种时序电路,必须供给脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。只要买来晶体震荡器,电容,连上就能了,按图1接上即可。 3、复位管脚:按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。 4、 EA管脚:EA管脚接到正电源端。至此,一个单片机就接好,通上电,单片机就开始工作了。

80C51单片机内部结构和工作原理

第2章80C51单片机内部结构和工作原理 本章要点 80C51系列单片机内部结构 外部引脚功能 存储空间配置和功能 片内RAM结构和功能 特殊功能寄存器的用途和功能 程序计数器PC的作用和基本工作方式 I/O端口结构、工作原理及功能 时钟和时序 复位电路、复位条件和复位后状态 低功耗工作方式的作用和进入退出的方法 §2-1 内部结构和引脚功能 一、 二、引脚功能 40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。

⒈电源: ⑴VCC - 芯片电源,接+5V; ⑵VSS - 接地端; ⒉时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。 ⒊控制线:控制线共有4根, ⑴ALE/PROG:地址锁存允许/片内EPROM编程脉冲 ①ALE功能:用来锁存P0口送出的低8位地址 ②PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。 ⑵PSEN:外ROM读选通信号。 ⑶RST/VPD:复位/备用电源。 ①RST(Reset)功能:复位信号输入端。 ②VPD功能:在Vcc掉电情况下,接备用电源。 ⑷EA/Vpp:内外ROM选择/片内EPROM编程电源。 ①EA功能:内外ROM选择端。 ②Vpp功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。 ⒋I/O线 80C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。 P3.0 ——RXD:串行口输入端; P3.1 ——TXD:串行口输出端; P3.2 ——INT0:外部中断0请求输入端; P3.3 ——INT1:外部中断1请求输入端; P3.4 ——T0:定时/计数器0外部信号输入端; P3.5 ——T1:定时/计数器1外部信号输入端; P3.6 ——WR:外RAM写选通信号输出端; P3.7 ——RD:外RAM读选通信号输出端。 §2-1 存储空间配置和功能 80C51的存储器组织结构可以分为三个不同的存储空间,分别是: ⑴64KB程序存储器(ROM),包括片内ROM和片外ROM; ⑵64KB外部数据存储器(外RAM); ⑶256B内部数据存储器(内RAM) (包括特殊功能寄存器)。 80C51存储空间配置图 一、程序存储器(ROM) 地址范围:0000H~FFFFH,共64KB。其中:

80C51单片机原理试题-A

工程大学考试试卷标准答案及评分标准专用纸 A (# ) B () 2010/2011学年 第2学期 课程:单片机原理 班级:机电 教师: 荀杰 一、单项选择题。(每题2分,共22分) 1.8位二进制所表示的无符号整数,其相应的十进制数范围是(A )A .0-255 B .1-256 C .1-255 D .0-256 2.字母“b ”的ASC Ⅱ码是(D ) A . 11H B .OBH C .BOH D .62H 3.十进制数-1用二进制补码表示,该补码是(A )0 A . FFH B .00H C .FEH D .81H 4.8031单片机外接ROM 时,使用(A )引脚来选通74LS373芯片A .ALE B .SEN P C .EA D WR 5.如果8031单片机的一个机器周期为2微秒,则其时钟频率为(A )MHzA .6 B .8 C .12 D .16 6.8031单片机内含定时器和串行口的个数分别为( A ) A . 2和1 B .1和2 C .3和1 D .2和2 7.对程序存储区数据传送,应采用助记符为(C ) A . MOV B .MOVX C .MOVC D .PUSH 8.下列各指令中(A )才属于MCS -51指令系统的位指令 A . ANLC.,/bit B .XRLC,bit C .ORLbit,C D .MOVC,/bit 9.8031单片机外部中断0请示信号输入的引脚是(B ) A . RXD B .INTO C .T O D .WR 10.8031单片机的定时器1的中断程序入口地址为(A ) A .001BH B .0003H C .000BH D .0013H 11.8031片可扩展数据存储器( A )KB0 A . 64 B .32 C .8 D .4 二、填空题(每题2分,共24分) 1.87H 是用8位二进制原码表示的十六进制数,其相应的十进制数是_—7(答对了给2分;写出负号,数值不对给0.5分)__ 2.假设2个一字节的十六进制数9FH ,81H 相加的和仍然为8位二进制数,那么相加后其进位标志为_1 _(1或0),溢出标志为__1_(0或1)。 3.8031单片机中IP =0EH ,IE =8DH 时,CPU 能响应的优先权最低的中断源是__数据 _。 IP 寄存器格式 IE 寄存器格式 4.8031.单片机中,T0初始后让其开始计数,应将TCON 中的____ TR0___位置1。 T1方式字段 T0方式字段

外文翻译---51系列单片机的结构和功能

外文翻译---51系列单片机的结构和功能

外文资料翻译 英文原文: Structure and function of the MCS-51 series Structure and function of the MCS-51 series one-chip computer MCS-51 is a name of a piece of one-chip computer series which Intel Company produces. This company introduced 8 top-grade one-chip computers of MCS-51 series in 1980 after introducing 8 one-chip computers of MCS-48 series in 1976. It belong to a lot of kinds this line of one-chip computer the chips have such as 8051, 8031, 8751, 80C51BH, 80C31BH,etc., their basic composition, basic performance and instruction system are all the same. 8051 daily representatives- 51 serial one-chip computers . An one-chip computer system is made up of several following parts: (1) One microprocessor of 8 (CPU). (2) At slice data memory RAM (128B/256B),it use not depositing not can reading /data that write, such as result not middle of operation, final result and data wanted to show, etc. (3) Procedure memory ROM/EPROM (4KB/8KB ), is used to preserve the procedure , some initial data and form in slice. But does not take ROM/EPROM within some one-chip computers, such as 8031 , 8032, 80C ,etc.. (4) Four 8 run side by side I/O interface P0 four P3, each mouth can use as introduction, may use as exporting too. (5) Two timer / counter, each timer / counter may set up and count in the way, used to count to the external incident, can set up into a timing way too, and can according to count or result of timing realize the control of the computer. (6) Five cut off cutting off the control (universal asynchronous receiver/transmitter (UART) ), is it realize one-chip computer or one-chip computer and serial communication of computer to use for. (8) Stretch oscillator and clock produce circuit, quartz crystal finely tune electric capacity need outer. Allow oscillation frequency as 12 megahertz now at most. Every the above-mentioned part was joined through the inside data bus .Among them, CPU is a core of the one-chip computer, it is the control of the computer and command center, made up of such parts as arithmetic unit and controller , etc.. The arithmetic unit can carry on 8 persons of arithmetic operation and unit ALU of logic operation while including one, the 1 storing devices temporarily of 8, storing device 2 temporarily, 8's accumulation device ACC, register B and procedure state register PSW, etc. Person who accumulate ACC count by 2 input ends entered of checking etc. temporarily as one operation often, come from person who store 1 operation is it is it make operation to go on to count temporarily , operation result and loop back ACC with another one. In addition, ACC is often regarded as the transfer station of data transmission on 8051 inside. The same as general microprocessor, it is the busiest register. Help remembering that agreeing with a expresses in the order. The controller includes the procedure counter, the order is deposited, the

51单片机常见的五种流水灯编写方式

51单片机常见的五种流水灯编写方式通过改变赋值实现流水灯 void main() { while(1) { P2=0xfe; delay1ms(500); P2=0xfd; delay1ms(500); P2=0xfb; delay1ms(500); P2=0xf7; delay1ms(500); P2=0xef; delay1ms(500); P2=0xdf; delay1ms(500); P2=0xbf; delay1ms(500); P2=0x7f; delay1ms(500); } } 通过公式运算实现流水灯 void main() { while(1) { uint a,b=1; P2=0xfe; delayms(500); for(a=0;a<7;a++) {

P2-=b; // P2=P2-b delayms(500); b=b*2; //都化为同一类型进制运算 } } } 通过操作符<<与“|”实现流水灯 (通过移位实现流水灯) void main() { uchar a,i; while(1) { a=0xfe; //点亮第一位LED灯 for(i=0;i<8;i++) { P2=a; a=a<<1; //左移一位 a=a|0x01; //左移一位后与0x01相或,保证左移后最低位为1 delay_ms(500); } } } 通过库函数_crol_(字符左移)实现流水灯 void main() { uint a; a=0xfe; while(1) { P2=a;a=_crol_(a,1); delay_ms(500); } } 采用数组实现流水灯

相关文档
最新文档