
单片微型计算机c第9讲(机械).ppt
27页2 2上节内容回顾§ MCS51单片机的指令Ø数据传送类(28条)Ø算术运算类(24条)Ø逻辑运算类(25条)Ø控制转移类(17条)Ø位操作类(17条)3 3第8-9讲教学目的和要求【教学目标】通过讲述MCS-51单片机的汇编语言程序设计的基本步骤、基本方法,使学生对指令系统有进一步的认识和理解,同时使得学生掌握使用汇编语言进行程序设计的方法,通过实例加以巩固教学重点】①单片机程序设计的基本方法;②查表、差值运算、译码等简单程序设计方法;【教学难点】如何将实际问题转换成单片机能识别和解决的问题4 4第五章 MCS-51的汇编语言程序设计5 55.3.2 分支结构p指令执行时,根据不同的情况执行不同的程序段单分支 双分支 多分支6 6双分支结构n设变量x以补码的形式存放在片内RAM的30H单元,变量y与x的关系是:p当x>0时,y=x;p当x=0时,y=20H;p当x0时,y=x;p当x=0时,y=20H;p当x0,转结束 MOV A, #05H ;x <0处理ADD A, 30H MOV 30H, A ;X+05H送YSJMP DONE9 95.3.3 循环结构p按某种控制规律重复执行的程序称为循环程序。
循环程序有先执行后判断和先判断后执行两种基本结构1010例1 延时程序§ 编写一段延时50ms的程序p若晶振频率为12MHz,则一个机器周期为1μs,延时50ms,则程序的执行时间为50000个机器周期p立即数取指在0~255之间,可考虑200*250=50000p需要用到减1,结果不为0则重复的指令p执行一条DJNZ指令需要2个机器周期,即 2μs采用循环计数法实现延时,需要用到双重循环1111延时程序DEL: MOV R7,#200 ;1 μsDEL1:NOP ; 1 μsDEL1: MOV R6,#? ;1 μsNOP ;1 μsDEL2:DJNZ R6,DEL2 ;2μsDJNZ R7,DEL1 ;2μs DEL1: MOV R6,#123 ;1 μs共计 [(2×123+2+ 2)×200+1] μs,即50.001ms1212例2 未知次数的循环将内部RAM中起始地址为data的数据串传送到外部RAM中起始地址为buffer的存储区域内,直到发现‘$ ’字符停止传送。
………… data??H??Hdata+1……内部RAM‘$’??………… bufferbuffer+1……外部RAM问题何时终止传送?对取出的数进行与’S’进行比较,判断是否相等用CJNE 1313例2 未知次数的循环程序将内部RAM中起始地址为data的数据串传送到外部RAM中起始地址为buffer的存储区域内,直到发现‘$ ’字符停止传送MOV R0,#data MOV DPTR,#bufferLOOP: MOV A,@R0 CJNE A,’$’,继续执行地址结束LP:MOVX @DPTR,AINC R0INC DPTRSJMP LOOPLP2: SJMP $ENDSJMP LP2CJNE A,’$’,LP14145.4 子程序及其调用p在实际应用中,经常会遇到一些带有通用性的问题,在一个程序中可能要使用多次这时可以将其设计成通用的子程序供随时调用,减少代码冗余n一个程序中可以多次调用一个子程序n多个程序可以调用一个子程序n子程序可以调用子程序,最多支持8级p调用子程序时,单片机能自动保存PC内容,遇RET返回时,能自动恢复PC程序1……子程序 RET……程序2……1515子程序结构§ 子程序编写完成后,使用pACALL 函数名(短距离调用)pLCALL 函数名(整个ROM区调用)§ 此处的函数名,实际上是一个标号,编译后形成具体的地址。
n 子程序的处理过程中,可能要影响PSW、ACC,以及其他的一些功能寄存器,若这些影响是子程序功能的一部分,则无需保护;否则,一定要保护现场,使得主程序得以正确执行保护现场……子程序处理……恢复现场RET子程序函数名:1616通过堆栈进行现场的保护SUB1:PUSH PSW ;保护现场 PUSH ACC ;PUSH B ;… …MOV PSW,#10H ;换当前工作寄存器组… …POP B ;恢复现场POP ACC ;POP PSW ;RET注意:①保护和恢复的工作在子程序中进行②保护与恢复的顺序要对应1717子程序结构§ 子程序参数的传递p调用子程序时,语句中无法携带子程序运行所需的参数p明确子程序的功能后,对子程序使用的参数,应在调用之前完成数据的赋值等工作p类似乘法指令MUL AB,必须在此指令之前将AB赋值,运算才有意义保护现场……子程序处理……恢复现场RET子程序函数名:1818子程序举例n编写程序,实现c=a2+b2 设a,b,c分别存于内部RAM的30H,31H,32H三个单元中§ 如何求数的平方§ MUL AB§ 左移§ 查表开始调用求平方子程序结束a2→R1(31H)→A(30H)→AA+R1→A调用求平方子程序A→32H1919方法1:直接相乘START:MOV A,30H ;取aACALL SQR ;调用乘法MOV R1,A ;a2 暂存于R1中MOV A,31H ;取bACALL SQR ;调用查平方表ADD A,R1 ;a2+b2 存于A中MOV 32H,A ;存结果SJMP $SQR :PUSH PSWMOV B,AMUL AB;POP PSWRET开始调用求平方子程序结束a2→R1(31H)→A(30H)→AA+R1→A调用求平方子程序A→32H2020方法2:左移1次START:MOV A,30H ;取aACALL SQR ;调用乘法MOV R1,A ;a2 暂存于R1中MOV A,31H ;取bACALL SQR ;调用查平方表ADD A,R1 ;a2+b2 存于A中MOV 32H,A ;存结果SJMP $SQR :PUSH PSWRL APOP PSWRET开始调用求平方子程序结束a2→R1(31H)→A(30H)→AA+R1→A调用求平方子程序A→32H2121方法3:查表START:MOV A,30H ;取aACALL SQR ;调用乘法MOV R1,A ;a2 暂存于R1中MOV A,31H ;取bACALL SQR ;调用查平方表ADD A,R1 ;a2+b2 存于A中MOV 32H,A ;存结果SJMP $SQR :MOV DPTR,#TAB ;子程序MOVC A,@A+DPTR ;RET TAB :DB 0,1,4,9,16 ,25,36,49,64,81DB ……开始调用求平方子程序结束a2→R1(31H)→A(30H)→AA+R1→A调用求平方子程序A→32H22225.5 综合举例§ 设有一串字符,依次存放在内部RAM从30H单元开始的连续单元中,该字符串以0AH为结束标识(0AH不计入字符长度),编写程序,统计该字符串个数,将该数放入累加器A中。
………… 30H??H??H??H??HRAM0AH……个数→AMOV R1,#30HMOV R0,#00HLP:CJNE @R1,#0AH,NESJMP ED NE:INC R0INC R1SJMP LP ED: MOV A,R0SJMP $END2323改进MOV R1,#30HMOV R0,#00HLP:CJNE @R1,#0AH,NESJMP EDNE:INC R0INC R1SJMP LPED: MOV A,R0SJMP $ENDMOV R1,#2FHMOV R0,#0FFHNE:INC R0INC R1LP:CJNE @R1,#0AH,NEMOV A,R0SJMP $END2424综合举例§设在30H和31H单元中各有一个8位数据: (30H)=x7x6x5x4x3x2x1x0 (3lH)=y7y6y5y4y3y2y1y0现在要从30H单元中取出低5位,并从31H单元中取出低3位完成拼装,拼装结果送40H单元保存,即 (40H)=y2y1y0x4x3x2x1x0n分析:n从最终结果来看,40H单元的数与30H单元的数较为接近,可以30H 单元数据作为初始操作数据。
n30H单元最高3位无用,可先去掉得000x4x3x2x1x0n将31H单元高低位交换,可得到y3y2y1y0y7y6y5y4 ,左移1位可得y2y1y0y7y6y5y4y3 ,再去掉低5位,即y2y1y000000再拼装即可2525综合举例§设在30H和31H单元中各有一个8位数据: (30H)=x7x6x5x4x3x2x1x0 (3lH)=y7y6y5y4y3y2y1y0现在要从30H单元中取出低5位,并从31H单元中取出低3位完成拼装,拼装结果送40H单元保存,即 (40H)=y2y1y0x4x3x2x1x0MOV 40H,30H ANL 40H,#00011111BMOV A,31H SWAP A RL A ANL A,#11100000BORL 40H,A 2626本章小结1、伪指令:ORG、DB、DW、EQU、END等2、程序设计步骤3、常用程序结构:顺序结构、分支结构、循环结构(1)顺序程序:直线程序或简单程序单重分支(2)分支程序(3)循环程序:构成:初始化、循环体、控制变量的修改、循环次数的控制。
本节作业P79 第7题P80 第8、10题。
