版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
任务4流水灯控制器的设计教学规划
知识重点:
知识难点:教学方式:(1)C51基本控制语句(2)C51函数及预处理C51函数及其调用以任务入手,通过完成多路信号灯控制器设计,掌握C51语句及函数调用。4.1C51语句4.2案例4:多路信号灯控制器设计4.3C51函数及预处理4.4案例5:流水灯控制器设计目录4.1C51语句4.1.1简单语句与复合语句C51的语句按其复杂度可以分为简单语句和复杂语句。可以用花括号“{”和“}”把一些语句组合在一起,使其在语法上等价于一个简单语句,这样的语句就称之为复合语句。复合语句中最后一个语句中最后的分号不能忽略不写;结束一个复合语句的右花括号之后不能带分号。if(a>b){t=a;a=b;b=t;}上述例子是C语言用得很多的程序段,当a>b时,执行复合语句,使a和b的值互换。4.1.2分支控制语句分支控制语句主要包括if...else...语句、if...语句、多级if...else...语句和switch语句,共4种形式。前两种语句用于两分支选择结构,后两种语句用于多分支选择结构。1.if…语句
if(表达式)
表达式2.if…else…语句
if(表达式){分支一}else{分支二}表达式分支1分支2TF[实例4-1]如图4-1所示,P0口接8只发光二极管,P1.0接一个按钮,要求将按钮按下时,左边四个发光二极管亮,当按妞放开时,右边四个发光二极管亮。图4-1一个按钮控制二极管发光电路#include<reg51.h>sbitp10=P1^0;main(){while(1){
if(p10==1)P0=0x0f;
elseP0=0xf0;}}#include<reg51.h>sbitp10=P1^0;voidmain(){while(1){
if(p10==1)P0=0x0f;if(p10==0)P0=0xf0;}}a)、If语句实现b)
if…else语句实现3.多级if…else…语句if(表达式1){
分支一}elseif(表达式2){
分支二}elseif(表达式3){
分支三}……else{
分支n}表达式1分支1表达式2分支2表达式3分支3分支n真假假真真…………假假多级if...else...语句的流程图如图4-2所示。【实例4-2】如图4-3所示,P0口接8只发光二极管,P1.0、P1.1分别接一个按钮S1,S2,要求当没有按钮按下时,8只发光二极管全灭,当S1按钮按下时,左边4个亮,当S2按钮按下时,右边4个亮,当2个按钮按下时,全亮。#include<reg51.h>sbitp10=P1^0;sbitp11=P1^1;voidmain(){while(1){if(p10==0&&p11==0)P0=0
;
//当两个按键按下时全亮
elseif(p11==0)P0=0x0f
;
//S2按键按下时右边四个亮
elseif(p10==0)P0=0xf0
;
//S1按键按下时左边四个亮
elseP0=0xff
;
//S1、S2没有键按下时,8灯全灭}}4.switch语句switch(整形或字符型变量){case值1:分支一;break;case值2:分支二;break;……case值n:分支n;break;default:分支n+1或空语句;}图4-5switch语句流程图[例4-3]P1.0~P1.3接4个按键,P1.4~P1.7接4个发光二极管,现要求一般情况下,4个发光二极管全亮,如果只按S1时D1灭,只按S2时D2灭,依此类推。源程序清单:#include<reg51.h>voidmain(){unsignedcharct1;P1=0X0F;while(1){ct1=P1;}}ct1=ct1&0x0f;switch(ct1){case0x0e:P1=0x8f;break;case0x0d:P1=0x4f;break;case0x0b:P1=0x2f;break;case0x07:P1=0x1f;break;default:P1=0x0f;}4.1.3循环控制语句
比如,洗衣服的过程就包含循环结构。洗衣服的过程通常包括“放人洗衣粉”、“搓洗”、“冲洗”这些步骤,直到把衣服洗干净。程序中使用的循环结构也就是重复,指示单片机重复一条或多条指令,直到满足某种条件,这时才停止重复这些指令。C51中可以用while语句、for语句和do...while语句来实现循环结构。1.while语句while(表达式){循环体}语句循环条件?FT【实例4-4】使用while语句编写程序,实现从1到100的累加。#include<reg52.h>#include<stdio.h>voidmain(){unsignedinti=1;unsignedintsum=0;SCON=0x52;//设置串行口控制寄存器SCONTMOD=0x20;//定时器1工作于方式2TH1=0xE8;//11.0592MHz,1200波特率TR1=1;//启动定时器1while(i<=100){sum=sum+i;i++;}printf(“sum=%d\n”,sum);while(1){}}2.for语句for(表达式1;表达式2;表达式3){循环体}表达式1为循环控制变量初始化表达式表达式2为循环条件表达式表达式3为循环控制变量增值表达式“增值”仅仅是指循环控制变量发生了变化,不要按其字面意思去理解。在单片机应用中,经常要写延时程序,利用for语句可以实现延时,程序段如下所示:上述程序段中,循环体为空,即循环体不需要做任何事情。根据图4-8所示的流程图可以看出,虽然每次循环没有执行任何语句,但给变量i自动加1,一直加到30000退出循环。inti;inti;for(i=0;i<30000;i=++)或for(i=0;i<30000;i++);{}3.do…while语句4.嵌套的循环结构实际应用中,经常要用到嵌套的循环结构。在嵌套循环结构中,内层循环需要置于称之为外层循环的另一个循环中。3种循环语句还可以互相嵌套。【实例4-7】如图4-9所示,P0.0接一个发光二极管,P1.0接一个按钮,要求当按钮按下时,发光二极管不停地闪烁;当按钮放开时,停止闪烁。编写程序如下:#include<reg51.h>sbitp10=P1^0;sbitp00=P0^0;voidmain(){while(1){while(p10==0)p00=~p00;
}}unsignedinti;for(i=50000;i>0;i--);4.1.4
转移语句1.break语句break;在switch语句中,break语句用来使流程跳出switch结构,继续执行switch之后的语句;在for语句中,break语句用来使流程跳出循环体,接着执行循环后面的语句。2.continue语句continue;continue语句的作用是跳过本次循环中剩余的循环体语句,立即进行下一次循环【例4-5】针对图4-9,若与P0.0相连的发光二极管不停地闪烁,当与P1.0相连的按键按下时停止闪烁。#include<reg51.h>sbitP10=P1^0;sbitP00=P0^0;voidmain(){inti;while(1)
{P00=~P00;for(i=30000;i>0;i++);if(P10==0)
{P00=1;break;
}//退出循环
}
while(1);}【例4-6】电路如图4-9示,要求与P0.0连接的发光二极管不停地闪烁,当按下与P1.0相连的按钮时,发光二极管暂停闪烁,放开按钮时,发光二极管继续闪烁#include<reg51.h>sbitP10=P1^0;sbitP00=P0^0;voidmain(){inti;while(1){
if(P10==0)continue;
//跳过本次循环,发光二极管暂停闪烁P00=~P00;for(i=30000;i>0;i++);}}案例4.多路信号灯控制器设计要求单片机外接S1—S4四个按键,用于控制3个LED灯(分别为红色黄色绿色)发光,按下S1键红色LED灯亮,按下S2键黄色LED灯亮,按下S3键绿色LED灯亮,按下S4键三个灯全亮。单片机的P1.0一P1.2分别接红色LED灯L1、黄色LED灯L2、绿色LED灯L3组成显示电路.,且低电平点亮。按键电路由单片机P3口的P3.2~P3.5分别接四个独立按键S1~S4组成,按键断开时输入为1,按键闭合则输入为0。程序如下:#include<reg51.h>voidmain(){
unsignedcharct1;
P3=0xFF;
ct1=P3;
ct1=ct1&0x3c;}switch(ct1){case0x38:P1=0xfe;break;case0x34:P1=0xfD;break;case0x2c:P1=0xfB;break;case0x1c:P1=0xf8;break;default:P1=0x0f;}4.2C51函数及预处理主函数:每一个C51程序都必须至少有一个函数,以main为名,称为main函数或主函数。main函数是程序的入口,在程序运行时从main函数开始执行。普通函数:main函数之外的函数可以统称为普通函数。普通函数从用户使用的角度划分,可以分为标准函数(即库函数)和用户自定义函数。例如使用printf()时就要把头文件stdio.h包括进来。
4.2.1函数的定义ANSIC标准所定义的形式:类型标识符
函数名(数据类型,形式参数1,数据类型
形式参数2,......){函数体}例如如下代码定义了一个函数,其功能是返回两个数中的较大数。intmax(inta,intb){inttemp;temp=a>b?a:b;returntemp;}函数形式上划分可以分为无参数函数、有参数函数和空函数。类型标识符名函数名(){函数体}1.无参数函数无参数函数往往并不返回函数值,在这种情况下,“类型标识符名”,使用“void”!串行口初始化函数:void
serial_initial(
){SCON=0x52;//设置串行口控制寄存器SCONTMOD=0x20;//定时器1工作于方式2TH1=0xE8;//11.0592MHz,1200波特率TR1=1;//启动定时器1TI=1;}无参数输入不返回函数值2.有参数函数类型标识符名函数名(数据类型名形式参数1,数据类型名形式参数2,……)
{函数体}例:int
max(int
a,intb){
inttemp;temp=a>b?a:b;returntemp;}3.空函数类型标识符
函数名(){}例如,可以按下面定义一个空函数:interror_number(){}调用这个空函数时什么工作也没有做在实际设计中,在开发的初级阶段,程序的功能通常不是十分完整,这时就经常会使用空函数首先搭出程序的框架,再在后续的工作中逐渐扩充.注意:(1)在同一工程中,函数名必须惟一。(2)形式参数在同一个函数中必须惟一,但可以与其他函数中的变量同名。(3)不能在一个函数中再定义函数。(4)在定义函数时应指明函数返回值的类型,如果没有函数返回值,应将设为void,若省略了函数返回值的类型,则默认为int型。(5)函数的返回值是通过函数中的return语句获得的,若不需要返回函数值,可以不要return语句。(6)函数名后面的圆括号不可省略,在圆括号后面也不可加分号(;)。4.2.2函数参数和函数返回值1.形式参数和实际参数在定义函数时函数名后面圆括号中的变量名称称为“形式参数”,简称“形参”在主调函数调用被调函数时,函数名后面圆括号中的表达式称为“实际参数”,简称“实参”。实例[4-7]
实例[4-7]
#include<reg52.h>#include<stdio.h>voidserial_initial(){SCON=0x52;//设置串行口控制寄存器SCONTMOD=0x20;//定时器1工作于方式2TH1=0xE8;//11.0592MHz,1200波特率TR1=1;//启动定时器1}intmax(inta,intb);//a,b为形式参数{inttemp;temp=a>b?a:b;returntemp;}voidmain(){intx,y,z,mx;serial_initial();printf("\nPleaseinput2num:");scanf(”%d%d%d",&x,&y,&z);mx=max(x,y);//x,y为实际参数mx=max(mx,z);//mx、z为实际参数printf("Themaxnumberis%d\n”,mx);while(1){}}2.函数的返回值希望通过函数调用使主调函数能得到一个确定的值,这个值就是函数的返回值。函数的返回值是通过函数中的return语句获得的。如果需要从被调用函数中返回一个函数值,被调函数中必须包含return语句。返回值的类型必须与函数头中的类型标识符名-致,否则以函数头中的类型为准,由系统自动转换。为了明确表示“不带回值”,可以用“void”定义“无类型”(或称“空类型”)。4.2.3函数的原型声明C51语言中,主函数与其他函数是平行的,相对于在同一个源程序文件中的main()函数,其他函数可以在main()函数之前定义。缺点:所有的函数都位于main()函数之前,使得整个源程序文件显得庞杂混乱。原型声明:所有的函数的定义都放在main()函数之后,但要在main()函数之前对其进行原型声明。[实例4-8]其他函数都位于main()函数之前定义[实例4-9]
其他函数都位于main()函数之后定义,要原型声明【实例4-8】【实例4-9】#include<reg52.h>#include<stdio.h>voiduart_init(){SCON=0x50;TMOD=(TMOD&0x0f)|0x20;TH1=0xE8;TR1=1;}voidmain(){uart_init();printf("Functiondefinitionisaheadofmain()function)";while(1){}}#include<reg52.h>#include<stdio.h>voiduart_init();//函数uart_init()
进行函数声明voidmain(){uart_init();printf("Functiondefinitionisaheadofmain()function");while(1){}}voiduart_init(){SCON=0x50;TMOD=(TMOD&0x0f)|0x20;TH1=0xE8;TR1=1;}4.2.4函数的调用1.函数调用的一般形式
函数名(实际参数列表);2.函数调用的3种方式(1)函数语句:把函数调用作为一个语句。此时不要求被调函数返回函数值,只是完成一定的操作。(2)函数表达式:函数出现在一个表达式中,这种表达式称为函数表达式,这时要求函数带回一个确定值来参与运算。(3)函数参数:在主调函数中将函数调用作为另一个函数调用的实际参数。这种在一个函数的过程中又调用了另外一个函数的方式,称为嵌套函数调用。4.2.5内部函数与外部函数1.内部函数
内部函数只能被本文件中其他函数所调用。static类型标识符名函数名(数据类型名形式参数1,
数据类型名形式参数2,…){函数体}内部函数又称静态函数。使用内部函数可以使函数只局限于所在文件,即使不同的文件中有相同函数名的函数也不会相互干扰。通常把只由同一文件使用的函数和外部变量放在一个文件中,用static加以说明使之局部化,限制其他文件对其引用。2.外部函数外部函数定义方法是在函数的类型标识符名前加extern,即:extern类型标识符名函数名(数据类型名形式参数1,
数据类型名形式参数2,…){函数体}如果在定义函数时省略extern,则默认为外部函数。在需要调用此函数的文件中对此函数进行原型声明时一般也要用extern来说明所用的函数是外部函数。【实例4-10】编写下面的程序学习外部函数的用法。有两个源程序文件file1.c和file2.c,在file1.c中引用了file2.c中的max()函数。(filel.c和file2.c分别编写成两个源程序文件,然后在同一个工程中编译。)/*file1.c*/#include<reg52.h>#include<stdio.h>voiduart_init(void);externunsignedintmax(unsignedint,unsignedint,unsignedint);voidmain(void){unsignedinta,b,c,result;a=10;b=40;c=30;uart_init();result=max(a,b,c);printf("Thelargestnumberis%u.",result);while(1){}}voiduart_init(){SCON=0x50;TMOD=(TMOD&0x0f)|0x20;TH1=0xE8;TR1=1;}/*fi1e2.c*/externunsignedintmax(unsignedintx,unsignedinty,unsignedintz){return(x>y?x:y)>z?(x>y?x:y):z;}4.2.6预处理命令在源程序中这些命令都放在函数之外,并且一般都放在源文件的前面。在编译系统对程序进行通常的编译(包括词法分析、语法分析、代码生成、代码优化等)之前,先对程序中这些特殊的命令进行预处理,然后将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码。这些特殊的命令就是预处理命令。C51的预处理命令共有三种:(1)宏定义;(2)文件包含;(3)条件编译。1.宏定义宏定义命令为#define,其作用是用一个标识符来表示一个字符串,称为宏。不带参数的宏定义:
#define宏名(字符串)
例如:#definePI3.14带参数的宏定义:#define宏名(形参表)(字符串)例如:#defineS(a,b)(a*b);#define宏名(字符串)【实例4-11】编写下面的程序学习带参数的宏定义的用法,定义两个带参数的宏L(a,b)和S(a,b)。#defineL(a,b)(2*(a+b))#defineS(a,b)((a)*(b))voiduart_init(void);voidmain(void){unsignedintlength,area;uart_init();length=L(5,10);area=S(5,10);printf("Length=%u\nArea=%u\n",length,area);while(1){}}voiduart_init(){SOON=0x50;TMOD=(TMOD&0x0f)|0x20:TH1=0xE8;TR1=1;}2.文件包含文件包含处理是指一个源文件可以将另外的文件包含到本文件中。文件包含命令行的一般形式为:
#include<文件名>或者#include“文件名”文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。在前面已多次用此命令包含过库函数的头文件,例如:
#include<reg51.h>#include<stdio.h>3.条件编译一般情况下,源程序中所有的行都参加编译,但有时候希望对其中的一部分内容只在满足一定条件时才进行编译,也就是可以
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 儿科护理:小儿尿崩症的护理
- 2026年山西运城农业职业技术学院单招职业适应性考试题库有完整答案详解
- 2026年广西交通职业技术学院单招职业倾向性考试题库及答案详解(考点梳理)
- 2026年山西管理职业学院单招综合素质考试题库及参考答案详解一套
- 2026年山西药科职业学院单招职业倾向性考试题库含答案详解(突破训练)
- 2026年广东省揭阳市单招职业倾向性考试题库有完整答案详解
- 2026年广西体育高等专科学校单招职业适应性测试题库及完整答案详解1套
- 2026年广东舞蹈戏剧职业学院单招综合素质考试题库带答案详解(完整版)
- 2026年广东省河源市单招职业适应性考试题库带答案详解(预热题)
- 聚四氟乙烯在肺部纤维化治疗中的效果
- 第七章-知觉-实验心理学课件
- 人教版小学一年级语文下册单元测试卷全套
- 小学生主题班会 拒绝校园欺凌 课件
- 第二章空调负荷计算与送风量
- 船坞工程廊道施工方案
- 建筑材料-混凝土介绍ppt
- GB/T 4745-2012纺织品防水性能的检测和评价沾水法
- GB/T 11263-1998热轧H型钢和剖分T型钢
- 03【教案】 项目三 数控编程基础知识
- 中小学体育教师职称晋升面试答辩真题解密
- 代开发票委托书范本
评论
0/150
提交评论