第四章单片机的程序设计.ppt
《第四章单片机的程序设计.ppt》由会员分享,可在线阅读,更多相关《第四章单片机的程序设计.ppt(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第四章单片机的程序设计现在学习的是第1页,共25页第第04章:章:MCS51单片机的程序设计单片机的程序设计主要内容:l汇编语句格式与伪指令l简单程序与分支程序举例与分析l循环程序举例与分析l子程序举例(查表)lC51初步(程序段例示)现在学习的是第2页,共25页3、常用的典型子程序(掌握,能记能背!)l顺序(直线)程序l分支程序l循环程序(单循环、多循环)l散转l子程序与参数传递l查表程序l数制转换l数学运算程序现在学习的是第3页,共25页4)散转程序设计散转程序设计 散散转转程程序序是是分分支支程程序序的的一一种种,它它可可根根据据运运算算结结果果或或输输入入数数据据将将程程序序转转入入不
2、同的分支。不同的分支。MCS MCS-51 51 指指令令系系统统中中有有一一条条跳跳转转指指令令JMP JMP A+DPTRA+DPTR,用用它它可可以以很很容容易易地地实实现现散散转转功功能能。该该指指令令把把累累加加器器的的8 8 位位无无符符号号数数与与 16 16 位位数数据据指指针针的的内内容容相相加加,并并把把相相加加的的结结果装入程序计数器果装入程序计数器PC,PC,控制程序转向目标地址去执行。控制程序转向目标地址去执行。此此指指令令的的特特点点在在于于,转转移移的的目目标标地地址址不不是是在在编编程程或或汇汇编编时时预预先先确确定定的的,而而是是在在程程序序运运行行过过程程中
3、中动动态态地地确确定定的的。目目标标地地址址是是以以数数据据指指针针 DPTRDPTR的的内内容容为为起起始始的的 256 256 字字节节范范围围内内的的指指定定地地址址,即即由由 DPTRDPTR的的内内容容决决定定分分支支转转移移程程序序的的首首地地址址,由由累累加加器器A A的内容来动态选择其中的某一个分支转移程序。的内容来动态选择其中的某一个分支转移程序。现在学习的是第4页,共25页例例8(8(同例同例3)3):根据工作寄存器根据工作寄存器R0 内容的不同内容的不同,使程序转入相应的分支:使程序转入相应的分支:(R0)=0 对应的分支程序标号为对应的分支程序标号为PR0;(R0)=1
4、 对应的分支程序标号为对应的分支程序标号为PR1;.(R0)=N 对应的分支程序标号为对应的分支程序标号为PRN。程序如下程序如下:LP0:LP0:MOV DPTR,MOV DPTR,TAB ;TAB ;取表头地址取表头地址 MOV A,R0 MOV A,R0 ADD A,R0 ;R0 ADD A,R0 ;R0内容乘以内容乘以2 2 JNC LP1 ;JNC LP1 ;无进位转移无进位转移 (可能可能R0=128)R0=128)INC DPH ;INC DPH ;加进位位加进位位LP1:LP1:JMP A+DPTR;JMP A+DPTR;跳至散转表中相应位置跳至散转表中相应位置TAB:AJMP
5、 PR0TAB:AJMP PR0 AJMP PR1 AJMP PR1 .AJMP PRN AJMP PRN 现在学习的是第5页,共25页 本本例例程程序序仅仅适适用用于于散散转转表表首首地地址址TAB和和处处理理程程序序入入口口地地址址 PR0,PR1,PRN在在同同一一个个 2 KB范范围围的的存存储储区区内内的的情情形形。若若超超出出 2 KB范范围围可可在在分分支支程程序序入入口口处处安安排一条长跳转指令排一条长跳转指令,可采用如下程序可采用如下程序:MOV DPTR,TABMOV A,R0 MOV B,03H ;长跳转指令占长跳转指令占 3 个字节个字节MUL ABXCH A,B;成绩
6、的高成绩的高8位送入位送入A中中 ADD A,DPH;对分支转移参数高位进行处理,把它对分支转移参数高位进行处理,把它加到加到DPH中去中去MOV DPH,A;修正修正DPTRXCH A,BJMP A+DPTR;跳至散转表中相应的位置跳至散转表中相应的位置TAB:LJMP PR0;TAB:LJMP PR0;跳至不同的分支跳至不同的分支 LJMP PR1LJMP PR1 LJMP PRN LJMP PRN 现在学习的是第6页,共25页5)5)子程序和参数传递子程序和参数传递 什么是子程序?什么是子程序?通通常常把把一一些些基基本本操操作作功功能能编编制制为为程程序序段段作作为为独独立立的的子子程
7、程序序,以以供供不不同同程程序序或或同同一一程程序序反反复复调调用用。在在程程序序中中需需要要执执行行这这种种操操作作的的地地方方放放置置一一条条调调用用指指令令,当当程程序序执执行行到到调调用用指指令令,就就转转到到子子程程序序中中完完成成规规定定的的操操作作,并返回到原来的程序继续执行下去。并返回到原来的程序继续执行下去。现在学习的是第7页,共25页子程序是如何调用的?子程序是如何调用的?调调用用子子程程序序的的指指令令有有“ACALLACALL”和和“LCALLLCALL”,执执行行调调用用指指令令时时,先先将将程程序序地地址址指指针针PCPC改改变变(“ACALLACALL”加加2,2
8、,“LCALLLCALL”加加3 3),然然后后 PCPC值值压压入入堆堆栈栈,用用新新的的地地址址值代替。执行返回指令时值代替。执行返回指令时,再将再将 PCPC值弹出。值弹出。子子程程序序调调用用中中,主主程程序序应应先先把把有有关关的的参参数数存存入入约约定定的的位位置置,子子程程序序在在执执行行时时,可可以以从从约约定定的的位位置置取取得得参参数数,当当子子程程序序执执行行完完,将将得得到到的的结结果果再再存存入入约约定定的的位位置置,返返回回主主程程序序后后,主主程程序序可可以以从从这这些些约约定定的的位位置置上上取取得得需要的结果需要的结果,这就是这就是参数的传递。参数的传递。现在
9、学习的是第8页,共25页 子程序编程与调用子程序编程与调用 例例9:试编写多字节加法子程序试编写多字节加法子程序 分析:设这两个多字节数分别存放在起始地址为分析:设这两个多字节数分别存放在起始地址为FIRST和和SECOND的连续区域中(从低位字节开始的连续区域中(从低位字节开始存放),两个数的字节数存放在存放),两个数的字节数存放在NUMBER单元中,最后求得的和存放在单元中,最后求得的和存放在FIRST开始的区域中。现采用开始的区域中。现采用单字节加法指令进行多字节的加法运算,因此可用循环程序来实现。单字节加法指令进行多字节的加法运算,因此可用循环程序来实现。编写子程序,供其它程序调用编写
10、子程序,供其它程序调用:FIRST EQU 08H SECOND EQU 30H NUMBER EQU 70H ORG 3000HAABB:MOV R0,#FIRST ;置起始地址置起始地址 MOV R1,#SECOND MOV R2,NUMBER;置计数初值置计数初值 CLR C LOOP:MOV A,R0 ADDC A,R1 ;进行一次加法运算进行一次加法运算 MOV R0,A ;存放结果存放结果 INC R0 ;修改地址指针修改地址指针 INC R1 DJNZ R2,LOOP ;计数及循环控制计数及循环控制 RET ;子程序返回子程序返回 END 这里使用了存储区域这里使用了存储区域FI
11、RST 和和SECOND以及存储单元以及存储单元NUMBER作为数据、结果交接区。作为数据、结果交接区。现在学习的是第9页,共25页 子程序编程与调用子程序编程与调用 例例9:试编写多字节加法子程序试编写多字节加法子程序 分析:设这两个多字节数分别存放在起始地址为分析:设这两个多字节数分别存放在起始地址为FIRST和和SECOND的连续区域中(从低位字节开始存的连续区域中(从低位字节开始存放),两个数的字节数存放在放),两个数的字节数存放在NUMBER单元中,最后求得的和存放在单元中,最后求得的和存放在FIRST开始的区域中。现采用开始的区域中。现采用单字节加法指令进行多字节的加法运算,因此可
12、用循环程序来实现。单字节加法指令进行多字节的加法运算,因此可用循环程序来实现。编写子程序,供其它程序调用编写子程序,供其它程序调用:FIRST EQU 08H SECOND EQU 30H NUMBER EQU 70H ORG 3000HAABB:MOV R0,#FIRST ;置起始地址置起始地址 MOV R1,#SECOND MOV R2,NUMBER;置计数初值置计数初值 CLR C LOOP:MOV A,R0 ADDC A,R1 ;进行一次加法运算进行一次加法运算 MOV R0,A ;存放结果存放结果 INC R0 ;修改地址指针修改地址指针 INC R1 DJNZ R2,LOOP ;计
13、数及循环控制计数及循环控制 RET ;子程序返回子程序返回 END 这里使用了存储区域这里使用了存储区域FIRST 和和SECOND以及存储单元以及存储单元NUMBER作为数据、结果交接区。作为数据、结果交接区。子程序名现在学习的是第10页,共25页分分析析:假假设设一一个个字字节节的的1616进进制制数数在在内内部部RAMRAM的的40H40H和和41H41H单单元元,查查表表求求得得对对应应的的两两位位ASCIIASCII并并将将结结果果存入存入50H50H、51H51H单元,可用堆栈进行参数传递单元,可用堆栈进行参数传递 1 1)子子程程序序HEASCHEASC的的功功能能:取取出出堆堆
14、栈栈中中的的数数据据,查查表表将将低低半半字字节节转转换换成成ASCIIASCII送送累累加加器器A A。2 2)分别将待转换数据入栈)分别将待转换数据入栈,然后调用子程序然后调用子程序HEASC,HEASC,程序如下程序如下:MAIN:MOV SP,30H;设定设定SP指针指针 PUSH 40H ;压栈压栈 LCALL HEASC ;调用将低半调用将低半字节的内容字节的内容 ;转换转换成成ASCII码子程序码子程序HEASC POP A MOV 50H,A ;存低半字节转换结果存低半字节转换结果 PUSH 41H LCALL HEASC POP A MOV 51H,A ;存高半字节转换结果存
15、高半字节转换结果END;位置对吗?位置对吗?HEASC:DEC SP DEC SP ;SP 指向十六进制数参数地址 子程序编程与调用子程序编程与调用 例例10:查表求出数据的查表求出数据的ASCII码码,再以字符形式输出。再以字符形式输出。POP A ;取入口参数取入口参数 ;查表求ASCII码 PUSH A;保存出口参数 INC SP;指向返回地址 INC SP RET TAB:DB 0,1,;ASCII码表 现在学习的是第11页,共25页在编写子程序时,需要注意以下两点在编写子程序时,需要注意以下两点 1)保护现场与恢复现场(堆栈的使用)保护现场与恢复现场(堆栈的使用)。子程序执行时,可能
16、要使用累加器和某些。子程序执行时,可能要使用累加器和某些工作寄存器。在调用子程序之前,这些寄存器中可能存放有主程序的中间结工作寄存器。在调用子程序之前,这些寄存器中可能存放有主程序的中间结果,这些中间结果在子程序返回后可能仍需要使用。这就需要在子程序使用果,这些中间结果在子程序返回后可能仍需要使用。这就需要在子程序使用累加器和这些工作寄存器之前,先将其中的内容转移到安全区域保护起来,累加器和这些工作寄存器之前,先将其中的内容转移到安全区域保护起来,即保护现场。当子程序执行完后,即返回主程序之前,再将这些内容取出,即保护现场。当子程序执行完后,即返回主程序之前,再将这些内容取出,送回到累加器和原
17、来的工作寄存器中,这一过程称为恢复现场。送回到累加器和原来的工作寄存器中,这一过程称为恢复现场。2)数据连接点(参数传递)数据连接点(参数传递)。例如,当要求。例如,当要求sin45时,可用正弦函数子程序。但时,可用正弦函数子程序。但在调用之前必须把在调用之前必须把45送到某一交接处,调用子程序后,子程序从交接处取回送到某一交接处,调用子程序后,子程序从交接处取回45,并求它们的正弦值。在正弦函数求出后,返回主程序之前必须把计算结,并求它们的正弦值。在正弦函数求出后,返回主程序之前必须把计算结果送到交接处。在返回主程序后,主程序从交接处取得结果。在通常情况下,果送到交接处。在返回主程序后,主程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第四 单片机 程序设计
限制150内