[工学]单片机程序设计.ppt_第1页
[工学]单片机程序设计.ppt_第2页
[工学]单片机程序设计.ppt_第3页
[工学]单片机程序设计.ppt_第4页
[工学]单片机程序设计.ppt_第5页
已阅读5页,还剩134页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章,单片机程序设计方法,常用伪指令,定位伪指令ORG 汇编结束伪指令END 符号定义伪指令EQU 定义字节数据伪指令DB 定义字数据伪指令DW 数据赋值伪指令DATA 位地址赋值伪指令BIT 定义空间伪指令DS 数据地址赋值伪指令XDATA,逻辑及移位类指令 逻辑与指令(6条),例: ORG 0000H ;程序开始 MOV A , #34H ;(A)=34H ANL A , #0FH ;(A)=(A)0FH=04H NOP END ;结束,与运算技巧: 与运算有见零为零的特点,通常用来将数据的某几位清零,其他位保持不变。,逻辑或指令(6条),例: ORG 0000H ;程序开始 MOV A , #49H ;(A)=49H ORL A , #07H ;(A)=(A)07H=4FH NOP END ;结束,或运算技巧: 或运算有见1为1的特点,通常用来将数据的某几位置1,其他位保持不变。,逻辑异或指令(6条),例: ORG 0000H ;程序开始 MOV A , #55H ;(A)=55H XRL A , #0FFH;(A)=(A) FFH=AAH NOP END ;结束,异或运算技巧: 异或运算有见1取反的特点,通常用来将数据的某几位取反,其他位保持不变。,累加器A清0和取反指令,ORG 0000H ;程序开始 MOV A , #8CH ;(A)=8CH CLR A ;(A)=00H END ;结束,ORG 0000H ;程序开始 MOV A , #8CH ;(A)=8CH CPL A ;(A)=73H END ;结束,A.0,A.7,A.0,A.7,A.0,A.7,A.0,A.7,CY,CY,RL A RR A RLC A RRC A,注意:执行带进位的循环移位指令之前,必须给CY置位或清零。,循环移位指令,使用技巧: 循环右移一次相当于除以2。,ORG 0000H MOV A , #80H MOV R5 , #8 LOOP: RR A DJNZ R5 , LOOP NOP END,使用技巧: 循环左移一次相当于乘以2。,ORG 0000H MOV A , #01H MOV R4 , #8 LOOP: RL A DJNZ R4 , LOOP NOP END,循环左移指令,循环左移RLA,进位位C与操作数作为整体循环移位,1 0 0 0 0 0 0,0,C,A,RLCA,RLCA,1,0 0 0 0 0 0 0,1,0,C,0,0 0 0 0 0 0 1,RLCA,1.位传送指令,注意: 位存储单元之间的数据传递要通过进位标志CY来完成,例: MOV C , P0.0 ;(CY)=(P0.0) MOV ACC.3 , C ;(ACC.3)=(CY) MOV 05H , C ;(05H)=(CY),1位二进制数在位存储单元之间传递,2.位置位和位清零指令,设置位状态,例如: CLR C ;(CY)=0 CLR B.0 ;(B.0)=0 CLR P2.0 ;(P2.0)=0 CLR 7FH ;(7FH)=0,例如: SETB C ;(CY)=1 SETB RS1 ;(RS1)=1 SETB P3.0 ;(P3.0)=1 SETB 60H ;(60H)=1,3.位运算指令,注意: C是布尔机的累加器,例如: ANL C , P3.2 ORL C , P3.2 CPL C CPL P3.0,利用位逻辑运算指令可以实现各种各样的逻辑功能。 利用位逻辑运算指令编程实现下面硬件逻辑电路的功能,MOV C,P1.0 ANL C,P1.1 CPL C ORL C,/P1.2 MOV 0F0H,C MOV C,P1.3 ORL C,P1.4 ANL C,0F0H MOV P1.5,C,数据的拼拆,【例】设在30H和31H单元中各有一个8位数据: (30H)=x7x6x5x4x3x2x1x0 ,(31H)=y7y6y5y4y3y2y1y0 现在要从30H单元中取出低5位,并从31H单元中取出低3位完成拼装,拼装结果送40H单元保存,并且规定: (40H)=y2y1y0x4x3x2x1x0 利用逻辑指令ANL、ORL来完成数据的拼拆:,MOV 40H,30H ;将x7x0传送到40H单元 ANL 40H,#0001 1111B ;将高3位屏蔽掉 MOV A,31H ;将y7y0传送到累加器中 SWAP A ;将A的内容左移4次 RL A ;y2y0移到高3位 ANL A,#1110 0000B ;将低5位屏蔽掉 ORL 40H,A ;完成拼装任务,4.位转移指令,MOV A , #00110111B JB ACC.1 , LOOP1 MOV B , #4 SJMP LOOP2 LOOP1:MOV B , #5 LOOP2:SJMP $,程序功能:根据ACC.1的状态,设定B的值。,5.判CY标志指令,3.3.4 控制转移类指令 无条件转移指令(4条),1) 长转移指令:LJMP AAAAH ; AAAAHPC,注意:该指令可以转移到64 KB程序存储器中的任意位置。,2)绝对转移指令,AJMP addr11 ; PC+2PC, addr11 PC.10PC.0,3)相对转移指令,SJMP rel,4) 间接转移指令 指令格式:JMP A+DPTR ;PC A + DPTR,该指令的特点是转移地址可以在程序运行中加以改变。DPTR一般为确定值,根据累加器A的值来实现转移到不同的分支。在使用时往往与一个转移指令表一起来实现多分支转移。,下面的程序能根据累加器A的值0、1、2、3转移到相应的TAB0TA6分支去执行。 MOV DPTR,#TABLE ;表首地址送DPTR ADD A,ACC JMP A+DPTR ;根据A值转移 TABLE:AJMP TAB0 ;当(A)=0时转TAB0执行 AJMP TAB2 ;当(A)=1时转TAB2执行 AJMP TAB4 ;当(A)=2时转TAB4执行 AJMP TAB6 ;当(A)=3时转TAB6执行,条件转移指令(8条) 1)累加器A判0指令(2条),2)减1非零转移指令(2条),3)比较转移指令(4条),操作数为无符号数,条件转移类指令范例方案一,还有什么方法实现循环的终止?,将00H0FH这16个数顺序地置入片内RAM20H2FH单元中。 MOV R0,#20H MOV R7,#0FH CLR A LOOP:MOV R0,A INC A INC R0 DJNZ R7,LOOP SJMP $,地址指针,循环计数器,第一个数据,条件转移类指令范例方案二,MOV R0,#20H MOV R7,#0FH CLR A LOOP:MOV R0,A INC A INC R0 CJNE A,#0FH,LOOP SJMP $,条件转移类指令范例方案三,MOV R0,#20H MOV A,#0FH MOV 30H,#00H LOOP:MOV R0,30H INC 30H INC R0 DEC A JNZ LOOP SJMP $,地址指针,循环计数器,第一个数据,条件转移类指令范例方案四,MOV R0,#20H MOV A,#0FH MOV 30H,#00H LOOP:MOV R0,30H INC 30H INC R0 SUBB A,#01H JNC LOOP SJMP $,地址指针,循环计数器,第一个数据,调用和返回指令(8条) 1)绝对调用指令(1条),2)长调用指令(1条),3)返回指令,4)空操作,分支程序,循环程序,简单程序,查表程序,子程序,应用举例,汇编语言程序设计,简单程序结构特点: 按指令的先后顺序依次执行。 将20H单元的两个压缩BCD码拆开变成ASCII码,存入21H、22H单元。(假设20H中的BCD码为00110100),什么是BCD码? 什么是ASII码?,0011,压缩BCD码,0011,0011,0100,低四位ASII码,高四位ASII码,方法1:将BCD码除以10H,恰好是将BCD码分别移到了A、B的低4位。然后再各自与30H相或,即成为ASCII码。,方法2:利用半字节交换指令来实现。,ORG 0000H MOV A,20H MOV B,#10H DIV AB ORL B,#30H MOV 22H,B ORL A,#30H MOV 21H,A SJMP $ END,简单程序例1-方法1,源程序如下:,0011,0100,PC,PC,0011 0100,0001 0000,PC,0011,0000,0000 0100,PC,0011 0100,PC,PC,PC,0011,PC,ORG 0000H MOV R0,#20H MOV A,#30H XCHD A,R0 MOV 22H,A MOV A,R0 SWAP A ORL A , #30H MOV 21H, A SJMP $ END,简单程序例1-方法2,PC,PC,PC,PC,PC,PC,PC,PC,源程序如下:,0011,0010 0000,0011,0100,0000,0100,0011,0100,0011,0000,0011,0000,0011,PC,0011,ORG 0000H MOV A,30H ;取值 ANL A,#0FH ;取低4位 ADD A,#30H ;转换成ASCII码 MOV 32H,A ;保存结果 MOV A,30H ;取值 SWAP A ;高4位与低4位互换 ANL A,#0FH ;取低4位(原来的高4位) ADD A,#30H ;转换成ASCII码 MOV 31H,A ;保存结果 SJMP $ END,简单程序例1-方法3,双字节求补,设原码存放在R1R0中, 求补后存于R3R2,补码0原码,ORG 0000H LJMP MAIN ORG 0100H MAIN: CLR C CLR A SUBB A,R0 MOV R2,A CLR A SUBB A,R1 MOV R3,A SJMP $ END,双字节求补,设原码存放在R1R0中, 求补后存于R3R2,取反加1,ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV A,R0 CPL A ADD A,#1 MOV R2,A MOV A,R1 CPL A ADDC A,#0 MOV R3,A SJMP $ END,(1)单分支,单分支程序的基本结构:,2、分支程序,例:如图所示,设计一段程序实现功能:如果(A)中1的个数为奇数,所有的二极管发光;如果全0,则只让VD0-VD3发光;否则全灭。,ORG 0000H JB P,JISH JZ QUAN MOV P2,#00H SJMP TOend JISHU:MOV P2,#0FFH SJMP TOend QUAN:MOV P2,#0FH TOend: SJMP $ END,流程图:,源程序:,判断奇偶标志位的值,判断(A)的值是否为0,(A)有偶数个1,二极管灭,(A)有奇数个1,二极管全亮,(A)为0,VD0-VD3亮,注意:在MCS-51单片机中,实现单分支常用的指令有:JZ、JNZ、DJNZ、CJNE、JC、JNC、JB、JNB、JBC等.,虚线框代表一个单分支,(2)双分支,双分支程序的基本结构:,双分支程序设计 例:内部RAM的40H单元和50H单元各存放了一个8位无符号数,请比较这两个数的大小,比较结果用发光二极管显示(LED为低有效): 若(40H)(50H),则P1.0管脚连接的LED1发光; 若(40H)(50H),则P1.1管脚连接的LED2发光。,题意分析: 本例是典型的分支程序,根据两个无符号数的比较结果(判断条件),分别点亮相应的发光二极管。 比较两个无符号数常用的方法是将两个数相减,然后判断有否借位CY。 若CY=0,无借位,则XY; 若CY=1,有借位,则XY。程序的流程图如下图所示。,两数比较流程图,X DATA 40H ;数据地址赋值伪指令DATA Y DATA 50H ORG 0000H MOV A, X ;(X) A CLR C ;CY=0 SUBB A,Y ;带借位减法,A- (Y)-CYA JC L1 ;CY=1,转移到 L1 CLR P1.0 ;CY=0,(40H)(50H),点亮P1.0 连 接的LED1 SJMP FIN ;直接跳转到结束等待 L1: CLR P1.1 ;(40H)(50H),点亮P1.1接的LED2 FIN: SJMP $ END,(3)多分支,多分支程序的基本结构:,例:在某单片机系统中,按下一按键,键值(代表哪个键被按下)存放在内部RAM的40H单元内。设计一段程序实现功能: 如果(40H)=00H,调用子程序SUB1; 如果(40H)=01H,调用子程序SUB2; 如果(40H)=02H,调用子程序SUB3; 如果(40H)=03H,调用子程序SUB4; 如果(40H)=04H,调用子程序SUB5。,流程图,程序清单, MOV 40H,A MOV DPTR,#TAB RL A ADD A,40H JMP A+DPTR TAB: LCALL SUB1 LCALL SUB2 LCALL SUB3 LCALL SUB4 LCALL SUB5,设定表格首地址,40H3 传送给A,查表转移,转移地址表,3、循环程序,MOV R0,#10 MOV R1,#30H START:MOV A,R1 ;取数 JB ACC.7,NEG ;若为负数,转NEG JZ ZER0 ;若为零,转ZER0 ADD A,#02H ;若为正数,求X+2 AJMP SAVE ;转到SAVE,保存数据 ZER0: MOV A,# 64H ;数据为零,Y=100 AJMP SAVE ;转到SAVE,保存数据 NEG: DEC A CPL A ;求X SAVE: MOV R1,A ;保存数据 INC R1 ;地址指针指向下一个地址 DJNZ R0,START ;数据未处理 SJMP ;暂停,【例】在起始地址为M的内部数据存储器中放有100个数,其中有一个数的值等于a,试编一程序,求出这个数的地址,送N单元。若这个数不存在,则将00H送入N单元。,N EQU 08H M EQU 09H ORG 2040H START: MOV R0, #M MOV R1, #64H LOOP: CJNE R0 , #a, W SJMP WW W: INC R0 DJNZ R1,LOOP MOV N, #00H SJMP WWW WW: MOV N, R0 WWW: SJMP $,【例】在起始地址为M的内部数据存储器中放有100个数,其中有一个数的值等于a,试编一程序,求出这个数的地址,送N单元。若这个数不存在,则将00H送入N单元。,4、子程序设计,在实际问题中,常常会遇到在一个程序中多次用到相同的运算或操作,若每遇到这些运算或操作,都从头编起,将使程序繁琐、浪费内存。因此在实际中,经常把这种多次使用的程序段,按一定结构编好,存放在存储器中,当需要时,可以调用这些独立的程序段。通常将这种可以被调用的程序段称为子程序。,主要内容: (1)主程序与子程序的关系 (2)子程序嵌套 (3)子程序的调用与返回,(1)主程序与子程序的关系,主程序MAIN,主程序,LCALL SUB,调用子程序,子程序入口地址,RET,ORG 0000H MAIN: MOV A,#0FEH ;送显示初值 LP: MOV R0,#10 ;送闪烁次数 LP0: MOV P1,A ;点亮LED LCALL DELAY ;延时 MOV P1,#0FFH;熄灭灯 LCALL DELAY ;延时 DJNZ R0,LP0 RL A SJMP LP END,例:LED灯的闪烁点亮(一),(2)子程序嵌套,子程序嵌套(或称多重转子)是指在子程序执行过程中,还可以调用另一个子程序。,子程序SUB1,子程序1,主程序MAIN,程序,程序,LCALL SUB1,RET,子程序1,子程序SUB2,RET,子程序2,LCALL SUB2,(3)子程序的调用与返回,问题:子程序调用、返回到主程序中的正确位置,并接著执行主程序中的后续指令呢? 为了解决这个问题,采用了堆栈技术。,子程序SUB1,子程序1,主程序MAIN,程序,程序,RET,子程序1,子程序SUB2,RET,子程序2,2010,2013,2110,2113,2100,2200,20 13,20,13,PC,21 13,13,21,堆栈区,堆栈指针SP,堆栈,LCALL SUB1,LCALL SUB2,21,13,20,13,子程序设计注意事项,(1)要给每个子程序起一个名字,也就是入口地址的代号。 (2)要能正确地传递参数。即首先要有入口条件,说明进入子程序时,它所要处理的数据放在何处(如:是放在A中还是放在某个工作寄存器中等)。另外,要有出口条件,即处理的结果存放在何处。 (3)注意保护现场和恢复现场。在子程序使用累加器、工作寄存器等资源时,要先将其原来的内容保存起来,即保护现场。当子程序执行完毕,在返回主程序之前,要将这些内容再取出,送还到累加器、工作寄存器等原单元中,这一过程称为恢复现场。,(1)运算类子程序设计,例:假如在MCS-51单片机内部RAM中30H37H单元、 38H3FH单元分别存放有两个8字节BCD码十进制数,设计一段程序将这两个数相加,并把结果存于2FH37H单元中,小地址存数据的高字节。 分析:先清Cy位,把(37H)和(3FH)进行带Cy相加,再进行十进制调整,结果存于37H单元中;把(36H)和(3EH)进行带Cy相加,再进行十进制调整循环至结束,结果把最高字节的Cy存入2FH单元。,ORG 0000H MOV R2,#08H MOV R0,#37H MOV R1,#3FH CLR C LOP:MOV A,R0 ADDC A,R1 DA A MOV R0,A DEC R0 DEC R1 DJNZ R2,LOP CLR A RLC A MOV 2FH,A SJMP $ END,设定循环次数,R0和R1分别指向加数和被加数的首地址,相加,并回存结果,R0和R1分别指向加数和被加数的下一地址,判断循环次数,存进位标志,极值查找程序 例:在MCS-51单片机内部RAM的40H-47H单元中存有8个无符号数,设计一段程序找出其中的最大值,并存放到48H单元中。 这是一个求最大值的问题。 分析:先把(A)(40H),然后将(41H)和(A)进行比较,如果(41H)(A),则(A)(41H),然后和下一个字节进行比较,依次类推,最后(A)必定是最大值。,ORG 0000H MOV R2,#07H MOV R0,#40H MOV A,R0 LOOP:INC R0 MOV B,R0 CJNE A,B,NEX NEX: JNC NET MOV A,B NET: DJNZ R2,LOOP MOV 48H,A SJMP $ END,设定循环次数R1,R0作为数据指针,指向数据区第一个字节,取出下一个字节,存入B,如果(A)(B), 则(A)(B),次数到否,到则取出(A)48H,(2)查表程序设计,程序使用的专用指令: MOVC A, A+PC MOVC A, A+DPTR 一般情况下, 常使用后者 程序设计一般规则: 先确定表格存放的位置 在表格中填入相应的数据 查表时先将表格的首地址给DPTR,再将要查表的数据送给A,最后用 MOVC A, A+DPTR,例:假如在MCS-51单片机内部RAM中40H单元内存放的是一个角度(范围0- 90),设计一段程序,计算出200sin(),把结果存入41H单元中(结果只取整数)。 分析:先建立一个相应的数值表格,定义在程序存储器中,利用输入的值进行查表。 程序如下: ORG 0000H MOV DPTR,#TABLE MOV A,40H MOVC A,A+DPTR MOV 41H,A SJMP $ TABLE:DB 0,3,7,10,14,17,21,24,28,31,35,38 DB 41,45,48199,200,200 END,查表,表格内容,表格的数据是怎么计算出来的?,例:假如在MCS-51单片机内部RAM中40H单元内存放的是一个参数x(范围0-10),设计一段程序,计算出5x3+4x2+3x+1,把结果存入41H和42H单元中。 分析:先建立一个相应的数值表格(每个为2个字节),定义在程序存储器中,利用输入的值进行查表。 程序如下: ORG 0000H MOV DPTR,#TABLE MOV A,40H CLR C RLC A ;A*2A PUSH ACC MOVC A,A+DPTR MOV 41H,A POP ACC INC A MOVC A,A+DPTR MOV 42H,A SJMP $ TABLE: DW 0001H,000DH,003FH,00B5H,018DH DW 02D1H,04DBH,078DH,0B19H,0F9DH,1537H END,查表,得到高两位数,表格内容,查表,得到低两位数,【例】128种分支程序设计。R3转移的目的地址序号007FH。,(3)散转子程序设计,【例】256种分支程序设计。R3转移的目的地址序号00FFH。,MOV A , R3 MOV DPTR , #TAB CLR C RLC A JNC LOW128 INC DPH LOW128: MOV B , A INC A MOVC A , A+DPTR ;取低8位地址 PUSH ACC ;分支首址低8位进栈 MOV A , B MOVC A , A+DPTR PUSH ACC ;分支首址高8位进栈 RET TAB: DW ROUT00,查表程序,表格是事先存放在ROM中的,一般为一串有序的常数,例如平方表、字型码表等。 表格可通过伪指令DB来确定。 通过查表指令 MOVC A,A+DPTR MOVC A,A+PC 来实现。,在LED显示和键盘处理程序中将会用到。,例 用查表法计算平方(一) ORG 0000H MOV DPTR,#TAB ;表首地址送DPTR MOV A,#05 ;被查数字05A MOVC A,A+DPTR ;查表求平方 SJMP $ TAB:DB 0,1,4,9,16,25,36,49,64,81 END,例 用查表法计算平方(二) ORG 0000H 0000H MOV A,#05 ;05 A 0002H ADD A,#02 ;修正累加器A 0004H MOVC A,A+PC ;查表求平方 0005H SJMP $ ;2字节 0007H: DB 0,1,4,9,16,25,36,49,64,81 END,执行MOVC A,APC指令时,PC指向SJMP $指令,与表首地址相差2字节,数码管,a,b,c,d,e,f,g,dp,MSB,LSB,一位十六进制数转换8段式数码管显示码,由于数与显示码没有规律,不能通过运算得到,只能通过查表方式得到。,一位十六进制数转换8段式数码管显示码,设数放在R2中,查得的显示码也放于R2中,用MOVC A,A+DPTR查表。,显示码表 TAB: DB 3FH,06H,5BH,4FH DB 66H,6DH,7DH,07H DB 7FH,67H,77H,7CH DB 39H,5EH,79H,71H,ORG 0200H CONVERT:MOV DPTR,#TAB ;DPTR指向表首址 MOV A,R2 ;转换的数放于 MOVC A,A+DPTR ;查表指令转换 MOV R2,A RET TAB: DB 3FH,06H,5BH,4FH DB 66H,6DH,7DH,07H DB 7FH,67H,77H,7CH DB 39H,5EH,79H,71H,在这个例子中,编码是一个字节,只通过一次查表指令就可实现转换,如编码是两个字节,则需要用两次查表指令才能查得编码,第一次取得低位,第二次取得高位。,(4)滤波子程序,工业控制对象的工作环境一般比较差,干扰源较多,一般计算机控制系统的模拟输入信号中,均含有各种干扰成分。它们来自被测信号源本身、传感器和外界等。 消除和抑制干扰的方法很多,对于随机干扰信号,因为不是周期信号,很难用模拟滤波器取得满意的效果,这时,可以用数字滤波的方法予以削弱或滤除。 数字滤波器实际上是一种程序滤波或软件滤波,常用的方法有中值滤波、算术平均滤波、加权平均滤波和惯性滤波等。,【例】编程实现防脉冲干扰平均值滤波。,方法一: 1.求最大值 2.求最小值 3.求所有采样值的和 4.去掉最大值和最小值 5.求平均值,方法二:,【例】设计一报警处理程序。只有采样值连续3次异常时,系统才进行报警处理。,CHECK: CLR C ;清进位标志位 MOV A , Amax ;读上限报警值 SUBB A , SAMP ;判断是否超过上限报警值 JC ABNORMAL ;超过上限,转ABNORMAL MOV A , Amin ;读下限报警值 SUBB A , SAMP ;判断是否超过下限报警值 JNC ABNORMAL ;超过下限,转ABNORMAL CLR FLAG ;采样正常,清采样异常标志位 AJMP RETU,ABNORMAL: JB FLAG , ABNOR_L;上次采样异常,转ABNOR_L MOV NUM , #02H ;上次采样正常,重置允许连续异常次数 SETB FLAG ;置位采样异常标志位 AJMP RETU ABNOR_L : DEC NUM ;允许采样异常次数减1 MOV A , NUM ;读允许连续采样异常次数 JZ ALARM ;允许采样异常次数=0,执行报警处理程序 SETB FLAG ;置位采样异常标志位 AJMP RETU ALARM: . ;报警处理程序 . RETU: RET,(5)定时子程序设计,单重循环延时 例:假设单片机的fosc=12MHz,计算单片机执行下面程序消耗的时间。 DELAY: MOV R5,#TIME ;1机器周期 MM: NOP ;1机器周期 DJNZ R5,MM ;2机器周期 RET ;2机器周期 执行完以上4条语句,所花时间: T=(1+(1+2)TIME)+2 1s 推广计算式: T(机器周期数)=(循环体机器周期数) 循环次数+初始化机器周期数,多重循环延时 例:假设单片机的fosc=12MHz,计算单片机执行下面程序消耗的时间。 DELAY2: MOV R3,#TIME1 ;1机器周期 LOOP1: MOV R2,#TIME2 ;1机器周期 LOOP2: NOP ;1机器周期 DJNZ R2,LOOP2 ;2机器周期 DJNZ R3,LOOP1 ;2机器周期 RET ;2机器周期 执行完以上6条语句,所花时间: T=(1+(1+(1+2)TIME2+2)TIME1 +2) 1s,循环程序设计,延时程序中延时时间的设定:,源程序: 指令周期 DELAY: MOV R3, #( X )H 2个T机器 DEL2: MOV R4,#( Y )H 2个T机器 DEL1: NOP 1个T机器 NOP 1个T机器 DJNZ R4,DEL1 2 个T机器 DJNZ R3,DEL2 2个T机器 RET,指令周期、机器周期T机器与时钟周期T时钟的关系: T机器=12T时钟=121/fosc=1s (假设晶振频率fosc为12M),延时时间的简化计算结果: (1+1+2) X Y,延时时间怎样计算?,若想延时100ms,只需修改计数初始值,即 (1+1+2) 125200s=100ms,多字节无符号数加法,设从片内RAM30H单元和40H单元有两个16字节数,把它们相加,结果放于30H单元开始的位置处(设结果不溢出)。,用R0作指针指向30H单元,用R1作指针指向40H单元,(R0),(R1),用R2为循环变量,初值为16,在循环体中作16次带进位加,加得的结果放回R0指向的单元,每次修改改变R0、R1指针位置,在第一次循环前应先将CY清零。,程序: ORG 1000H MOV R0,#30H MOV R1,#40H MOV R2,#16 CLR C LOOP: MOV A,R0 ADDC A,R1 MOV R0,A INC R0 INC R1 DJNZ R2,LOOP END,例2:有两组BCD码分别存放在23H、22H单元和33H、32H单元,求它们的和并送入43H、42H单元中去。(高位在前,低位在后),分析:,0011,1000,0110,0101,0001,0001,1000,0111,BCD码83H,BCD码11H,BCD码78H,BCD码56H,例2:有两 组BCD码(如:1183H和5678H),分别存放在23H、22H单元和33H、32H单元,求它们的和,并送入43H、42H单元中去。(高位在前,低位在后) 解:,MOV A,22H ADD A,32H DA A MOV 42H,A MOV A,23H ADDC A,33H DA A MOV 43H,A SJMP $,ORG 0000H MOV A,22H ADD A,32H DA A MOV 42H,A MOV A,23H ADDC A,33H DA A MOV 43H,A SJMP $ END,此条加法指令可否改用带进位的(ADDC)?,ORG 2000H CLR C MOV A,22H ADD A,32H DA A MOV 42H,A MOV A,23H ADDC A,33H DA A MOV 43H,A SJMP $ END,1000 0011,0101 0110,0001 0001,0111 1000,1000 0011,0111 1000,1111 1011,0110 0001,0001 0001,0101 0110,0110 0111,0110 1000,PC,PC,PC,PC,PC,PC,PC,PC,PC,1111 1011,0110 0001,PC,0110 1000,PC,0110 0111,0101 0110,0111 1000,0001 0001,1000 0011,分支程序设计,结构特点:不一定按指令的先后顺序依次运行程序,程序的流向有两个或两个以上分支,根据指定条件选择程序的流向。 如:,1.分支程序有三种基本形式,即单分支、双分支、多分支。 2.分支程序的设计要点如下: (1)先建立可供条件转移指令测试的条件。 (2)选用合适的条件转移指令。 (3)在转移的目的地址处设定标号。,【例】 设X存在30H单元中,根据下式 X+2 X0 Y = 100 X=0 求出Y值, 将Y值存入31H单元。 X X0 分析:根据数据的符号位判别该数的正负,若最高位为0,再判别该数是否为0。,分支程序的典型实例,ORG 1000H MOV A,30H ;取数 JB ACC7,NEG ;负数,转NEG JZ ZER0 ;为零,转ZER0 ADD A,#02H ;为正数,求X+2 AJMP SAVE ;转到SAVE,保存数据 ZER0:MOV A,# 64H ;数据为零,Y=100 AJMP SAVE ;转到SAVE,保存数据 NEG: DEC A CPL A ;求X SAVE: MOV 31H,A ;保存数据 SJMP ,设内部RAM20H单元和30H 单元中分别存放了两个8位的无符号数 X、Y, 若XY 则让P1.0管脚连接的LED亮;若XY 则让P1.1管脚连接的LED亮。,方法1:两个数据做减法SUBB,可根据借位CY来判断两个数的大小!,方法2:两个数据做比较CJNE,再根据是否相等和借位CY来判断两个数的大小!,分支程序实例-数据比较大小,方法1编程:,X DATE 20H Y DATE 30H ORG 0000H MOV A,X CLR C SUBB A,Y JC L1 ;XY CLR P1.0 SJMP FINISH L1: CLR P1.1 FINISH: SJMP $ END,X DATE 20H Y DATE 30H ORG 0000H MOV A,X CJNE A,Y,L0 L0:JC L1 ;XY CLR P1.0 SJMP FINISH L1: CLR P1.1 FINISH: SJMP $ END,方法2编程:,分支程序实例-数据比较大小,两个有符号数的比较。,问题1:如何表示有符号数?,问题2:有符号数怎样比较大小?,1.先判断符号位,负数小;正数大. 2.符号相同,则用减法判断是否有借位.,比较20H和30H单元两个有符号数的大小,结果按下述规律显示。 (20H)=(30H),P1.0点亮; (20H)(30H),P1.1点亮; (20H)(30H),P1.2点亮;,例,散转程序,散转程序是指通过修改某个参数后,程序可以有三个以上的流向,多用于键盘程序。 常用的指令是JMP A+DPTR,该指令是把16位数据指针DPTR的内容与累加器A中的8位无符号数相加,形成地址,装入程序计数器PC,形成散转的目的地址。,DPTR,+,A,PC,A中内容为8位无符号数,16位地址数,;跳转表首送数据指针,例: 根据R7的内容,转向各自对应的操作程序 (R7= 0,转入OPR0;R7= 1,转入OPR1R7= n,转入OPRn),MAIN: MOV DPTR,#JPTAB MOV A,R7 ADD A,R7 JNC NOAD INC DPH NOAD: JMP A+DPTR JPTAB: AJMP OPR0 AJMP OPR1 AJMP OPR2 OPR0: MOV 40H,#1 SJMP FINISH OPR1: MOV 40H,#2 SJMP FINISH OPR2: MOV 40H,#3 FINISH: SJMP $,;R72A (修正变址值),;判有否进位,;有进位则加到高字节地址,;转向形成的散转地址人口,;直接转移地址表,ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV A,R3 MOV DPTR,#PRGTBL MOVC A,A+DPTR JMP A+DPTR PRGTBL: DB PRG0-PRGTBL DB PRG1-PRGTBL DB PRG2-PRGTBL DB PRG3-PRGTBL PRG0:,散转程序,入口条件:(R3),四个程序段: 从内部RAM 256B读数 从外部RAM 256B读数 从外部RAM 64K读数 从外部RAM 4K读数,ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV A,R3 ;1 MOV DPTR,#PRGTBL ;3 MOVC A,A+DPTR ;1 JMP A+DPTR ;1 PRGTBL: DB PRG0-PRGTBL ;DB 4 DB PRG1-PRGTBL DB PRG2-PRGTBL DB PRG3-PRGTBL PRG0:,0100 0106 010A,(A)=4,(DPTR)=0x0106,PRG0: MOV A,R0 SJMP PRGE PRG1: MOV P2,R1 MOVX A,R0 SJMP PRGE PRG2: MOV DPL,R0 MOV DPH,R1 MOVX A,DPTR SJMP PRGE PRG3: MOV A,R1 ANL A,#0FH ANL P2,#11110000B ORL P2,A MOVX A,R0 PRGE: SJMP $,;内部RAM读数 ;外部RAM 256B读数 ;外部RAM 64K读数 ;R1存放高4位地址 ;屏蔽高4位 ;P2口高4位可作通用I/O口 ;只送12位地址 ; R0存放低8位地址从外部RAM读数,循环程序设计,例:编程实现P1口连接的8个LED显示方式如下:从P1.0到P1.7的顺序,依次点亮其连接的LED。,子程序,ORG 0000H START: MOV R2,#08H ;设置循环次数 MOV A,#11111110B ;送显示模式字 NEXT: MOV P1,A ;点亮二极管 ACALL DELAY RL A ;左移一位,改变显示模式字 DJNZ R2,NEXT ;循环次数减1,不为零,继续点亮 SJMP START ;下面一个二极管 DELAY: MOV R3,#0FFH ;延时子程序开始 DEL2: MOV R4,#0FFH DEL1: NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET END,A.0,A.7,数据传送程序,例:不同存储区域之间的数据传输: 将内部RAM30H单元开始的内容传送到外部RAM0100H单元开始的区域,直到遇到传送的内容是0为止。,地址指针R0赋初值,(R0)A,A(DPTR), 地址指针增1,地址指针DPTR赋初值,A = 0,N,Y,开始,结束,程序1:所有发光二极管不停地闪动。 ORG 0000H ;程序从地址0000H开始存放 START: MOV P1,#00H ;把立即数00H送P1口,点亮所有发光二极管 ACALL DELAY ;调用延时子程序 MOV P1,#0FFH ;灭掉所有发光二极管 ACALL DELAY ;调用延时子程序 AJMP START ;重复闪动 DELAY: MOV R3,#7FH ;延时子程序 DEL2: MOV R4,#0FFH DEL1: NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET END ;汇编程序结束,信号灯的控制,程序1流程图,程序2:用开关控制发光二极管的显示方式。 ORG 0000H MOV P3,#00010000B ;使P3口锁存器的P3.4置位 MOV A,P3 ;读P3口引脚线信号 ANL A,#00010000B ;“逻辑与”操作,屏蔽掉无关位 JZ DDPING ;判断P3.4是否接地,若是,跳转到DDPING执行 MOV P1,#00H ;否则,P3.4接高电平,点亮所有发光二极管 SJMP $ DDPING:MOV P1,#55H ;P3.4接地,发光二极管交叉亮灭 SJMP $ END,A=0,A0,程序2流程图,程序3:使8个发光二极管顺序点亮。 ORG 0000H START: MOV R2,#08H ;设置循环次数 MOV A,#0FEH ;送显示模式字 NEXT: MOV P1,A ;点亮连接P1.0的发光二极管 ACALL DELAY RL A ;左移一位,改变显示模式字 DJNZ R2,NEXT ;循环次数减1,不为零,继续点亮下面一个二极管 SJMP START DELAY: MOV R3,#0FFH ;延时子程序开始 DEL2: MOV R4,#0FFH DEL1: NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET END,R4-10,R4-1=0,R3-10,R3-1=0,R2-10,R3-1=0,程序3流程图,八路彩灯控制程序,要求: (1)D1D8八个彩灯按规定顺序依次点亮(间隔1秒),最后全亮; (2)按规定顺序依次熄灭(间隔1秒),最后全灭; (3)八个灯同时点亮,保持1秒; (4)八个灯同时熄灭,保持0.5秒; 再将第3、4步重复4遍,最后整个程序再重复N遍。,参考程序(一),ORG 0000H LJMP MAIN ORG 0100H MAIN:MOV R7,#7 LOOP: MOV R6,#16 MOV R5,#4 MOV DPTR,#TABL MOV R4,#0 LOOP1:MOV A,R4 MOVC A,A+DPTR MOV P1,A INC R4 LCALL DELAY LCALL DELAY DJNZ R6,LOOP1 LOOP2: MOV P1,#0FFH LCALL DELAY LCALL DELAY MOV P1,#00H LCALL DELAY DJNZ R5,LOOP2 DJNZ R7,LOOP SJMP $ END,子程序的调用与返回,问题:子程序调用、返回到主程序中的正确位

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论