C51的程序语句
- 格式:pdf
- 大小:481.95 KB
- 文档页数:7
第十二课 C51开关分支语句学习了条件语句,用多个条件语句能实现多方向条件分支,但是能发现使用过多的条件语句实现多方向分支会使条件语句嵌套过多,程序冗长,这样读起来也很不好读。
这个时候使用开关语句同样能达到处理多分支选择的目的,又能使程序结构清晰。
它的语法为下:switch (表达式){case 常量表达式1: 语句1; break; case 常量表达式2: 语句2; break; case 常量表达式3: 语句3; break; case 常量表达式n: 语句n; break; default: 语句}运行中switch 后面的表达式的值将会做为条件,与case 后面的各个常量表达式的值相对比,如果相等时则执行case 后面的语句,再执行break(间断语句)语句,跳出switch 语句。
如果case 后没有和条件相等的值时就执行default 后的语句。
当要求没有符合的条件时不做任何处理,则能不写default 语句。
在上面的章节中我们一直在用printf 这个标准的 C 输出函数做字符的输出,使用它当然会很方便,但它的功能强大,所占用的存储空间自然也很大,要1K 左右字节空间,如果再加上scanf 输入函数就要达到2K 左右的字节,这样的话如果要求用2K 存储空间的芯片时就无法再使用这两个函数,例如AT89C2051。
在这些小项目中,通常我们只是要求简单的字符输入输出,这里以笔者发表在本人网站的一个简单的串行口应用实例为例,一来学习使用开关语句的使用,二来简单了解51 芯片串行口基本编程。
这个实例是用PC 串行口通过上位机程序与由AT89c51 组成的下位机相通信,实现用PC 软件控制AT89c51 芯片的IO 口,这样也就可以再通过相关电路实现对设备的控制。
为了方便实验,在此所使用的硬件还是用回以上课程中做好的硬件,以串行口和PC 连接,用LED 查看实验的结果。
原代码请到在笔者的网站下载,上面有单片机c语言下位机源码、PC 上位机源码、电路图等资料。
51单片机程序执行流程详解单片机是没有上操作系统的东西,在keil中编写的代码都是裸机代码,深化编写裸机代码有助于了解硬件的特性。
若不是硬件特性已定的状况之下的其它流程都是代码作祟。
突然想到来探探51单片机的执行流程。
这个念头起源于最初见到每个51程序里面的主函数里面最终都挂一个while(1);语句。
为何要加一句while 死循环让程序停留在main函数中呢。
将while(1);语句去掉有什么影响么?写一个很简洁的程序试一下。
执行以上程序,由P1端口掌握的流水灯闪了一下。
程序最终进入while(1);里纠缠去了,这个到好解释。
现将while(1);语句屏蔽掉。
我还以为程序不能被正确执行了呢,由于退出了main主函数,就像Render需要循环来实现一样(尽管刚刚闪灯的程序不在循环之内,但我还是不由产生了这一错觉)。
程序执行的结果是:流水灯不停的闪耀!看到这个现象后的猜想及动作^-^:(1) 这块板坏了吧!(在带操作系统如linux字符界面下运行一个不带死循环的C语言文件完毕后就会返回到linux shell程序中)。
抓紧换个板再测试一下,明显还是一样的结果。
(2) 单片机中将始终执行main函数中的最终一个(些)语句?(基于带OS平台下运行标准C语言文件的阅历,可从来没有想过是main函数被多次调用或多次进入)(3) 单片机内将C语言指令取出来加载到单片机内,单片机内自动生成一个主程序循环执行C语言中main函数的内容?(虽然很荒唐,还是想了)(4) 赶快谷歌百度一下单片机的执行流程(虽然在谷歌百度时以“51单片机程序执行流程”搜寻,没有搜到相关内容)。
换朴实的搜寻词:“51单片机main”。
然后就消失跟我一样带有疑问的问题:为什么main函数中不加while(1);语句之后程序会反复执行呢?回答的关键词包括“程序跑飞、看门狗、复位”。
(5) 趁上嵌入式的机会将“51单片机程序执行流程”搬出来并向老师叙述了我所写程序的得到的现象,包括我怎么验证呀等等。
c51 for语句举例
C51是一种微控制器芯片系列,它采用基于哈佛结构的指令系统,具有高性能和低功耗的特点。
在C51中,for语句用于循环执行特定的代码块,通常用来迭代执行一组操作固定次数的情况。
下面是一个简单的C51代码示例,展示了for语句的使用:
```
#include <reg51.h> //包含C51的寄存器定义
void main() {
unsigned char i; //声明一个无符号字节型变量i
for (i = 0; i < 10; i++) { // for循环从0开始,当i小于10时执行循环,执行完一次后i自增1
P1 = i; //将i的值赋给P1端口,实现输出
}
while (1); //无限循环
}
```
上述示例中,for循环通过变量i的改变控制了循环的执行,i从0开始,每次循环递增1,直到i达到10时循环终止。
在循环内部,我们通过P1 = i将变量i的值赋给P1端口,实现从0到9的数字在端口上的输出。
最后,程序进入一个无限循环,保持程序的执行。
除了上述基本的for循环示例外,C51中的for循环还可以通过嵌套使用,或者在循环条件中利用复杂的逻辑表达式来实现更灵活的循环控制。
此外,for循环还可以使用break和continue语句来提前终止循环或跳过当前循环迭代。
对于更复杂的需求,我们可以在for循环中结合使用其他C51的功能,如数组、函数等来满足所需。
c51的c语言程序格式
C51 是指基于8051微控制器的编程,通常使用C语言进行开发。
下面是一个简单的C语言程序示例,用于8051微控制器。
```c
include <> // 包含8051的寄存器定义
void main() {
while(1) { // 无限循环
P1 = 0x00; // 将P1端口的所有引脚设置为低电平
delay(1000); // 延时1ms
P1 = 0xFF; // 将P1端口的所有引脚设置为高电平
delay(1000); // 延时1ms
}
}
void delay(unsigned int t) { // 延时函数
while(t--);
}
```
这个程序将在P1端口上周期性地切换高电平和低电平,产生一个简单的LED闪烁效果。
注意:在实际的8051编程中,你还需要考虑如何配置微控制器的时钟、如何配置I/O端口、如何配置中断等。
此外,你还需要一个8051的编译器来编译你的C代码,生成可以在8051上运行的机器码。
C51单片机循环语句循环语句是几乎每个程序都会用到的,它的作用就是用来实现需要反复进行多次的操作。
如一个12M 的51 芯片应用电路中要求实现1 毫秒的延时,那么就要执行1000 次空语句才能达到延时的目的(当然能使用定时器来做,这里就不讨论),如果是写1000 条空语句那是多么麻烦的事情,再者就是要占用很多的存储空间。
我们能知道这1000 条空语句,无非就是一条空语句重复执行1000 次,因此我们就能用循环语句去写,这样不但使程序结构清晰明了,而且使其编译的效率大大的提高。
在 C 语言中构成循环控制的语句有while,do-while,for 和goto 语句。
同样都是起到循环作用,但具体的作用和使用方法又大不一样。
我们具体来看看。
goto 语句这个语句在很多高级语言中都会有,记得小时候用BASIC 时就很喜欢用这个语句。
它是一个无条件的转向语句,只要执行到这个语句,程序指针就会跳转到goto 后的标号所在的程序段。
它的语法如下:goto 语句标号; 其中的语句标号为一个带冒号的标识符。
示例如下void main(void){unsigned char a;start: a++;if (a==10) goto end;goto start;end:;}上面一段程序只是说明一下goto 的使用方法,实际编写很少使用这样的手法。
这段程序的意思是在程序开始处用标识符“start:”标识,表示程序这是程序的开始,“end:”标识程序的结束,标识符的定义应遵循前面所讲的标识符定义原则,不能用C 的关键字也不能和其它变量和函数名相同,不然就会出错了。
程序执行a++,a 的值加1,当 a 等于10 时程序会跳到end 标识处结束程序,不然跳回到start 标识处继续a++,直到 a 等于10。
上面的示例说明goto 不但能无条件的转向,而且能和if 语句构成一个循环结构,这些在 C 程序员的程序中都不太常见,常见的goto 语句使用方法是用它来跳出多重循环,不过它只能从内层循环跳到外层循环,不能从外层循环跳到内层循环。
单片机c51程序结构中的4种选择语句单片机C51程序结构中的4种选择语句包括if语句、if-else语句、switch语句和三目运算符。
下面将分别对这四种选择语句进行详细介绍。
一、if语句if语句是单片机程序中最常用的选择语句之一,用于根据条件的真假来执行不同的代码块。
语法结构如下:```cif (条件){// 条件为真时执行的代码}```其中,条件可以是任意的逻辑表达式,当条件为真时,if语句后面的代码块将会被执行;当条件为假时,if语句后面的代码块将被跳过。
例如,下面的代码示例中,通过if语句判断变量x的值是否大于10,若成立则执行打印语句:```cif (x > 10){printf("x大于10");}二、if-else语句if-else语句是在if语句的基础上增加了“否则”的情况,用于在条件为真和条件为假时执行不同的代码块。
语法结构如下:```cif (条件){// 条件为真时执行的代码} else {// 条件为假时执行的代码}```当条件为真时,if语句后面的代码块将会被执行;当条件为假时,else语句后面的代码块将会被执行。
例如,下面的代码示例中,通过if-else语句判断变量x的值是否大于10,若成立则执行打印语句,否则执行另外一个打印语句:```cif (x > 10){printf("x大于10");} else {printf("x小于等于10");}三、switch语句switch语句用于根据不同的条件值执行不同的代码块,可以避免使用大量的if-else语句。
语法结构如下:```cswitch (表达式){case 值1:// 当表达式的值等于值1时执行的代码break;case 值2:// 当表达式的值等于值2时执行的代码break;// 可以添加更多的casedefault:// 当表达式的值不等于任何一个case时执行的代码break;}```switch语句首先根据表达式的值与每个case后面的值进行比较,当找到与表达式值相等的case时,执行该case后面的代码,并使用break语句跳出switch语句;若表达式的值不等于任何一个case时,执行default后面的代码。
C51的程序语句
1表达式语句
在表达式的后面加一个分号“;”,构成表达式语句;
一行可以放一个表达式语句,也可放多个表达式语句,每个表达式后面须用“;”分隔;
一行还可以仅由一个“;”占一行形成一个表达式语句,即空语句
2复合语句
由若干条语句组合而成的一种语句,用大括号“{ }”将若干条语句包括在一起就形成了一个复合语句。
复合语句最后不需要以分号“;”结束,但它内部的各条语句仍需以分号“;”结束。
复合语句的一般形式如下:
{
局部变量定义
<程序体>
}
3顺序、选择和循环结构
选择结构可以用if/else, if/else if等语句实现;
多分支结构,通过if和else if 语句嵌套实现,也可用switch/case语句实现;循环结构通过while、do while、for、goto等语句实现。
4条件、分支和循环语句
4.1 if语句――基本条件选择语句,一般有三种格式
4.2 switch/case语句――处理多分支结构的语句
4.3 while—循环语句
While do语句:先判断,后执行。
While (表达式)
[do] {语句;} /*循环体*/
先计算表达式的值,为真时,执行循环体内的语句,否则,不执行循环体中的语句,中止循环,执行循环体后的下一条语句。
表达式的值可以在循环体内改变。
Do
{语句;} /*循环体*/
While (表达式);/*先执行,后判断表达式的值,表达式的值为真,则再执
行循环体,然后再判断。
循环体的内容至少执行一次*/
4.4 for 语句――循环
For 语句是C51中使用最灵活、最频繁的循环控制语句,可以完全代替while语句,功能最强大,格式如下:
For (表达式1;表达式2;表达式3)
{语句;} /*循环体*/
4.5 循环的嵌套
4.6 break和continue语句
4.7 return语句
5 C51的函数方法
5.1 函数的定义格式
函数类型函数名(形式参数表) [reentrant] [interrupt m] [using n] 形式参数说明
{ 局部变量定义
函数体
}
函数类型说明了函数的返回值的类型
函数名是用户为自定义函数取的名字,以便于调用函数时使用
形式参数用于列举在主调函数与被调函数之间进行数据传递的形式参数Reentrant 修饰符
Interrupt m修饰符
Using n
用于指定本函数内部使用的工作寄存器组,其中n的取值为0~3,表示寄存器组号。
对于using n 的使用注意以下几点:using n 修饰符不能用于有返回值的函数。
5.2 函数的调用与声明
函数调用的一般形式如下
函数名(实参列表);
6 输入与输出函数。