Download presentation
Presentation is loading. Please wait.
1
第四章 汇编语言程序设计 4 . 1 程序设计概述 一、程序设计步骤 二、程序设计方法 三、汇编语言源程序的格式
程序设计概述 一、程序设计步骤 二、程序设计方法 三、汇编语言源程序的格式 汇编语言的语句一般自左到右按序至少包括以下四项: 标号:操作码 操作数;注释 注意: 1.标号的第一个字符必须是英文字母,随后的可以是英文字母或数字。 2.在操作码和操作数之间应该有空格。
2
汇编语言基本程序设计 顺序结构程序 例:将片外0200H、0201H单元两个无符号数相乘,结果送片内RAM的50H、51H单元。 ORG H M EQU H;乘数首地址 M EQU 50H;乘积首地址 AJMP MAIN ORG H MAIN: MOV DPTR,#M1;指向被乘数 MOV A,#64H MOVX @DPTR,A ;将100送0200H INC DPTR MOV A,#0AH MOVX @DPTR,A;将10送0201H MOV DPTR,#M1;指向数据区 MOV R0,#M2;R0指向结果单元 MOVX MOV B,A INC DPTR MOVX MUL AB MOV @R0,A;存积低字节到50H MOV A,B INC R0 MOV @R0,A;存积高字节到51H AJMP $
3
分支程序 例:设计可多达128路分支出口的转移程序。设128个出口分别转向128段小程序,它们的入口地址依次为:addr00,addr01, addr02, … ,addr7F;要转移到某分支的信息存放在工作寄存器R3中。 MOV A,R3 RL A MOV DPTR,#TAB JMP @A+DPTR TAB:AJMP addr00 AJMP addr01 … … AJMP addr7F
4
例:设计有256路分支出口的转移程序 MOV DPTR,#TAB MOV A,R2;取出口信息 CLR C RLC A;出口信息乘以2
JNC LOW;出口信息在0~127间则转移 INC DPH;出口信息在128~255间,则DPTR加256,使页数加1 LOW: MOV R3,A;暂存出口信息 MOVC PUSH A MOV A,R3 INC A MOVC PUSH A RET;将出口地址高8位送PC高8位,将出口地址低8位送PC低8位 TAB: DW addr 00 DW addr 01 DW addr 02 … … DW addr FF
5
循环程序 例:求无符号数累加和 。若Ai均为单字节数,并按i(i=1~n)顺序存放在片内RAM从60H开始的单元中,n放在R2中,要求它们的和(双字节)放在R3和R4中。 ORG H AJMP ADD1 …….. ORG H ADD1:MOV R3,#00H;部分和高字节清零 MOV R4,#00H;部分和低字节清零 MOV R2,#8;数据个数送R2 MOV R0,#60H;数据首址送R0 CLR C LOOP:MOV A,R4;取部分和低位 ADD MOV R4,A;存部分和 INC R0;地址加1 CLR A ADDC A,R3;部分和高字节加进位 MOV R3,A;存部分和 DJNZ R2,LOOP END
6
4.2.4 查表程序 4.2.5 子程序及调用 1. 用工作寄存器和累加器传递参数
查表程序 例:已知数据0~9的平方,设变量x的值在累加器A中,查表后求 的值放回累加器,试编制程序。 ORG H SQR :MOV DPTR,#TABLE MOVC RET TABLE:DB H,01H,04H,09H,16H DB H,36H,49H,64H,81H 子程序及调用 1. 用工作寄存器和累加器传递参数 例:用程序实现 ,设 、 、y 分别存于片内RAM的X1、X2、Y 3个单元中。 MOV R1,A; 暂存R1中 MOV A,X2 ACALL SQR;调查表程序 ADD A,R1 MOV Y,A ORG 00H X1 EQU 30H X2 EQU 40H Y EQU 50H START:MOV A, X1 ACALL SQR;调查表程序
7
2. 用指针寄存器传递参数 例:将片内RAM中30H单元开始的10个数据取反后送到片内RAM中40H开始的单元中。 ORG 0100H
2. 用指针寄存器传递参数 例:将片内RAM中30H单元开始的10个数据取反后送到片内RAM中40H开始的单元中。 ORG H MOV R2,#0AH;数据块长度送R2 MOV R0,#30H;要处理的数据块首址送R0 MOV R1,#40H;处理后数据块首址送R1 ACALL TRAN;调用求反子程序 ORG 0200H TRAN:PUSH A KK :MOV CPL A ;数据求反 MOV @R1,A;存数据到R1指向的片内RAM单元 INC R0 INC R1 DJNZ R2,KK;未处理完,继续转到KK MOV A,R1 ;当前存放处理结果单元地址送A CLR C SUBB A,#0AH;退回到结果数据区首址 XCH A,R1 ;交换 POP A RET
8
3. 用堆栈传递参数 例:将R1中的低半字节(低4位)一个16进制数转换成ASCII码,再放回R1。 ORG 00H AJMP START
3. 用堆栈传递参数 例:将R1中的低半字节(低4位)一个16进制数转换成ASCII码,再放回R1。 ORG 00H AJMP START START:MOV SP,#50H;堆栈指针 MOV A,R1 ;待处理的16进制数送A PUSH ACC ;待转换数入栈 LCALL H_ASC;调数制转换子程序 POP ACC ;从堆栈取得转换值 MOV R1,A ;转换值送R1 ORG 0E0H H_ASC:MOV R1,SP ;R1指向栈顶 DEC R ; R1退回到入口参数地址 DEC R ; XCH ANL A,#0FH ;保留低半字节
9
MOV DPTR,#TAB;取ASCII码表首址
MOVC XCH ;转化好的数据送堆栈 RET TAB DB 30H,31H,32H,33H, DB 34H,35H,36H, DB 37H,38H,39H DB 41H,42H,43H,44H DB 45H,46H
10
4 . 3 算术逻辑处理程序 1、多字节二进制数加法 例:两个双精度数(8字节数二进制数)相加。 BUF1 EQU 50H;定义被加数首址
算术逻辑处理程序 1、多字节二进制数加法 例:两个双精度数(8字节数二进制数)相加。 BUF1 EQU 50H;定义被加数首址 BUF2 EQU 60H;加数首址 N EQU 08H;加数字节数 MOV R0,#BUF1;R0指向被加数 MOV R1,#BUF2;R1指向加数 MOV R2,#N ;加数总字节数送R2 ADDBIN:CLR C ;清进位 LOOP :MOV ;取被加数 ADDC ;两数相加,带进位 MOV @R0,A ;和放回被加数单元 INC R ;指向被加数的下一个字节 INC R ;指向加数的下一个字节 DJNZ R2,LOOP;未加完转LOOP JC DON ;最高字节相加有进位转 MOV @R0,#00H;无进位R0置零 JMP STOP ;退出,暂停 DON:MOV @R0,#01H ;最高字节求和的进位存R0 STOP:
11
2、多字节压缩BCD码加法 例:多字节压缩BCD码加法 MOV R0,#ADR1;被加数低字节地址指针
MOV R3,#N ;字节数 ACALL BCDADD ORG 0108H BCDADD:MOV A,R ;两个多字节BCD码加法子程序 PUSH A ;被加数首址入栈暂存 MOV A,R3 PUSH A ;加数字节数入栈暂存 CLR C LP :MOV ;取被加数 ADDC ;相加 DA A ;十进制加法调整 MOV @R0,A ;存和 INC R ;指针加1 INC R1 DJNZ R3,LP0 ;做完加法否 POP A MOV R3,A ;恢复R3中的内容 JNC RETURN ;最高字节相加有无进位 MOV @R0,#01H INC R ;最高字节和有进位,扩展一个字节 RETURN :POP A MOV R0,A ;恢复R0,指向和的首址 RET
12
3、多字节数求补 例:多字节数求补 ADR EQU 60H N EQU 08H MOV R2,#N ;待处理的字节数送R2
MOV R0,#ADR ;R0指向待处理的数据 ACALL D_NEG;调用多字节数求补子程序 ORG 00A0H D_NEG:MOV A,R0 PUSH A ;数据区首址入栈保护 MOV ;从片内RAM60H取最低字节 CPL A ;求反 ADD A,#01H ;最低字节取反后加1 ;最低字节处理后放回原处 DEC R ;待处理字节数减1 DON : INC R ;R0指向下一个数 MOV ;下一个字节送A CPL A ADDC A,# ;考虑低位字节求反加1后可能的进位 MOV @R0,A ;处理完后放回原处 DJNZ R2,DON POP A ;处理完,从栈顶弹出结果数据区首址 MOV R0,A ;结果单元首址送R0 RET
13
4、多字节无符号数求极大值 设在DAT开始的片内RAM中存放8个无符号字节数,找出最大值,并暂存在A中。 DAT EQU 40H
ORG 0AH MOV R2,#07H ;R2存比较次数 MOV R0,#DAT;R0指向数据区首址 CLR C MAX:MOV ;第一个数据送R3 MOV R3,A INC R ;指向下一个数据 MOV ;取下一个数据 SUBB A,R ;后一数减前一数,A(i+1)-A(i) JNC LP ;无借位,后一数大,不交换 MOV A,R ;交换数据 XCH ;大字符下沉 DEC R0 XCH ;小字符上浮 INC R0 LP:DJNZ R2,MAX RET
14
5、冒泡程序 例:设片内RAM 40H开始的单元有无序字符表,假设为8个字节,将其按代码值大小升序排列。 N EQU 08H ;元素个数
TAB EQU 40H ;数据区首址 MOV R2,#N MOV R0,#TAB ACALL ARRAY;调用升序排序子程序 ORG 0100H ARRAY:DEC R ;置外循环次数=N-1(冒泡次数) SETB 00H ;置交换标志位=1 MOV R7,#00H ;第0次冒泡,R7置0 LP :JNB 00H,LP ;无交换标志,退出 CLR 00H ;清交换标志 MOV A,R ;数据首址送A MOV R1,A ;R0内容暂存于R1 MOV A,R ;N-1送R5 MOV R5,A ;置内循环次数初值=N-1
15
CLR C SUBB A,R7 ;内循环次数=N-1-(R7) MOV R5,A ;更新内循环次数 LP1:MOV MOV R3,A INC R ;指向第二个数据 MOV SUBB A,R3 ;相邻元素比较,A(i+1)-A(i) JNC LP ;A(i+1)>A(i)转LP2 MOV A,R3 ;A(i+1)<A(i), A(i+1)与A(i)交换 XCH ;大字符A(i)下沉到A(i+1)所在单元 DEC R1 XCH ;小字符A(i+1) 上浮到A(i)所在单元 INC R1 SETB 00H ;有交换,设标志位为1 LP2:DJNZ R5,LP1;比较完否? INC R ;完成一次冒泡,R7内容加1 DJNZ R2,LP0;完成全部冒泡? LP3:RET
16
6、除以2的倍数的处理 例:设自P0口输入8个数据,已经存放在片内RAM60H开始的单元中,求出这8个数据的平均值,并将商放在R3、R4中。
MOV R0,#60H;R0指向数据区首址 ACALL AVG AVG:MOV R2,#08H;R2作为计数器 MOV R3,#00H;部分和高位字节单元清零 MOV R4,#00H;部分和低位字节单元清零 ACALL D_ADD;调用求累加和子程序 ACALL D_DIV8;调用除以8的子程序 RET ORG 0100H D_ADD:CLR C ;多字节累加和子程序 LOOP: MOV A,R ;取部分和低位字节 ADD ;与下一个数相加 MOV R4,A ;存部分和低位字节 INC R ;地址加1,指向下一个字节 CLR A ADDC A,R ;加上低位字节向高位的进位 MOV R3,A ; 存部分和高位字节 DJNZ R2,LOOP;未加完继续
17
D_DIV8:MOV R2,#03H ;双字节除以8子程序
DON:CLR C ;清进位 MOV A,R ;被除数高位字节送A RRC A ;被除数高位字节带进位右移一位 MOV R3,A ;存中间结果的高位字节 MOV A,R ;被除数低位字节送A RRC A ;被除数低位字节带进位右移一位 MOV R4,A ;存中间结果的低位字节 DJNZ R2,DON ;完成右移3位否? RET
18
7、双字节无符号数整数相乘 例:双字节无符号数整数相乘 MOV R1,#ADR ;置积的首地址
ACALL DW_MUL;调用双字节无符号数乘法子程序 ORG 00A0H DW_MUL:MOV R7,#04H CLEAR:MOV @R1,#00H ;存放乘积的4个单元清零 INC R1 DJNZ R7,CLEAR MOV R1,#ADR PARTMUL:MOV A,R ;(R2)乘(R4) MOV B,R4 MUL AB ;积的低字节在A中,高字节在B中 ACALL ADDM ;调用处理部分积子程序 MOV A,R ; (R2)乘(R5) MOV B,R5 MUL AB MOV A,R ; (R3)乘(R4)
19
MOV B,R4 MUL AB DEC R1 ACALL ADDM ;调用处理部分积子程序 MOV A,R ; (R3)乘(R5) MOV B,R5 ACALL ADDM ;调用处理部分积子程序 RET ADDM:ADD ;处理部分积子程序 MOV @R1,A MOV A,B INC R1 ADDC MOV ADDC A,#00H
20
4 . 4 数制转换程序 1、二进制数转换为十进制数 例:将R3中的二进制数转换为非压缩BCD码,存放在片内R0指向的单元。
数制转换程序 1、二进制数转换为十进制数 例:将R3中的二进制数转换为非压缩BCD码,存放在片内R0指向的单元。 MOV R0,#60H ;转换好的数放在60H开始的单元 B_BCD:MOV A,R ;取二进制数到A MOV B,#100 DIV AB ;A中的商为BCD百位数 INC R0 INC R ;R0指向十进制数的百位 MOV @R0,A ;存十进制数的百位 MOV A,#10 XCH A,B ;将余数交换到A中,A中10交换到B中 DIV AB ;余数再除以10,A中得到十位数,B中得到个位数 DEC R0 MOV @R0,A ;存十进制数的十位数 MOV @R0,B ;存十进制数的个位数 RET
21
例:双字节二进制数转换为压缩BCD数 DW_BCD:MOV A,R0 ; R0指向双字节二进制数的低地址单元
MOV R6,A ;将待转换数据指针暂存R6 MOV A,R ;R1指向待存BCD码的起始单元 MOV R7,A ;BCD码指针暂存R7 MOV R2,#2 ;要转换2个字节的二进制数 INC R ;存BCD码需3个字节 CLR C BB0:MOV @R1,#0 INC R1 DJNZ R2,BB0 ;清BCD码单元 MOV R3,#16 ;要转换的二进制数位数为16 BB3:MOV A,R ;R0指向待转换的二进制数 MOV R0,A MOV R2,#2 ;双字节左移需左移两次
22
BB1:MOV ;取一个字节到A RLC A ;二进制数带进位C循环左移一位 MOV @R0,A ;左移后暂存 INC R ;R0指向第二个字节 DJNZ R2,BB1 ;将ai移位入C中,i=15,14,13,…,0 MOV R2,#2 INC R ;三个单元存放BCD码 MOV A,R ;R1指向BCD码单元 MOV R1,A BB2: MOV ADDC ;进行y=y *2 + ai的运算 DA A ;十进制调整 MOV @R1,A ;存中间结果 INC R1 DJNZ R2,BB2 DJNZ R3,BB3 ;16位二进制数处理完否?
23
2、十进制数转换为二进制数 例:十进制数(多位压缩BCD码)转换成二进制数 BCD_DW:MOV A,R5 ;将BCD数的高位字节送A
MOV R2,A ;暂存到R2 ACALL BCDIN1 ;调用子程序计算a3*10+a2 MOV B,# ; 将100送B MUL AB ; 计算(a3*10+a2)*100 MOV R6,A ;暂存乘积低位字节 XCH A,B ;将乘积的高位字节交换到A中 MOV R5,A ;存乘积高位字节 MOV A,R ;取BCD码的低位字节 MOV R2,A ;送R2 ACALL BCDIN1 ;调用子程序计算a1*10+a0
24
ADD A,R6 ;加上[(a3*10+a2)*100]的低位字节
MOV R4,A ;存结果的低位字节 MOV A,R5 ADDC A,#00H;计入进位 MOV R5,A ;存结果的高位字节 AJMP $ BCDIN1:MOV A,R ;取BCD码,(计算 子程序) ANL A,#0F0H ;屏蔽低4位,得高4位BCD码 SWAP A ;交换A的高低半字节 MOV B,#10 ;10送B MUL AB ; MOV R3,A ;乘积低位字节送R3 MOV A,R ;取BCD码 ANL A,#0FH ;屏蔽高4位,得低位BCD码 ADD A,R ;加低位BCD码,+ai RET
25
3、二进制数转换为16进制数的ASCII码 例:单字节二进制数转换为2个十六进制ASCII码 BINASC:MOV A,R2 ;取二进制数
MOV R3,A ANL A,#0FH ;屏蔽高4位 ACALL SUB1 MOV R2,A ;存低半字节的ASCII码 MOV A,R ;取原二进制数 ANL A,#0F0H ;屏蔽低4位 SWAP A ;A高低半字节交换 ACALL SUB1 ;调子,将16进制数转换为ASCII码 MOV R3,A ;存高半字节ASCII码 ……… SUB1:PUSH A CLR C SUBB A,#0AH POP A JC AD ;该数小于10转到AD30 ADD A,#07H ;大于10,为A~F AD30:ADD A,#30H RET
26
4、ASCII字符串转换为十六进制数 , 两两组合成 一个字节
例:将ASCII串转换为十六进制数。设在R0指向的片内RAM区存有20个十六进制数的ASCII字串。将ASCII码转换为十六进制数,然后两两组合成一个字节,从低地址单元到高地址单元依次组合。 ASCHEX:MOV R3,#N ;字节数 MOV A,R1 PUSH A ;保护R1 MOV A,R6 PUSH A ;保护R6 DON1:MOV ;取一个ASCII码到A,设R0指向ASC码首址 ACALL COVHEX ;调子,将ASCII码转换成十六进制数 MOV A,R ;取出口参数 MOV R6,A ;低半字节暂存到R6 INC R ;R0指向下个ASCII码 MOV ;取下一个ASCII码到A MOV A,R ;取出口参数 SWAP A
27
ADD A,R6 ;将两个十六进制数组合成一个字节
MOV @R1,A ;存二进制数,设R1已指向目的存储区首址 INC R ;R1指向下个结果单元 INC R ;R0指向下个ASCII码 DJNZ R3,DON1;处理完? POP A MOV R6,A ;恢复R6 MOV R1,A ;恢复R1 RET COVHEX:CLR C ;ASCII码转换为16进制数子程序 SUBB A,#30H ;ASCII码值减30H MOV R7,A ;中间结果暂存到R7 MOV A,#09H ;09H送累加器A SUBB A,R ;09H减ASCII码减30H后的值 JNC EXIT ;没借位跳转 CLR C ;否则先清进位 MOV A,R ;再将ASCII码减30H的中间结果存到A SUBB A,#07H ;再减07H MOV R7,A EXIT:RET ;返回值存于R7中
28
4 . 5 中断应用程序 一、MCS-51单片机中断服务程序入口地址对照表 中断源 中断服务程序入口地址 外部中断0 0003H
中断应用程序 一、MCS-51单片机中断服务程序入口地址对照表 中断源 中断服务程序入口地址 外部中断0 0003H 定时器/计数器0溢出 000BH 外部中断1 0013H 定时器/计数器1溢出 001BH 串行口 0023H
29
二、中断请求的撤除 1、定时器溢出中断请求及外部中断负边沿触发方式下的 中断请求由硬件自动撤除 2、串行口中断请求的撤除由软件实现
CLR TI ;撤除发送中断 CLR RI ;撤除接收中断 3、外部中断低电平触发方式下的中断请求撤除需外接电 路实现 在中断服务程序中用如下两条指令可实现中断请求的撤除和继续开放 ANL P1,#0FEH ORL P1,#01H 外部中断请求 INT0 P1.0 Q D S CLK 8051
30
三、中断系统的初始化 例:设外部中断0为低电平触发,编写中断系统初始化程序。 采用位操作: SETB EA ;允许CPU中断
SETB EX0 ;允许外部0中断 SETB PX0 ;设外部0中断为高优先级 CLR IT0 ;设外部0中断为低电平触发 采用字节操作: MOV IE,#81H ORL IP,#01H ANL TCON,#0FEH
31
四、外部中断源的扩展 1、定时器/计数器扩展外中断源
例:将定时器/计数器0设置为工作方式2,计数模式,计数初值为0FFH,允许中断,编写初始程序。 MOV TMOD,#06H;计数器,方式2 MOV TH0,#0FFH ;计数初值 MOV TL0,#0FFH SETB ET ;允许计数器中断 SETB EA ;CPU开中断 SETB TR ;启动计数器0 2、查询式扩展外部中断源(见实例)
32
五、外部中断应用程序例程 例:某工业监控系统,具有温度、压力、PH值等多路监控功能。在PH<7时,向CPU申请中断,CPU响应后令P3.0引脚输出高电平,经驱动,使加碱管道电磁阀接通1s,以调整PH值。设PH<7时外设输入正脉冲到D触发器CLK端,其中断服务程序入口为INT02。
33
ORG H LJMP MAIN ORG H LJMP H ORG H ;外部中断0中断服务程序入口地址 ;地址表 JB P1.0,INT00 JB P1.1,INT01 JB P1.2,INT02 JB P1.3,INT03 ORG H INT00:…….. RETI INT01:……..
34
INT02: ;中断服务程序2 PUSH PSW ;保护现场 PUSH A ;保存现场 SETB PSW ;保存现场 SETB P ;接通加碱管道电磁阀 ACALL DELAY ;调用延时程序延时1S CLR P ;1s到时关加碱管道电磁阀 ANL P1,#BFH;BF= ,撤除PH<7的中断请求 ORL P1,#40H ;允许PH<7的中断请求 POP A ;恢复现场 POP PSW RETI ;中断返回 INT03:…….. RETI MAIN:…….. END
35
定时器/计数器应用程序 例:设单片机晶振频率为6MHz,要求使用定时器0工作方式1产生周期为500us的等宽脉冲,并在P1.0端输出,编写程序实现。 ORG 0000H AJMP MAIN ORG 000BH AJMP INTP ORG 0100H MAIN:ANL TMOD,#0F0H;高4位不变,不影响T1的工作 ORL TMOD,#01H ;置定时器0工作方式1 MOV TH0,#0FFH ;设置计数初值 MOV TL0,#83H SETB EA ;CPU开中断 SETB ET ;定时器0开中断 SETB TR ;启动定时器0 SJMP $ ;等待中断 INTP: MOV TH0,#0FFH ;重新设置计数初值 CPL P ;输出取反 RETI END
36
例:已知晶振频率为6MHz,要求使用定时器0在工作方式2产生100us定时,在P1.0输出周期为200us的连续方波脉冲,编写程序。
查询方式: MAIN: ANL TMOD,#0F0H;不影响T1工作 ORL TMOD,#02H ;T0定时,方式2 MOV TH0,#0CEH ;初值 MOV TL0,#0CEH MOV IE,#00H ;禁止中断 SETB TR ;启动定时器0 LOOP: JBC TF0,LOOP1 AJMP LOOP LOOP1: CPL P1.0
37
中断方式: ORG 0000H LJMP MAIN ORG 000BH LJMP INT0 OGR 0030H
MAIN:ANL TMOD,#0F0H ;不影响T1工作 ORL TMOD,#02H ;T0定时,方式2 MOV TH0,#0CEH ;初值 MOV TL0,#0CEH SETB EA ;开CPU中断 SETB ET ;开T0中断 SETB TR ;启动T0 ……… INT0: CPL P1.0 RETI
38
例:要求利用单片机内部的定时器/计数器,达到1分钟延时。设晶振频率12MHz。
ORG H LJMP 0030H ORG BH ;定时器/计数器1中断服务程序 SETB F0;建立标志位F0 RETI ORG H ;主程序 START: MOV TMOD,# B;T0和T1置方式 … … REPEAT:MOV TH1,#15H ;置T1初值 MOV TL1,#0A0H MOV TH0,#0FCH ;置T0初值
39
MOV TL0,#18H CLR P ;T1输入端清零 MOV IE,#88H ;开CPU与T1中断,T0中断屏蔽 SETB TR ;启动T1工作 SETB TR ;启动T0工作 LOOP: … … JNB TF0,$ ;等T0定时到、溢出 CLR TF ;清T0溢出标志 JBC F0,ELSE ;如F0=1,转ELSE SETB P ;否则,T1端置1 MOV TH0,#0FCH ;T0重装载 CLR P ;T1输入端清零,令T1计一次数 SJMP LOOP ELSE: … … AJMP REPEAT
40
作 业 编程,利用定时器中断方式使P1.0和P1.1口分别输出周期为2ms和50ms的方波。设晶振为12MHz。
41
串行通信接口应用程序 例:用8051串行口外接74LS165移位寄存器扩展8位并行输入口,输入数据由8个开关提供,另有一个开关K提供联络信号。当开关K合上时,表示要求输入数据。输入8位开关量,对应分别处理不同的任务。 START:JB P1.1, $ ;K未合上,等待 CLR P ;74LS165并行置入数据 SETB P ;置串行移位方式 MOV SCON,#10H;串口方式0并启动接收 JNB RI , $ ;查询RI CLR RI ;清接收中断标志 MOV A,SBUF;输入数据 …… ;据输入的各位分别处理任务 SJMP START ;准备下一次接收
42
例:由串行通信接口实现双机通信。将发送机8051片内RAM 40H~4FH的数据串发送到接收机8051片内RAM60H~6FH中。发送、接收机工作于方式2,TB8为奇偶校验位,接收时对数据奇偶校验。
发送程序(查询方式): MOV SCON,#80H ;串行口方式2 MOV PCON,#00H ;SMOD=0,波特率不加倍 MOV R0,#40H ;待发数据区地址指针 MOV R2,#10H ;数据长度 LOOP:MOV ;取发送数据 MOV C,P ;奇偶位送TB8 MOV TB8,C MOV SBUF,A ;发送数据 WAIT:JBC TI,NEXT ;发送完一帧信息后硬件置位TI SJMP WAIT NEXT: INC R ;修改发送数据地址指针 DJNZ R2,LOOP RET
43
接收程序(查询方式): MOV PCON,#00H ;置SMOD=0 MOV R0,#60H ;置数据区地址指针
MOV SCON,#90H ;串口工作方式2,并启动接收 LOOP:JBC RI,READ ;等待接收数据并清RI SJMP LOOP READ:MOV A,SBUF ;读一帧数据 MOV C,P JNC LP ;C不为1转LP0 JNB RB8,ERR ;RB8=0,即RB8不为P转ERR AJMP LP1 LP0 :JB RB8,ERR ; RB8=1,即RB8不为P转ERR LP1 :MOV @R0,A ;RB8=P,接收一帧数据 INC R0 DJNZ R2,LOOP RET ERR :…… ;出错处理程序 ……..
Similar presentations