《(48)--3.4.7汇编程序综合设计举例1-2.ppt》由会员分享,可在线阅读,更多相关《(48)--3.4.7汇编程序综合设计举例1-2.ppt(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第3章 MCS-51 单片机的指令系统3.4.73.4.7汇编语言汇编语言综合设计举例综合设计举例本节将综合各种编程方法,通过一些应用实例的说明和分析,使读者进一步熟悉MCS-51单片机的汇编语言编程方法和技巧(1 1)数据传送类程序设计)数据传送类程序设计在单片机系统中,由于数据、程序都保存在CPU外部的存储器中,而程序的执行和数据的处理都是由CPU来完成的,因此数据(包括指令的读取)传送类操作是计算机最常见、最频繁的一类操作。MCS-51单片机同样如此,单片机系统内的数据传输主要是内部数据存储器(即内部RAM)、外部数据存储器(外部RAM)以及程序存储器之间的数据传输。单片机的I/O口从编
2、址上看属于内部RAM,因此,对于I/O口的操作也是属于存储器间数据传输的范畴。由此可见,掌握单片机的存储器之间数据传输指令以及编程对于学习应用单片机的重要性。3.4.73.4.7汇编语言汇编语言综合设计举例综合设计举例【例】编写程序,首先将片外RAM地址从0000H22FFH单元的内容初始化为0FFH,然后将片内30H60H单元中数据搬迁到片外RAM中的1000H1030H单元中,并将源数据区清零。0000H.0001H0002H0FFH0FFH0FFH22FFH0FFH30H31H32H60H1000H1001H1002H1030H.data2data3datandata1.data2dat
3、a3datandata1片外RAM片内RAM片外RAM22FFH+1个2300H个8960个DJNZ指令最大循环256次8960256=35D=23H3.4.73.4.7汇编语言汇编语言综合设计举例综合设计举例【例】编写程序,首先将片外RAM地址从0000H22FFH单元的内容初始化为0FFH,然后将片内30H60H单元中数据搬迁到片外RAM中的1000H1030H单元中,并将源数据区清零。0000H.0001H0002H0FFH0FFH0FFH22FFH0FFH30H31H32H60H1000H1001H1002H1030H.data2data3datandata1.data2data3da
4、tandata1片外RAM片内RAM片外RAM22FFH+1个2300H个8960个DJNZ指令最大循环256次8960256=35D=23H3.4.73.4.7汇编语言汇编语言综合设计举例综合设计举例【例3-52】编写程序,首先将片外RAM地址从0000H22FFH单元的内容初始化为0FFH,然后将片内30H60H单元中数据搬迁到片外RAM中的1000H1030H单元中,并将源数据区清零。0000H.0001H0002H0FFH0FFH0FFH22FFH0FFH片外RAM22FFH+1个2300H个8960个DJNZ指令最大循环256(00FF)次8960256=35D=23HORG0000
5、HSJMPMain;主程序ORG0030HMain:MOVSP,#6FH;设置堆栈地址;初始化外部RAMMOVDPTR,#0000H;设置数据地址指针MOVA,#0FFH;设置数据变量MOV R7,#23H;设置外循环计数次数23H次LpEx0:MOV R6,#0;设置内循环计数次数256次LpIn0:MOVX DPTR,A;初始化为0FFHINCDPTR;修改地址指针DJNZR6,LpIn0;内循环判断DJNZR7,LpEx0;外循环判断DPTRDPTR3.4.73.4.7汇编语言汇编语言综合设计举例综合设计举例【例】编写程序,首先将片外RAM地址从0000H22FFH单元的内容初始化为0F
6、FH,然后将片内30H60H单元中数据搬迁到片外RAM中的1000H1030H单元中,并将源数据区清零。30H31H32H60H1000H1001H1002H1030H.data2data3datandata1.data2data3datandata1片内RAM片外RAMMOV R7,#31H;设置循环计数次数31H次MOVDPTR,#1000H;设置目的数据区起始地址指针MOVR0,#30H;设置源数据区起始地址指针LpExD:MOVA,R0;读取源数据区数据MOVX DPTR,A;写入目的数据区CLRAMOVR0,A;源数据区数据被清零INCR0INCDPTRDJNZR7,LpExDSJM
7、P$;程序停止向下运行END;程序汇编结束DPTRR0DPTRR0A00H00H00H00Hdata100H3.4.73.4.7汇编语言汇编语言综合设计举例综合设计举例【例】编写程序,首先将片外RAM地址从0000H22FFH单元的内容初始化为0FFH,然后将片内30H60H单元中数据搬迁到片外RAM中的1000H1030H单元中,并将源数据区清零。30H31H32H60H1000H1001H1002H1030H.data2data3datandata1.data2data3datandata1片内RAM片外RAMMOV R7,#31H;设置循环计数次数31H次MOVDPTR,#1000H;设
8、置目的数据区起始地址指针MOVR0,#30H;设置源数据区起始地址指针LpExD:MOVA,R0;读取源数据区数据MOVX DPTR,A;写入目的数据区CLRAMOVR0,A;源数据区数据被清零INCR0INCDPTRDJNZR7,LpExDSJMP$;程序停止向下运行END;程序汇编结束DPTRR0DPTRR0A00H00H00H00Hdata100H分段处分段处(2 2)数据运算处理类程序设计)数据运算处理类程序设计【例】在多个单字节无符号数中查找最大数。设内部RAM从60H开始的单元中存放着8个无符号数,请找出最大数,并将其保存到片内30H单元中。3.4.73.4.7汇编语言汇编语言综合
9、设计举例综合设计举例60H61H62H67H.data2data3data8data1片外RAM;用伪指令定义符号常量,使程序更有可读性和通用性Buf1EQU60HNEQU7ORG0000H;ORG伪指令SJMPMain;主程序ORG0030H;用户程序从0030H单元开始存放Main:MOVSP,#6FH;设置堆栈地址;初始化部分MOV R0,#Buf1;设置数据地址指针MOV R2,#N;设置字节数LCALLGetMAX;调用求最大数子程序MOV30H,A;结果保存SJMP$;程序停止向下运行Buf1R0N=7R260H61H62H67H.data2data3data8data1片外RAM
10、;用伪指令定义符号常量,使程序更有可读性和通用性Buf1EQU60HNEQU7ORG0000H;ORG伪指令SJMPMain;主程序ORG0030H;用户程序从0030H单元开始存放Main:MOVSP,#6FH;设置堆栈地址;初始化部分MOV R0,#Buf1;设置数据地址指针MOV R2,#N;设置字节数LCALLGetMAX;调用求最大数子程序MOV30H,A;结果保存SJMP$;程序停止向下运行Buf1R0N=7R2(2 2)数据运算处理类程序设计)数据运算处理类程序设计【例】在多个单字节无符号数中查找最大数。设内部RAM从60H开始的单元中存放着8个无符号数,请找出最大数,并将其保存
11、到片内30H单元中。3.4.73.4.7汇编语言汇编语言综合设计举例综合设计举例60H61H62H67H.data2data3data8data1片外RAMBuf1R0N=7R2;子程序;子程序名:GetMAX;子程序功能:查找无符号数最大值子程序;子程序入口:(R0)=处理前的数据块首地址;;(R2)=数据块长度(数据字节数);子程序出口:(A)=处理后的结果(返回给主程序)(2 2)数据运算处理类程序设计)数据运算处理类程序设计【例】在多个单字节无符号数中查找最大数。设内部RAM从60H开始的单元中存放着8个无符号数,请找出最大数,并将其保存到片内30H单元中。3.4.73.4.7汇编语言
12、汇编语言综合设计举例综合设计举例60H61H62H67H.data2data3data8data1片外RAMBuf1R0N=8R2 GetMAX:CLRC MAX:MOVA,R0;第1个数据送R3MOVR3,AINCR0;指向下一个数MOVA,R0;取向下一个数SUBBA,R3;后一位数据减前一位数JNCLop;后无借位,后一位数大,则不交换MOVA,R3;否则,交换数据XCHA,R0;大数下沉(地址越来越大)DECR0XCHA,R0;小数则上浮(地址越来越小)INCR0SJMP Lop1 Lop:ADD A,R3 Lop1:DJNZR2,MAX;继续比较RET;子程序返回AR3R0data1
13、A减去C=0C=1data1data2data1data2data260H61H62H67H.data2data3data8data1片外RAMBuf1R0N=8R2AR3R0data1A减去C=0C=1data1data2data1data2data2 GetMAX:CLRC MAX:MOVA,R0;第1个数据送R3MOVR3,AINCR0;指向下一个数MOVA,R0;取向下一个数SUBBA,R3;后一位数据减前一位数JNCLop;后无借位,后一位数大,则不交换MOVA,R3;否则,交换数据XCHA,R0;大数下沉(地址越来越大)DECR0XCHA,R0;小数则上浮(地址越来越小)INCR0
14、SJMP Lop1 Lop:ADD A,R3 Lop1:DJNZR2,MAX;继续比较RET;子程序返回(3 3)I/OI/O口操作类程序设计口操作类程序设计【例】请编程实现下移跑马灯程序。即每个LED灯点亮0.2S后熄灭,然后相邻的灯再点亮0.2s后熄灭,方向自上而下。发光二极管控制电路如图所示,当P1.0输出为高电平即逻辑“1”时,LED1熄灭,否则,输出为低电平时即逻辑“0”,LED1点亮。3.4.73.4.7汇编语言汇编语言综合设计举例综合设计举例ORG0000H SJMPMain ORG0030H Main:MOV SP,#6FH MOV P1,#0FEH;设置LED灯的初始状态,L
15、ED1亮LpLED:LCALLDL200ms ;调用延时0.2s的子程序,令灯亮0.2sMOV A,P1 ;点读取P1的状态值RLA;循环左移MOV P1,A;左移后的值写回P1口SJMPLpLED;重复上述过程。1111 1110P11111 1101(3 3)I/OI/O口操作类程序设计口操作类程序设计【例】请编程实现下移跑马灯程序。即每个LED灯点亮0.2S后熄灭,然后相邻的灯再点亮0.2s后熄灭,方向自上而下。发光二极管控制电路如图所示,当P1.0输出为高电平即逻辑“1”时,LED1熄灭,否则,输出为低电平时即逻辑“0”,LED1点亮。3.4.73.4.7汇编语言汇编语言综合设计举例综
16、合设计举例;子程序名:DL200ms;子程序功能:实现延时200ms的子程序;子程序入口:无;子程序出口:无 DL200ms:MOV R6,#200;外循环,实现延时200ms,即0.2s;内循环,实现延时1ms的程序,选用R7作为循环计数器DL1ms:MOV R7,#200;为R7赋值指令,指令周期:1个机器周期DL5us:NOP;空操作,指令周期:1个机器周期NOP;空操作,指令周期:1个机器周期NOP;空操作,指令周期:1个机器周期DJNZR7,DL5us;DJNZ指令,指令周期:2个机器周期DJNZR6,DL1ms;外循环判断控制RET;子程序返回(3 3)I/OI/O口操作类程序设计
17、口操作类程序设计【例】请编程实现由外到里的双向跑马灯程序。即每个LED灯点亮0.3S后熄灭,然后相邻的灯再点亮0.3s后熄灭,方向自外而里。发光二极管控制电路如图所示,当P1.0输出为高电平即逻辑“1”时,LED1熄灭,否则,输出为低电平时即逻辑“0”,LED1点亮。3.4.73.4.7汇编语言汇编语言综合设计举例综合设计举例7EH 0111 11100BDH 1011 11010DBH 1101 10110DBH 1110 0111ORG0000HSJMPMainORG0030HMain:MOVSP,#6FH;设置堆栈地址LpLED:MOVP1,#7EH;点亮最外侧LED灯,即LED1和LE
18、D8亮LCALLDL300ms;调用延时0.3s的子程序,令灯亮0.3sMOV P1,#0BDH;点亮LED2和LED7LCALLDL300ms;调用延时0.3s的子程序,令灯亮0.3sMOV P1,#0DBH;点亮LED3和LED6LCALLDL300ms;调用延时0.3s的子程序,令灯亮0.3sMOV P1,#0E7H;点亮LED4和LED5LCALLDL300ms;调用延时0.3s的子程序,令灯亮0.3sSJMPLpLED;重复上述过程;子程序名:DL200ms;子程序功能:实现延时200ms的子程序;子程序入口:无;子程序出口:无 DL200ms:MOV R6,#200;外循环,实现延
19、时200ms,即0.2s;内循环,实现延时1ms的程序,选用R7作为循环计数器DL1ms:MOV R7,#200;为R7赋值指令,指令周期:1个机器周期DL5us:NOP;空操作,指令周期:1个机器周期NOP;空操作,指令周期:1个机器周期NOP;空操作,指令周期:1个机器周期DJNZR7,DL5us;DJNZ指令,指令周期:2个机器周期DJNZR6,DL1ms;外循环判断控制RET;子程序返回(3 3)I/OI/O口操作类程序设计口操作类程序设计【例】请编程实现由外到里的双向跑马灯程序。即每个LED灯点亮0.3S后熄灭,然后相邻的灯再点亮0.3s后熄灭,方向自外而里。发光二极管控制电路如图所示,当P1.0输出为高电平即逻辑“1”时,LED1熄灭,否则,输出为低电平时即逻辑“0”,LED1点亮。3.4.73.4.7汇编语言汇编语言综合设计举例综合设计举例7EH 0111 11100BDH 1011 11010DBH 1101 10110E7H 1110 01117EH 0111 11100BDH 1011 11010DBH 1101 10110E7H 1110 0111