第3章 MCS-51单片机汇编语言程序设计

第3章 MCS-51单片机汇编语言程序设计
第3章 MCS-51单片机汇编语言程序设计

第3章MCS-51单片机汇编语言程序设计

3.1 MCS-51单片机指令系统

3.1.1基础知识

1.基本概念

指令:由程序员编写的能够为计算机识别的命令。

指令系统:由全部指令构成的指令集合。

汇编语言:用助记符描述的指令的集合。

汇编程序:汇编语言编写的程序借助编译工具编译成为目标代码,计算机才能识别。这个编译工具称为汇编程序。

2.指令的分类

每条指令在程序存储器ROM中占据一定的空间,以字节为单位。按指令所占字节数分类:

单字节(49条);双字节(46条);3字节(16条)。

每条指令在执行时要花去一定的时间,以机器周期为单位。按指令执行时间分类:

单周期(64条);双周期(45条);4周期(2条)。

按指令的功能分类,可分为5大类:

数据传送类(29条);算术运算类(24条);逻辑运算及移位类(24);控制转移类(17条);位操作类(17条)。

3.MCS-51单片机指令的格式

1).MCS-51单片机指令的标准形式:

[标号:]操作码[目的操作数/寻址方式][,源操作数/寻址方式][;注释]

其中:方括符[ ]表示可选项,一个具体的指令可以有这部分也可以没有这部分;标号代表指令所在的程序存储器地址,可以是1-8个以字母开头的字符串,以“:”结尾;操作码就是指令功能助记符;目的操作数存储指令的操作结果;源操作数是操作的数据源;注释是以“;”开头的不进行任何操作,起到帮助解释程序功能的作用。

2).MCS-51单片机指令的寻址方式

寻址方式:指令按地址获得操作数的方式。

MCS-51单片机共有七种寻址方式:

(1)寄存器寻址:操作数存储在寄存器中,是最节省存储空间的一种寻址方式。

(2)立即寻址:指令中直接给出进行操作的操作数,操作数以#为前缀,当操作数是以A—F 开头的十六进制数时必须在前面添一个“0”。二进制数必须带后缀“B”或“b”;十六进制数必须带后缀“H”或“h”;十进制数的后缀是“D”或“d”或不加任何符号。

(3)寄存器间接寻址:操作数的地址存放在寄存器中,循环结构程序经常使用这种寻址方式,也作为52系列单片机寻址内部RAM 80H-0FFH单元的寻址方式。

(4)直接寻址:直接给出存放操作数的地址,SFR只能采用直接寻址方式。

(5)基址加变址间接寻址:基址寄存器的内容加上变址寄存器的内容是存放操作数的地址,查表程序经常使用这种寻址方式;

(6)相对寻址:在指令中给出相对地址rel,rel是一个8位数的地址偏移量,是相对于转移指令下一条指令第一个指令代码的地址偏移量。是控制程序转移时使用的寻址方式;

(7)位寻址:指令中给出进行操作位的直接地址,是MCS-51单片机的一个特点。

最后应当指出一条指令可能有多种寻址方式。

3.1.2 指令系统

MCS-51单片机的汇编语言包括两种指令:一种是(真)指令:告诉计算机如何操作以及做何种操作;另一种是伪指令:告诉汇编程序在翻译应用程序时有何具体约定。伪指令不进行具体的操作。

1.指令集

MCS-51系列单片机指令集含有111条指令,按功能分可以分成五大类功能:

1).数据传送类指令(5种/29条)

①内部存储器间传送:(MOV—16条);

②外部数据存储器与累加器间传送:(MOVX——4条);

③程序存储器向累加器传送:(MOVC—2条);

④数据交换:(XCH,XCHD,SWAP—5条);

⑤堆栈操作:(PUSH,POP—2条)。

2).算术运算类指令(6种/24条)

①半加法运算:(ADD—4条);

②带进位加法运算(ADDC—4条);

③带借位减法运算(SUBB—4条);

④加1/减1操作:(INC,DEC—9条);

⑤单字节乘/除法运算:(MUL,DIV—2条);

⑥十进制调整:(DA A—1条)。;

3).逻辑运算及移位类指令(5种/24条)

①逻辑与运算:(ANL—6条);

②逻辑或运算:(ORL—6条);

③逻辑异或运算:(XRL—6条);

④累加器清零/取反:(CLR,CPL—2条);

⑤累加器移位操作:(RL,RLC,RR,RRC—4条)。

4).控制转移类指令(4种/17条)

①无条件转移:(LJMP,AJMP,SJMP,JMP—4条);

②条件转移(判断跳转):(JZ,JNZ,CJNE,DJNZ—8条);

③程序调用及返回:(LCALL,ACALL,RET,RETI—4条);

④空操作:(NOP—1条)。“耗时”一个机器周期。

5).位操作类指令(4种/17条)

①位传送:(MOV—2条);

②位清零/置位:(CLR,SETB—4条);

③位逻辑与/或/非运算:(ANL,ORL,CPL—6条);

④位条件转移:(JC,JNC,JB,JNB,JBC—5条)。

2. 伪指令

1).ORG伪指令

格式:ORG常数

此语句用于指出程序在程序存储器中的位置,通过ORG指令参数的变化,可以定义程序编译后的存储地址,主程序可以省略此语句,相当于使用ORG 0000H。

2).END伪指令

格式:END

指出源程序的结束。编译程序对END后面语句不作处理。

3).DB伪指令

格式:地址名:DB表达式表

DB伪指令按字节值初始化存储器,表达式表是由逗号分隔的一个或多个字节值或字符串组成。

例:ABC:DB ?DA Y?,25H,1010B

ABC:DB 44H,41H,59H,25H,0AH

这两条伪指令是等价的。

DB伪指令中的地址名,应由以字母开头不长于12个字符的串组成,可以被指令作为参数引用,引用时地址名具有相应数据区首地址的值。

4).DW伪指令

格式:地址名:DW 数字表

DW伪指令按字(二个字节)初始化存储器,与DB伪指令一样,地址名可以被指令作为参数引用。

例:ABC:DW 1234H,08H

ABC:DB 12H,34H,00H,08H

以上两条伪指令是等价的。

5).DS伪指令

格式:地址名:DS 常数

DS伪指令保留一段存储空间,空间的长度由常数指定。该空间全部填写FFH。

例如:ABC:DS 4

ABC:DB 0FFH,0FFH,0FFH,0FFH。

以上两条伪指令是等价的。

6).EQU伪指令

格式:符号名EQU 21H

EQU伪指令给符号名指定一个数值,以后用户可以在指令中引用符号名就相当于使用该数值。

例如:NUM EQU 21H

MOV A,#NUM

等价于MOV A#21H(源操作数是立即寻址)

MOV A,NUM

等价于MOV A,21H(源操作数是直接寻址)

7).位地址符号命令BIT

格式:字符名称BIT 位地址

该命令把位地址赋于标号段的字符名称。

例如:A1 BIT P1.0

A2 BIT P1.1

这里位地址P1.0、P1.1分别赋给标号段的字符A1、A2,在编程中可将字符A1、A2当作位地址用。

3.2 MCS-51单片机典型汇编语言程序设计要点

3.2.1循环程序

循环程序的结构大体上是相同的。要特别注意以下几个问题:

1、在进入循环之前,应合理设置循环初始变量。

2、循环体只能执行有限次,如果无限执行的话,称之为“死循环”,这是应当避免的。

3、不能破坏或修改循环体,这里,要特别注意应避免从循环体外直接跳转到循环体内。

4、多重循环的嵌套,应当是以下两种形式:图3.1(a)、(b)图均正确,应避免图(c)的情况。

(a)(b)(c)

图3.1 循环程序结构图

由此可见,多重循环是从外层向内层一层层进入,从内层向外层一层层退出。不要在外层循环中用跳转指令直接转到内层循环体内。

5、循环体内可以直接转到循环体外或外层循环中,实现一个循环由多个条件控制结束的结构。

6、对循环体的编程要仔细推敲,合理安排,对其进行优化时,应主要放在缩短执行时间上,其次是程序的长度。

3.2.2查表程序

查表是汇编语言程序设计中经常遇到的一类程序,对于一些复杂参数的计算,不仅程序长,难以计算,而且要耗费大量时间。尤其是一些非线性参数,用一般算术运算解决是十分困难的。它涉及到对数、指数、三角函数以及微分和积分运算。对于这样一些运算,用汇编语言编程都比较复杂,有些甚至无法建立数学模型,如果采用查表法解决就容易多了。

所谓查表,就是把事先计算或测得的数据按一定顺序编制成表格,存放在程序存贮器中。查表程序的任务就是根据被测数据,查出最终所需要的结果。因此查表比直接计算简单得多,尤其是对非数值计算的处理上。利用查表法可完成数据运算、数据转换和数据补偿等工作。并具有编程简单、执行速度快、适合于实时控制等优点。

编程时可以方便地利用伪指令DB或DW把表格的数据存入程序存贮器ROM。MCS-51指令系统中有两条指令具有极强的查表功能。

1. MOVC A,@A+DPTR

该指令以数据地址指针DPTR内容作基址,它指向数据表格首址,以变址器A的内容为所查表格的项数(即在表格中的位置是第几项)。执行指令时,基址加变址,读取表格中的数据,(DPTR+A)内容送A。

该指令可以灵活设置数据地址指针DPTR内容,可在64K程序存贮器范围内查表,故称为长查表指令。

2. MOVC A,@A+PC

该指令以程序计数器PC内容作基址,以变址器A内容为项数加变址调整值。执行指令时,基址加变址,读取表格中数据,(PC+A)内容送A。变址调整值即MOVC A,@A+PC指令执行后的地址到表格首址之间的距离,即两地址之间其它指令所占的字节数。

用PC内容作基址查表只能查距本指令256个字节以内的表格,被称为页内查表指令或短查表指令。执行该指令时,PC当前值是由MOVC A,@A+PC指令在程序中的位置加2以后决定的,还要计算变址调整值,使用起来比较麻烦。但它不影响DPTR内容,使程序具有一定灵活性,仍是一种常用的查表方法。

3.2.3 子程序编程及调用

在MCS-51指令系统中,子程序调用指令LCALL、ACALL的功能是:①首先将返回点

地址推入堆栈;②将子程序首址置入PC。子程序返回指令RET的功能是将返回点地址置入PC。因此,作为子程序,必须有明确的符号地址,而且,子程序的最后一句指令必须是RET。

在主程序运行时可能会用到RAM,R n,A,DPTR,PSW以及其它特殊功能寄存器,而在子程序中也可能又用到这些寄存器,如果在子程序运行时,首先不对主程序的工作环境或称现场加以保护,则在子程序运行时就可能破坏掉现场,子程序返回后,主程序会因现场环境被破坏而不能继续工作。因此,在调用子程序过程中,保护现场和恢复现场是必要的。

习题与思考题解题思路与方法

【习题3-1】什么是指令?什么是程序?简述程序在计算机中的执行过程。

【解答】指令是控制计算机进行某种操作的命令。CPU就是根据指令来指挥和控制计算机各部分协调地动作,完成规定的操作。指令是由二进制代码表示的。通常指令分为操作码和操作数两部分:操作码规定操作的类型,操作数给出参加操作的数据或存放数据的地址。

为完成某项规定任务,把计算机指令按一定次序进行编排组合所形成的指令集称为程序。程序在计算机中的执行过程实质就是执行人们所编制程序的过程,即逐条执行指令的过程。计算机每执行一条指令都可分为三个阶段进行,即取指令,分析指令和执行指令。

取指令阶段的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。

分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。

执行指令阶段的任务是:取出操作数,然后按照操作码的性质对操作数进行操作,即执行指令。

计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令或循环等待指令。

【习题3-2】MCS-51单片机的指令系统具有哪些特点?

【解答】MCS-51单片机的指令系统由111条指令组成。如果按字节数分类,有49条单字节指令、46条双字节指令和16条三字节指令,以单字节指令为主;如果按指令执行时间分类,有64条单周期指令、45条双周期指令和2条(乘、除)四周期指令,以单周期指令为主。

由此看来,MCS-51单片机的指令系统具有存储效率高、执行速度快的特点。除此而外,指令系统还有如下特点:

①可以进行直接地址到直接地址的数据传送,能把一个并行I/O口中的内容传送到内部RAM单元中而不必经过累加器A或工作寄存器Rn。这样可以大大提高传送速度和缓解累加器A的瓶颈效应。

②用变址寻址方式访问程序存储器中的表格,将程序存储器单元中的固定常数或表格字节内容传送到累加器A中。这为编程翻译算法提供了方便。

③在算术运算指令中设有乘法(MUL)和除法(DIV)指令。

④指令系统中,一些对I/O口进行操作的指令具有“读一修改一写”的功能。“读一修改一写”指令是指:在执行读锁存器的指令时,CPU首先完成将锁存器的值通过缓冲器BUF2读人内部,进行修改、改变,然后重新写到锁存器中去。这一特点是由I/O口的准双向特性所决定的。这种类型的指令包含所有的口的逻辑操作(ANL、ORL、XRL)和位操作(JBC、CPL、MOV、SETB、CLR等)指令。

⑤MCS-51单片机内部有一个布尔(位)处理器,对位地址空间具有丰富的位操作指令。布尔(位)操作类指令共有17条,其中包括布尔传送指令、布尔状态控制指令、布尔(位)逻辑

操作指令及布尔(位)条件转移指令。

【习题3-3】MCS-51单片机指令系统中有哪些寻址方式?相应的寻址空间在何处?请举一例说明。

【解答】1.MCS-51单片机指令系统的寻址方式

MCS-51单片机指令系统中有寄存器寻址、直接寻址、间接寻址、立即寻址、位寻址、基址加变址间接寻址和相对寻址七种寻址方式。

(1)寄存器寻址方式

MCS-51单片机中的工作寄存器R0一R7、累加器A、数据指针DPTR都是可寻址寄存器。在寄存器寻址操作中,这些寄存器都以寄存器名作指令操作数。

在寄存器寻址方式的操作指令中,寄存器内容作为操作数,可以是源操作数或目的操作数。例如:

INC DPTR ;DPTR寄存器内容加1

MOV A ,R7 ;工作寄存器R7内容送累加器A中

DIV AB ;A内容除以B寄存器内容

XCH A ,R6 ;A内容与R6内容交换

(2)直接寻址方式

直接寻址方式的操作指令直接把地址作为操作数来运行,既可作源操作数,也可作目的操作数。如:

MOV 30H,40H ;把片内存储器40H单元的内容送入30H单元

MOV R6,DPH ;寄存器DPH的直接寻址,将DPH中的内容送人R6

(3)间接寻址方式

间接寻址寄存器有Ri(i=0、1)和DPTR。间接寻址时,寄存器的内容是操作数的地址,在间接寻址寄存器标记前加@符号作为标记。

通过@Ri可以对片内数据存储器的00H—FFH单元间接寻址。如将40H中的内容送人累加器A中,其间接寻址操作如下:

MOV R1 ,#40H ;用R1作间接寻址寄存器,给R1赋子地址值

MOV A ,@Rl ;@R1中内容送人A中

通过@DPTR对片外数据存储器0000H—FFFFH进行间接寻址。如将A中的内容送入片外数据存储器385FH单元中,其间接寻址操作如下:

MOV DPTR ,#385FH ;给DPTR赋地址值

MOVX @DPTR ,A ;A中的内容送入片外RAM的385FH单元中

(4)位寻址方式

MCS-51单片机中有完全服务于位寻址操作的布尔指令系统。为了满足位操作中位状态的缓冲、传送、运算,将进位位C作为位寻址操作的位累加器。

在位寻址操作中,位单元可以使用地址编号或位地址名。如:

MOV 5FH ,C ;将进位位C的状态送5FH位地址中

ANL C ,5FH ;将5FH的位状态与进位位C的状态相“与”,其结果保留在C中

SETB TR0 ;将TCON中的TR0置位

CLR 8CH ;将TCON中的TR0清零,TR0的位地址为8CH

(5)立即寻址方式

指令中常常要使用一些常数来参与指令操作,由于这些常数能立即传送或赋值,故称为立即数。立即数前面必须加“#”标记。

指令中的立即数有8位立即数#dara 8和16位立即数#datal6。由于立即数是一个常数,不是物理空间,故立即数在寻址操作中只能作为源操作数。如:

MOV A ,#40H ;立即数40H给A赋值

MOV DPTR ,#385FH ;立即数385FH给DPTR赋值

ANL A ,#55H ;A中的数与55H相“与”,其结果放在A中

(6)基址加变址间接寻址方式

基址加变址间接寻址方式是以一个基地址加一个变量地址的寻址操作方式。作为基地址使用的有PC指针和DPTR地址指针;A作为变量地址使用。

采用基址加变址间接寻址操作的指令只有以下三条,即:

MOVC A ,@A+DPTR ;查表指令

MOVC A ,@A+PC ;查表指令

JMP @A+DPTR ;散转指令

前两条用于程序存储器的查表操作,后一条则用于程序的分支散转。

(7)相对寻址方式

相对寻址是将程序转移到相对地址的寻址转移操作。

相对寻址中,相对地址rel是一个8位数的地址偏移量,是相对于相对转移指令下一条指令第一个指令代码的地址偏移量。程序转移的范围为一128~+127,即向前(PC值加大)转移,最大为127个字节,向后转移(PC值减小)可转移128个字节。

相对寻址操作使用在相对转移指令中,如:

DJNZ R0,SINl ;工作寄存器R0减1不为零时程序转移到SINI标号处

2.MCS-51单片机指令系统中各寻址方式的寻址空间

MCS-51单片机指令系统中各寻址方式的寻址空间列入题表3-1中。

题表3-180C51指令系统中各寻址方式和寻址空间

【习题3-4】MCS-51单片机的片内数据存储器寻址方式有那些?每个存储区域的寻址方式的特点如何?

【解答】MCS-51单片机的片内数据存储器寻址方式有:寄存器寻址、直接寻址、间接寻址和位寻址。

1.寄存器寻址,在00H一1FH区是工作寄存器区。

工作寄存器R0~R7有4组。当前工作寄存器由SFR的程序状态字PSW的RSl、RS0位状态选择。单片机复位后PSW=00H,故复位后的当前工作寄存器R0一R7选择第0组寄存器,地址为00H~07H。在程序运行过程中可通过对PSW中RSl、RS0位的状态设置,选择当前工作寄存器为0~3组中的一组。例如,通过下述指令操作,选择当前工作寄存器为第3组,即18H~1FH单元:

MOV PSW,#18H;将PSW中的RSl、RS0置成11

2.直接寻址,将片内数据存储器的00H一7FH作为直接地址,对这些地址直接进行数

据传送操作。

例如,将数据5FH送人片内数据存储器的30H单元。直接寻址指令操作如下:

MOV 30H,#5FH ;把立即数5FH送人片内数据存储器30H单元中

3.间接寻址,将片内数据存储器作为间接地址空间,将工作寄存器R0、R1作为间接寻址寄存器,通过@Ri(i=0,1)实现间接的数据传送。例如,同样将5FH送入片内数据存储器的30H单元,采用R0寄存器间接寻址时,操作指令如下:

MOV R0 ,#30H ;将存储器地址30H给R0赋值

MOV @R0 ,#5FH ;把5FH立即数送入R0寄存器指定的30H单元中堆栈操作是以SP为间接寻址寄存器的间接寻址。MCS-51单片机的堆栈是自由堆栈。单片机复位后,堆栈指针指向内存的07H单元,在程序运行中可任意设置堆栈。堆栈设置通过设置堆栈指针的操作实现。例如,将堆栈设置到60H以后,则可通过下列指令完成:MOV SP ,#5FH ;设栈顶为60H

PUSH ACC ;进栈

POP ACC ;出栈

4.位寻址,在20H一2FH的位地址空间可实现位操作,如置位、清零、或逻辑操作、位条件转移等。例如,对21H的D3位置位或清零时,可使用以下操作指令:SETB 0BH ;对0BH位置位操作,21H单元的D3位的位地址为0BH

CLR 0BH ;对0BH位的清零操作。

【习题3-5】在8051的片内RAM中,已知(30H)=38H,(38H)=40H,(40H)=48H,(48H)=90H。分析下面各条指令,说明源操作数的寻址方式,按顺序执行各条指令后的结果。

【编程方法】

MOV A ,40H 直接寻址(A)=48H

MOV R0 ,A 寄存器寻址(R0)=48H

MOV P1 ,#0F0H 立即寻址(P1)=0F0H

MOV @R0 ,30H 直接寻址(48H)=38H

MOV DPTR ,#3848H 立即寻址(DPTR)=3848H

MOV 40H ,38H 直接寻址(40H)=40H

MOV R0 ,30H 直接寻址(R0)=38H

MOV D0H ,R0 直接寻址(D0H)=38H

MOV 18H ,#30H 立即寻址(18H)=30H

MOV A ,@R0 寄存器间接寻址因(R0)=30H,(30H)

=38H,所以(A)=38H

MOV P2 ,P1 寄存器寻址(P2)=0F0H

RET

【习题3-6】现需将外部数据存储器200DH单元中的内容传送到280DH单元中,请设计程序。

【编程方法】按题意程序设计如下:

MOV DPTR ,#200DH ;将源地址设为200DH

MOVX A ,@DPTR ;读源地址的内容

MOV DPTR ,#280DH ;将源地址设为280DH

MOVX @DPTR ,A ;读源地址的内容送目的地址【习题3-7】已知当前PC值为1010H,请用两种方珐将程序存储器10FFH中的常数送入累加器A。

【编程方法】按题意有如下两种程序设计方法。

方法一:MOV A ,#0EFH 设偏移量

MOVC A ,@A+PC 将当前PC值加偏移量地址的内容读出

方法二:MOV DPTR ,#10FFH 设基地址

MOV A ,#0 偏移地址设为0

MOVC A ,@A+DPTR 将DPTR值加偏移量地址的内容读出【习题3-8】已知累加器A中存放两位BCD码数,请编写程序实现十进制数减1。

【编程方法】按题意编写的程序如下:

MOV B ,A :保存A

ANL A ,#0FH ;取出个位

CLR C

SUBB A ,#1

CJNE A ,#0FFH,LP ;个位大于1

MOV A ,B ;个位等于0,恢复A的值

CLR C

SUBB A ,#10H ;个位不够减,向十位借位。

ADD A ,#9H ;个位置成9

RET

LP:ANL B ,#0F0H ;恢复十位数值

ORL A ,B

RET

【习题3-9】请编写程序,将片外数据存储器中2000H单元中的内容和2100H单元的内容相乘,并将结果存放在内部RAM的22H和23H单元中,高位存放在高地址中。

【编程方法】按题意编写的程序如下:

MOV DPTR ,#2000H ;DPTR指向2000H

MOVX A ,@DPTR ;取来被乘数

MOV B ,A ;存人B寄存器

MOV DPTR ,#2100H ;DPTR指向2100H

MOVX A ,@DPTR ;取来乘数存入累加器A

MUL AB ;得结果

MOV 22H ,A ;结果低位存入22单元中

MOV 23H ,B ;结果高位存入23单元中

RET

【习题3-10】已知延时程序为:

DELAY:MOV R2 ,#0FAH

L1:MOV R3 ,#0FAH

L2:DJNZ R3 ,L2

DJNZ R2 ,L1

RET

若系统的晶振频率为6MHz,求该延时子程序的延时。

【分析解答】因为晶振频率为6 MHz,所以机器周期为2μs,DJNZ:4μs;MOV:4μs;RET:4μs。

指令周期数执行时间

DELAY:MOV R2 ,#0FAH 2个机器周期,耗时4μs

L1:MOV R3 ,#0FAH 2个机器周期,耗时4μs

L2:DJNZ R3 ,L2 2个机器周期,耗时4μs

DJNZ R2 ,L1 2个机器周期,耗时4μs

RET 2个机器周期,耗时4μs

其中,0FAH=250。

所以,总时间=4μs+(250×4μs十4μs)×250+4μs=251.008 ms。

【习题3-11】请将片外数据存储器地址为2040H一2060H区域的数据块,全部搬移到片内RAM的40H一60H地址区域,并将原数据区全部填为FFH。

【编程方法】按题意编程如下:

MOV P2 ,#20H ;设置高8位地址为20H

MOV R0 ,#40H ;指向数据区首地址

M_P0:MOVX A ,@R0 ;取外部RAM中数据(用MOVX)

MOV @R0 ,A ;存人片内RAM中(用MOV)

MOV A ,#0FFH ;用#0FFH填充原来数据区

MOVX @R0 ,A

INC R0 ;指针加1

CJNE R0 ,#61H ,M_P0 ;到数据区末地址吗?没有,循环

RET ;到了结束

【习题3-12】试编写子程序,使间址寄存器R0所指的连续两个片外数据存器单元中的低4位二进制数,合并为一个字节,装入累加器A中。已知R0指向低地址,并要求该单元低4位放在A中的高4位。

【编程方法】按题意编程如下:

MOVX A ,@R0 ;取来数据

ANL A ,#0FH ;屏蔽高4位,保留低4位

SWAP A ;高4位与低4位对调

MOV B ,A ;保存在B寄存器中

INC R0 ;指向下一个地址

MOVX A ,@R0 ;取来数据

ANL A ,#0FH ;屏蔽高4位,保留低4位

ORL A ,B ;合为一个数

RET

【习题3-13】双字节与单字节无符号数相乘,设被乘数存于4lH、40H单元中,乘数存于R4中,乘积存于52H、51H、50H单元中(前者为高位字节,后者为低位字节,顺序排列),请编写此乘法程序段。

【编程方法】按题意编写的乘法程序段如下:

MOV B ,40H ;被乘数低位进B寄存器

MOV A ,R4 ;乘数进A

MUL AB ;乘

MOV 50H ,A ;存积的低8位

MOV 40H ,B ;暂存积的高8位人(40H)

MOV B ,41H ;被乘数高位进B寄存器

MOV A ,R4 ;乘数进A

MUL AB ;乘

ADD A ,40H ;(40H)+(51H)→(5lH)

MOV 51H ,A ;存积的中8位(51H)

MOV 52H ,B ;存积的高8位

MOV A ,52H ;(52H)+(CY)→(52H)

ADDC A ,#0

MOV 52H ,A

RET

【习题3-14】编程将片内40H一5FH单元中内容送到以3000H为首的片外存储区中。

【编程方法】

按题目要求编程如下:

MOV R1 ,#40H ;片内存储区首地址

MOV R0 ,#20H ;传送的字节数

MOV DPTR ,#3000H ;片外存储区首地址L1:MOV A ,@R1 ;取源区数据

MOVX @DPTR ,A ;送目的区

INC R1 ;修改源区地址

INC DPTR ;修改目的区地址

DJNZ R0 ,L1 ;循环结束判断

RET

【习题3-15】编写计算下列算式的程序。

①23H +45H +ABH +03H = ?

②CDH +15H -38H -46H =

③1234H +8347H =

④ABl23H -43ADCH =

【编程方法】

按题目要求编程如下:

① MOV B ,#00H ;和的高位清零

MOV A ,#23H

ADD A ,#45H

ADD A ,#0ABH

XCH A ,B ;相加后有溢出处理

ADDC A ,#00H

XCH A ,B

ADD A ,#3H ;结果A 中是低位,B 中是高位 RET

② MOV A ,#0CDH

ADD A ,#15H

SUBB A ,#38H

SUBB A ,#46H

RET

③ MOV A ,#34H

ADD A ,#47H

MOV 40H

,A ;结果40H 是和的最低位 MOV A ,#12H

ADDC A ,#83H

MOV 41H ,A ;结果4lH 中是和的高位

RET

④ CLR C

MOV A ,#23H

SUBB A ,#0DCH

MOV 40H ,A ;结果40H 中是低位

MOV A ,#0B1H

SUBB A ,#3AH

MOV 41H ,A

MOV A ,#0AH

SUBB A ,#04H

MOV 42H ,A ;结果42H 中是高位

RET

【习题3-16】编写计算下式的程序,设乘积结果均小于255。a 、b 值分别存在片外RAM 3001H 和3002H 单元中,结果存于片外RAM 3000H 单元中。

??

???>÷

a Y ,,,25

【编程方法】

按题目要求编程如下:

① MOV DPTR

,#3001H MOVX A

,@DPTR ;取a 值 MOV 30H ,A ;a 值暂存储在30H

INC DPTR

MOVX A ,@DPTR ;取b值

CJNE A ,30H ,L1 ;a=b?

MOV A ,#25

SJMP EE

L1:JC L2 ;a>b转向标号L2

MOV B ,30H ;a

MUL AB

SJMP EE

L2:MOV B ,A

MOV A ,30H

DIV AB

EE:MOV DPTR ,#3000H

MOVX @DPTR ,A

RET

【习题3-17】设有两个长度均为15的数组,分别存放在以2000H和2100H为首的存储区中,试编程求其对应项之和(设和步超过255),结果存放到以2200H为首的存储区中。

【编程方法】

在本题中假设两数之和不超过255。按题目要求编程如下:

MOV DPTR ,#2000H ;第一个加数首地址

MOV R1 ,#15 ;加法次数

L1:MOV DPH ,#20H ;第一个加数地址高位

MOVX A ,@DPTR ;取第一个加数

MOV R2 ,A ;暂存R2中

MOV DPH ,#21H ;另一个加数地址的高位

MOVX A ,@DPTR ;取另一个加数

ADD A ,R2 ;加第一个加数

MOV DPH ,#22H ;和地址高位

MOVX @DPTR ,A ;存和

INC DPL ;修改地址低位

DJNZ R1 ,L1 ;循环结束判断

RET

【习题3-18】设有100个用补码表示的有符号数,连续存放在以2000H为首地址的存储区中,试编程统计其中正数、负数、零的个数。

【编程方法】

在本题中设正数、负数、零的个数分别存放在30H、31H、32H单元中。按题目要求编程如下:

MOV 30H ,#0 ;正数的个数初值

MOV 31H ,#0 ;负数的个数初值

MOV 32H ,#0 ;零的个数初值

MOV DPTR ,#2000H ;设数据区首地址

MOV R1 ,#100 ;设数据区长度

L4:MOVX A ,@DPTR ;取数

INC DPTR ;修改地址

CJNE A ,#0 ,L1 ;与0比较

INC 32H ;是0,0的个数加1

SJMP L2 ;转向循环结束判断L1:JB ACC.7 ,L3 ;是负数转向L3

INC 30H ;是正数,正数个数加1

SJMP L2 ;转向循环结束判断L3:INC 31 H ;是负数,负数个数加1

L2:DJNZ Rl ,L4 ;循环结束判断

RET

【习题3-19】试编一查表程序,从首地址为2000H和长度为100的数据块中找出ASCⅡ码A,将其地址送到20A0H和20A1H单元中,其中,20A0H单元存低位地址。

【编程方法】

按题目要求编程如下:

MOV DPTR ,#2000H ;数据块首地址

MOV R2 ,#100 ;查找长度

GO_ON:MOVX A ,@DPTR ;取一个数

CJNE A ,#…A?,IFEND ;是否等于…A??

MOV A ,DPH ;是,将地址存入指定单元

MOV B ,DPL

MOV DPTR ,#20A1H

MOVX @DPTR ,A

DEC DPTR

XCH A ,B

MOVX @DPTR ,A

RET

IFEND:INC DPTR 不是,下一个

DJNZ R2 ,GO_ON ;未查找完,继续

RET

【习题3-20】在以2000H为首地址的存储区中,存放着20个用ASCⅡ码表示的0~9之间的数,试编程将它们转换成BCD码,并以压缩BCD码(即一个单元存放二位BCD码)的形式存放在3000H~3009H单元中。

【编程方法】

按题目要求编程如下:

MOV R2 ,#10 ;组合次数

MOV R3 ,#20H ;源地址送R3,R4

MOV R4 ,#00H

MOV R5 ,#30H ;目的地址送R5,R6

MOV R6 ,#00H

C_LP:MOV DPH ,R3 ;取源地址

MOV DPL ,R4

MOVX A ,@DPTR ;读一个数

ANL A ,#0FH ;屏蔽高4位,保留低4位

SWAP A ;将低4位暂存

XCH A ,B

INC DPTR ;修改源地址

MOVX A ,@DPTR ;读下一个数

ANL A ,#0FH ;屏蔽高4位,保留低4位

ORL A ,B ;和暂存数据组合成新BCD码

INC DPTR ;修改源地址

MOV R3 ,DPH ;保存源地址

MOV R4 ,DPL

MOV DPH ,R5 ;取目的地址

MOV DPL ,R6

MOVX @DPTR ,A ;保存BCD码

INC DPTR ;修改目的地址

MOV R5 ,DPH ;保存目的地址

MOV R6 ,DPL

DJNZ R2 ,C_LP ;转换未完,继续

RET

【习题3-21】试编程实现下列逻辑表达式的功能。设P1.0一P1.7为8个变量的输入端,而其中P1.7又作为变量输出端。

①76543210X X X X X X X X Y +++=

②76543210X X X X X X X X Y ++=

【编程方法】

按题目要求编程如下:

;输入端定义

X0

EQU P1.0 X1

EQU P1.1 X2

EQU P1.2 X3

EQU P1.3 X4

EQU P1.4 X5

EQU P1.5 X6

EQU P1.6 X7

EQU P1.7 ;以上是用伪指令定义的变量和管脚的对应关系 Y

EQU P1.7 TEMPl

EQU 00H ;两个暂存位定义为位地址00H 和01H TEMP2

EQU 01H 表达式① MOV

C ,X0 ANL

C ,X1 ANL

C ,/X2 ORL

C ,/X3 MOV

TEMPl ,C MOV

C ,X4 ANL

C ,X5 ANL

C ,X6 ORL

C ,/X7 ORL

C ,TEMPl MOV

Y ,C RET

表达式② MOV

C ,X0 ANL

C ,X1 CPL

C MOV

TEMPl ,C MOV

C ,X2 ANL

C ,X3 ANL

C ,X4 CPL

C MOV

TEMP2 ,C MOV

C ,X5 ANL

C ,X6 ANL

C ,X7 CPL

C ORL

C ,TEMP2 CPL

C

ORL C ,TEMPl

MOV Y ,C

RET

【习题3-22】试编写延时1s、1min、1 h的子程序。

【编程方法】

按题目要求编程如下:已知单片机晶振采用6 MHz。

;延时1 h

DLY_1H:MOV R0 ,#60

DLYlH_1:LCALL DLY 1M ;调用延时1分钟的程序

DJNZ R0 ,DLYlH_1 ;60次结束

RET

DLY_1M:MOV R1 ,#60 ;延时1 min

DLYlM_1:LCALL DLY_1S ;调用延时1秒钟的程序

DJNZ R1 ,DLYlM_1 ;60次结束

RET

DLY_1S:MOV R2 ,#100 ;延时1 s

DLYlLl:MOV R3 ,#10

DLYlS_2:MOV R4 ,#125 ;1 ms延时的设定值

DLl:NOP

NOP

DJNZ R4 ,DLl

DJNZ R3 ,DLYlS_2

DJNZ R2 ,DLYlS_1

RET

应当指出,在分钟和小时的调用程序中,忽略了一些指令的运行时间,计算结果有一定的误差,结果为近似值。

【习题3-23】在2030H和2031H单元各有一个小于12的数,编程求这两个数的平方和,用调用子程序方法实现,结果存在2040H单元。

【编程方法】

依题意编写主程序和子程序如下:

主程序MOV SP ,#50H ;设堆栈指针

MOV DPTR ,#2030H

MOVX A ,@ DPTR ;取第一个数

LCALL SQR ;求第一个数的平方

MOV R1 ,A 平方值暂存R1

MOV DPTR ,#2031H

MOVX A ,@DPTR ;取第二个数

LCALL SQR ;求第二个数的平方

ADD A ,R1 ;求平方和

MOV DPTR ,#2040H

MOVX @DPTR ,A ;存人2040H

SJMP $

SQR;MOV B ,A

MUL AB

RET

求一个数的平方还可以用查表的方法来实现

SQR:MOV DPTR ,#TAB

MOVC A ,@A+DPTR

RET

TAB:DB 0,1,4,9,16,25,36,49,64,81,100,121,…

【习题3-24】根据存入R2中的16个双字节数的序号查表找出对应数据。

【编程方法】以表格首地址(TABL)为基址,以序号(的2倍)为偏移量,查找对应的数据。 【习题3-25】从BLOCK 单元开始有一个无符号数据块,其长度存在于LEN 单元,请求出数据块中最大的数,并存入MAX 单元。

【编程方法】最基本的方法是取第一个数与第二数比较,并把此前一个数作为基准。若比较结果是基准数大,则大作交换,再取下一个来作比较;若比较结果是基准数小,则用较大的数来代替原有基准,然后再进行下轮比较。总之,要保持基准数是到目前为止最大的数。当比较结束时,基准数就是所求的最值。

LEN EQU 20H

MAX EQU 21H

BLOCK EQU 22H

START : CLR

A MOV R2 ,LEN

MOV R1 ,#BLOCK

LOOP : CLR C ;清Cy

SUBB A ,@R1 ;用减法作比较

JNC NEXT ;(A )>((R1)),转移

MOV A ,#R1 ;(A )>((R1)),A←((R1))

SJMP NEXT1

NEXT : ADD A ,@R1 ;恢复原A 的内容

NEXT1: INC

R1 DJNZ R2 ,LOOP

MOV MAX ,A

L1:

RET 【习题3-26】试编程把以2040H 为首地址的连续50个单元中的无符号数按降序排列,存放到以3000H 为首地址的存储区中。

【编程方法】

该程序采用冒泡(下沉)法,也可用别的方法;排列前首先将数据搬到目的存储单元。按题目要求编程如下:

MOV R2 ,#50 ;排序字节数

MOV R3 ,#20H ;源地址暂存人R3、R4

MOV R4 ,#40H

MOV R5 ,#30H ;目的地址暂存入R5、R6

MOV R6 ,#00H

SD_LP : MOV DPH ,R3

MOV DPL ,R4

STA1

MOV A ,R2 ;取待查数据的序号 X (入口)

RL A ;每数占2个单元,序号要乘2

MOV R4,A ;R4 ← 序号 x2 (即偏移量)

MOV DPTR ,#TABL ;DPTR ← 表格首地址 MOVC A ,@A+DPTR ;(A)← 查到数据高8位

XCH A ,R4 ;数据高8位存进R4(出口) 同时取出偏移量到A

INC DPTR ;DPTR 指向下一个单元

MOVC A ,@A+DPTR ;再查到数据低8位

MOV

R3,A ;将数据低8位存进R3(出口) RET

TABL : DW 050FH ,0E89H ,0A695H ,1EAAH ,0D9BH ,0373H

DW 7F93H ,26D7H , 2710H ,9E3FH ,1A66H ,22E3H

MOVX A ,@DPTR

INC DPTR

MOV R3 ,DPH

MOV R4 ,DPL

MOV DPH ,R5

MOV DPL ,R6

MOVX @DPTR ,A

INC DPTR

MOV R5 ,DPH

MOV R6 ,DPL

DJNZ R2 ,SD_LP ;将数据块搬到目的存储区

MOV R2 ,#49 ;重复次数

CMP_LPl:MOV DPTR ,#3000H ;起始地址

MOV R3 ,#49 ;比较次数

CMP_LP2:MOVX A ,@DPTR

MOV B ,A

INC DPTR

MOVX A ,@DPTR

CJNE A ,B ,L1 ;相邻两个数比较

L1:JC NO_CHAGE ;A小,不交换转NO_CHAGE

MOV 30H ,A ;准备交换

CLR C

MOV A ,DPL

SUBB A ,#01 H

MOV DPL ,A

MOV A ,30H

MOVX @DPTR ,A

INC DPTR ,B

MOV A

MOVX @DPTR ,A

NO_CHAGE:DJNZ R3 ,CMP_LP2 ;50个数重复一遍?

DJNZ R2 ,CMP_LPl ;排序结束?

RET

【习题3-27】在单片机片内RAM中从BLOCK单元开始存放有一个数据块,数据块长度存在于LEM单元当中,要求编写一个顺序检索程序,将存放在KEY单元中的关键字检索出来,给出关键字在数据块的序号,序号存在R2中,当找遍整个数据块而并未检索到关键字时,序号为00H。

【编程方法】方法是依次地从数据块中取数并同关键字比较,若找到关键字时,则停止比较,将序号存于R2当中;否则继续进行。

BLOCK EQU 32H

LEN EQU 30H

KEY EQU 31H

START:MOV #R0 ,BLOCK ;数据块首址→R0

MOV R1 ,LEN ;数据块长度→R1

MOV R2 ,#00H ;序号初始值为00H LOOP:MOV A ,KEY ;取关键字

XRL A ,@R0 ;比较

INC R0 ;地址指针加1

INC R2 ;序号加1

JZ ED

DJNZ R1 ,LOOP

MOV R2 ,#00H ;未检索到

ED:RET

【习题3-28】求两个8位有符号数加法,和超过8位,两个加数存放于BLOCK和BLOCK+1单元。

【编程方法】和超过8位需要占两个单元,设为SUM和SUM+1单元,两个有符号数的加法是作补码加法数来处理的,由于和超过8位,因此,和就是一个16位符号数,其符号位在16位数的最高位。为此,直接相加进位是不够的还要作一些处理,例如-65和65相加,若直接相加求和,即使扩展到16位,结果也是不正确的,正确的处理方法是先将8位有符号数扩展成16位有符号数,然后再相加。若是8位正数,则高8位扩展为00H,若是8位负数,则高8位扩展为FFH。这样处理之后,再按双字节相加,就可以得正确的结果。在编程时,可令寄存器R2和R3为两个加数的高8位,并先令其为0,即先假定两个加数为正数,然后判断符号位,再决定是否要将高8位改为FFH。

BLOCK EQU 20H

SUM EQU 22H

START:MOV R0,#BLOCK ;R0指向加数

MOV R1,#SUM ;R1指向和数

MOV R2,#0 ;高8位先设为0

MOV R3,#0 ;

MOV A,@R0 ;取出第一个加数

JNB ACC.7,N1 ;若是正数转N1

MOV R2,#0FFH ;若是负数高8位全为1 N1:INC R0 ;修改R0指针

MOV B,@R0 ;取第二个加数到B

JNB B.7,N2 ;若是正数转N2

MOV R3,#0FFH ;是负数高8位为全1 N2:ADD A,B ;低8位相加

MOV @R1,A ;存低8位和

INC R1 ;修改R1指针

MOV A,R2 ;准备加高8位

ADDC A,R3 ;高8位相加

MOV @R1,A ;存高8位和

ED:RET

【习题3-29】4位二进数转换成ASCⅡ码。已知参数:4位二进制数放于R2。结果参数:ASCⅡ码放于R3。

【编程方法】对于≤9的4位二进制数加30H得相应ASCⅡ码,对于>9的4位二进制数加37H 得相应的ASCⅡ码。

B_TO_A1: MOV A ,#9H ;

CLR C ;

SUBB A ,R2 ;

JC L1 ;(R2>)则跳转L1

MOV A ,#30H ;(R2)<=9则加30H

ADD A ,R2 ;

SJMP L2 ;

L1:MOV A ,R2 ;加37H

ADD A ,#37H ;

L2:MOV R3 ,A ;

L3:RET ;

该程序也可通过查表方法来实现。

B_TO_A2: MOV DPTR,#ASCTAB ;表首地址存于DPTR

MOV A,R2 ;取数

ANL A ,#0FH ;保留低4位

MOVC A ,@A +DPTR ;查表

MOV R3,A ;存放ASC Ⅱ码

RET ASCTAB : DB …0 1 2 3 4 5 6 7 8 9 A B C D E F?

注意:数据表格中用单引号…?括起来的元素,汇编程序汇编时,将这些元素当作ASC Ⅱ码处理。相当于:

ASCTAB :

DB 30H ,31H ,32H ,33H ,34H ,35H ,36H ,37H ,38H ,39H ,DB 41H ,42H ,43H ,44H ,45H ,46H

【习题3-30】ASC Ⅱ码转换成为4位二进制数。已知参数:ASC Ⅱ码放于R2。结果参数:4位二进制数放于R3。

【编程方法】对于≤9的数的ASC Ⅱ码减去30H 得4位二进制数,对于>9的十六进制数的ASC Ⅱ码减去37H 得二进制数。

MOV A ,R2 ;

CLR C ;

SUBB A ,#30H ;4位二进制数先减去30H

MOV R3 ,A ;

SUBB A ,#0AH ;判二进制数是否≤9

JC L1 ;是,则转L1

XCH A ,R3 ;不是,该数再减去7

SUBB A ,#07H ;

MOV R3 ,A ;

L1: RET ;

【习题3-31】十进制整数转换成二进制数可以表示十进制数,即B=a n-1×10n-1+…+a 1×10+a 0 【编程方法】如5

10)3)105)105)10)(((((6 5103105105106655351611

11234+?+?+?+?=+?+?+?+?==个

故可将最高位的十进制(6)乘以10后再加上次高位的十进制数(5),再乘10,再……,最后加最低位的十进制的结果,乘10的次数为十进制数的位数减1。

START : MOV A ,R3

MOV B ,#10H

DIV AB ;分离十位和个位

MOV R4 ,B

MOV B ,#10

MUL AB

ADD A ,R4

MOV R7 ,A ;将十位和个位转换成十六进制数

MOV A ,R2

MOV B ,#10H

DIV AB ;分离千位和百位

MOV R4 ,B

MOV B ,#10

MUL AB

ADD A ,R4 ;将千位和百位转换成十六进制数

MOV B ,#100 ;扩大100倍

MUL AB ;

ADD A ,R7

MOV R7 ,A

CLR A

ADDC A ,B

MOV R6 ,A ;十六进制数相加

ED:RET

【习题3-32】二进制数转换成十进制数。一个M位二进制整数的表达式为:B=b m-1×2m-1+…+b1×2+b0

=(((…(b m-1×2)+b m-2)×2+b1)×2)+b0

可用以下公式来计算:

初值:B=0,i=M-1

循环体-B=B×2+Bi i=i-1

结束条件:i<0

由上式可见,我们只要对部分和B按十进制常数运算法则进行乘2和加Bi位的运算,就可得到十进制的转换结果。这里的十进制乘2和加Bi位的运算可用带进位加法指令来完成,然后进行十进制调整可得十进制运算结果,以压缩的BCD码方式存放。

把R2、R3中的16位二进制整数转换成本字节压缩的BCD码放在R4、R5、R6中。

CLR A ;清零结果寄存器

MOV R4,A ;清零结果寄存器

MOV R5 A ;清零结果寄存器

MOV R6 A ;

MOV R7,#16 ;运算次数送R7

L2:CLR C ;

MOV A,R3 ;R2R3左移一位进C y

RLC C ;R2R3左移一位进C y

MOV R3,A ;R2R3左移一位进C y

MOV A,R2 ;R2R3左移一位进C y

RLC A ;R2R3左移一位进C y

MOV R2,A ;R2R3左移一位进C y

MOV A,R6 ;R4R5R6×2+C Y→R4R5R6

MDDC A,R6 ;R4R5R6×2+C Y→R4R5R6

DA A ;R4R5R6×2+C Y→R4R5R6

MOV R6,A ;R4R5R6×2+C Y→R4R5R6

MOV A,R5 ;R4R5R6×2+C Y→R4R5R6

ADDC A,R5 ;R4R5R6×2+C Y→R4R5R6

DA A,;R4R5R6×2+C Y→R4R5R6

MOV R5,A ;R4R5R6×2+C Y→R4R5R6

MOV A,R4 ;R4R5R6×2+C Y→R4R5R6

ADDC A,R4 ;R4R5R6×2+C Y→R4R5R6

DA A ;R4R5R6×2+C Y→R4R5R6

MOV R4,A ;R4R5R6×2+C Y→R4R5R6

DJNZ R7,L2 ;运算未结束转L2

L3:SJMP L3 ;

END ;

【习题3-33】128路分支程序。

功能:根据R3的值(00H~7FH)转到128个目的地址。

【编程方法】根据题意编写子程序:子程序的入口条件:(R3)=转移目的地址代号(00H~7FH);出口条件:转移到128个分支程序段入口。

参考程序如下:

JMP128:MOV A,R3

RL A ;(A)* 2

51单片机汇编指令速查表

51单片机汇编指令速查表 指令格式功能简述字节数周期 一、数据传送类指令 MOV A, Rn 寄存器送累加器 1 1 MOV Rn,A 累加器送寄存器 1 1 MOV A ,@Ri 内部RAM单元送累加器 1 1 MOV @Ri ,A 累加器送内部RAM单元 1 1 MOV A ,#data 立即数送累加器 2 1 MOV A ,direct 直接寻址单元送累加器 2 1 MOV direct ,A 累加器送直接寻址单元 2 1 MOV Rn,#data 立即数送寄存器 2 1 MOV direct ,#data 立即数送直接寻址单元 3 2 MOV @Ri ,#data 立即数送内部RAM单元 2 1 MOV direct ,Rn 寄存器送直接寻址单元 2 2 MOV Rn ,direct 直接寻址单元送寄存器 2 2 MOV direct ,@Ri 内部RAM单元送直接寻址单元 2 2 MOV @Ri ,direct 直接寻址单元送内部RAM单元 2 2 MOV direct2,direct1 直接寻址单元送直接寻址单元 3 2 MOV DPTR ,#data16 16位立即数送数据指针 3 2 MOVX A ,@Ri 外部RAM单元送累加器(8位地址) 1 2 MOVX @Ri ,A 累加器送外部RAM单元(8位地址) 1 2 MOVX A ,@DPTR 外部RAM单元送累加器(16位地址) 1 2 MOVX @DPTR ,A 累加器送外部RAM单元(16位地址) 1 2 MOVC A ,@A+DPTR 查表数据送累加器(DPTR为基址) 1 2 MOVC A ,@A+PC 查表数据送累加器(PC为基址) 1 2 XCH A ,Rn 累加器与寄存器交换 1 1 XCH A ,@Ri 累加器与内部RAM单元交换 1 1 XCHD A ,direct 累加器与直接寻址单元交换 2 1 XCHD A ,@Ri 累加器与内部RAM单元低4位交换 1 1 SWAP A 累加器高4位与低4位交换 1 1 POP direct 栈顶弹出指令直接寻址单元 2 2 PUSH direct 直接寻址单元压入栈顶 2 2 二、算术运算类指令 ADD A, Rn 累加器加寄存器 1 1

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码变换的意思来了。 ;;上式中后面的位:

8051单片机的内部结构

8051是MCS-51系列单片机的典型产品,我们以这一代表性的机型进行系统的讲解。 8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明: 中央处理器(CPU)是整个单片机的核心 部件,是8位数据宽度的处理器,能处理 8位二进制数据或代码,CPU负责控制、 指挥和调度整个单元系统协调的工作,完 成运算和控制输入输出功能等操作。 ·数据存储器(RAM): 8051内部有128个8位用户数据存储 单元和128个专用寄存器单元,它们是统 一编址的,专用寄存器只能用于存放控制 指令数据,用户只能访问,而不能用于存 放用户数据,所以,用户能使用的的RAM 只有128个,可存放读写的数据,运算的 中间结果或用户定义的字型表。 ·程序存储器(ROM): 8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。 ·定时/计数器(ROM): 8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。 ·并行输入输出(I/O)口: 8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。 ·全双工串行口: 8051内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以 用作异步通信收发器,也可以当同步移位器使用。 ·中断系统: 8051具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可 满足不同的控制要求,并具有2级的优先级别选择。 ·时钟电路: 8051内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,但8051 单片机需外置振荡电容。

四边形的性质

四边形的性质 知识要点归纳: 平行四边形: 1、定义:两组对边分别平行的四边形叫平行四边形。 2、表示方法:若四边形ABCD是,平行四边,则记作“ ABCD ”,读作平行四边形ABCD。 3、平行四边形不相邻的两个顶点连成的线段叫它的对角线 4、平行四边形相对的边称为对边,相对的角称为对角 5、平行四边形的性质: (1)平行四边形两组对边分别平行。 (2)平行四边形两组对边分别相等。 (3)平行四边形两组对角分别相等。 (4)平行四边形的对角线互相平分。 6、平行线之间的距离:若两条直线互相平行,则其中一条直线上任意两点到另一条直线的距离相等,这个距离称为平行线之间的距离。 7、平行四边形的判别方法: (1)两组对边分别平行的四边形是平行四边形。 (2)两条对角线相互平分的四边形是平行四边形。 (3)两组对边分别相等的四边形是平行四边形。 (4)两组对角分别相等的四边形是平行四边形。 菱形: 1、定义:一组邻边相等的平行四边形叫做菱形。 2、性质:具有平行四边形的一切性质;菱形的四边形相等;菱形的对角线互相垂直平分,每一条对角线平分一组对角;菱形是轴对称图形。 菱形的判别方法: (1)一组邻边相等的平行四边形是菱形。 (2)对角线互相垂直的四边形是菱形。 (3)四条边都相等的四边形是菱形。 矩形: 1、定义:有一个是直角的平行四边形叫做矩形。 2、性质:矩形具有平行四边形的一切性质;矩形的对角线相等;矩形的四个角都是直角;矩形是轴对称图形,有两条对称轴。 3、矩形的判别方法: (1)有一个角是直角的平行四边形是矩形; (2)有三个角是直角的四边形是矩形; (3)对角线相等的平行四边形是矩形。 正方形: 1、定义:一组邻边相等的矩形叫做正方形。 2、正方形性质: (1)正方形具有平行四边形、矩形、菱形的一切性质; (2)边----四边相等、邻边垂直、对边平行。

51单片机汇编指令集(附记忆方法)

51单片机汇编指令集 一、数据传送类指令(7种助记符) MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送; MOVC(Move Code)读取程序存储器数据表格的数据传送; MOVX (Move External RAM) 对外部RAM的数据传送; XCH (Exchange) 字节交换; XCHD (Exchange low-order Digit) 低半字节交换; PUSH (Push onto Stack) 入栈; POP (Pop from Stack) 出栈; 二、算术运算类指令(8种助记符) ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加1; DEC(Decrement) 减1; MUL(Multiplication、Multiply) 乘法; DIV(Division、Divide) 除法; 三、逻辑运算类指令(10种助记符) ANL(AND Logic) 逻辑与; ORL(OR Logic) 逻辑或; XRL(Exclusive-OR Logic) 逻辑异或; CLR(Clear) 清零; CPL(Complement) 取反; RL(Rotate left) 循环左移; RLC(Rotate Left throught the Carry flag) 带进位循环左移; RR(Rotate Right) 循环右移; RRC (Rotate Right throught the Carry flag) 带进位循环右移; SWAP (Swap) 低4位与高4位交换; 四、控制转移类指令(17种助记符) ACALL(Absolute subroutine Call)子程序绝对调用; LCALL(Long subroutine Call)子程序长调用; RET(Return from subroutine)子程序返回; RETI(Return from Interruption)中断返回; SJMP(Short Jump)短转移; AJMP(Absolute Jump)绝对转移; LJMP(Long Jump)长转移; CJNE (Compare Jump if Not Equal)比较不相等则转移;

8051单片机的引脚及其功能

今天我们学习8051单片机的引脚及其功能。 8051系列各种芯片的引脚是互相兼容的,8051,8751和8031均采用40脚双列直播封装型式。当然,不同芯片之间引脚功能也略有差异。8051单片机是高性能的单片机,因为受到引脚数目的限制,所以有不少引脚具有第二功能,其中有些功能是8751芯片所专有的。各引脚功能简要说明如下: Vcc(40脚):电源端,为+5V。 Vss(20脚):接地端。 时钟电路引脚XLAL2(18脚):接外部晶体和微调电容的一端。若需采用外部时钟电路时,该引脚输入外时钟脉冲,要检查8051的振荡电路是否正确工作,可用示波器查看XLAL2端是否有脉冲信号输出。 时钟电路引脚XLAL1(19脚):接外部晶体的微调电容的另一端。在片内它是振荡电路方相放大器的输入端。在采用外部时钟时,该引脚必须接地。 RST(9脚):RST是复位信号输入端,高电平有效。当此输入端保持两个机器周期,即24个时钟振荡周期的高电平时,就可以完成复位操作。RST引脚的第二功能是VPD,即备用电源的输入端。当主电源Vcc发生故障降低到低电平规定值时,将+5V电源自动接入RST端,为RAM 提供备用电源,以保证存储在RAM中的信息不丢失,以使电源正常后能继续正常运行。 ALE(30脚):地址锁存允许信号端。当8051上电正常工作后,ALE引脚不断向外输出正脉冲信号,此频率为振荡器频率fosc的1/6。CPU访问片外存储器时,ALE输出信号作为锁存低8位地址的控制信号。在CPU访问片外数据存储器时,会丢失一个脉冲。平时不访问外存储器时,ALE端也可1/6的振荡频率固定输出正脉冲,因而ALE也可以用作对外输出时钟或定时信号。如果你想看一下8051芯片的好坏,可用示波器查看ALE端是否有脉冲信号输出,如有,则8051基本上是好的。ALE端的负载驱动能力为8个LS型TTL。此引脚的第二功能PROG是对片内带有4K EPROM的8751固化程序时,作为编程脉冲输入端。 PSCN(29脚):程序存储器允许输出信号端。在访问片外程序存储器时,此端口定时输出脉冲作为读片外程序存储器的选通信号。此引脚EPROM的OE端,PSCN端有效,即允许读出片

单片机应用系统设计工程实践报告

2016-2017学年第1学期 单片机应用系统设计/工程实践 (课号:103G06B/D/E) 实验报告 项目名称:基于AT89C51单片机温度报警系统 学号 姓名 班级 学院信息科学与工程学院 完成时间

目录 一、项目功能及要求 (3) 1.1、课程设计的性质和目的 (3) 1.3、项目设计要求 (3) 二、系统方案设计及原理 (3) 2.1、设计主要内容 (3) 2.2 、AT89C51单片机简介 (3) 2.3 、DS18B20简介 (4) 2.4 、数码管显示 (5) 2.5、报警电路 (6) 三、系统结构及硬件实现 (7) 3.1、总电路图 (7) 3.2、单片机控制流程图 (8) 四、软件设计过程 (8) 五、实验结果及分析 (8) 5.1 、Proteus仿真 (8) 5.2 、C程序调试 (9) 六、收获及自我评价 (14) 七、参考文献 (15)

一、项目功能及要求 1.1、课程设计的性质和目的 本温度报警器以AT89C51单片机为控制核心,由一数字温度传感器DS18B20测量被控温度,结合7段LED以及驱动LED的74LS245组合而成。当被测量值超出预设范围则发出警报,且精度高。 利用现代虚拟仿真技术可对设计进行仿真实验,与单片机仿真联系紧密的为proteus仿真,利用keil软件设计单片机控制系统,然后与proteus进行联合调试,可对设计的正确性进行检验。 1.2、课程设计的要求 1、遵循硬件设计模块化。 2、要求程序设计结构化。 3、程序简明易懂,多运用输入输出提示,有出错信息及必要的注释。 4、要求程序结构合理,语句使用得当。 5、适当追求编程技巧和程序运行效率。 1.3、项目设计要求 1、基于AT89C51单片机温度报警系统; 2、设计3个按键分别为:设置按钮、温度加、温度减; 3、DS18B20温度传感器采集温度,并在数码管上显示按键的区别; 二、系统方案设计及原理 2.1、设计主要内容 本设计以AT89C51单片机为核心,从而建立一个控制系统,实现通过3个按键控制温度,以达到设置温度上下限的功能,并在数码管上显示三个数字当前的温度上下限设置值和DS18B20温度采集值的显示(精确到小数点后一位),当温度高于上限或者低于下限蜂鸣器报警。 2.2 、AT89C51单片机简介 AT89C51是一个低功耗,高性能CMOS8位单片机,片内含4kBytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用A TMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及89C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89C51可为许多嵌入式控制应用系统提供高性价比的解决方案.AT89C51具有如下特点:40个引脚,4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器,32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,片内时钟振荡器。 此外,AT89C51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。AT89C51单片机的基本结构和外部引脚如下图所示。

平行四边形的对角线特征

第2课时平行四边形的对角线特征 1.理解平行四边形中心对称的特征,掌握平行四边形对角线互相平分的性质. 2.能综合运用平行四边形的性质解决平行四边形的有关计算问题和简单的证明题. 3.培养学生的推理论证能力和逻辑思维能力. 自学指导:阅读课本43页至44页,完成下列问题. 知识探究 1.有两组对边分别平行的四边形叫做平行四边形,记作□ABCD,读作平行四边形ABCD. 2.平行四边形的性质:对边相等,对角相等,对角线互相平分. 3.平行四边形是中心对称图形. 活动1 小组讨论 例1证明平行四边形对角线互相平分. 已知:如图,□ABCD的对角线AC、BD相交于点O. 求证:OA=OC,OB=OD. 证明:∵四边形ABCD是平行四边形 ∴AD=BC,AD∥BC ∴∠1=∠2,∠3=∠4. ∴△AOD≌△COB(ASA) ∴OA=OC,OB=OD. 例2如图,四边形ABCD是平行四边形,AB=10,AD=8,AC⊥BC.求BC、CD、AC、OA的长以及□ABCD的面积.

解:∵四边形ABCD是平行四边形∴BC=AD=8,CD=AB=10 又∵AC⊥BC ∴△ABC是直角三角形 ∴ 又∵OA=OC ∴OA=1 2 AC=3 ∴S□ABCD=BC×AC=8×6=48 自学反馈 如图,在□ABCD中,BC=10 cm,AC=8 cm,BD=14 cm. (1)△AOD的周长是多少?为什么? (2)△ABC与△DBC的周长哪个长?长多少? 解:(1)21 cm ∵四边形ABCD为平行四边形 ∴AO=OC=1 2 AC BO=OD= 1 2 BD BC=AD ∴C△AOD=AO+OD+AD=1 2 AC+ 1 2 BD+BC=4+10+7=21 cm (2)△DBC长,长6 cm. ∵四边形ABCD为平行四边形 ∴AB=CD ∵C△ABC=AB+BC+AC=AB+BC+8 C△DBC=BC+CD+BD=BC+AB+14 ∴C△DBC-C△ABC=6 cm ∴C△DBC>C△ABC,长6 cm. 例3 探究题: (1)□ABCD的对角线AC与BD相交于O,直线EF过点O与AB、CD分别相交于E、F(图1),试探究OE与OF的大小关系?并说明理由.

51单片机汇编指令集(附记忆方法)

51 单片机汇编指令集 一、数据传送类指令( 7 种助记符) MOV(英文为Move :对内部数据寄存器RAM 和特殊功能寄存器SFR 的数据进行 传送; MOV Q Move Code )读取程序存储器数据表格的数据传送; MOVX (Move External RAM) 对外部 RAM 勺数据传送; XCH (Exchange) 字节交换; XCHD (Exchange low-order Digit) 低半字节交换; PUSH (Push onto Stack) 入栈; POP (Pop from Stack) 出栈; 二、算术运算类指令( 8 种助记符) ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加 1; DEC(Decrement) 减 1; MUL(Multiplication 、Multiply) 乘法; DIV(Division 、Divide) 除法; 三、逻辑运算类指令( 10 种助记符) ANL(AND Logic) 逻辑与; ORL(OR Logic) 逻辑或; XRL(Exclusive-OR Logic) 逻辑异或; CLR(Clear) 清零; CPL(Complement) 取反; RL(Rotate left) 循环左移; RLC(Rotate Left throught the Carry flag) RR(Rotate Right) 循环右移; RRC (Rotate Right throught the Carry flag) SWAP (Swap) 低 4 位与高 4 位交换; 四、控制转移类指令( 17 种助记符) ACALL ( Absolute subroutine Call )子程序绝对调用; LCALL ( Long subroutine Call )子程序长调用; RET ( Return from subroutine )子程序返回; RETI ( Return from Interruption )中断返回; SJMP ( Short Jump )短转移; AJMP ( Absolute Jump )绝对转移; LJMP( Long Jump )长转移; CJNE (Compare Jump if Not Equal) 比较不相等则转移; DJNZ (Decreme nt Jump if Not Zero) 减1后不为0则转移; JZ (Jump if Zero) 结果为0则转移; JNZ (Jump if Not Zero) 结果不为0则转移; JC (Jump if the Carry flag is set) 有进位则转移; JNC (Jump if Not Carry) 无进位则转移; JB (Jump if the Bit is set) 位为1则转移; JNB (Jump if the Bit is Not set) 位为0则转移; 带进位循环左移; 带进位循环右移;

51单片机常用汇编语言助记符英文全称

51单片机常用汇编语言助记符英文全称 (1)数据传送类指令(7种助记符) MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送;MOVC(Move Code)读取程序存储器数据表格的数据传送; MOVX (Move External RAM) 对外部RAM的数据传送; XCH (Exchange) 字节交换; XCHD (Exchange low-order Digit) 低半字节交换; PUSH (Push onto Stack) 入栈; POP (Pop from Stack) 出栈; (2)算术运算类指令(8种助记符) ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加1;DEC(Decrement) 减1; MUL(Multiplication、Multiply) 乘法; DIV(Division、Divide) 除法; (3)逻辑运算类指令(10种助记符) ANL(AND Logic) 逻辑与; XRL(Exclusive-OR Logic) 逻辑异或; CLR(Clear) 清零;CPL(Complement) 取反; RL(Rotate left) 循环左移; RLC(Rotate Left throught the Carry flag) 带进位循环左移; RR(Rotate Right) 循环右移; RRC (Rotate Right throught the Carry flag) 带进位循环右移; SWAP (Swap) 低4位与高4位交换; (4)控制转移类指令(17种助记符) ACALL(Absolute subroutine Call)子程序绝对调用;

平行四边形的对角线特征教案

第2课时平行四边形的对角线特征 【知识与技能】 理解并掌握平行四边形的对角线互相平分的性质,并能用它来解决问题. 【过程与方法】 通过活动探究获得平行四边形的对角线互相平分的性质过程中,增强学生的合作交流意识和探究精神,培养分析问题,解决问题的能力. 【情感态度】 在问题解决过程中让学生体验成功的快乐,激发学习数学的兴趣. 【教学重点】 平行四边形的对角线互相平分这一性质的探究与应用. 【教学难点】 综合运用平形四边形性质解决问题. 一、情境导入,初步认识 探究如图,在纸上画ABCD,将它剪下,再在一张纸上沿ABCD的边缘 画一个与ABCD相同的EFGH.在它们的中心(两条对角线的交点)钉一个图钉,将ABCD绕点O旋转180°后,它能与EFGH重合吗?从中你能看出上节 课得到的ABCD的边、角关系吗?进一步地,你能发现OA与OC,OB与OD的关系吗? 【教学说明】教学时,教师应给出适当的时间让学生能够完成操作实践,并通过观察思考获得结论,一方面巩固上节课学过的两个性质,另一方面又为本节探讨平行四边形对角线互相平分的性质作铺垫,引入新课. 二、思考探究,获取新知 通过ABCD绕点O旋转180°后与EFGH重合,易发现OA=OC,OB=OD这一结论,于是有:平行四边形的对角线互相平分,即在ABCD中,AC、BD相交

于O,则有OA=OC,OB=OD. 思考请观察下边的图形(在ABCD中,AC、BD相交于O),你能证明上述 结论吗? 【教学说明】教师可引导学生利用三角形全等来得到上述结论,让学生自主完成证明过程. 三、典例精析,掌握新知 例1 如图,四边形ABCD是平行四边形,且AB=10,AD=8,AC⊥BC,求BC、CD、AC、OA的长及ABCD的面积. 【分析】由平行四边形的对边相等易知BC=AD=8,CD=AB=10,再在Rt△ACB 中,AB=10,BC=8,∠ACB=90°,∴AC=6,由平行四边形的对角线互相平分知OA=OC=12AC=3,从而易得ABCD的面积为BC×AC=6×8=48. 【教学说明】教师给出本题后,应让学生先独立完成试试,然后教师给出评讲,让学生在成功或挫折中加深对知识的领悟. 例2如图,ABCD的对角线AC、BD相交于点O,过点O的一直线交AD 于E,交BC于F.求证:OE=OF. 【分析】由平行四边形的性质有OA=OC,又AD∥BC,故∠EAO=∠FCO,又由∠AOE=∠COF易知△AOE≌△COF,从而OE=OF. 【教学说明】本例仍可先让学生自己独立完成,然后相互交流,教师巡视,对有困难同学及时予以指导.

初三数学巧用四边形的对角线知识精讲

初三数学巧用四边形的对角线知识精讲 殷学广 由三角形的三个顶点就能确定这个三角形的位置、形状和大小;当没有给出顶点时,由三角形的一些元素(共六个元素,分别为三角形的三条边和三个内角)也能确定三角形的形状和大小。确定了三角形,就能研究这个三角形的中线、高、角平分钱、中位线这几个重要的线段。在四边形中,是通过对角线把它分割成三角形来研究的,这样四边形中的对角线就显得更加重要。本文就如何巧用四边形的对角线来判定特殊的四边形举例加以分析,供同学们学习时参考。 一. 利用对角线判定特殊的四边形 在课堂上我们已探索过以下几个重要的结论: (1)对角线互相平分的四边形是平行四边形; (2)对角线互相平分且相等的四边形是矩形; (3)对角线互相平分且垂直的四边形是菱形; (4)对角线相等且互相垂直平分的四边形是正方形; (5)对角线相等的梯形是等腰梯形。 其实以上这些结论是有联系的。如图1,四边形ABCD 中,两条对角线相交于点O 。 (1)当OA =OC ,OB =OD 时,四边形ABCD 是平行四边形。 (2)在OA =OC ,OB =OD 的基础上增加AC =BD 条件时,四边形 ABCD 在平行四边形的基础上变成矩形。 (3)在OA =OC ,OB =OD 的基础上增加AC ⊥BD 条件时,四边形ABCD 在平行四边形的基础上变成菱形。 (4)在OA =OC ,OB =OD 的基础上增加AC =BD ,BD AC ⊥条件时,四边形ABCD 在平行四边形的基础上变成正方形。 (5)当AB//CD ,CD AB ≠。且OC OD =,OA =OB 时,此时的四边形ABCD 为对角线相等的梯形,即等腰梯形。 由此可知,把一个一般的四边形变为特殊的四边形,可以通过改变两条对角线的大小关系和位置关系来完成。这也是特殊四边形之间重要的联系纽带之一。 二. 利用对角线判定动态四边形的形状 如图2,ABC ?中,点O 是边AC 上的一个动点,P 是BC 延长线上一点。过点O 作直线MN//BC ,设MN 交∠BCA 的平分线于点E ,交∠PCA 的平分线于点F ,连结AE 、AF 。 (1)图中有等腰三角形吗? (2)当点O 运动到何处时,四边形AECF 是矩形?简要说明理由。 (3)在(2)中的矩形可能是正方形吗?此时ABC ?应满足什么条件?

(完整版)51单片机汇编指令(全)

指令中常用符号说明 Rn当前寄存器区的8个工作寄存器R0~R7(n=0~7) Ri当前寄存器区可作为地址寄存器的2个工作寄存器R0和R1(i=0,1) Direct8位内部数据寄存器单元的地址及特殊功能寄存器的地址 #data表示8位常数(立即数) #data16表示16位常数 Add16表示16位地址 Addr11表示11位地址 Rel8位代符号的地址偏移量 Bit表示位地址 @间接寻址寄存器或基址寄存器的前缀 ( )表示括号中单元的内容 (( ))表示间接寻址的内容 指令系统 数据传送指令(8个助记符) 助记符中英文注释 MOV Move 移动 MOV A , Rn;Rn→A,寄存器Rn的内容送到累加器A MOV A , Direct;(direct)→A,直接地址的内容送A MOV A ,@ Ri;(Ri)→A,RI间址的内容送A MOV A , #data;data→A,立即数送A MOV Rn , A;A→Rn,累加器A的内容送寄存器Rn MOV Rn ,direct;(direct)→Rn,直接地址中的内容送Rn MOV Rn , #data;data→Rn,立即数送Rn MOV direct , A;A→(direct),累加器A中的内容送直接地址中 MOV direct , Rn;(Rn)→direct,寄存器的内容送到直接地址 MOV direct , direct;(direct)→direct,直接地址的内容送到直接地址 MOV direct , @Ri;((Ri))→direct,间址的内容送到直接地址 MOV direct , #data;8位立即数送到直接地址中 MOV @Ri , A;(A)→@Ri,累加器的内容送到间址中 MOV @Ri , direct;direct→@Ri,直接地址中的内容送到间址中 MOV @Ri , #data; data→@Ri ,8位立即数送到间址中 MOV DPTR , #data16;data16→DPTR,16位常数送入数据指针寄存器,高8位送入DPH,低8位送入DPL中(单片机中唯一一条16位数据传送指令) (MOV类指令共16条)

51单片机汇编指令

按功能分为五大类: (1)数据传送类指令(7种助记符) MOV(Move)对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送;MOVC(Move Code)读取程序存储器数据表格的数据传送; MOVX (Move External RAM) 对外部RAM的数据传送; XCH (Exchange) 字节交换; XCHD (Exchange low-order Digit) 低半字节交换; PUSH (Push onto Stack) 入栈; POP (Pop from Stack) 出栈; (2)算术运算类指令(8种助记符) ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加1; DEC(Decrement) 减1; MUL(Multiplication、Multiply) 乘法; DIV(Division、Divide) 除法; (3)逻辑运算类指令(10种助记符) ANL(AND Logic) 逻辑与; ORL(OR Logic) 逻辑或; XRL(Exclusive-OR Logic) 逻辑异或; CLR(Clear) 清零; CPL(Complement) 取反; RL(Rotate left) 循环左移; RLC(Rotate Left throught the Carry flag) 带进位循环左移; RR(Rotate Right) 循环右移; RRC (Rotate Right throught the Carry flag) 带进位循环右移; SWAP (Swap) 低4位与高4位交换; (4)控制转移类指令(17种助记符) ACALL(Absolute subroutine Call)子程序绝对调用; LCALL(Long subroutine Call)子程序长调用; RET(Return from subroutine)子程序返回; RETI(Return from Interruption)中断返回; SJMP(Short Jump)短转移; AJMP(Absolute Jump)绝对转移; LJMP(Long Jump)长转移; CJNE (Compare Jump if Not Equal)比较不相等则转移; DJNZ (Decrement Jump if Not Zero)减1后不为0则转移; JZ (Jump if Zero)结果为0则转移; JNZ (Jump if Not Zero) 结果不为0则转移;

平行四边形对角线的性质【教案】

18.1.1 平行四边形的性质(二) 教学目标: 1. 理解平行四边形中心对称的特征,掌握平行四边形对角线互相平分的性质. 2. 能综合运用平行四边形的性质解决平行四边形的有关计算问题,和简单的证明题. 3. 培养学生的推理论证能力和逻辑思维能力. 重点、难点 4. 重点:平行四边形对角线互相平分的性质,以及性质的应用. 5. 难点:综合运用平行四边形的性质进行有关的论证和计算. 6. 难点的突破方法: (1)本节课的主要内容是平行四边形的性质3,它是通过 旋转平行四边形,得到平行四边形是中心对称图形和对角线互 相平分的性质.这一节综合性较强,教学中要注意引导学生.要注意让学生巩固基础知识和基本技能,加强对解题思路的分析,解题思想方法的概括、指导和结论的升华. (2)教学时要讲明线段互相平分的意义和表示方法.如图,设四边形ABCD 的对角线AC 、BD 相交于点O ,若AC 与BD 互相平分,则有OA =OC ,OB =OD . (3)在平行四边形中,从一条边上的任意一点,向对边画垂线,这点与垂足间的距离(或从这点到对边垂线段的长,或者说这条边和对边的距离),叫做以这条边为底的平行四边形的高.这里所说的“底”是相对高而言的. 在平行四边形中,有时高是指垂线段本身,如作平行四边形的高,就是指作垂线段.所以平行四边形的高,在作图时一般是指垂线段本身.在进行计算时,它的意义是距离,即长度. (4)平行四边形的面积等于它的底和高的积,即ABCD S =a·h .其中a 可以是平行四边形的任何一边,h 必须是a 边与其对边的距离,即对应的高,如图(1).要避免学生发生如图(2)的错误.为了区别,有时也可以把高记成a h 、AB h ,表明它们所对应的底是a 或AB . (5)学完本节后,归纳总结一下平行四边形比一般四边形多哪些性质,平行四边形有哪些性质.可以按边、角、对角线进行总结.通过复习总结,使学生掌握这些知识,也培养学生随时复习总结的习惯,并提高他们归纳总结的能力. 三、例题的意图分析 本节课安排了两个例题,例1是一道补充题,它是性质3的直接运用,然后对例1进行了引申,可以根据学生的实际情况选讲,并归纳结论:过平行四边形对角线的交点作直线交对边或对边的延长线,所得的对应线段相等.例1与后面的三个图形是一组重要的基本图形,熟悉它的性质对解答复杂问题是很有帮助的.

AT89S51单片机实例35例汇编+C语言对照带电路图及说明-闪烁灯

1.闪烁灯 1.实验任务 如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。 2.电路原理图 图4.1.1 3.系统板上硬件连线 把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。 4.程序设计内容 (1).延时程序的设计方法 作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要 求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在 执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程 序是如何设计呢?下面具体介绍其原理:

如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒机器周期微秒 MOV R6,#20 2个 2 D1: MOV R7,#248 2个 2 2+2×248=498 20× DJNZ R7,$ 2个2×248 (498 DJNZ R6,D1 2个2×20=40 10002 因此,上面的延时程序时间为10.002ms。 由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时, 延时10ms,以此为基本的计时单位。如本实验要求0.2秒=200ms, 10ms×R5=200ms,则R5=20,延时子程序如下: DELAY: MOV R5,#20 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET (2).输出控制 如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管 的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0 端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。 5.程序框图 如图4.1.2所示

第3章-MCS-51系列单片机的指令系统和汇编语言程序范文

第3章MCS一51系列单片机的指令系统 和汇编语言程序 3·1汇编指令 3·1·1请阐明机器语言、汇编语言、高级语言三者的主要区别,进一步说明为什么这三种语言缺一不可。 3·1·2请总结: (1)汇编语言程序的优缺点和适用场合。 (2)学习微机原理课程时,为什么一定要学汇编语言程序? 3·1·3MCS一51系列单片机的寻址方式有哪儿种?请列表分析各种寻址方式的访问对象与寻址范围。 3·1·4要访问片内RAM,可有哪几种寻址方式? 3·1·5要访问片外RAM,有哪几种寻址方式? 3·1·6要访问ROM,又有哪几种寻址方式? 3·1·7试按寻址方式对MCS一51系列单片机的各指令重新进行归类(一般根据源操作数寻址方式归类,程序转移类指令例外)。 3·1·8试分别针对51子系列与52子系列,说明MOV A,direct指令与MOV A,@Rj 指令的访问范围。 3·1·9传送类指令中哪几个小类是访问RAM的?哪几个小类是访问ROM的?为什么访问ROM的指令那么少?CPU访问ROM多不多?什么时候需要访问ROM? 3·1·10试绘图示明MCS一51系列单片机数据传送类指令可满足的各种传送关系。3·1·11请选用指令,分别达到下列操作: (1)将累加器内容送工作寄存器R6. (2)将累加器内容送片内RAM的7BH单元。 (3)将累加器内容送片外RAM的7BH单元。 (4)将累加器内容送片外RAM的007BH单元。 (5)将ROM007BH单元内容送累加器。 3·1·12 区分下列指令的不同功能: (l)MOV A,#24H 与MOV A.24H (2)MOV A,R0与MOV A,@R0 (3)MOV A,@R0与MOVX A,@R0 3·1·13设片内RAM 30H单元的内容为40H; 片内RAM 40H单元的内容为l0H; 片内RAM l0H单元的内容为00H; (Pl)=0CAH。 请写出下列各指令的机器码与执行下列指令后的结果(指各有关寄存器、RAM单元与端口的内容)。 MOV R0,#30H MOV A,@R0 MOV RI,A MOV B,@Rl MOV @R0,Pl MOV P3,Pl MOV l0H,#20H MOV 30H,l0H

51单片机的内部结构

51单片机的内部结构 MCS-51单片机内部结构 8051是MCS-51系列单片机的典型产品,我们以这一代表性的机型进行系统的讲解。 8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、 并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明: ·中央处理器: 中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位 二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控 制输入输出功能等操作。 ·数据存储器(RAM): 8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据, 所以,用户能使用的的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义 的字型表。 ·程序存储器(ROM): 8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。 ·定时/计数器(ROM): 8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。 ·并行输入输出(I/O)口: 8051共有4组8位I/O口(P0、 P1、P2或P3),用于对外部数据的传输。 ·全双工串行口: 8051内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。 ·中断系统: 8051具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。

相关文档
最新文档