03程序设计

上传人:痛*** 文档编号:248218216 上传时间:2024-10-22 格式:PPT 页数:44 大小:423KB
返回 下载 相关 举报
03程序设计_第1页
第1页 / 共44页
03程序设计_第2页
第2页 / 共44页
03程序设计_第3页
第3页 / 共44页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第三章,MCS-51,单片机汇编语言程序设计,3.1,概述,MCS-51,单片机的编程语言可以是汇编语言也可以是高级语言(如,C,语言),高级语言编程快捷,但程序长,占用存储空间大,执行慢;汇编语言产生的目标程序简短,占用存储空间小,执行快,能充分发挥计算机的硬件功能。无论是高级语言还是汇编语言,源程序都要转换成目标程序(机器语言)单片机才能执行。,支持写入单片机或仿真调试的目标程序有两种文件格式:,BIN,文件和,HEX,文件,,BIN,文件是由编译器生成的二进制文件,是程序的机器码,,HEX,文件是由,INTER,公司定义的一种格式,这种格式包括地址、数据和校验码,并用,ASCII,码来存储,可供显示和打印。,HEX,文件需通过符号转换程序,OHS51,进行转换,两种语言的操作过程见图,3-1,。,连接,/,定位器,L51,汇编语言,源程序,汇编器,A51,符号转换程序,OHS51,绝对地址目标程序,.BIN,C,语言程序,浮动地址目标程序,编译器,C51,HEX,图,3-1,两种语言源程序转换成目标程序,目前很多公司将编辑器、汇编器、编译器、连接,/,定位器、符号转换程序做成集成软件包,用户进入该集成环境,编辑好程序后,只需点击相应菜单就可以完成上述的各步,如,WAVE,、,KEIL,,,WAVE,集成软件的使用见附录,。,汇编:将汇编语言,源程序,转换成机器语言,目标,程序的过程称为汇编。,汇编程序:能将汇编语言,源程序,转换成机器语言,目标,程序的系统软件称为汇编程序。,汇编的方法:汇编的方法有两种,1.,手工汇编:,人工查指令表,查出程序中每条指令对应的机器代码。早期的计算机使用。,2,.,机器汇编:,用计算机中的汇编程序对用户源程序进行汇编。,用机器汇编要提供给汇编一些信息,遵循汇编程序的一些约定。这些由伪指令指定。,1),确定程序中每条汇编语言指令的指令机器码,2),确定每条指令在存储器中的存放地址,3),提供错误信息,4),提供目标执行文件,(*.OBJ/*.HEX),和列表文件,(*.LST),地址 机器码源程序,ORG 2000H,2000H 78 30 MAIN,:,MOV R0,,,#30H,2002H E6 MOV A,,,R0,汇编的主要任务:,1.,机器指令:指令系统中的全部指令。每条机器指令都有对应的机器代码,可以被,CPU,执行。,2.,伪指令: 汇编控制指令,没有指令代码,只用于汇编过程,为汇编程序提供汇编信息。,一,.,汇编语言指令类型,3,.,宏指令,宏汇编功能:将需要反复多次执行的程序段定义成一个宏指令名(宏定义)。编程时,可在程序中使用宏指令名来替代被定义的程序段(宏调用)。,宏定义过程,:,宏调用过程:,宏指令名 实际参数,宏指令名 实际参数,宏指令名,MACRO,形式参数,;被定义的程序段,ENDM,二伪指令 常用伪指令及功能:,1.,起始指令,ORG,nn,功能:定义程序或数据块的起始地址。,指示此语句后面的程序或数据块以,nn,为起始地址,连续存放在程序存储器中。,指令地址 机器码源程序,ORG 2000H,2000H 78 30 MAIN,:,MOV R0,,,#30H,2002H E6 MOV A,,,R0,ORG 3000H,3000H 23 TAB,:,DB 23H,,,100,,,A,3001H 64,3002H 41,2.,字节定义 标号:,DB,(字节常数,或字符或表达式),功能:,指示在程序存储器中以标号,为起始地址的单元里存放的数为,字节数据(八位二进制数)。,例如,LN,:,DB 32,,,C,,,25H,,,-1,;,LN,LN+2,地址单元依次存放,20H , 43H , 25H,,,FFH,地址,数据,LN,20,LN+1,43,LN+2,25,LN+3,FF,3.,字定义 标号:,DW,(,字常数或表达式),作用: 指示在程序存储器中以标号为,起始地址的单元里存放的数为字数据,(即,16,位的二进制数),例如:,GH,:,DW 1234H,,,5678H,,,08,GH,12,34,GH+2,56,78,GH+4,00,08,5,.,等值指令 标号,EQU,(数值表达式) 表示,EQU,两边的量等值,用于为标号或标识符赋值。例如:,X1 EQU 2000H X2 EQU 0FH MAIN:MOV DPTR,,,#X1 ; DPTR=2000H ADD A,,,#X2 ; A=A+0FH,4,保留字节 标号:,DS,(,数值表达式),作用:,指示在程序存储器中保留以标号为起始地,址的若干字节单元,其单元个数由数值表达式指定。,例如,L1,:,DS 32 ;,从,L1,地址开始保留,32,个存储单元。,6.,位定义,标号,BIT,位地址,作用:,同,EQU,指令,不过定义的是位操作地址。,例如,AIC BIT P1.1,。,7.,汇编结束,END,作用:,指示源程序段结束。,END,指令放在程序的最后。,A51,汇编程序还有一些其它的伪指令,列在教材表,3-1,中,以备查阅。,4-2,汇编语言程序设计步骤,一,.,确定方案和计算方法,二,.,了解应用系统的硬件配置、性能指标,三,.,建立系统数学模型,确定控制算法和操作步骤,四,.,合理分配存储器单元和了解,I/O,接口地址,五,.,编制源程序,1.,按功能设计程序,明确各程序之间的相互关系,2.,用流程图表示程序结构和功能,开始,1,Y,N,?,3.,程序中用注释说明指令在程序中的作用,方便阅读、调试和修改,顺序程序设计,例,3-1,编程将外部数据存储器的,000EH,和,000FH,单元的内容相换。,常用程序结构,顺序程序、分支程序、循环程序、子程序,000EH,000FH,000EH,000FH,000EH,000FH,000EH,000FH,分析,:,外部数据存储器的数据操作只能用,MOVX,指令,且只能和,A,之间传送,因此必须用一个中间环节作暂存,设用,20H,单元。用,R0,、,R1,指示两单元的低八位地址,高八位地址由,P2,指示。编程过程如下:,000EH,000FH,000EH,000FH,000EH,000FH,ORG 0000H,MOV P2, #0H ;,送地址高八位至,P2,口,MOV R0, #0EH ;R0= 0EH,MOV R1, #0FH ;R1=OFH,MOVX A, R0 ;A=(000EH),MOV 20H, A ;(20H)=(000EH),MOVX A, R1 ;A=(000FH),XCH A, 20H ; A=(000EH),(20H)=(000FH),MOVX R1, A,MOV A, 20H,MOVX R0, A ;,交换后的数送各单元,SJMP $,END,4-3,顺序程序,顺序程序,(,简单程序,),,程序走向只有一条路径,例,3-2,:将,R4R5,双字节符号数求补程序。,ORG 0000H,MOV A,,,R5,;,取低字节,CPL A,ADD A,,,#1,;,低字节变补,MOV R5,,,A,MOV A,,,R4,;,取高字节,CPL A,ADDC A,,,#0,;,高字节变补,ORL A, #80H;,恢复负号,MOV R4,,,A,END,例,3-3,分解压缩式,BCD,码,使其成为非压缩式,BCD,码。,ORG 0000H,MOV R0,,,#40H,;,设指针,MOV A,,,R0,;,取一个字节,MOV R2,,,A,;,暂存,ANL A,,,#0FH,;,清,0,高半字节,INC R0,MOV R0,,,A,;,保存数据个位,片内,RAM,42H,41H,40H,65,MOV A,,,R2,SWAP A,;,十位换到低半字节,ANL A,,,#0FH,INC R0,MOV R0,,,A,;,保存数据十位,END,05,06,地址,数据,TAB,0,TAB+1,1,TAB+2,4,TAB+3,9,TAB+4,16H,TAB+5,25H,例,3-5,设变量放在片内,RAM,的,20H,单元,其值为,00H05H,之间,要求编查表程序,查出变量的平方值,并放入片内,RAM,的,21H,单元。,ORG 0000H,MOV DPTR,#TAB,MOV A,20H,MOVC A,A+DPTR ;,查表,MOV 21H,A,SJMP $,TAB2: DB 00H,01H,04H,09H,16H,25H,END,分析 :在程序存储器安排一张平方表,首地址为,TAB,,以,DPTR,指向表首址,,A,存放变量值,利用查表指令,MOVC A,,,A+DPTR,,即可求得。,表中数据用,BCD,码存放合乎人们的习惯,.,如果平方值为两个字节,程序应如何编。,DPTR,A,ORG 0000H,MOV A,,,R2,JNB ACC.7,,,N,;为正数?,CPL A,;负数变补,INC A,MOV R2,,,A,N,:,SJMP $,;结束,3.4,分支程序的设计,由条件转移指令构成程序判断框部分,,,形成分支结构,3.5.1,单分支程序,一个判断决策框,两种分支结构图。,条件满足,?,N,影响条件,Y,处理段,条件满足,?,N,影响条件,Y,处理,1,处理,2,例,1,求,8,位有符号数的绝对值。,方法:正数不变,负数变补,例,2,用单片机加重力传感器作磅秤,秤出重量后算出行李运费价格,其秤出的重量以,10kg,为,1,个计价单位,G , G,已存入,40H,单元。计价方法为,50kg,以内按,3,元, 50kg,以上,分段计价,: 50kg,按,3,元计价,,超过部分按,2,元计价。 由此列出算式:,G3 + (G-5)2,; 当,G,5,M=,G3,;当,G5,3G,因重复使用,先暂存在,R2,。流程见左,程序如下:,ORG 0100H,FRT,:,MOV A,,,40H,;,取行李重量计价单位,G,MOV R3,,,A,MOV B,,,#03H,;,运费,M=G3,MUL AB,MOV R2,,,A,;暂存,3G,MOV A,,,R3,;取回,G,CJNE A,,,#05H,,,L1,;,G 5 ?,SJMP WETC,L1,:,JC WETC,;是,转至,WETC,SUBB A,,,#05H,;否则,M=3G+2(G-5),RLC A,ADD A,,,R2,MOV R2,,,A,WETC,:,MOV 41H,,,R2,;存运费,M,RET,多分支散转程序的设计,有一类分支程序,它根据不同的输入条件或不同的运算结果,转向不同的处理程序,称之为散转程序。这类程序通常利用,JMP A+DPTR,间接转移指令实现转移。有如下两种设计方法:,1.,查转移地址表,:,将,转移地址,列成表格,将表格的内容作转移的目标地址。,2.,查转移指令表,:,将转移到不同程序的,转移指令,列成表格,判断条件后查表,转到表中指令执行,下面用两个例子说明。,1.,利用转移地址表实现转移,例,3-7,根据,R3,的内容转向对应的程序,,R3,的内容为,0,n,处理程序的入口符号地址分别为,PR0,PRn,(n128),。,分析:将,PR0,PRn,入口地址列在表格中,每一项占两个单元,,PRn,在表中的偏移量为,2n,,因此将,R3,的内容乘,2,即得,PRn,在表中的偏移地址,从偏移地址,2n,和,2n+1,两个单元分别取出,PRn,的高八位地址和低八位地址送,DPTR,寄存器,用,JMP A+DPTR,指令(,A,先清零)即转移到,PRn,入口执行。,这里设,PR0-PRn,地址,PR0,EQU 0110H ;,用伪指令定义,PRn,的具体地址,PR1 EQU 0220H,PR2 EQU 0330H,ORG 0000H,MOV A,R3,;R3A,ADD A,ACC,;A*2,MOV DPTR,#TAB,PUSH ACC,MOVC A,A+DPTR,;,取地址表中高字节,MOV B,A,;,暂存于,B,INC DPL,POP ACC,MOVC A,A+DPTR,;,取地址表中低字节,MOV DPL,A,MOV DPH,B,;DPTR,为表中地址,CLR A,;A=0,JMP A+DPTR,;,转移,TAB,:,DW PR0,PR1,PR2,.,PRn,;,转移地址表,END,01,10,02,20,.,TAB,TAB+2,DPH DPL,例如,R3=1,的操作,02,20,2.,利用转移指令表实现转移,例,3-8,设有五个按键,0,、,1,、,2,、,3,、,4,其编码分别为,3AH,、,47H,、,65H,、,70H,、,8BH,,要求根据按下的键转向不同的处理程序,分别为,PR0,、,PR1,、,PR2,、,PR3,、,PR4,,设按键的编码已在,B,寄存器中,编出程序。,分析,:,将键码排成表,将键码表中的值和,B,中的键编码比对,记下在键码表中和,B,中的键编码相等的序号,另安排一个转移表,安排,AJMP,指令,(,机器码,),,因每条,AJMP,指令占二字节,将刚才记下的序号乘,2,即为转移表的偏移地址,利用,JMP A+DPTR,执行表内的,AJMP,指令,从而实现多分支转移,,设,JPT,的地址为,001AH,、,PR0,入口地址为,0110H,、 ,参考,2.4.2,节,求,AJMP PR0,的机器码,0000 0,001,0001,0000 001,00001,0000 (2110h ),a10a9a8a7a6a5a4a3a2a1a0,AJMP PR0,的机器码为,2110H,,,PR1,入口地址为,0220H AJMP PR1,的机器码为,4120H,转移指令表,JPT,的内容如下所示。设,B=65H,键值为,2:,20,41,JPT+4,20,02,JPT+2,10,21,JPT,AJMP PR0,AJMP PR1,AJMP PR2,TAB,3AH,TAB+1,47H,TAB+2,65H,TAB+3,70H,转移指令表,JPT,键码表,TAB,65H,A,2,B,2A,A=1,A=2,A=0,65H,65H,ORG 0000H,MOV DPTR,#TAB ;,置键码表首址,MOV A,#0 ;,表的起始位的偏移量为,0,NEXT: PUSH ACC,MOVC A,A+DPTR ;A=,键码表的编码,CJNE A,B,AGAN ;,将,B,中值和键码表的值比较,POP ACC,RL A ;,如相等,序号乘,2,得分支表内偏移量,MOV DPTR,#JPT ;,置分支表首址,JMP A+DPTR,AGAN: POP ACC ;,不相等比较下一个,INC A ;,序号加,1,CJNE A,#5,NEXT,SJMP $ ;,键码查完还没有,B,中按键编码程序结束,JPT: AJMP PR0 ;,分支转移表,AJMP PR1,AJMP PR2,AJMP PR3,AJMP PR4,TAB: DB 3AH,47H,65H,70H,8BH ;,键码表,END,当程序中的某些指令需要反复执行多次时,采用循环程序的方式,这样会使程序缩短,节省存储单元(并不节省执行时间)。,循环次数的控制,有两种控制方式,:,第一种方法,先判断再处理即先判断满不满足循环条件,如不满足,就不循环,多以循环条件控制。,第二种方法,先处理再判断,即循环执行一遍后,下一轮还需不需要进行,多以计循环次数控制。循环可以有单重循环和多重循环,在多重循环中,内外循环不能交叉,也不允许外循环跳入内循环。下面通过几个实例说明循环程序的设计方法。,3.5,循 环 程 序 设 计,例,3-9,设计一个延时,10ms,的延时子程序,已知单片机使用的晶振为,6MHz,。,分析,延时时间与两个因素有关,:,晶振频率和循环次数。由于晶振采用,6MHz,,一个机器周期是,2s,,用单循环可以实现,1ms,延时,外循环,10,次即可达,10ms,延时。,内循环如何实现,1ms,延时呢,程序中可先以未知数,MT,代替,从附录,A,查每条指令机器周期计算程序的执行时间。,ORG 0020H,MOV R0,,,#0AH,;外循环,10,次,DL2,:,MOV R1,,,#MT,;内循环,MT,次,DL1,:,NOP,NOP,;空操作指令,DJNZ R1,,,DL1,DJNZ R0,,,DL2 RET,1,1,1,1,2,2,内循环,DL1,到指令,DJNZ R1,,,DL1,的计算:,(,1+1+2,),2SMT=1000S,MT=125=7DH,将,7DH,代入上面程序的,MT,,计算总的延时时间:,1+1+,(,1+1+2,),125+28102S,=10062S=10.062mS,若需要延时更长时间,可以采用多重循环。,机器周期数,内,外,例,3-10,编写多字节数,10,程序。 内部,RAM,以,20H,为首址的一片单元中存放着一个多字节符号数,字节数存放在,R7,中,存放方式为低位字节在低地址,高位字节在高地址,要求乘,10,后的积仍存放在这一片单元中。 分析 用,R1,作该多字节的地址指针,部分积的低位仍存放于本单元,部分积的高位存放于,R2,,以便和下一位的部分积的低位相加。以,R7,作字节数计数。 编程如下:,345 H,0A H,32 H,28 H,2B H,1E H,20B H,ORG 0000H,CLR C,;清进位位,C,MOV R1,,,#20H,;,R1,指示地址,MOV R2,,,#00H,;存积的高八位寄存器,R2,清,0,S10,:,MOV A,R1,;取一字节送,A,MOV B,,,#0AH,;,10,送,B,PUSH PSW,MUL AB,;字节乘,10,POP PSW,ADDC A,,,R2,;上次积高八位加本次积低八位,MOV R1,,,A,;送原存储单元,MOV R2,,,B,;积的高八位送,R2,INC R1,;指向下一字节,DJNZ R7,,,S10,;未乘完去,SH10,,否则向下执行,MOV R1,,,B,;存最高字节积的高位,SJMP $,例如,12 23 65 09 89,比较大小,不交换,(0),12,23 65,09 19,12 23,65 09,19,交换,(1),12 23,09,65 19,不交换,(0),交换,(1),12 23,65 09 19,12 23,09 19,65,最大,交换,(1),不交换,(0),12,23 09,19 65,12,09,23 19,65,交换,(1),12,09,19,23,65,不交换,(0),交换,(1),12 23,09 19 65,12 09 19 23 65,最大,12 09 19 23 65,09,12 19,23 65,09 12 19,23 65,09 12 19 23 65,09 12,19 23,65,MCS-51,单片机有着优异的位逻辑功能,可以方便的实现各种复杂的逻辑运算,.,这种用软件替代硬件的方法,可以大大简化甚至完全不用硬件,但比硬件要多花运算时间。,例,3-17,编写一程序,以实现图,3-7,中的逻辑运算电路,.,3.6,位操作程序设计,其中,P1.1,和,P2.2,分别是端口线上的信息,TF0,和,IE1,分别是定时器定时溢出标志和外部中请求标志, 25H,和,26H,分别是两个位地址,运算结果由端口线,P1.3,输出。,.,图,3-4,硬件逻辑运算电路,程序如下:,START:MOV C,P2.2,ORL C,TF0,ANL C,P1.1,MOV F0,C,MOV C,IE1,ORL C,/25H,ANL C,F0,ANL C,/26H,MOV P1.3,C,SJMP $,例,3-18,设累加器,A,的各位,ACC.0,ACC.7,分别记为,X0,X7,,编制程序用软件实现下式,: Y=X,0,X,1,X,2,+X,0,X,1,X,2,+X,0,X,1,X,2,X,3,+X,4,X,5,X,6,X,7,X0 BIT ACC.0,X1 BIT ACC.1,X2 BIT ACC.2,X3 BIT ACC.3,X4 BIT ACC.4,X5 BIT ACC.5,X6 BIT ACC.6,X7 BIT ACC.7,ORG 0000H,MOV C,X0,ANL C,X1,ANL C,X2,MOV 00H,C ;X0X1X2,MOV C,X0,ANL C,/X1,MOV 01H,C ;X0X1,ANL C,/X2,ORL C,00H,MOV 00H,C,MOV C,X2,ANL C,01H,ANL C,X3 ;X0X1X2X3,ORL C,/00H,MOV 00H,C,MOV C,X7,ANL C,/X6,ANL C,/X5,ANL C,/X4 ; X4 X5 X6 X7,ORL C,00H ;,最终结果,YC,SJMP $,子程序是构成单片机应用程序必不可少的部分,通过,ACALL,和,LCALL,两条子程序调用指令,可以十分方便地用来调用任何地址处的子程序。,子程序节省占用的存储单元,使程序简短、清晰,善于灵活的使用子程序,是程序设计的重要技巧之一。,子程序必须以,RET,指令结尾,.,在调用子程序时,有以下几点应注意:,3.7,子程序,当一段程序需多次应用,或为多人应用时,这段程序编为子程序,.,1,)保护现场。,如果在调用前主程序已经使用了某些存储单元或寄存器,在调用时,这些寄存器和存储单元又有其他用途,就应先把这些单元或寄存器中的内容压入堆栈保护,调用完后再从堆栈中弹出以便加以恢复。如果有较多的寄存器要保护,应使主、子程序使用不同的寄存器组。,2,)设置入口参数和出口参数。,用之前主程序要按子程序的要求设置好地址单元或存储器(称为入口参数),以便子程序从指定的地址单元或存储器获得输入数据;,子程序经运算或处理后的结果存放到指定的地址单元或寄存器(称为出口参数),主程序调用后从指定的地址单元或寄存器读取运算或处理后的结果,只有这样,才能完成子程序和主程序间的数据的正确传递。,3,)子程序中可包括对另外子程序的调用,称为子程序嵌套。,例,3-19,用程序实现,c=a2+b2,,设,a,b,均小于,10,。,a,存放在,31H,单元,,b,存放在,32H,单元,把,c,存入,34H,和,33H,单元。(和要求为,BCD,码)。,解:因该算式两次用到平方值,所以在程序中采用把求平方编为子程序的方法。求平方采用查表法,主程序和子程序编写如下:,主程序:,ORG 0000H,MOV SP,,,#3FH,MOV A,,,31H,;取,a,LCALL SQR ;,求,a,方,MOV R1,,,A,MOV A,,,32H,;取,b,LCALL SQR ;,求,b,方,ADD A,,,R1 ;,求和,DA A,;调整,MOV 33H,,,A,MOV A,,,#0,ADDC A,,,0,MOV 34H,,,A,SJMP $,子程序:,ORG 0030H,SQR,:,INC A,MOVC A,,,A+PC,RET,TAB,:,DB 00H,01H,04H,DB 09H 16H,25H,DB 36H,49H64H,81H,END,3.8,小 结,1,、程序设计的关键在于指令熟悉和算法,(,思路,),正确、清晰,对复杂的程序应先画出流程图。只有多做练习多上机调试,熟能生巧,才能编出高质量的程序。,2,、伪指令是非执行指令,提供汇编程序以汇编信息,应正确使用。,3,、本章应掌握顺序程序、分支程序、循环程序、子程序等各类程序的设计方法,并能熟练应用查表技术简化程序的设计。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!