资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单片机原理及应用思考题,1.,顺序程序设计,例,4.1,请用,MCS-51,汇编指令编写程序,将片内,RAM104,、,105,单元中的内容分别传送到片外,RAM 104H,、,105H,单元中。,分析:应注意片内和片外的寻址指令不同,ORG 1000H,MOV R0,,,#68H,MOV A,,,R0 ;,片内,RAM104,单元内容送累加器,MOV DPTR,,,#0104H,MOVX DPTR,,,A ;,完成片内,RAM104,单元内容送片,;,外,104H,单元中,INC R0,MOV A,,,R0 ;,片内,RAM105,单元内容送累加器,INC DPTR,MOVX DPTR,,,A ;,完成片内,RAM105,单元内容送片,;,外,105H,单元中,SJMP$;,等待,END ;,结束,1.,简单分支程序,Y,N,顺序执行,条件满足?,转向目标程序,2.,分支程序设计,图,4,.,1,简单分支程序转移,分析:只要将两数进行比较,用比较的结果作为分支转移的条件就很容易地找出其中的大数。,已知片内,RAM FIRST,开始的两个单元中各存放有一个,8,位无符号二进制数,要求找出其中的大数并存入片内,RAM,的,SECOND,单元中。,例,4.2,ORG 1000H,CLR C,MOV R0,,,#FRIST ;,第一个数地址送,R0,中,MOV A,,,R0 ;,取第一个数,INC R0 ;R0,指向第二个数地址,SUBB A,R0 ;,两数比较,JC BIG ;,第二个数大转,BIG,DEC R0 ;R0,指向第一个数地址,BIG:MOV SECOND,R0 ;,存大数,SJMP$;,等待,END ;,结束,参考程序,2,)多路分支程序(散转程序),K=n,K=n-1,K=2,转向分支,n-1,转向分支,2,转向分支,1,转向分支,n,K=?,K=1,图,4.2,多路分支程序转移,1,)把,AJMP,或,LJMP,指令组成一个分支程序的 转移表,表的首地址放入,DPTR,中;,2,)调整后的出口信息放入累加器,A,中;,3,)执行,JMP A+DPTR,转向对应的分支程序。,可通过间接转移指令,JMP A+DPTR,和,无条件转移指令中的,AJMP,或,LJMP,指令来实现,多路分支转移:,例,4.3,已知,R0,中存放有一数字关键码,要求根据码值的不同,分别转向对应的码值程序段去执行。即当,(R0)=K,时,便执行,CODEK,程序。,ORG 1000H,MOV DPTR,,,#TAB ;,表首址送,DPTR,MOV A,,,R0 ;,取数字关键码,ADD A,,,R0 ;,每条,AJMP,指令占用两个字,;,节,将出口信息乘,2,JNC LESS ;,关键码小于,128,转,LESS,INC DPH,LESS:JMP A+DPTR,TAB:AJMP CODE0 ;,关键码为,0,,转,CODE0,执行,AJMP CODE1 ;,关键码为,1,,转,CODE1,执行,AJMP CODE255 ;,关键码为,255,,转,CODE255;,执行,SJMP$;,等待,END ;,结束,参考程序,AJMP,指令的转移范围不超出所在的,2KB,字节区间,如各小段程序较长,在,2KB,字节内无法全部容纳,上面的程序应该怎样修改?,思考,1),循环初始化,设置循环的初始状态,位于循环程序的开头位置,2),循环处理,循环程序的主体部分,是通过反复执行来完成数据的具体处理,它位于循环体内。,3.,循环程序设计,循环程序由,4,部分组成:,MOV A,R0 ;片内RAM105单元内容送累加器,INC DPTR ;调整加数地址指针,MOV R3,#10H ;设循环计数器初值,查表就是把事先计算或测得的数据按照一定的顺序编制成表格存放在存储器中,然后根据输入的数据,从表格中查出所需的结果。,子程序的第一条指令之前必须有标号;,EGA EQU 50H,COUNT EQU 60H,MOV A,R0 ;片内RAM105单元内容送累加器,RET ;,BIG:MOV SECOND,R0 ;存大数,MOV DPTR,#TAB ;表首址送DPTR,2)调整后的出口信息放入累加器A中;,请编一个加法程序,将他们的和存放在ADR1开始的连续单元中。,通常位于循环体后,是用来存放循环处理的最终结果及恢复各寄存器与工作单元的原始值。,#ADR2(DPRTR),可通过间接转移指令JMP A+DPTR和,可通过间接转移指令JMP A+DPTR和,3),循环控制,也在循环体内,是用于控制循环的继续与否。,4),循环结束,通常位于循环体后,是用来存放循环处理的最终结果及恢复各寄存器与工作单元的原始值。,设,MCS-51,单片机内部,RAM,从,40H,开始的连续,16,个单元中,每个单元中分别存放有单字节的带符号数。要求将其中的正数存入,50H,开始的连续单元中,负数存入,60H,开始的连续单元中,并将正数、负数和零的个数分别存入,70H,、,71H,、,72H,单元中。,例,4.4,1,)带符号数的最高位为符号位,可通过最高位判断正负:“,0”,表示正数,“,1”,表示负数。,2,)程序中需要从,40H,单元开始取源数,存正数和负数,故需要三个地址指针来指向对应的内存单元;设对应的地址指针分别为,R0,、,R1,和,R2,,由于,R2,不能用间接寻址方式,故,R2,需要同,R1,或,R0,进行交换后,才能进行负数的存放。,分析,图,4.3,程序流程图,参考程序,:,ORG 1000H,CLR A,MOV 70H,A ;,存放正数的个数单元清,0,MOV 71H,A ;,存放负数的个数单元清,0,MOV 72H,A ;,存放零的个数单元清,0,MOV R3,#10H ;,设循环计数器初值,MOV R0,#40H ;,设源数地址指针,MOV R1,#50H ;,设正数地址指针,MOV R2,#60H ;,设负数地址指针,LOOP:MOV A,R0 ;,取源数,JZ,ZERO,;,源数为,0,,转,ZER0,JNB ACC.7,POSI,;,源数为正,转,POSI,INC 71H ;,负数个数加,1,MOV R4,A ;,暂存原数,MOV A,R2,XCH A,R1 ;R1,与,R2,中的内容交换,XCH A,R4,MOV R1,A ;,存负数,XCH A,R4,XCH A,R1 ;R1,与,R2,中的内容交换,INC R2 ;,调整负数地址指针,SJMP,LOOP1,;,转循坏控制,POSI:INC 70H;,正数个数加,1,MOV R1,A ;,存正数,INC R1 ;,调整正数地址指针,SJMP LOOP1,ZERO:INC 72H ;,零的个数加,1,LOOP1:INC R0 ;,调整源数地址指针,DJNZ R3,LOOP ;,未送完,继续,SJMP$;,等待,END ;,结束,查表指令有:,MOVC A,,,A+DPTR,MOVC A,,,A+PC,查表就是把事先计算或测得的数据按照一定的顺序编制成表格存放在存储器中,然后根据输入的数据,从表格中查出所需的结果。,4.,查表程序设计,片内,RAM,的,EGA,单元中有一个大写的英文字母,要求将此字母在英文字母表中的位置送入片内的,COUNT,单元中,如,EGA,单元中字母为,I,时,则,COUNT,单元中需送入数字,9,。,例,4.6,如果将,26,个英文字母按照顺序编成一个表,通过查表法得到一个字母与,EGA,单元中的字母比较,若不相等再查,同时记录查表的次数。查完后,将记录次数送,COUNT,单元。,分析,参考程序,ORG 1000H,EGA EQU 50H,COUNT EQU 60H,MOV COUNT,,,#00H,MOV A,#16 ;,调整地址,LOOP:PUSH A,MOVC A,A+PC ;,查表,CJNZ A,EGA,NF ;,所查字母与,EGA,中字母比较,SJMP LAST ;,相等转,LAST,NF:POP A,INC A ;,调整地址,INC COUNT ;,记数值加,1,SJMP LOOP ;,继续查,LAST:INC COUNT ;,记数值加,1,SJMP$;,等待,ALPT:DBA,B,Y,,,Z,END ;,结束,编写子程序时应注意:,a.,子程序的第一条指令之前必须有标号;,b.,子程序中需要保护现场;,c.,主程序和子程序之间的参数传递。,5.,子程序设计,已知片内,BLOCKB,单元开始处有一数据块,块长在,R2,中,在此数据块的每个单元中存放有一个未组合的,BCD,码,要求将每个,BCD,码转换为,ASCAII,码,并存放在片内,BLOCKA,开始的连续单元中。,例,4.8 BCD,码转换为,ASCAII,码,将一位,BCD,码转换为,ASCAII,码的子程序:,TRANS:MOV A,R0 ;,取,BCD,码,ADD A,#30H,MOV R1,A ;,送,ASCAII,码,INC R0,INC R1,RET ;,返回,分析:,将一位,BCD,码转换为相应的,ASCAII,码只需加上,30H,即可。,主程序:,ORG 1000H,MOV R2,,,#L,MOV R0,,,#BLOCKB;,设,BCD,码的地址指针,MOV R1,,,#BLOCKA;,设,ASCAII,的地址指针,LOOP,:,ACALL TRANS ;,调用,TRANS,子程序,DJNZ R2,,,LOOP;,未转换完,继续,SJMP$;,等待,END ;,结束,设片内,40H,单元中有一组合的,BCD,码,要求将其转换为二进制数存回原处。,分析:,1,)组合的,BCD,码为两位十进制数,需将十位 数和个位数分开处理。,2,)十位数转换时只要累加,0AH,就能将其转换 为相应的二进制数,然后再将个位数直接 加到转换后的十位数上就可完成整个数的 转换。,例,4.9 BCD,码转换为二进制数,参考程序,ORG 1000,BCDTOB:MOV A,,,40H,ANL A,,,#F0H;,取十位数,SWAP A ;,将十位数换到低,4,位,JZ DONE ;,十位数为,0,返回,MOV R3,,,#00H ;,累加和寄存器清,0,LOOP,:,DEC A,ACALL ADD0AH ;,调用加,10,子程序,JNZ LOOP ;,未加完继续,MOV A,,,40H,ANL A,,,#0FH ;,取个位数,ADD A,,,R3 ;,与十位相加,MOV 40H,,,A ;,转换完,存结果,DONE:RET,;(,书上此处有错,),ADD0AH,:,PUSH A,;保护现场,MOV A,,,R3,;累加的和送,A,中,ADD A,,,#0AH,MOV R3,,,A,;加,10,后送回原处,POP A,;恢复现场,RET,;返回,加,10,子程序,:,已知片内,RAM ADR1,开始的单元依次从低位到高位存放有,L,个字节的无符号数,片外,RAM ADR2,开始的单元也依次从低位到高位存放有,L,个字节的无符号数。请编一个加法程序,将他们的和存放在,ADR1,开始的连续单元中。,2),算术运算子程序,例,4.11,多字节无符号数相加,R0,:片内,RAM,地址指针,初值为,ADR1,DPTR:,片外,RAM,地址指针,初值为,ADR2,每完成一个字节的加法后,,R0,、,DPTR,各自加,1,,调整为加数、被加数下一待加字节的地址。,R2,:计数器。存放待加的字节数,每完成一个字节的加法后,内容减,1,,当,R2=0,时,程序结束。,开始,#ADR1(R0),#ADR2(DPRTR),#L(R2),C,清零,(R0)+(DPTR)(A),(A)(R0),(R0)+1(R0),(R1)+1(R1),(R2)-1(R2),(R2)=0?,Y,N,出口,初始化,设初值,循环体,工作部分,修改,循环体,参数,判别,程序流程框图:,TAB:AJMP CODE0 ;关键码为0,转CODE0执行,MOV R2,#60H ;设负数地址指针,MOV R3,A ;,(R2)-1(R2),MOV R0,#40H ;设源数地址指针,1)带符号数的最高位为符号位,可通过最高位判断正负:“0”表示正数,“1”表示负数。,MOV R1,A ;存正数,;外104H单元中,片内RAM的EGA单元中有一个大写的英文字母,要求将此字母在英文字母表中的位置送入片内的COUNT单元中,如EGA单元中字母为I时,则COUNT单元中需送入数字9。,MOV A,R3 ;,ORG 1000H,查表就是把事先计算或测得的数据按照一定的顺序编制成表格存放在存储器中,然后根据输入的数据,从表格中查出所需的结果。,INC R1,SJMP LAST ;相等转LAST,要求将其中的正数存入50H开始的连续单元中,负数存入60H开始的连续单元中,并将正数、负数和零的个数分别存入70H、71H、72H单元中。,MOV A,R0 ;片内RAM105单元内容送累加器,设MCS-51单片机内部RAM从40H开始的连续16个单元中,每个单元中分别存放有单字节的带符号数。,参考程序,ORG 1000H,NSADD,:,MOV R0,,,#ADDR1;,设被加数的地址指针,MOV DPTR,,,#ADDR2 ;,设加数的地址指针,MOV R2,,,#L ;,设循环计数器初值,CLR C,LOOP,:,MOVX A,,,DPTR ;,取加数,ADDC A,R0 ;,两数相加,MOV R0,A ;,存和,INC R0 ;,调整被加数地址指针,INC DPTR ;,调整加数地址指针,DJNZ R2,LOOP ;,未加完,继续,RET ;,返回,1.,用硬件电路实现,2.,定时器实现,3.,软件延时,定时(或延时)方法:,3),延时程序,谢谢观看,
展开阅读全文