白云网站建设公,最新新闻资讯,中山建网站公司,学好wordpress怎么赚钱作者介绍
周瑞康#xff0c;男#xff0c;银川科技学院#xff0c;计算机人工智能学院#xff0c;2022级计算机科学与技术8班本科生#xff0c;单片机原理及应用课程第八组。
指导老师#xff1a;王兴泽
电子邮箱2082545622qq.com
前言#xff1a;
本篇文章是参考《…作者介绍
周瑞康男银川科技学院计算机人工智能学院2022级计算机科学与技术8班本科生单片机原理及应用课程第八组。
指导老师王兴泽
电子邮箱2082545622qq.com
前言
本篇文章是参考《单片机原理及应用c语言版第2版》杨居义·编著教材编写的笔记
由周瑞康王征汪泽祥杨立娟韩旭同学共同完成此篇章其中杨立娟韩旭同学负责C51的顺序结构C51的选择结构相关知识。汪泽祥同学负责C51的循环结构。王征同学负责项目实践。周瑞康同学负责以上内容排版整合。
项目12C51流程控制语句与项目实践 C语⾔的三种基本结构指的是顺序结构、选择结构、循环结构基本上所有的程序执行过程都可以拆分为这三种结构或者这三种结构的组合。这三种结构是构建任何C语言程序的基础它们可以相互嵌套和组合以实现复杂的程序逻辑。 顺序结构
顺序结构的特点是程序的执行流程是直线型的即程序从第一条语句开始从上到下按顺序逐条执行直到最后一条语句结束过程中没有任何分支或跳转。 2.选择结构
通过某个给定条件进行判断条件为真或假时分别执行不同的程序内容,选择结构分条件语句和开关语句两种。 2.1if语句条件语句
主要包括if语句和switch语句。If语句在单片机c语言中是极为常用的语句用来判断某些变量(信号)达到预期的值后再执行满足条件的指令或者执行不满足条件的指令。If 语句的基本形式有三种
直接的if语句
if (condition) { // 当条件为 true 时执行的代码
}
if……else……语句
在需要根据条件执行不同操作时if-else 语句提供了更好的结构。当第一个条件为 false 时程序会执行 else 块中的代码。
if (condition) { // 当条件为 true 时执行的代码
} else { // 当条件为 false 时执行的代码
}
if的嵌套形式
如果程序需要处理多个条件else if 语句可以帮助实现更复杂的逻辑结构。else if 语句允许在多个条件中进行选择。
if (condition1) { // 如果 condition1 为 true则执行这段代码
} else if (condition2) { // 如果 condition1 为 false 且 condition2 为 true则执行这段代码
} else if (condition2) { // 如果 condition1 为 false 且 condition2 为 true则执行这段代码
else { // 如果以上条件均为 false则执行这段代码
}
2.2switch语句开关语句 if语句比较适合于从两者之间选择。当要实现从多种选一时采用switch…case多分支开关语句可使程序变得更为简洁。
Switch(表达式)
{
Case 常量表达式1:/*如果常量表达式1满足则执行语句1*/
语句1;
break; /*执行完语句1后使用break跳出switch结构*/
Case 常量表达式2: /*如果常量表达式2满足则执行语句2*/
语句2;
break; /*执行完语句2后使用break跳出switch结构*/
:
:
Case 常量表达式n: /*如果常量表达式n满足则执行语句n*/
语句n;
break; /*执行完语句n后使用break跳出switch结构*/
default: /*条件都不满足时执行语句n1*/
语句n1;
}
当switch括号中表达式的值与某一个case后面的常量表达式的值相等时就执行它后面的语句然后因遇到break而退出switch语句。
当所有case中常量表达式的值都没有与表达式的值相匹配时就执行default后面的语句。
每个case的常量表达式必须是互不相同的否则出现对表达式的同一个值有两种以上的选择。
如果case语句中遗忘了break,则程序在执行了本行case选择之后不会按规定退出switch语句而是执行后续的case语句。
注意对于Switch语句需要注意两点一是常量表达式的值必须是整型或字符型二是最好使用“break”。
实例
void main(void)
{unsigned char i;
i2;
Switch(i)
{
Case 0: P00xff ; /*如果i0,则执行“P00xff”*/
break;
Case 1:P10xff;
break;
Case 2:P20xff; /*常量表达式2满足则执行“P20xff”*/
break; /*执行完后跳出switch结构*/
default:P10x00; /*当所有的case中的常量表达式的值都没有与表达式的值相匹配时就执行default后面的语句*/
}
}
3.C51的循环结构
循环结构是结构化程序设计的3种基本结构之一因此掌握循环结构的概念是程序设计尤其是C程序设计最基本的要求。
在C51语言中实现循环的语句主要有3种。
(1)While语句的一般形式
While(表达式)
{语句/*循环体*1}
While语句的语义是计算表达式的值当值为真(非0)时执行循环体语句否则跳出循环体执行后续操作。
使用while语句应注意以下几点
●While语句中的表达式一般是关系表达式或逻辑表达式只要表达式的值为真(非0)即可继续循环。
●循环体如包含一个以上的语句则必须用“{}”括起来组成复合语句。
●While循环体中应有让循环最终能结束的语句否则将造成死循环。一直运行直至关机。
实例
while(1)
{}
这个语句的作用就是无限循环一直运行直至关机。
实例用while求1到10的和程序如下
void main(void)
{
unsigned char i,sum;
sum0;
i1;
while(i10)
{
sumsumi
i;
}
POsum; //将结果送P0口显示
}
(2)do…while语句的一般形式
do
{语句;} /*循环体*/
while(表达式);
do…while循环语句的执行过程如下首先执行循环体语句一次再判断表达式的值。如果表达式的值为真(非0值),则重复执行循环体语句直到表达式的值变为假(0值)时循环结束。对于这种结构,在任何条件下循环体语句至少会被执行一次。注意
●do是C语言关键字必须和while联合使用
● while(表达式)后的分号“;”不能少它表示整个循环语句的结束。
实例用do…while求1到10的和程序如下 void main(void)
{
unsigned char i,sum;
sum0;
i1;
do{
sumsumi; /*注意{}不能省否则跳不出循环体*/
i;
}
while(i10);/1分号“;”不能少
POsum; //将结果送P0口显示
}
(3)for语句的一般形式
For (初始化表达式条件表达式增量表达式)
{语句} /*循环体*/
For 循环语句结构可使程序按指定的次数重复执行
一个语句或一组语句。for循环语句的执行过程如下
●初始化表达式
●求解条件表达式。若其值为“真”,则执行for后面的语句如果其值为“假”,那么跳过for循环语句
●若条件表达式为“真”,则执行指定的语句后执行增量表达式
●执行for后面的语句。
4.项目实践
任务12-2-1:用按键S控制P1口8只LED显示状态
任务实现
(1)分析先设置一个变量i,当i1时LED1发光当i2时LED1、LED2发光当i3时LED1、LED2、LED3发光...;当i8时LED1LED8都发光。由“switch”语句根据i的值来实现LED发光。i值的改变可以通过按键S来控制每按下S按键一次i自增1,当增加到9时将其值重新置为1。
(2)程序设计
#includesreg51.h //包含单片机寄存器的头文件
sbit SP3^0; 1/定义按键S接入P3.0引脚
/*********************************
函数功能延时约150ms
**********************************/
Void delay(void)
{
Unsigned char i,j;
for(i0;i200;i)
for(j0;j250;j) }
/*********************************
函数功能主函数
**********************************/
void main(void)
{
unsigned chari;
i0; //初始化
while(1) //无限循环
{
if(S0) //判断S按键是否被按下如果S0被按下
{
delay(); 150ms延时消除键盘抖动
if(S0) /*再判断S按键是否被按下如果S0确被按下*/
i; //自增1
if(i9) //如果i9,将其值重新置为1
i1;
}
switch(i) //7使用多分支语句
{
case1:P10xfe; //LED1发光
break; //退出switch语句
case2:P10xfc; //LED1、LED2发光
break; //退出switch语句
case3:P10xf8; //LED1、LED2、LED3发光
break; //退出switch语句
case4:P10xf0; //LED1、LED2、LED3、LED4发光
break; //退出switch语句
case5:P10xe0; //LED1、LED2、LED3、LED4、LED5发光
break; //退出switch语句
case6:P10xc0; //LED1、LED2、LED3、LED4、LED5、LED6发光
break; //退出switch语句
case7:P10x80; //LED1、LED2、LED3、LED4、LED5、LED6、LED7发光
break; //退出switch语句
case8:P10x00; //LED1~LED8发光
break; //退出switch语句
defauit: //默认值关闭所有LED
P10xff;}
} } 任务12-2-2:用for语句实现蜂鸣器发出1kHZ音频
任务实现
(1)分析:设单片机晶振频率为12MHz,则机器周期为1μs。只
要让单片机的P1.0引脚的电平信号每隔音频的半个周期取反一次即可发出1KHz音频。音频的周期为T1/1000Hz0.001s,即1000μs,半个周期为1000μs/2500μs,即在P1.0引脚上每500μs取反一次即可发出1KHz音频。而延时500μs需要消耗机器周期数N500μs /3167,即延时每循环167次就可让P1.0引脚上取反一次就可以得到1KHz音频。
(2)程序设计
#includereg51.h //包含单片机寄存器的头文件
sbit soundP1^0; //将sound位定义为p1.0引脚
/**********************************************
函数功能延时以形成约1KHz音频
/********************************************** void delay500us(void)
{
unsigned char i;
for(i0;i167;i)
;
}
/**********************************************
函数功能延时1000μs以形成一个周期约500Hz音频
/********************************************** void delay1000us(void)
{
unsigned int i;
for(i0;i333;i)
;
}
/**********************************************
函数功能发声1s时间的控制
/**********************************************
void sound1s(void)
{
unsigned int i;
for(i0;i1000;i)
{
sound 0;
delay500us();
sound 1;
delay500us();
}
}
/**********************************************
函数功能发声0.5s时间的控制
/**********************************************
void soundBans(void)
{
unsigned char i;
for(i0;i250;i)
{
sound0;
delay1000us();
sound1;
delay1000us();
}
} 4实践探索——用单片机开发版来实现 由于开发板蜂鸣器连接在P2.4引脚因此只需要修改代码”sbit soundP2^4”就可以了。
小结消耗机器周期数的计算(近似值):
(1)一重循环
for(i0;in;i) //n必须为无符号字符型数据
消耗机器周期数为
N3×n
式中N为消耗机器周期数n为需要设置的循环次数(n必须为无符号字符型数据)。
(2)二重循环
for(i0;in;i) //n必须为无符号字符型数据
for(i0;im;i) //m必须为无符号字符型数据消耗机器周期数为
N3×n×m
任务12-2-3:用while语句控制P1口8只LED的显示状态
任务实现
(1)分析
设计一个用while语句实现P1口8只LED显示状态的程序根据要求在while语句循环中设置一个变量i,当i小于0x64(十进制数100)时将i的值送P1口显示并i自增1,当i等于0×64时就跳出while循环。
(2)程序设计
#includereg51.h //包含单片机寄存器的头文件
/**********************************************
函数功能延时约150ms
/**********************************************
void delay(void)
{
unsigned char i,j;
for(i0;i200;i)
for(j0;j250;j)
;
}
/**********************************************
函数功能主函数
/**********************************************
void main(void)
{
unsigned char i;
while(1) //无限循环
{
i0; //将i置为0即初始化
while(i0x64) //i小于100时执行循环体
{
P1i;
delay;
i; //i自增1
}
} }
任务12-2-4:用do…while语句控制P1口8只LED的显示状态
任务实现
(1)分析:只要在循环体中按照点亮次序依次点亮再将循环条件设置为死循环即可。现在来讨论点亮LED的控制码。LED1发光的控制码为0xfe;LED1、LED2发光的控制码为0xfc;LED1、LED2、LED3发光的控制码为0xf8......LED1LED8都发光的控制码为0x00;LED1发光的控制码为0xfe;LED1、LED2发光的控制码为0xfc...依次循环。
2程序设计
#includereg51.h
void delay(void)
{
unsigned char i,j;
for(i0;i200;i)
for(j0;j200;j)
;
}
void main(void)
{
do
{
P10xfe; //LED1点亮
delay(); //延时
P10xfc; //LED1、LED2点亮
delay(); //延时
P10xf8; //LED1、LED2、LED3点亮
delay(); //延时
P10xf0; //LED1~LED4点亮
delay(); //延时
P10xe0; //LED1~LED5点亮
delay(); //延时
P10xc0; //LED1~LED6点亮
delay(); //延时
P10x80; //LED1~LED7点亮
delay(); //延时
P10x00; //LED1~LED7点亮
delay(); //延时
}while(1);
}