单片机技术第4章.ppt

  1. 1、本文档共61页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
DELAY: MOV R6,#n1 DL1: MOV R5,#n2 DL2: NOP NOP DJNZ R5,DL2 DJNZ R6,DL1 SJMP $ 【例4-13】设计时间为t的延时程序。 循环程序的一个用处就是设计延时程序,在LED动态扫描和键盘扫描“消抖”中经常要用到,一般的延时用双重循环就可以了。以下是双重循环延时的基本程序: 在上述程序中,“MOV R6,# n1”运行了1次,“MOV R5,# n2”和“DJNZ R6,DL1”各运行了n1次,“NOP NOP DJNZ R5,DL2”运行了n1×n2次(每次时间为4T),因为每条指令的运行时间(即指令周期)是已知的,所以上述程序运行的时间是能够精确计算出来的。在要求不高的情况下,上述时间近似为(n2∶n1越大,误差越小): t ≈ 4×T×n1×n2 时间的长短除了与n1、n2有关之外,还可以用增加或减少“NOP”对时间进行调整。延时程序常常以子程序形式出现,只要将末句“SJMP $”改为“RET”即可。 查表程序设计 在单片机汇编语言程序设计中,查表程序的应用非常广泛,在LED、LCD显示程序设计中经常用到查表程序,另外可以将单片机无法实现的一些计算(如函数的计算)直接将结果存到内部,需要时一一“对号”读取就可以了。 【例4-14】在程序中定义一个0~9的平方表,利用查表指令找出累加器A=05H的平方值。 ORG 0000H MOV DPTR,#TABLE ;表首地址→DPTR(数据指针) MOV A,#05 ;05→A MOVC A,@A+DPTR ;查表指令,25→A,A=19H SJMP $ ;程序暂停 TABLE: DB 0,1,4,9,16,25,36,49,64,81 ;定义0~9平方表 END 有关查表程序的其他应用可以参考其他资料,LED显示扫描时,从BCD转到字型码的查表程序可以参考第8章,在这里大家要理解查表的原理:查表实际上是人为安排的一种巧合,程序本身没有在“查”,“对号入座”是查表程序设计的基本思想。 散转程序设计 在上面的分支程序中可以看到,它是在两种可能的情况下作出某种选择,非此即彼,而在实际应用中,常常会遇到需要从两个以上的条件中选择一个,这种程序称为多分支程序或散转程序,其结构如图4-9所示。MCS-51单片机指令系统中专门提供了散转指令,利用散转指令可以方便地解决看似复杂的问题,请看下面的例子。 图4-9 散转程序结构 【例4-15】编写要求根据R1的内容转向各个操作程序的程序。即当: (R1)=0时,转向GO_0 (R1)=1时,转向GO_1 … (R1)=n时,转向GO_n 解:程序清单如下: MOV A,R1 RL A ;分支序号值乘2,若下面转移指令用LJMP则要乘3 MOV DPTR,#FIRST ;转移指令表首址 JMP @A+DPTR ;转向形成的散转地址 FIRST: AJMP GO_0 ;转移指令表 AJMP GO_1 … AJMP GO_n 有关散转的过程可以参考散转指令“JMP @A+DPTR”的说明,散转常用在键盘的程序的功能处理,如键盘号为0时,转向GO _0,键盘号为1时,转向GO_1等。 另外,散转程序也可以连续用“CJNE”指令来实现,只是程序显得“肥”,不够精简。当然散转程序也有约束条件,即只能对有规律的数据进行散转。如在例4-15中,若将某个数据改变,散转时就会走错路,而用“CJNE”却不会有这样的条件约束。从这个角度上来说,指令不必每条都会用,用什么样的指令,最后取决于编程者的习惯。当然高效率的程序还是要提倡的。例4-15用“CJNE”来实现可以表示如下。 MOV A,R1 ;取出数据 CJNE A,#00 H,NEXT1 ;是否为00H,否,继续比较 AJMP GO_0 NEXT1: CJNE A,#01H,NEXT2 ;是否为01H,否,继续比较 AJMP GO_1 NEXT2: CJNE A,#02H,NEXT3 ;是否为02H,否,继续比较 AJMP GO_1 … NEXTn: CJNE A,#0nH,OTHER ;是否为0nH,否,其他或停止 AJMP GO_n 子程序程序设计 在解决实际问题时,经常会遇到一个程序中多次使用同一个程序段,例如延时程序、查表程序、算术运算程序等功能相对独立的程序段。 在实际的单片机应用系统软件设计中,为了程序结构更加清晰,易于设计,易于修改,增强程序可读性,同时便于程序的移植,基本上都要使用子程序结

文档评论(0)

一天一点 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档