资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第09讲,*,键控移位,例:有一电路如图所示,设计一个程序实现以下功能:,SW,按下第,1,次,,VD1,发光;,SW,按下第,2,次,,VD1、VD2,发光,;,SW,按下第,3,次,,VD1、VD2、VD3,发光,SW,按下第,7,次,,VD1VD7,发光;,SW,按下第,8,次,,VD1,发光;,SW,按下第,9,次,,VD1、VD2,发光,依次轮回。,解题思路:本例涉及到查询按键按下的过程,,SW,没有按下时,P2.0,为高电平,按下为低电平。实际应该查询的是,P2.0,的下降沿,,P2.0,有一个下降沿,表明有一个按键按下,,LED,的状态应该改变一次。,1,第09讲,2,第09讲,程序清单,SW BITP2.0,ORG0000H,LOOP0:SETBSW,MOVA,#01H,MOVR7,#07H,LOOP1:MOVC,SW,MOVR6,#255,DELAY:NOP,NOP,DJNZR6,DELAY,ANLC,/SW,JNCLOOP1,置,P2.0,为输入方式,确定循环次数为,7,延时消抖,判断是否有下降沿,有则移位,否则继续查询,初态,次态,3,第09讲,数据排序程序,例:将片内,RAM,中20,H-27H,中的数据按照从小到大的顺序重新排列。,解题思路:见下图,RLCA,ORLA,#01H,MOVP2,A,DJNZR7,LOOP1,SJMPLOOP0,END,显示输出,如果循环次数到则重新开始,4,第09讲,RAM,地址,20H,21H,22H,23H,24H,25H,26H,27H,原始数据,66H,11H,10H,34H,67H,01H,89H,A0H,1,01H,11H,10H,34H,67H,66H,89H,A0H,2,01H,10H,11H,34H,67H,66H,89H,A0H,3,01H,10H,11H,34H,67H,66H,89H,A0H,4,01H,10H,11H,34H,66H,67H,89H,A0H,5,01H,10H,11H,34H,66H,67H,89H,A0H,6,01H,10H,11H,34H,66H,67H,89H,A0H,7,01H,10H,11H,34H,66H,67H,89H,A0H,5,第09讲,R120H,R0(R1)+1,R3 08H,B(R1),R2(R3)-1,查找最小值并和,(,R1),单元互换,R3-1=0?,END,R1(R1)+1,N,Y,程序流程:,6,第09讲,程序清单:,ORG 0000H,MOV R1,#20H,MOV R3,#08H,LOOP1:,MOV A,R1 ;R0(R1)+1,INC A,MOV R0,A,MOV A,R3 ;R2(R3)-1,DEC A,MOV R2,A,MOV B,R1,LOOP:MOV A,R0,CJNE A,B,MM,7,第09讲,MM:,JNC SS ;,如果,AB,跳转,MOV B,A,MOV 28H,R0,SS:INC R0,DJNZ R2,LOOP,MOV R0,28H ;,最小值单元和20,H,单元内容互换,MOV A,R1 ;,数据,MOV R0,A,MOV R1,B,INC R1,DJNZ R3,LOOP1,END,8,第09讲,查表程序设计,程序使用的专用指令:,MOVC A,A+PC MOVC A,A+DPTR,一般情况下,常使用后者,程序设计一般规则,:,先确定表格存放的位置,在表格中填入相应的数据,查表时先将表格的首地址给,DPTR,,再,将要查表的数据送给,A,,最后用,MOVC A,A+DPTR,9,第09讲,例1,:假如在,MCS-51,单片机内部,RAM,中40,H,单元内存放的是一个角度,(范围,0-90,),设计一段程序,计算出,200,sin(),把结果存入,41,H,单元中(结果只取整数),。,解题思路:,先建立一个相应的数值表格,定义在程序存储器中,利用输入的值进行查表。,10,第09讲,例程:,ORG0000H,MOVDPTR,#TABLE MOVA,40H MOVCA,A+DPTR,MOV41H,A SJMP$,TABLE:DB0,3,7,10,14,17,21,24,28,31,35,38 DB41,45,48199,200,200,END,查表,表格内容,11,第09讲,例2,:假如在,MCS-51,单片机内部,RAM,中40,H,单元内存放的是一个参数,x,(,范围,0-10,),设计一段程序,计算出,5,x,3,+4x,2,+3x+1,把结果存入,41,H,和42,H,单元中(高位在前),。,解题思路:,先建立一个相应的数值表格(每个为,2,个字节),定义在程序存储器中,利用输入的值进行查表。,12,第09讲,例程:,ORG0000H,MOVDPTR,#TABLE MOVA,40H RLCA PUSHACC MOVCA,A+DPTR MOV41H,A,POPACC INCA MOVCA,A+DPTR MOV42H,A SJMP$,TABLE:DW0000H,000DH,003FH,00B5H,018DH DW02D1H,04DBH,078DH,0B19H,0F9DH,1537H,END,查表,得到高两位数,表格内容,查表,得到低两位数,13,第09讲,例3,:假如在内部,RAM,的30,H,单元中存放有一个,BCD,编码的十进制数,查出其共阴,7,段显示代码,并送到外部,RAM,的,CFA0H,单元中。,程序清单,MOV DPTR,#0050H MOV A,30H MOVC A,A+DPTR,MOV DPTR,#0CFA0H MOVX DPTR,A,ORG 0050H DB 3FH ;0,的7,段共阴显示代码,DB 06H ;1,的7,段共阴显示代码,DB 5BH ;2,的7,段共阴显示代码,查表,得到数值,送出数值,表格内容,14,第09讲,思考:,1,、如果在你设计的一个程序中将计算,cos10,o,、cos15,o,、cos60,o,的值,如何计算。,2,、如果,在,R0,中存放有一个,16,进制数,要将它的,ASCII,码放到,40,H,单元中,该如何设计程序。,15,第09讲,子程序设计基础,在编写程序时,经常有一些的程序会被频繁的使用。通常情况下,我们将这些程序段定义成子程序,使程序变的便于调试和阅读,同时也缩小了程序的长度。在编写子程序时,应注意以下几点:,子程序的第一条指令地址为子程序的入口地址。,主程序调用子程序利用指令,LCALL、ACALL,指令进行,返回使用,RET。,在子程序的内部有转移指令时,最好使用相对转移指令。,在使用子程序时,要注意现场的保护,在退出时要恢复现场。,子程序设计,16,第09讲,2),子程序参数传递,在调用子程序时,经常要进行参数的传递,常用的方法有以下几种:,利用工作寄存器或累加器进行传递。,利用可间接寻址的寄存器进行传递。,使用堆栈进行参数传递。,例:假如在,MCS-51,单片机外部,RAM,中00,H07H,单元中依次存放有8个无符号数,X,i,(i,为0-7),设计一段程序计算出,Y,i,=X,i,2,,,并把结果存于外部,RAM 10H,开始的16个单元中(,Y,i,占用两个字节,高位在前);再计算,Z,i,=,X,i,2,,并把,Z,i,依次存放在,X,i,所在的单元。,17,第09讲,解题思路:,在本例中,,Y,i,=X,i,2,和,Z,i,=X,i,2,都,比较复杂,我们可以分别使用子程序。,程序清单:,ORG0000H,MOVR0,#00H,MOVR1,#10H,MOVR2,#08H,LOOP:,MOVXA,R0,LCALLDIVIDE,LCALLSQUARE,MOVXR1,B,INCR1,MOVXR1,A,DJNZR2,LOOP,SJMP$,R0,和,R1,作为数据指针,,R2,为循环次数。,传递参数,调用运算子程序,存放结果,18,第09讲,DIVIDE:PUSHACC,CLRC,RRCA,MOVXR0,A,POPACC,RET,SQUARE:MOVB,A,MULAB,RET,END,Z,i,=X,i,2,运算子程序,Y,i,=X,i,2,运算子程序,19,第09讲,定时程序,单重循环延时,例,1:,假设单片机的,f,osc,=12MHz,计算单片机执行下面程序消耗的时间。,DELAY:MOV R5,#TIME ;1,机器周期,MM:NOP ;1,机器周期,DJNZ R5,MM ;2,机器周期,RET ;2,机器周期,执行完以上,4,条语句,所花时间,:,T=(1+(1+2),TIME)+2,1,s,推广计算式,:,T(,机器周期数,)=(,循环体机器周期数,),循环次数,+,初始化机器周期数,20,第09讲,多重循环延时,例,1:,假设单片机的,f,osc,=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),1,s,21,第09讲,思考,1:,如果单片机的主振频率是,6,MHz,,以上两个程序可实现的最长延时时间是多长,?,思考,2:,对于固定主振频率的单片机系统,要求提高延时时间,应该如何处理?比如延时,1,秒。,22,第09讲,小 结,本章要求:,了解,MCS-51,单片机的,7,种寻址方式;,掌握数据传送与交换、算术运算、逻辑运算、控制转移、位操作,5,类共,111,条指令的功能,特别是每一类指令中比较常用的指令;,掌握,MCS-51,单片机汇编语言程序的基本格式及伪指令;,了解程序的基本结构(顺序结构、分支结构、循环结构)和程序设计的基本方法;,掌握数制转换、算术运算、极值查找等典型程序的设计;,掌握子程序的设计方法及其参数传递方法。,23,第09讲,
展开阅读全文