第四章 单片机流程控制

合集下载

MCS51单片机第4章

MCS51单片机第4章

功能:将赋值项n的值赋予字符名称x。程序中凡出现该字符名 称x就等同于该赋值项n,其值在整个程序中有效。赋值项n可 以是常数、地址、标号或表达式。在使用时,必须先赋值后使 用。
“字符名称”与“标号”的区别是“字符名称”后无冒 号,而“标号”后面有冒号。
(4)定义字节伪指令DB 格式:[标号:] DB x1, x2,„, xn
(4)循环体是循环程序中重复执行的部分,应仔细推敲,合理安 排,应从改进算法、选择合适的指令入手对其进行优化,以达到 缩短程序执行时间的目的。
查表程序设计
查表:根据存放在ROM中数据表格的项数来查找 与它对应的表中值。
适用场合:主要应用于数码显示、打印字符的转 换、数据转换等场合。
查表程序设计 1. 采用 MOVC A, @A+DPTR 指令查表程序的设计方法
(1)建立相应的函数(设自变量为X)。 (2)计算出这个表中所有的函数值Y。将这群函数值按顺 序存放在起始(基)地址为TABLE的程序存储器中。 (3)将表格首地址TABLE送入DPTR,X送入A,采用查表指 令MOVC A, @A+DPTR完成查表,就可以得到与X相对应的Y 值于累加器A中。
解:每次求和的过程相同, 可以用循环程序实现。16 个二进制无符号数求和, 循环程序的循环次数应为1 6次(存放在R2中),它们 的和放在R4, R5中(R4存 高8位,R5存低8位)。程 序流程图如右图所示。
程序如下:
START: ORG 1000H MOV R0, #30H MOV R2, #10H MOV R4, #00H MOV R5, #00H MOV A, R5 ADD A, @R0 MOV R5, A CLR A ADDC A, R4 MOV R4, A INC R0 DJNZ R2, LOOP SJMP $ END

单片机顺序控制课程设计

单片机顺序控制课程设计

单片机顺序控制课程设计一、课程目标知识目标:1. 学生能理解单片机的基本原理和功能,掌握顺序控制的基本概念。

2. 学生能掌握单片机编程中的顺序控制指令,并应用于实际电路中。

3. 学生能解释并分析单片机顺序控制在实际应用中的工作原理。

技能目标:1. 学生能运用所学知识,设计并编写简单的单片机顺序控制程序。

2. 学生能对设计的顺序控制系统进行调试和故障排查,提高解决问题的能力。

3. 学生能通过实际操作,提升动手实践能力和团队协作能力。

情感态度价值观目标:1. 学生能培养对单片机及编程的兴趣,激发学习的积极性和主动性。

2. 学生在学习过程中,养成严谨、细心的态度,提高自我管理和约束能力。

3. 学生通过团队协作,培养沟通、交流和合作意识,增强集体荣誉感。

课程性质:本课程为实践性较强的课程,结合理论知识与实际操作,培养学生动手实践能力和创新能力。

学生特点:学生具备一定的单片机基础知识,具有较强的学习兴趣和动手欲望,希望通过实际操作提高自己的技能。

教学要求:教师需采用任务驱动法、案例教学法等教学方法,引导学生主动探究、积极实践,注重培养学生的创新意识和实际操作能力。

同时,关注学生的个体差异,因材施教,使每位学生都能在课程中取得进步。

通过分解课程目标为具体的学习成果,便于教学设计和评估的实施。

二、教学内容1. 单片机基础回顾:主要包括单片机的组成、工作原理和功能特点,重点复习单片机的内部结构及寄存器的作用。

2. 顺序控制原理:介绍顺序控制的概念、分类及其在单片机系统中的应用,分析顺序控制程序的编写方法。

3. 编程指令学习:学习单片机顺序控制相关指令,如跳转、循环等,并掌握其在编程中的应用。

4. 实践操作:设计简单的顺序控制程序,如流水灯、温度控制器等,让学生动手实践,提高编程和调试能力。

5. 故障分析与排查:分析在实际操作中可能出现的故障,教授学生如何进行排查和解决。

6. 案例分析与讨论:引入实际应用案例,让学生分组讨论,分析顺序控制在案例中的作用和实现方法。

单片机控制系统的开发流程

单片机控制系统的开发流程

单片机控制系统的开发流程一、引言单片机控制系统是一种应用广泛的嵌入式系统,具有体积小、功耗低、成本低等优点。

开发单片机控制系统需要经过一系列的步骤和流程。

本文将详细介绍单片机控制系统的开发流程。

二、需求分析在开发单片机控制系统之前,我们首先需要明确系统的需求。

需求分析是整个开发流程的关键步骤,它包括对系统功能、性能、接口、可靠性等方面进行详细的分析和定义。

在需求分析阶段,我们需要与用户充分沟通,确保对系统需求的准确理解。

三、系统设计在需求分析的基础上,我们进行系统设计。

系统设计是将需求分解为模块和功能的过程。

在单片机控制系统的设计中,需要确定硬件平台、选择合适的单片机型号、设计电路原理图、选择合适的外设等。

同时,还需进行软件设计,包括编写程序流程图、确定算法等。

四、硬件开发硬件开发是指根据设计要求,进行电路板的布线和焊接工作。

在硬件开发阶段,我们需要绘制电路板布线图,选择合适的元器件,并进行电路板的制作。

在制作过程中需要注意电路板的布线规范和焊接质量,确保电路的稳定性和可靠性。

五、软件开发软件开发是单片机控制系统开发的重要环节,它包括编写程序、调试、测试和优化等步骤。

在软件开发中,我们可以使用编程语言如C语言、汇编语言等来编写程序。

程序的编写需要根据系统设计的要求,实现相应的功能。

在编写过程中,需要进行调试和测试,确保程序的正确性和稳定性。

同时,还需要进行性能优化,提高系统的运行效率。

六、系统集成系统集成是将硬件和软件组合在一起,形成完整的单片机控制系统的过程。

在系统集成中,我们需要将编写好的程序下载到单片机中,与硬件平台进行连接,进行功能测试和调试。

在测试过程中,需要验证系统的功能是否符合需求,是否稳定可靠。

七、系统调试和优化在系统集成之后,我们需要进行系统的调试和优化。

在调试过程中,需要排除硬件和软件方面的问题,确保系统的正常运行。

同时,还可以对系统进行优化,提高系统的性能和可靠性。

八、系统验收和发布在系统调试和优化完成后,我们进行系统的验收。

4 第四章 C51流程控制语句精品资料

4 第四章 C51流程控制语句精品资料
else if (score>=80) printf(“Your result is an B\n”);
else if (score>=70) printf(“Your result is an C\n”);
else if (score>=60) printf(“Your result is an D\n”);
{ 局部变量定义; 语句1; 语句2;
} 复合语句在执行时,其中的各条单语句按顺序依次执行,整个复 合语句在语法上等价于一条单语句,因此在C51中可以将复合语句视为 一条单语句。通常复合语句出现在函数中,实际上,函数的执行部分 (即函数体)就是一个复合语句;复合语句中的单语句一般是可执行 语句,此外还可以是变量的定义语句(说明变量的数据类型)。在复 合语句内部语句所定义的变量,称为该复合语句中的局部变量,它仅 在当前这个复合语句中有效。利用复合语句将多条单语句组合在—起, 以及在复合语句中进行局部变量定义是C51语言的一个重要特征。
(4)case语句和default语句的出现次序对执行过程没有影响。 (5)每个case语句后面可以有“break”,也可以没有。有break语句, 执行到break则退出switch结构,若没有,则会顺次执行后面的语句,直 到遇到break或结束。 (6)每一个case语句后面可以带一个语句,也可以带多个语句,还可 以不带。语句可以用花括号括起,也可以不括。
TH1=0xF3;
TR1=1; for (i=1;i<=100;i++) s=s+i; //累加1~100之和在s中 printf(“1+2+3……+100=%d\n”,s);
成立 语句A
条件P
不成 立 语句B

第4章 MCS-51单片机汇编语言程序设计

第4章 MCS-51单片机汇编语言程序设计
开始
程序清单:
送转移地址序号
A,R3 ;取序号 A ;序号乘2 DPTR, #JTAB ;32个子程序 首地址送DPTR JMP @A+DPTR ;根据序号转移 JTAB: AJMP ROUT00 ;32个子程序首地址 AJMP ROUT01 … MP: MOV RL MOV AJMP ROUT31
第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计
【例4-1】
双字节二进制数求补。
程序说明:对R3(高8位)、R2(低8位)中的二进制定 点数取反加1即可得到其补码。
开始
程序清单:
BINPL:MOV A,R2 CPL A ADD A,#01H MOV R2,A MOV A,R3 CPL A ADDC A,#00H MOV R3,A RET ;低位字节取反 ;加1 ;低位字节补码送R2 ;高位字节取反 ;加进位 ;高位字节补码送R3
散转生成正确偏移号
置换指令地址表首址
转入R3指示的程序
AJMP
……
AJMP
第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计
3.循环程序
包括:循环初始化、循环处理、循环控制
开始 置初值 循环体 循环结束? Y 循环修改 N 循环体 循环结束? N Y 结束 循环修改 结束 开始 置初值
;调用查表子程序 ; 暂存R1中 ;调查表子程序 ;平方和存A中 ;等待
取第一个数→A 调查表子程序 结果存入R1 取下一个数→A 调查表子程序 两数平方相加 存结果
子程序清单:
SQR: INC A ;加RET占的一个字节 MOVC A,@A+PC ;查平方表 RET TAB: DB 0,1,4,9,16 DB 25,36,49,64,81 END

第四章 流程控制 单片机C

第四章 流程控制 单片机C

第四章 Cx51的流程控制C语言是结构化编程语言,结构化语句有若干模块组成,每个模块中包含着若干个基本结构,每个基本结果中可以又若干调语句。

归纳起来,C语言又三种基本结构:1)顺序结构;2)选择结构;3)循环结构。

一、选择控制语句C51 的选择语句主要有if 语句和switch/case 语句。

1、 if 语句1)基本结构if(表达式) {语句}表达式为真执行花括号中的语句,否则跳过花括号中的语句。

如果没有花括号,执行紧随其后的一句。

2)C51 提供三种形式的if 语句:① if(表达式){语句;}② if(表达式){语句1;} else {语句2;}③ if(表达式1){语句1;}else if(表达式2){语句2;}else if(表达式3){语句3;}此外,如果一个if 语句中又含有一个或多个if 语句,则称为if 语句嵌套。

在if 语句嵌套中应注意if 与else 的对应关系,else 总是与它前面最近的一个if 语句相对应。

例1:某浮点数的范围在0.000~9999 之间,试编写一个函数返回浮点数的小数点位置。

根据小数点的位置,即可在实际的单片机系统中显示出小数。

解:此题的基本思路是根据浮点数的4 种取值范围给出4 种不同的返回值,可以约定当定浮点数的大小在0.000~9.999、10.00~99.99、100.0~999.9、1000~9999 之间时,分别返回0、1、2 和3。

参考程序如下:int ftochar(float valp){int dotno=0;if(valp<10.0) dotno=0;else if((valp>=10.0)&&(valp<100.0)) dotno=1;else if((valp>=100.0)&&(valp<1000.0))dotno=2;else if(valp>=1000.0) dotno=3;return dotno;}//代码长度298也可以这样编:int ftochar(float valp) {int dotno=0;if(valp>=10.0) dotno=1; if(valp>=100.0) dotno=2; if(valp>=1000.0) dotno=3; return dotno;}//代码长度227自己体会编程技巧(IF语句选择,if2)例2:if(P1_1!=0) {P1_1=0;}//中断取反等例3:if(P1&0xf0)!=0xf0) {……}//检查P1高4位中是否有02、 switch/case 语句switch/case 是C51 的多分支选择语句,它的一般形式如下:switch(表达式){case 常量表达式1:语句1; break;case 常量表达式2:语句2; break;⋯⋯case 常量表达式n:语句n; break;default :语句n+1;}switch 括号中的表达式的值与某一case 后面的常量表达式的值相同时,就执行它后面的语句(可以是复合语句),遇到break 语句则退出switch 语句。

第四章 程序流程控制

第四章 程序流程控制

第四章 程序流程控制 支持两层块循环 一层循环(外循环):BRC0, RSA0, REA0; 二层循环(内循环): BRC1, RSA1, REA1,BRS1;
内循环完成后跳到外循环执行。如果再次进入内循环, 则不需要初始化BRC1,块重复备份寄存器(BRS1) 自动保存内循环块的重复次数。 任何一个块循环内都可以嵌套单指令重复。所以 C55x可以支持三层指令循环。
IVPH: 主机中断向量指针,16位,指向指向256字节的中断向量表 (包括向量:IV16~ IV23)这些中断向量供DSP和主机共 享使用。 INTM: 在状态寄存器ST1_55中的INTM,中断模式位,INTM=1, 禁止所有可屏蔽中断。
5509DSP中的中断
DSP的硬件复位:使这两个指针都指向FFFFh,即指向 0xFFFF00的地址,软件复位对这两个指针没有影响。 一般在程序初始化时设定中断矢量指针的值,防止取非法指令 代码,在修改中断矢量指针(IVPD,IVPH)前应当确定:
什么是中断
5509DSP中的中断
(1)由硬件或软件信号产生的,它使DSP暂停当前程 序转而去执行中断服务程序(ISR),从而可以实时的 进行事件处理。 (2) TMS320C5509支持32个ISR,有的即可以用软 件触发也可以由硬件触发,有的只能由软件触发。 软件中断:由程序指令产生,如:INTR、TRAP、 RESET 硬件中断:由设备的信号产生,可以是外部引脚信 号(外部中断),也可以是片内外设信号(内部中断)。
IFR0和IER0寄存器
第四章 程序流程控制
二、指令重复 指令重复:指重复执行一定次数的一条或者一段指令。包括无条 件单指令重复,有条件单指令重复,块重复三种形式。 1、无条件单指令重复:

单片机 第四章 80C51单片机汇编语言程序设计

单片机 第四章 80C51单片机汇编语言程序设计

(1)绝对调用指令:ACALL addr11 (2)长调用指令:LCALL addr16
(后续)
4.2.4 子程序设计
3.注意设置堆栈指针和现场保护 4.最后一条指令必须是RET指令 5.子程序可以嵌套,即子程序可以调用子程序
(接上)
6.在子程序调用时,还要注意参数传递的问题
子程序的基本结构
MAIN: ┇ ;MAIN为主程序或调用程序标号 ┇ LCALL SUB ;调用子程序 ┇ SUB:PUSH PSW PUSH ACC ;现场保护 ;
过程B
是 出口 (c) 循环结构
出口 (b) 分支结构
4.2.1
顺序程序结构
是汇编语言程序的最简单也是最基本的程序结 构。程序执行时一条接一条地按顺序执行指令, 无分支、循环以及调用子程序。 ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV A , #30H ADD A , #58H MOV 30H , A SJMP $
二、定时程序 (2)多重循环定时程序(单片机频率为6MHz) 例 MOV R5,#TIME1 LOOP2: MOV R4,#TIME2 ;单周期指令 LOOP1: NOP ;单周期指令 NOP DJNZ R4,LOOP1 ;双周期指令 DJNZ R5,LOOP2 ;双周期指令 RET 公式: 循环体时间=(TIME2*4+2+1)*TIME1*2µs 总时间=循环体时间+4µs
机器编辑->交叉汇编->串行传送
(过程图见教材92页)
单片机的开发过程
设计硬件 软件编程 软件仿真调试 源代码烧入单片机 插入单片机脱机工作 模数电路/单片机硬件 MCS51汇编语言/C
计算机/MEDWIN环境
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第四章 Cx51的流程控制C语言是结构化编程语言,结构化语句有若干模块组成,每个模块中包含着若干个基本结构,每个基本结果中可以又若干调语句。

归纳起来,C语言又三种基本结构:1)顺序结构;2)选择结构;3)循环结构。

一、选择控制语句C51 的选择语句主要有if 语句和switch/case 语句。

1、 if 语句1)基本结构 if(表达式) {语句}表达式为真执行花括号中的语句,否则跳过花括号中的语句。

如果没有花括号,执行紧随其后的一句。

2)C51 提供三种形式的if 语句:① if(表达式){语句;}② if(表达式){语句1;} else {语句2;}③ if(表达式1){语句1;}else if(表达式2){语句2;}else if(表达式3){语句3;}此外,如果一个if 语句中又含有一个或多个if 语句,则称为if 语句嵌套。

在if 语句嵌套中应注意if 与else 的对应关系,else 总是与它前面最近的一个if 语句相对应。

例1:某浮点数的范围在0.000~9999 之间,试编写一个函数返回浮点数的小数点位置。

根据小数点的位置,即可在实际的单片机系统中显示出小数。

解:此题的基本思路是根据浮点数的4 种取值范围给出4 种不同的返回值,可以约定当定浮点数的大小在0.000~9.999、10.00~99.99、100.0~999.9、1000~9999 之间时,分别返回0、1、2 和3。

参考程序如下:int ftochar(float valp){int dotno=0;if(valp<10.0) dotno=0;else if((valp>=10.0)&&(valp<100.0)) dotno=1;else if((valp>=100.0)&&(valp<1000.0)) dotno=2;else if(valp>=1000.0) dotno=3;return dotno;}//代码长度298也可以这样编:int ftochar(float valp){int dotno=0;if(valp>=10.0) dotno=1;if(valp>=100.0) dotno=2;if(valp>=1000.0) dotno=3;return dotno;}//代码长度227自己体会例2:if(P1_1!=0) {P1_1=0;}例3:if(P1&0xf0)!=0xf0) {……}//检查P1高4位中是否有0 2、 switch/case 语句switch/case 是C51 的多分支选择语句,它的一般形式如下:switch(表达式){case 常量表达式1:语句1; break;case 常量表达式2:语句2; break;⋯⋯case 常量表达式n:语句n; break;default :语句n+1;}switch 括号中的表达式的值与某一case 后面的常量表达式的值相同时,就执行它后面的语句(可以是复合语句),遇到break 语句则退出switch 语句。

若所有的case 中的常量表达式的值都没有与表达式的值相匹配时,就执行default 后面的语句。

每一个case 的常量表达式必须是互不相同的,否则将出现混乱局面。

各个case 和default 出现的次序,不影响程序的执行结果。

如果在case 语句中遗忘了break 语句,则程序执行了本行之后,不会按规定退出switch语句,而是将执行后续的case 语句。

例1、 AT89C51 单片机的P1.0 和P1.1 引脚接有两只按键,其4 种逻辑组合分别点亮由P2.0~P2.3 控制的4 只LED(高电平点亮),试编程实现此功能。

解:参考程序如下#include <at89x51.h>void main(){data unsigned char a;do{a=P1;a=a&0x03; //,读低2位P2=P2&0xf0;//P2低4位置0,关LED switch (a){Case 0:P2=P2|0x01;break;Case 1:P2=P2|0x02;break;Case 2:P2=P2|0x04;break;Case 3:P2=P2|0x08;}}while(1);//注意while(1)}二、循环语句循环程序主要有“当型”循环和“直到型”循环两种,C51 对此提供了4 种实现方法。

1、基于 if 和goto 构成的循环采用if 和goto 可以构成“当型”循环程序,其格式如下:loop:if(表达式){语句;goto loop;}loop 是语句标号,或称为标识符,原则上任何一条语句都可以有标号,标号和语句用“:”号分开。

采用if 和goto 也可以构成“直到型”循环程序,其格式如下:loop:{语句;if(表达式)goto loop;}goto 语句为无条件转向语句,它的一般形式是:goto 语句标号;按照软件工程的有关思想,在程序设计中应避免使用或尽量少使用goto,以提高程序的可读性。

有时候使用goto语句非常方便,2、基于while 语句构成的循环while 语句只能用来实现“当型”循环,其一般格式如下:while(表达式){语句;//可以是复合语句}while 语句首先计算表达式的值;若其值为非0,则执行内嵌语句,若其值为0,则退出while 循环。

例1:串行通信时,每发送1帧,需要等待发送完,经常用下面语句:while(TI==0);//注意后面的“;”TI=0;例2、对于仪器,开电源后一直工作,可以用下面的语句:while(1) { 程序}3、基于do-while 语句构成的循环do-while 语句只能用来实现“直到型”循环,其一般格式是:do{语句;//可以是复合语句} while (表达式);do-while 语句的特点是先执行内嵌的语句;再计算表达式,如果表达式的值为非0,则继续执行内嵌的语句,直到表达式的值为0 时结束循环。

例1:实型数组sample 存有10 个采样值,编写一个函数返回其平均值(即平均值滤波程序)。

解:参考程序如下:float avg(float *sample){float sum=0;char no=0;do{sum += sample[no];no++;} while(no<10);return (sum/10);}4、基于for 语句构成的循环for 语句的一般形式为:for (表达式1;表达式2;表达式3){语句;}它的执行过程是:首先求解初始化表达式1;其次求解表达式2,判断是否满足循环条件,若其值非0,则执行内嵌语句,如无花括号,执行紧随其后的一句语句;否则退出循环;最后求解尺度增量表达式3,并回到第2 步。

在for 语句中,可以没有表达式1、表达式2 或表达式3,若三个表达式都没有,则相当于一个死循环。

如果其后紧跟一个“;”,则为空循环,常用于延时;例1、求自然数1~100 的累加和,并用printf( )函数通过单片机的串口显示在终端上。

(12MHz晶振)解:参考程序如下:#include<at89x52.h>#include<stdio.h>main( ){int sum=0;int n;SCON = 0x50; /* 如用Keil C 进行模拟调试或使用printf( ),必须初始化SCON*/TMOD = TMOD|0x20; // 定时器T1 工作在方式2,用作波特率控制TH1 = 0xe6; // 9600bps 对应T1 的时间常数为0xe6TL1 =0xe6;TR1 = 1; // 启动T1TI = 1; //启动发送,以发送第一个字符for (n=1;n<=100;n++){sum=sum+n;printf("%d ",sum);}}(求和输出)例2:for(;;){语句}//无限循环语句,直到关机例3:for(t=0;t<sum;t++);//在程序中延时(for循环)例4:延时子程序及延时时间计算(延时程序)#include<at89x51.h>#include<intrins.h>void relay(unsigned int x){unsigned char j;while(x--){for(j=0;j<199;j++)_nop_();}}main(){unsigned int x=10;relay(x);}C:0x0000 02001A LJMP C:001A3: void relay(unsigned int x)4: {5: unsigned char j;6: while(x--)查延时时间:将晶振频率设置的和实际使用频率相同,用执行到光标处,从进入延时前,记下register中sec的时间t1,然后运行到延时结束,记下时间t2,延时时间t=t2-t1 (演示)该方法叫软件延时,最大的缺点是延时时占用了CPU,不能执行其他程序,因此不适合做时钟,时钟要用定时器。

编程例:while(1){ if(P0_4==0){for(i=0;i<200;i++);//防键盘抖动while(P0_4==0);celiang();//调测量函数,}if(P2_2==0){for(i=0;i<200;i++);if(P2_2==0)xiaoyan();//调用传感器校验……………} }C:0x0003 EF MOV A,R7 (1)C:0x0004 1F DEC R7 (1)C:0x0005 AA06 MOV R2,0x06 (2)C:0x0007 7001 JNZ C:000A (2)C:0x0009 1E DEC R6 (1)C:0x000A 4A ORL A,R2 (1)。

相关文档
最新文档