新MCS 51单片机原理及嵌入式系统应用 教学课件 王忠飞 第1-5章 第3章.pptVIP

新MCS 51单片机原理及嵌入式系统应用 教学课件 王忠飞 第1-5章 第3章.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
main(void)     // 主程序(C语言必须使用的关键函数) {   delay(10);      // 大约延时2 ms   Counter = InitValue; // 给变量Counter(计数器)赋初始值   while(1){      // 无限循环     delay(100);   // 大约延时20 ms     Counter++;   // 变量Counter(计数器)加1     if(Counter==0xFF)   // 判断Counter是否为FFH,是则重新赋初始值       Counter = InitValue;      // 给变量Counter(计数器)重新赋初始值   } } 3.3.2 循环及程序转移控制   任何程序语言编制的程序中,循环和转移控制总是被频繁使用。按照执行次数划分,循环分为有条件多次循环和无穷次循环(又称死循环)。MCS-51系列单片机的汇编语言实现有条件多次循环程序必须使用条件转移指令来实现,所以掌握MCS-51汇编语言的循环程序必须首先掌握条件转移指令的使用。在循环程序中常用的条件转移指令包括:JZ、JNZ、DJNZ、CJNE、JC、JNC、JB、JNB和JBC等。   1.计算n个数据之和   传入(变量):数据个数存放在R4中,存放数据的起始地址在R0中。   传出(变量):求得的和存放在R4(高8位)和R5(低8位)中。   实现分析:有n个无符号字节型数据,数据个数最多255个,和的最大值可以用两个字节表示。 Sum:   PUSH Acc    ;保存A的内容在堆栈区   PUSH B    ;保存B的内容在堆栈区   PUSH PSW   ;保存PSW的内容在堆栈区   MOV A,#00H  ;首先将和的低8位清零   MOV B,#00H ;首先将和的高8位清零   CLR C    ;将进位位清零   MOV R5,#00H ;R5寄存器清零 Sum1:   ADDC A,@R0 ;将一个字节的数据加到和的低字节中   MOV R5,A  ;保存和的低字节到R5中   CLR  A     ;累加器A清零   ADDC A,B  ;将进位位加到和的高8位中   MOV B,A  ;将和的高8位仍保存在B中   MOV  R5,A ;将临时保存在R5中和的低8位传送到A中   INC  R0    ;数据缓冲区指针加1,指向下一个字节   DJNZ R4,Sum1 ;累加是否继续?累加完成,和存放在 B(高8位)和A(低8位)中   MOV  R4,B ;将和的高8位传送到R4中,和的低8位  已经存放在R5中   POP  PSW  ;从堆栈区恢复PSW的内容   POP  B   ;从堆栈区恢复B的内容   POP  Acc   ;从堆栈区恢复A的内容   RET   2.循环等待从串行口接收字符串   传入(变量):准备接收的字符串长度存放在R4中,存放字符串的首地址在R0中。   传出(变量):接收到的字符串(R0指向字符串首地址)。   实现分析:程序需要判断串行口是否有数据,如果没有,则等待;如果有数据,则读取数据并保存到字符串中,然后根据接收数据个数判断是否完成接收。 ReceiveString:   PUSH Acc    ;保存A的内容在堆栈区   PUSH 02H   ;保存R2的内容在堆栈区   MOV R2,#00H  ;准备接收之前,将接收数据计数器清零 RecStr:   JNB RI,RecStr     ;检查串口接收器中是否有数据,没有则等待   CLR RI     ;有数据,将接收器的标志清零   MOV A,SBUF ;从接收器中读取数据   MOV @R0,A ;数据保存到指针所指的地址中   INC R0    ;指针加1   INC R2    ;接收到的数据个数加1   MOV A,R2   XRL A,R4   JZ ReceiveStringOK   ;接收到的数据个数等于期望接收的数据个数,接收完成   LJMP RecStr   ;接收未完成,跳转到继续接收处 ReceiveStringOK:   POP 02H     ;从堆栈区恢复R2的内容   POP Acc      ;从堆栈区恢复A的内容 RET   这个例子中,使用JNB、JZ两个条件跳转指令和LJMP无条件跳转指令控制程序转移。   本节的第一个完整的汇编语言程序例子中的“延时子程序”是典型的多重循环例子,其他的条件跳转、无条件跳转指令的应用在后面的例子中使用都比较频繁,这里不继续举例。 3.3.3 散转和查表的

您可能关注的文档

文档评论(0)

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

1亿VIP精品文档

相关文档