陕西科技大学科目期末考试复习陕西科技大学期末考考试单片机重点(考试专用)

更新时间:2023-05-30 12:02:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

一,原码、补码与反码

原码与真值的关系为

[X]原= X, 0≤X<2n

2n-1-X -2n<X≤0

由补码的概念引伸,当用n位二进制数表示整数X(1位为符号位,n-1位为数值位),模为2n时,

数X的补码可表示为:

[X]补= X 0≤X<2 n-1

2+X -2 n-1≤X≤0

反码[X]反

一个正数的反码,等于该数的原码;

一个负数的反码,等于该负数的原码符号位不变(即为1),数值位按位求反(即0变1,1变0)

[X]反= X 0≤X<2 n-1

(2-1)+X -2 n-1<X≤0

综上所述可归纳为:

正数的原码、反码、补码就是该数本身;

负数的原码其符号位为1,数值位不变;

负数的反码其符号位为1,数值位逐位求反;

负数的补码其符号位为1,数值位逐位求反并在末位加1。

二, 溢出的判别

双高位判别法

利用符号位(Kn-1位)及最高数值位(Kn-2位)的进位情况来判断是否发生了溢出。

CS :若符号位发生进位,则 CS=1;

否则 CS=0。

CP :若最高数值位发生进位,则 CP=1;

否则 CP=0。

当两个正数补码相加时,若数值部分之和大于2n-1,则数值部分必有进位CP=1;而符号位却

无进位CS=0。这时CSCP的状态为“01”,发生正溢出。

当两个负数补码相加时,若数值部分绝对值之和大于2n-1,则数值部分补码之和必小于

2n-1,CP=0;而符号位肯定有进位CS=1,这时CSCP的状态为“10”,发生负溢出。

当不发生溢出时,CS和CP的状态是相同的,即CSCP的状态为“00”或“11”。

三,一台计算机具有的所有指令的集合称为该计算机的指令系统。

MCS—51系列单片机的指令系统共有111条指令,在储存空间与执行时间上都有较高的

效率,还含有丰富的位操作指令。

按其功能可分为数据传送、算术运算、逻辑运算、程序转移、位操作等5个大类。

按指令执行时间:单机器周期指令64条,双机器周期指令45条,乘、除2条指令的执行

时间为4个机器周期

四,指令格式。

一条汇编语言指令中最多包含5 个区段, 如下所示: 

[标号:] 操作码[目的操作数][,源操作数][;注释] LOOP: ADD A,

#10H ;(A) ←(A)+10H

5个区段之间要用分隔符分开: 标号与操作码之间用“: ”隔开, 操作码与操作数之间

用空格隔开, 操作数与注释之间用“;”隔开, 如果操作数有两个以上, 则在操作数之间要用

逗号“,”隔开 (乘法指令和除法指令除外)。 nn

五,MCS-51单片机汇编指令常用符号

Rn—当前选定的寄存器区中的8个工作寄存器R0~R7, 即n=0~7。

Ri—当前选定的寄存器区中的2个寄存器R0、R1, i=0、1。

direct—表示直接寻址的地址;8位内部RAM单元的地址: 内部数据区RAM单元(00H~

7FH)或特殊功能寄存器地址(80H~0FFH)。 

#data—指令中的8位常数, #表示立即数。 

#data16—指令中的16位常数。 

addr16——16 位的目的地址, 用于LJMP, LCALL指令, 可指向 64 KB程序存储器地址

空间。

addr11——11位的目的地址, 用于AJMP, ACALL指令。目的地址必须与下一条指令的

第一个字节在同一个2KB程序存储器地址空间范围之内。 

rel—— 相对地址,8 位带符号的偏移量字节, 用于SJMP和所有条件转移指令中。 偏

移量相对于下一条指令的第一个字节计算, 在-128~+127 范围内取值。 

bit——内部数据RAM或特殊功能寄存器中的可直接寻址位。 DPTR——数据指针, 可

用作 16 位的地址寄存器。

A——累加器。 

B——寄存器, 用于 MUL和 DIV指令中。 

C——进位标志或进位位。 

@——间接寻址寄存器或基址寄存器的前缀, 如@Ri,@DPTR。

/——位操作数的前缀, 表示对该位取反,但不影响该位原值。 (X)—— X中的内容。

((X))——由 X寻址的单元中的内容。 

←——箭头左边的内容被箭头右边的内容所代替。

六,在 MCS -51单片机指令系统中, 有以下7种寻址方式: 

(1) 立即寻址;

(2) 直接寻址;

(3) 寄存器寻址;

(4) 寄存器间接寻址;

(5) 基址寄存器加变址寄存器间接寻址;

(6) 相对寻址;

(7) 位寻址。

七,例题。

例:设内部RAM单元(30H)=40H, (40H)=10H, (l0H)=00H,端口(P1)=CAH,分析一

下程序执行后各个单元及寄存器、P2口的内容

MOV R0,#30H ; (R0)← 30H, 78 30

MOV A,@R0 ; (A)←((R0)), E6

MOV R1, A ; (R1)←(A), F9

MOV B,@R1 ; (B)←((R1)), 87 F0

MOV @R1, P1 ; ((Rl))←(P1), A7 90

MOV P2,P1 ;(P2) ←(P1), 85 90 A0

MOV 10H,#20H ; (l0H)←20H, 75 10 20

执行上述指令后结果为:

(R0)=30H

(R1)=(A)=40H

(B)=l0H

(40H)=(P1)=(P2)=CAH,(l0H)=20H

例:设外部RAM (0203H)=FFH,分析以下指令执行后结果。

MOV DPTR,#0203H ; (DPTR)←0203H 90 02 03

MOVX A, @DPTR ; (A)←((DPTR)), E0

MOV 30H, A ; (30H)←(A), F5 30

MOV A, #0FH ; (A)←0FH, 74 0F

MOVX @DPTR, A ; ((DPTR))←(A), F0

执行结果为

(DPTR)=0203H

(30H)=FFH

(0203H)=(A)=0FH

例:在外部ROM/EPROM中,从2000H单元开始依次存放0~9的平方值:0、1、4、9、 、

81,要求依据累加器A中的值(0~9)来查找所对应的平方值,分析下述程序的结果。

MOV DPTR, #2000H ; (DPTR)←2000H, 90 20 00

MOV A, #09H ; (A)←09H, 74 09

MOVC A, @A+DPTR ;(A)←((A)十(DPTR)), 93

执行结果:

(DPTR)=2000H,

(A)=51H(81的十六进制数

例:以上例外部ROM/EPROM 2000H单元开始存放0~9的平方值,以PC作为基址寄

存器进行查表。

解: 设MOVC指令所在地址(PC)=1FF0H,则

偏移量=表首地址-(MOVC指令所在地址+1)

偏移量=2000H-(1FF0H+1)=0FH

相应的程序如下:

MOV A,#09H ;(A)←09H, 74 09

ADD A,#0FH ;地址调整, 24 0F

MOVC A,@A+PC ;(A)←((A)+(PC)+1), 83

执行结果为:

(PC)=1FF1H,

(A)= 51H(81的十六进制数)

例 设(R0)=30H, (30H)=4AH, (A)=28H,则:

XCH A,@R0

结果为: (A)=4AH, (30H)=28H

XCHD A,@R0

结果为: (A)=2AH, (30H)=48H

SWAP A

结果为: (A)=82H

例:若在外部ROM/EPROM中2000H单元开始依次存放0~9的平方值,数据指针

(DPTR)=3A00H,用查表指令取出2003H单元的数据后,要求保持DPTR中的内容不变。完

成以上功能的程序如下:

MOV A, #03H ; (A)←03H, 74 03

PUSH DPH ; C0 83

PUSH DPL ; C0 82

MOV DPTR, #2000H ; (DPTR)←2000H, 90 20 00

MOVC A, @A+DPTR ; (A)←(2000H+03H), 93

POP DPL ; D0 82

POP DPH ; D0 83

执行结果: (A)=09H ,(DPTR)=3A00H。

例: 进入中断服务子程序时, 把程序状态寄存器PSW、 累加器A、 数据指针DPTR进

栈保护。设当前SP为60H。则程序段

PUSH PSW

PUSH ACC

PUSH DPL

PUSH DPH

执行后, SP内容修改为 64H, 而61H、62H、63H、64H单元中依次栈入PSW、A、DPL、

DPH的内容。当中断服务程序结束之前, 如下程序段(SP保持 64H不变)

POP DPH

POP DPL

POP ACC

POP PSW

执行之后, SP内容修改为 60H, 而64H、 63H、 62H、 61H单元中的内容依次弹出

到DPH、DPL、A、PSW中。 

MCS -51 提供一个向上升的堆栈, 因此SP设置初值时要充分考虑堆栈的深度,

要留出适当的单元空间, 满足堆栈的使用。

例1:双字节无符号数加法(R0 R1)+(R2 R3)→(R4 R5);R0、R2、R4存放16位数的高字

节,R1、R3、R5存放低字节。假设其和不超过16位,其编程如下。

MOV A,R1 ; 取被加数低字节,E9 1E

ADD A,R3 ; 低字节相加,2B RE

MOV R5,A ; 保存和低字节,FD

MOV A,R0 ; 取高字节被加数;E811

ADDC A,R2 ; 两高字节之和加低位进位,

MOV R4,A ; 保存和高字节

八,减法指令影响CY、OV、AC和P标志

CY表示两无符号数相减时,最高位是否有借位产生,若CY=1,表示有借位,CY=0则表示

无借位;

OV表示两个带符号数相减时是否产生溢出,OV=1表示从一个正数中减一个负数得

出一个负数或从一个负数中减去一个正数时得出一个正数的错误情况,和加法类似。该标志

是由运算时差值的D7、D6位状态"异或"而得的,OV=0则表示无溢出;

AC=1表示差值的D3向D4有借位,AC=0则表示无半借位。

例 双字节无符号数相减(R0R1)-(R2R3)→(R4R5)。

R0、R2、R4存放16位数的高字节,R1、R3、R5存放低字节,先减低8位,后减高8位和

低位减借位。由于低位开始减时没有借位,所以要先清零。其编程如下:

MOV A,R1 ;取被减数低字节, E9

CLR C ;清借位位, C3

SUBB A,R3 ;低字节相减, 9B

MOV R5, A ;保存差低字节, FD

MOV A,R0 ;取被减数高字节, E8

SUBB A,R2 ;两高字节差减低位借位, 9A

MOV R4,A ;保存差高字节, FC

九,例题,

加(减)1指令中,若指令的操作数为直接地址端口P0~P3时, 具有“读-改-写"的功能。

例如:设(R0)=7EH, (7EH)=FFH, (7FH)=38H,

(DPTR)=l0FEH,

分析逐条执行下列指令后各单元的内容。

INC @R0 ; 使7EH单元内容由FFH变为00H

INC R0 ;使R0的内容由7EH变为7FH

INC @R0 ;使7FH单元内容由38H变为39H

INC DPTR ;使DPL为FFH,DPH不变

INC DPTR ;使DPL为00H,DPH为11H

INC DPTR ;使DPL为0lH,DPH不变

例如: 若(A)=4EH(78), (B)=5DH(93)

执行指令:

MUL AB

结果为:

积为:(BA)=lC56H,

7254>255,

(A)=56H,

(B)=lCH,

OV=1,

CY=0 ,

P=0。

1)逻辑"与"指令

ANL A, Rn ;(A)←(A)AND(Rn), 58~5F

ANL A, direct ;(A)←(A)AND(direct), 55 direct

ANL A, @Ri ;(A)←(A)AND(Ri), 56~57

ANL A, #data ;(A)←(A)AND #data , 54 data

ANL direct, A ;(direc)←(direct)AND(A), 52 direct

ANL direct, #data

;(direct)←(direct) AND #data , 53 direct data

功能: 将两个操作数的内容按位进行逻辑与操作, 并将结果送回目的操作数的单元中。

例如 (A)=FAH=11111010B,(R1)=7FH=01111111B

ANL A,Rl; (A)←11111010A01111111

结果为:(A)=01111010B=7AH。

逻辑“与”ANL指令常用于屏蔽(置位)字节中某些位。若清除某位,则用“0”和该位相

与;若保留某位,则用“1”和该位相与。

例如:(Pl)=C5H=11000101B,屏蔽P1口高4位

ANL P1,#0FH;(Pl)←(P0)AND 00001111

结果为:(P1)=05H=00000101B。

2)逻辑“或”指令

ORL A, Rn ;(A)←(A)OR(Rn), 48~4F

ORL A, direct ;(A)←(A)OR(direct), 45 direct

ORL A, @Ri ;(A)←(A)OR((Ri)), 46~47

ORL A, #data ;(A)←(A)OR#data , 44 data

ORL direct, A ;(direct)←(direct)OR (A), 42 direct

ORL direct, #data

;(direct)←(direc)OR #data ,43 direct data

功能:将两个操作数的内容按位进行逻辑或操作, 并将结果送回目的操作数的单元中。

例: 若(A)=C0H, (R0)=3FH, (3F)=0FH

执行指令:ORL A,@R0 ;(A)←(A)OR((R0)

结果为:(A)=CFH

例: 根据累加器A中4~0位的状态,用逻辑与、或指令控制P1口4~0位的状态,Pl

口的高3位保持不变。

ANL A,#00011111B;屏蔽A的高3位

ANL P1,#11100000B;保留P1的高3位。

ORL P1 A;

若上述程序执行前:

(A)=B5H=10110101B,(Pl)=6AH=01101010B,

则执行程序后

(A)=15H=00010101B,(Pl)=75H=01110101B

3) 逻辑“异或”指令

XRL A, Rn ;(A)←(A) XRL(Rn), 68 ~ 6F

XRL A, direct ;(A)←(A) XRL (direct), 65 direct

XRL A, @Ri ;(A)←(A) XRL ((Ri)), 66 ~ 67

XRL A, #data ;(A)←(A) XRL #data, 64 data

XRL direct, A ;(direct)←(direct) XRL(A), 62 direct

XRL direct, #data

; (direct)←(direct) XRL #data, 63 direct data

功能: 将两个操作数的内容按位进行逻辑异或操作, 并将结果送回到目的操作数的单元

中。

例如:若(A)=B5H=10110101B,

执行下列指令:

XRL A,#0F0H ; A的高4位取反,低4位保留

MOV 30H,A ;(30H)←(A)=45H,

XRL A,30H ; 自身异或使A清零

执行后结果:

(A)=00H。

4)简单逻辑操作指令

CLR A ; 对累加器A清“0” E4

CPL A ; 对累加器A按位取反 F4

上例中用异或指令使累加器清零,需要两条双字节指令

MOV 30H, A 和 XRL A, 30H

共占用四字节存储空间。

MOV A,#00H

实现累加器清零,也需一条双字节指令

不影响Cy, AC, OV等标志

例:双字节数求补码。

解:对于一个16位数,R3存高8位,R2存低8位,求补结果仍存R3、R2求补的参

考程序如下:

MOV A,R2 ; 低8位数送A

CPL A ;低8位数取反

ADD A, #01H ; 加1得低8位数补码

MOV R2, A ;存补码低8位

MOV A, R3 ; 高8位数送A

CPL A ; 高8位取反

ADDC A, #00H ; 加低8位进位

MOV R3, A ;存补码高8位

例 16位数的算术左移。16位数在内存中低8位存放在M1单元,高8位存放在M1+1

单元。

CLR C ; 进位CY清零

MOV R1, #M1 ; 操作数地址M1送Rl

MOV A, @Rl ; 16位数低8位送A

RLC A ; 低8位左移,最低位补0

MOV @R1, A ; 低8位左移后,回送Ml存放

INC Rl ; 指向16位高8位地址M1+1

MOV A, @R1 ; 高8位送A

RLC A ; 高8位带低8位进位左移

MOV @R1, A ; 高8位左移后回送M1+1存放

例 将外部数据RAM的一个数据块传送到内部数据RAM,两者的首址分别为

DATA1和DATA2,遇到传送的数据为零时停止。

解 外部RAM向内部RAM的数据传送一定要以累加器A作为过渡,利用判零条件

转移正好可以判别是否要继续传送或者终止。

MOV R0,#DATA1; 外部数据块首址送R0

MOV R1,#DATA2; 内部数据块首址送R1

LOOP:MOVX A,@R0; 取外部RAM数据入A

HERE:JZ HERE ; 数据为零则终止传送

MOV @R1, A; 数据传送至内部RAM单元

INC R0; 修改地址指针,指向下一数据地址

INC R1

SJMP LOOP; 循环取数

例32 将内部RAM中从DATA单元开始的10个无符号数相加,相加结果送SUM主元保

存。

解:设相加结果不超过8位二进制数,则相应的程序如下:

MOV R0,#0AH ; 给R0置计数器初值

MOV Rl,#DATA ; 数据块首址送Rl

CLR A ; A清零

LOOP:ADD A,@R1 ; 加一个数

INC R1 ;修改地址,指向下一个数

DJNZ R0,LOOP ; R0减1,不为零循环

MOV SUM,A ; 存10个数相加和

例 :设(SP)=30H,标号为SUB1的子程序首址在2500H, 执行指令:

3000H: LCALL SUBl ;(PC)=3000H

结果: (SP)=32H,(31H)=03H,(32H)=30H,(PC)=2500H。

2300H :ACALL SUB2 ; (PC)=2300H

执行该指令后:(PC)+2=2302H,(0010 0011 0000 0010)

可调用子程序的2KB范围为2000H~27FFH.

07FEH:ACALL SUB3 ;(PC)=07FEH

执行该指令后,(PC)+2=0800H ,(0000 1000 0000 0010)

可调用子程序的2KB范围为0800H~0FFFH。

十,程序设计。

例 1 两个无符号双字节数相加。

设被加数存放于内部RAM的40H(高位字节), 41H(低位字节), 加数存放

于50H(高位字节), 51H(低位字节), 和数存入 40H和41H单元中。

程序如下: 

START: CLR C ; 将Cy清零

MOV R0, #41H ; 将被加数地址送数据指针R0

MOV R1, #51H ; 将加数地址送数据指针R1

AD1: MOV A, @R0 ; 被加数低字节的内容送入A

ADD A,@R1 ; 两个低字节相加

MOV @R0, A ; 低字节的和存入被加数低字节中

DEC R0 ; 指向被加数高位字节

DEC R1 ; 指向加数高位字节

MOV A, @R0 ; 被加数高位字节送入A

ADDC A, @R1 ; 两个高位字节带Cy相加

MOV @R0, A ; 高位字节的和送被加数高位字节

RET

例2 将两个半字节数合并成一个一字节数。 

设内部RAM 40H, 41H单元中分别存放着 8 位二进制数, 要求取出两个单元

中的低半字节, 并成一个字节后, 存入 50H单元中。

START: MOV R1, #40H ; 设置R1为数据指针

MOV A, @R1 ; 取出第一个单元中的内容

ANL A, #0FH ; 取第一个数的低半字节

SWAP A ; 移至高半字节

INC R1 ; 修改数据指针

XCH A, @R1 ; 取第二个单元中的内容

ANL A, # 0FH ; 取第二个数的低半字节

ORL A, @R1 ; 拼字

MOV 50H, A ; 存放结果

RET

例3. 单字节压缩BCD码转换成二进制码子程序。

设两个BCD码(d1d0)表示的两位十进制压缩存在与R2中,其中R2高4位存十位,低

4位存个位。要把其转换成纯二进制码的算法:

(d1d0)BCD=d1×10+d0

入口:待转换的BCD码存于R2。

出口:转换结果(8位无符号二进制整数)仍存R2。

BCD2B: ORG 2000H

MOV A, R2

ANL A, #0F0H

SWAP A

MOV B, #0AH

MUL AB

MOV R3, A

MOV A, R2

ANL A, #0FH

ADD A, R3

MOV R2, A

RET

例4. 双字节压缩BCD码转换成二进制码子程序。

解:该转换的算法为:

(d3d2d1d0)=(d3×10+d2) ×100十(d1×10+d0 )

实现该算法的参考子程序如下:

入口: R5(千位、百位)、R4 (十位、个位)为BCD码。

出口: R5R4(16位无符号二进制整数)。

BCD4B: ORG 2100H

MOV A,R5

MOV R2,A

ACALL BCD2B

MOV B ,#64H

MUL AB ;

MOV R6,A

XCH A,B

MOV R5,A 没有 MOV R5,B

MOV A,R4

MOV R2,A

ACALL BCD2B

ADD A,R6

MOV R4,A

MOV A,R5

ADDC A,#00H

MOV R5,A

RET

例5 3个无符号单字节整数分别存于R1、R2、R3中,找出其中最大数放于R0中。

算法:首先将R0清零;

然后进行(R1 )与(R0)减法,若(R1)-(R0)>0,则

(R1)>(R0〉,把( R1)送(R0);否则(R0)保持不变。

将(R0)分别与(R2)和(R3)比较,比较处理的方法

与上面相同;

比较3次后,R0中即为3数中的最大数。

采用地址译码器的多片程序存储器的扩展。

例 要求用2764芯片扩展8031的片外程序存储器空间,

分配的地址范围为0000H~3FFFH。

解:采用完全译码的方法,每个单元只占用唯一的1个地址。

宇片数:

(末地址-首地址)+1=(3FFFH-0000H)+1=4000H=214

字片数=4000H÷2000H=2(片)

位片数:

位片数=单元位数/芯片位数=1

总片数=字片数×位片数=2×1=2(片)

分配地址范围:

第 1片: 0000 0000 0000 0000 (0000H) 0001 1111 1111 1111 (1FFFH)

第2片: 0010 0000 0000 0000 (2000H)

0011 1111 1111 1111 (3FFFH)

十一,中断

1) 外部中断源

INT0(P3.2)端口、INT1 (P3.3)

TCON的IE0、IE1,中断请求标志。

触发方式:

脉冲下降沿触发

电平触发

由TCON寄存器中的IT0、IT1来决定。

IE0:外部中断INT0的请求标志位。

IT0:外部中断INT0触发方式控制位。软件置1或清0:

IT0=1 时,外部中断INT0为下降沿触发。

IT0=0时,外部中断INT0为电平触发。

IE1:为外部中断INT1的请求标志位。功能与IE0相同。

IT1:外部中断INT1触发方式控制位。功能与IT0相同。

2) 内部中断源

定时器T0和T1溢出中断源、串行口发送/接收中断源。

2个定时器/计数器:T0和T1。

当计数器计满溢出时,分别产生溢出中断,使各自的中断标志位TF0、TF1置1,

产生中断请求标志。

TF0和TF1为TCON寄存器中的2位。

TF0:定时器T0的溢出中断标志位。由T0回零溢出引起。 TF1:定时器T1的溢出中

断标志位。由T1回零溢出引起。

8031复位后,TCON被清0。

TI/RI:串行I/O中断,完成一帧字符发送/接收引起。

串行口发送/接收中断源。其中断标志位占用SCON寄存器中的2位,它们是发送中

断请求标志TI和接收中断请求

TI:串行口内部发送中断请求标志位。当串行口发送完一个字符后,由内部硬件使发送

中断标志TI置位。产生中断请求标志。

RI:串行口内部接收中断请求标志位。当串行口接收到一个字符后,由内部硬件使接收

中断请求标志位RI置位。产生中断请求标志。

串行口的发送中断TI,和接收中断RI,共用一个内部中断源。它们逻辑“或”后,作为一个内部的串行口中断源。

TI RI:CPU 响应中断后,执行中断服务程序时,并不自动清0,需要在中断服务程序中用清零指令完成

1) 中断允许控制

MCS - 51单片机有 5个中断源, 为了使每个中断源都能独立地被允许或禁止, 以便用户能灵活使用, 它在每个中断信号的通道中设置了一个中断屏蔽触发器。

只有该触发器无效, 它所对应的中断请求信号才能进入CPU, 即此类型中断开放。 否则, 即使其对应的中断标志位置1, CPU也不会响应中断, 即此类型中断被屏蔽了。同时CPU内还设置了一个中断允许触发器, 它控制CPU能否响应中断。

2)中断允许寄存器IE

控制所有中断源的开放或禁止,每个中断源是否被允许。

格式:

位地址分别是A8H~AFH。

EA:中断总允许位。EA=1,CPU开放中断;EA=0,CPU禁止所有的中断请求。

ES:串行中断允许位。ES=1,允许串行口中断;ES=0,禁止串行口中断。

ET1:T1溢出中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。

EX1:外部中断1允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。

ET0:T0溢出中断允许位。ET0=1,允许T0中断;ET0=0,禁止T0中断。

EX0:外部中断0允许位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。

3) 中断优先级寄存器IP

a) IP位格式及优先级的设定

MCS-51单片机具有2个中断优先级,高优先级或低优先级。

IP在特殊功能寄存器中,字节地址为B8H,位地址分别是B8H~BFH,IP用来锁存各中断源优先级的控制位:

PS:串行口中断优先级控制位。PS=1,设定串行口为高优先级中断;PS=0,设定串行口为低优先级中断。

PT1:T1中断优先级控制位。PT1=1,设定定时器T1为高优先级中断;PT1=0,设定定时器T1为低优先级中断。

PX1:外部中断1优先级控制位。PX1=1,设定外部中断1为高优先级中断;PX1=0,设定外部中断1为低优先级中断。

PT0:T0中断优先级控制位。PT0=1,设定定时器T0为高优先级中断;PT0=0,设定定时器T0为低优先级中断。

PX0 :外部中断0优先级控制位。PX0=1,设定外部中断0为高优先级中断;PX0=0,设定外部中断0为低优先级中断。

MCS-51单片机复位后,IP寄存器低5位全部被清0,将所有中断源设置为低优先级中断。

b) 不同优先级中断请求同时发生时CPU响应的优先顺序

c) 相同优先级中断请求同时发生时CPU响应的优先顺序

MCS-51单片机有5个中断源,当它们处于同优先级时的优先级顺序如表所示。

十二,t c

例 1 设单片机晶振频率为 6 MHz,计算单片机定时器的最小定时时间和最大定时时间。

机器周期:T= 12÷6 MHz= 2μs

最小定时时间:Tmin= 2μs

最大定时时间:Tmax=216× 2=131072μs=131ms

例 2 设单片机晶振频率为 6 MHz,要求定时器T0产生100ms的定时,试确定计数初值及TMOD的内容。

采用方式1

机器周期:T= 12÷6 MHz= 2μs

脉冲计数:C= 100ms/2μs =5 ×104

则计数初值: TC= 216- 5 ×104 =15536

=3CB0H

TMOD: T0 M1M0 =01,C/T=0,GATE=0

T1可任意设置

TMOD= 0000001

1) 方式 0 的应用

例 1 利用定时器输出周期为 2 ms的方波, 设单片机晶振频率为 6 MHz。 选用定时器 /计数器T0 作定时器, 输出为P1.0 引脚, 2 ms 的方波可由间隔 1 ms的高低电平相间而成, 因而只要每隔 1 ms对 P1.0 取反一次即可得到这个方波。 

定时 1 ms的初值: 

因为 机器周期=12÷6 MHz= 2 μs

所以 1 ms内T0 需要计数N次: 

N= 1 ms÷2 μs = 500

使用方式 0 的 13 位计数器即可, T0 的初值X为:

X=M-N=8192-500=7692=1E0CH

(0001 1110 0000 1100)

但是, 因为 13 位计数器中, 低 8 位 TL0 只使用了 5 位, 其余码均计入高 8 位TH0 的初值, 则 T0 的初值调整为

 (000 1111 0000 01100)

TH0=0F0H, TL0=0CH

TMOD初始化: TMOD=00000000B=00H

(GATE=0, C/T=0, M1=0, M0=0)

TCON初始化: 启动TR0=1

IE初始化: 开放中断EA=1, 定时器T0 中断允许ET0=1

程序清单如下: 

ORG 0000H 

AJMP START; 复位入口

ORG 000BH

AJMP T0INT ; T0中断入口

ORG 0030H

START: MOV TH0, #0F0H ; T0赋初值

MOV TL0, #0CH

MOV TMOD, #00H

SETB ET0 ; 开T0中断

SETB EA ; 开总允许中断

SETB TR0 ; 启动T0

MAIN: AJMP MAIN ; 主程序

T0INT: CPL P1.0

MOV TL0, #0CH

MOV TH0, #0F0H

RETI

2) 方式 1应用

方式 1 与方式 0 基本相同, 只是方式 1 改用了 16 位计数器。 要求定时周期较长时, 13 位计数器不够用, 可改用 16 位计数器。 

例2 已知某生产线的传送带上不断地有产品单向传送, 产品之间有较大间隔。使用光电开关统计一定时间内的产品个数。 假定红灯亮时停止统计, 红灯灭时才在上次统计结果的基础上继续统计, 试用单片机定时器 /计数器T1的方式 1完成该项产品的计数任务。

(1) 初始化: TMOD=11010000B=0D0H

(GATE=1, C/T=1, M0M1=01)

TCON=00H

(2) T1在方式1时, 溢出产生中断, 且计数器回零, 故在中断服务程序中, 需用R0计数中断次数, 以保护累积计数结果。

(3) 启动T1计数, 开T1中断。 

程序清单如下: ORG 0000H 

AJMP START ; 复位入口

ORG 001BH

AJMP T1INT ; T1中断入口

ORG 0100H

START: MOV SP, #60H ; 初始化程序

MOV TCON, #00H

MOV TMOD, #0D0H

MOV TH1, #00H

MOV TL1, #00H

MOV R0, #00H ; 清中断次数计数单元

MOV P3, #28H; 设置P3.5第二功能

SETB TR1 ; 启动T1

SETB ET1; 开T1中断

SETB EA ; 开总中断

MAIN: ACALL DISP ; 主程序, 调显示子程序

ORG 0A00H

T1INT: INC R0 ; 中断服务子程序

RETI

DISP: ; 显示子程序

RET

3) 方式 2 应用

方式 2 是定时器自动重装载的操作方式, 在这种方式下, 定时器 0 和 1 的工作是相同的, 它的工作过程与方式 0、 方式 1 基本相同, 只不过在溢出的同时, 将 8 位二进制初值自动重装载, 即在中断服务子程序中, 不需要编程送初值, 这里不再举例。定时器 T1 工作在方式 2 时, 可直接用作串行口波特率发生器,

4) 方式 3 的应用

定时器 T0 工作在方式 3 时是 2 个 8 位定时器 /计数器。 且TH0 借用了定时器 T1 的溢出中断标志TF1和运行控制位 TR1。 

例 3 假设有一个用户系统中已使用了两个外部中断源, 并置定时器 T1 于方式 2, 作串行口波特率发生器用, 现要求再增加一个外部中断源, 并由 P1.0 口输出一个 5K Hz的方波(假设晶振频率为 6 MHz)。

在不增加其它硬件开销时, 可把定时器/计数器 T0 置于工作方式 3, 利用外部引脚 T0端作附加的外部中断输入端, 把 TL0 预置为 0FFH, 这样在 T0 端出现由 1至 0 的负跳变时, TL0 立即溢出, 申请中断, 相当于边沿激活的外部中断源。 在方式 3下, TH0 总是作 8 位定时器用, 可以靠它来控制由 P1.0 输出的 5 kHz方波。 

由 P1.0 输出 5 kHz的方波, 即每隔 100 μs使 P1.0 的电平发生一次变化。则TH0中的初始值 X=M-N=256-100/2=206。

MOV TL0, #0FFH 

MOV TH0, #206 MOV TL1, #BAUD ; BAUD根据波特率要求设置常数 MOV TH1, #BAUD MOV MOD, #27H ; 置T0工作方式3

; TL0工作于计数器方式

MOVTCON, #55H ; 启动定时器 T0、 T1, 置外部中断 0 和 1

; 为边沿激活方式

MOVIE, #9FH ; 开放全部中断

TL0 溢出中断服务程序(由 000BH单元转来): 

TL0INT: MOV TL0, #0FFH

; 外部引脚 T0 引起中断处理程序 RETI

TH0 溢出中断服务程序(由 001BH转来): 

TH0INT: MOVTH0, #206

CPL P1.0

RETI

此处串行口中断服务程序、 外中断 0和外中断 1的中断服务程序没有列出。

设MCS-51单片机系统时钟频率ФCLK为6MHZ,请编出利用定时/计数器T0在P1.0引脚上产生周期为2秒,占空比为50%的方波信号的程序

(1)主程序

1)T0工作方式的设定: 选择方式1(16位方式)

(最大定时131ms)

2)定时常数的设定:

TC=216-100ms/2μs =15536=3CB0H

即:TH0应装3CH,TL0应装B0H。

3)中断管理: 允许T0中断,开放总中断

即:IE应装10000010B。

4)启动定时器T0: SETB TR0

5)设置软件计数器初值:(如使用R7)

即R7应装0AH

6)动态停机:SJMP $

主程序如下:

MAIN:MOV TMOD,#01H;设定T0为方式1

MOV TH0,#3CH;装入定时常数高8位

MOV TL0,#0B0H;装入定时常数低8位 MOV IE,#82H;开放T0中断 SETB TR0 ;启动T0 MOV R7,#0AH ;设置软件计数器

SJMP $

(2)中断服务程序

任务: 1)恢复T0常数;

2)软件计数器减1;

3)判断软件计数器是否为0。为0时,改变P1.0状态,并恢复软件计数器初值;不为0时中断返回。

程序如下:

T0INT: MOV TL0,#0B0H ;恢复定时常数

MOV TH0,#3CH ;

DJNZ R7,NEXT

CPL P1.0

MOV R7,#0AH

NEXT: RETI

完整程序如下:

ORG 0000H

AJMP MAIN

ORG 000BH

AJMP TOINT

ORG 0030H

MAIN: MOV TMOD,#01H

MOV TH0,#3CH

MOV TL0,#0B0H MOV IE,#82H

SETB TR0

MOV R7,#0AH

SJMP $

TOINT: MOV TL0,#0B0H

MOV TH0,#3CH DJNZ R7,NEXT CPL P1.0

MOV R7,#0AH NEXT: RETI

END

本文来源:https://www.bwwdw.com/article/sk64.html

Top