版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3章 51系列单片机程序设计(C部分) 同 学 们: 上 午 好!第3章 51系列单片机程序设计(C部分) 3.4 C语言与语言与MCS513.7 C 程序基本结构及举例程序基本结构及举例 3.5 数数 组组3.6 函数函数第3章 51系列单片机程序设计(C部分) 3.4 C语言与语言与MCS5151系系列列单单片片机机常常用用编编程程语语言言汇编语言汇编语言C语言语言局限局限: 必须要考虑其存储器结构,尤其必须考虑其片内数据存储器与必须要考虑其存储器结构,尤其必须考虑其片内数据存储器与特殊功能寄存器正确、合理的使用以及按实际地址处理端口数据。特殊功能寄存器正确、合理的使用以及按实际地址处理
2、端口数据。为什么要学c呢?优点优点:对单片机的指令系统不要求了解对单片机的指令系统不要求了解,仅要求对单片机的存贮结构有初步了解仅要求对单片机的存贮结构有初步了解.寄存器分配寄存器分配,不同存贮器的寻址及数据类型等细节可由编译器管理不同存贮器的寻址及数据类型等细节可由编译器管理编程及程序调试时间短编程及程序调试时间短,效率高效率高提供的库包含大量标准子程序提供的库包含大量标准子程序,具有强大数据处理能力具有强大数据处理能力语句更接近人类自然语言语句更接近人类自然语言那我们用c语言编写单片机程序和用c编写标准的C语言程序有区别吗?用c来编写单片机程序要根据单片机存储结构及内部资源定义相应的C语言
3、中的数据类型和变量第3章 51系列单片机程序设计(C部分) 支持支持MCS51系列单片机的系列单片机的C语言编译器语言编译器编译器的作用编译器的作用:把编写的程序转换生成单片机可执行的代把编写的程序转换生成单片机可执行的代码程序。码程序。常用编译器常用编译器: KEIL/FranklinKEIL/Franklin以它的代码紧凑和使用方便等特点优于其它以它的代码紧凑和使用方便等特点优于其它编译器编译器。本章是针对这种编译器介绍本章是针对这种编译器介绍 MCS51单片机单片机C语言程序设计语言程序设计。 以下把支持以下把支持MCS-51的的C编译器简称编译器简称“C51”第3章 51系列单片机程序
4、设计(C部分) 3.4.1 C51数据类型及在数据类型及在MCS-51中的存储方式中的存储方式 位型位型(bit)无符号字符无符号字符(unsigned char) 有符号字符有符号字符(singed char) 无符号整型无符号整型(unsigned int ) 有符号整型有符号整型(signed int ) 无符号长整型无符号长整型(unsigned long ) 有符号长整型有符号长整型(signed long ) 浮点型浮点型(float)指针类型指针类型编编译译器器支支持持的的数数据据类类型型Franklin C51详细见表详细见表3.4.1第3章 51系列单片机程序设计(C部分)
5、表表3.4.1 Franklin C51的数据类型的数据类型数据类型数据类型长度长度(bit)长度长度(byte)值域值域bit110,1unsigned char810255signed char81128127unsigned int 162065535signed int 1623276832767unsigned long32404294967295signed long 32421474836482147483647float 3241.176E383.40E+38(6位数字)double6481.176E383.40E+38(10位数字)一般指针一般指针243存储空间065535第
6、3章 51系列单片机程序设计(C部分) 3.4.2 C51数据在数据在MCS-51中的存储方式中的存储方式位变量位变量(bit):与与MCS-51硬件特性操作有关的可以定义成位变量。硬件特性操作有关的可以定义成位变量。位变量必须定位在位变量必须定位在MCS-51单片单片机片内机片内RAM的位寻址空间中的位寻址空间中字符变量字符变量(char):18位位合适合适MCS-51单片机单片机无符号变量无符号变量(unsigned char)有符号字符变量有符号字符变量(signed char):最高位为符号位最高位为符号位当程序进行乘除法运算时,符号问题就变得十分复杂,而当程序进行乘除法运算时,符号问
7、题就变得十分复杂,而C51编译器会自动地将相应的库函数调入程序中来解决这个问题。编译器会自动地将相应的库函数调入程序中来解决这个问题。第3章 51系列单片机程序设计(C部分) 3.4.2 C51数据在数据在MCS-51中的存储方式中的存储方式整型变量整型变量(int):16位位MCS-51系列单片机将系列单片机将int型变量的高位字型变量的高位字节数存放在低地址字节中,低位字节数存节数存放在低地址字节中,低位字节数存放在高地址字节中。放在高地址字节中。与与8080和和8086 CPU系列不同系列不同有符号整型变量有符号整型变量(signed int)也使用也使用msb位作位作符号标志位,并使用
8、二进制补码表示数值。符号标志位,并使用二进制补码表示数值。可直接使用几种专用的机器指令来完成多字可直接使用几种专用的机器指令来完成多字节的加、减、乘、除运算。节的加、减、乘、除运算。第3章 51系列单片机程序设计(C部分) 图图3.4.1 整型数的存储结构整型数的存储结构 0 x120 x34+0+1地址地址 0 x120 x340 x560 x78.+0+1+2+3地址地址 图图3.4.2 长整型变量的存储结构长整型变量的存储结构 整型变量值整型变量值0 x1234, 0 x5678以图所示的方式存放在内存中。以图所示的方式存放在内存中。第3章 51系列单片机程序设计(C部分) 浮点型变量浮
9、点型变量(float):32位位符号位符号位阶码和尾数阶码和尾数Franklin C51的浮点变量数据类型的使用格式的浮点变量数据类型的使用格式 1位符号位。位符号位。 8位指数位。位指数位。 23位尾数。位尾数。 符号位是最高位,尾数为低符号位是最高位,尾数为低23位,内存中按字节存储顺序如下:位,内存中按字节存储顺序如下:地址地址+0+1+2+3内容内容MMMMMMMMMMMMMMMMEMMMMMMMSEEEEEEES为符号位,为符号位,1表示负,表示负,0表示正;表示正;E为阶码;为阶码;M为为23位尾数,最高位为位尾数,最高位为1。第3章 51系列单片机程序设计(C部分) 在编程时,如
10、果只强调运算速度而不进行负数运算时,在编程时,如果只强调运算速度而不进行负数运算时,最好采用最好采用无符号无符号(unsigned)格式。格式。 无符号字符类型的使用:无符号字符类型的使用:无论何时,应尽可能使用无符号无论何时,应尽可能使用无符号字符变量,因为它能直接被字符变量,因为它能直接被MCS-51所接受。基于同样的原因,所接受。基于同样的原因,也应尽量使用位变量。有符号字符变量虽然也只占用一个字也应尽量使用位变量。有符号字符变量虽然也只占用一个字节,但需要进行额外的操作来进行测试代码的符号位。这无节,但需要进行额外的操作来进行测试代码的符号位。这无疑会降低代码效率。疑会降低代码效率。注
11、意:注意:第3章 51系列单片机程序设计(C部分) 使用简化形式定义数据类型:使用简化形式定义数据类型:其方法是在源程序开头使用其方法是在源程序开头使用#define语句自定义简化的类型标识符。例如:语句自定义简化的类型标识符。例如:#define uchar unsigned char #define uint unsigned int 这样,在编程中,就可以用这样,在编程中,就可以用uchar代替代替unsigned char,用,用uint代替代替unsigned int来定义变量。来定义变量。第3章 51系列单片机程序设计(C部分) 3.4.3 C51数据的存储类型与数据的存储类型与M
12、CS-51存储结构存储结构表表 3.4.2 C51存储类型与存储类型与MCS-51存储空间的对应关系存储空间的对应关系存储类型存储类型与存储空间的对应关系与存储空间的对应关系 data 直接寻址片内数据存储区,访问速度快直接寻址片内数据存储区,访问速度快(128字节字节) bdata 可位寻址片内数据存储区,允许位与字节混合访问可位寻址片内数据存储区,允许位与字节混合访问(16字节字节) idata 间接寻址片内数据存储区,可访问片内全部间接寻址片内数据存储区,可访问片内全部RAM地址空间地址空间(256字节字节) pdata 分页寻址片外数据存储区分页寻址片外数据存储区(256字节字节)由由
13、MOV Ri访问访问(i=0,1) xdata 片外数据存储区片外数据存储区(64 KB)由由MOVX DPTR访问访问 code 程序存储器程序存储器64 KB空间,由空间,由MOVC DPTR访问访问第3章 51系列单片机程序设计(C部分) 表表3.4.3 C51存储类型及其数据长度和值域存储类型及其数据长度和值域存储类型存储类型长度长度(bit)长度长度(byte)值域范围值域范围data810255idata810255pdata810255xdata162065 535code162065 535第3章 51系列单片机程序设计(C部分) 带存储类型的变量的定义的一般格式为带存储类型的
14、变量的定义的一般格式为 数据类型数据类型 存储类型存储类型 变量名变量名带存储类型的变量定义举例带存储类型的变量定义举例:char data var1;bit bdata flags;float idata x,y,z;unsigned int pdata var2;unsigned char vector34;数据类型数据类型存储类型存储类型变量名变量名第3章 51系列单片机程序设计(C部分) 3.4.4 MCS-51特殊功能寄存器特殊功能寄存器(SFR)的的C51定义定义特殊功能寄存器特殊功能寄存器C51定义的一般语法格式如下:定义的一般语法格式如下:sfr sfr-name = int
15、constant;Franklin C51为为 SFR提供了一种自主形式的定义方法提供了一种自主形式的定义方法这种定义方法与标准这种定义方法与标准C语言不兼容,只适用于对语言不兼容,只适用于对MCS-51系列单片机进行系列单片机进行C语言编程。语言编程。sfr是定义语句的关键字,其后必须跟一个是定义语句的关键字,其后必须跟一个MSC-51单片机真实存在的特殊功能单片机真实存在的特殊功能寄存器名寄存器名=后面必须是一个整型常数,不允许带有运算符的表达式,是特殊功能寄存后面必须是一个整型常数,不允许带有运算符的表达式,是特殊功能寄存器器sfr-name的字节地址,这个常数值的范围必须在的字节地址,
16、这个常数值的范围必须在SFR地址范围内,位于地址范围内,位于0 x800 xFF。第3章 51系列单片机程序设计(C部分) 例如:例如:sfr SCON=0 x98;sfr TMOD=0 x89;/* 串口控制寄存器地址串口控制寄存器地址98H */* 定时器定时器/计数器方式控制寄计数器方式控制寄存器地址存器地址89H */第3章 51系列单片机程序设计(C部分) 3.4.5 MCS-51并行接口的并行接口的C51定义定义 MCS-51系列单片机并行系列单片机并行I/O接口除了芯片上的接口除了芯片上的4个个I/O口口(P0 P3)外,还可以在片外,还可以在片外扩展外扩展I/O口。口。MCS-
17、51单片机单片机I/O口与数据存储器统一编址,即把一个口与数据存储器统一编址,即把一个I/O口当作数据口当作数据存储器中的一个单元来看待。存储器中的一个单元来看待。 使用使用C51进行编程时,进行编程时,MCS-51片内的片内的I/O口与片外扩展的口与片外扩展的I/O可以统一在一个头文可以统一在一个头文件中定义,也可以在程序中件中定义,也可以在程序中(一般在开始的位置一般在开始的位置)进行定义。进行定义。 对于对于MCS-51片内片内I/O口按特殊功能寄存器方法定义。口按特殊功能寄存器方法定义。例如:例如:sfr P0=0 x80 ; /* 定义定义P0口,地址为口,地址为80H */sfr
18、P1=0 x90 ; /* 定义定义P1口,地址为口,地址为90H */第3章 51系列单片机程序设计(C部分) 一旦在头文件或程序中对这些片外一旦在头文件或程序中对这些片外I/O口进行定义后,在程序中就可以自由使用变量口进行定义后,在程序中就可以自由使用变量名与其实际地址的联系,以便使程序员能用软件模拟名与其实际地址的联系,以便使程序员能用软件模拟MCS-51的硬件操作。的硬件操作。 对于片外扩展对于片外扩展I/O口,则根据硬件译码地址,将其视作为片口,则根据硬件译码地址,将其视作为片外数据存储器的一个单元,使用外数据存储器的一个单元,使用#define语句进行定义。语句进行定义。例如例如#
19、include #define PORTA XBYTE 0 xFFC0absacc.h是是C51中绝对地址访问函数的头文件,将中绝对地址访问函数的头文件,将PORTA定义为外部定义为外部I/O口,地口,地址为址为 FFC0H,长度为,长度为8位。位。第3章 51系列单片机程序设计(C部分) (1) 位变量位变量C51定义。使用定义。使用C51编程时,定义了位变量后,就编程时,定义了位变量后,就可以用定义了的变量来表示可以用定义了的变量来表示MCS-51的位寻址单元。的位寻址单元。 3.4.6 位变量的位变量的C51定义定义例如:例如:bit direction_bit ;/* 把把direct
20、ion_bit定义为位定义为位变量变量 */bit look_pointer ;/* 把把look_pointer定义为位定义为位变量变量 */位变量的位变量的C51定义的一般语法格式如下:定义的一般语法格式如下: 位类型标识符位类型标识符(bit) 位变量名;位变量名;第3章 51系列单片机程序设计(C部分) (2) 函数可包含类型为函数可包含类型为bit的参数,也可以将其作为返回的参数,也可以将其作为返回值。值。注意注意: 使用使用(#pragma disable)或包含明确的寄存器组切换或包含明确的寄存器组切换(using n)的函数不能返回位值,否则编辑器将会给出一个错误信息。的函数不
21、能返回位值,否则编辑器将会给出一个错误信息。例如:例如: bit func(bit b0, bit b1) /* 变量变量b0,b1作为函数的参数作为函数的参数 */ return (b1); /* 变量变量b1作为函数的返回值作为函数的返回值 */ 第3章 51系列单片机程序设计(C部分) (3) 对位变量定义的限制。对位变量定义的限制。在位定义中,允许定义存储类型,位变量都被放入一个在位定义中,允许定义存储类型,位变量都被放入一个位段,此段总位于位段,此段总位于MCS-51片内的片内的RAM区中。因此,存区中。因此,存储类型限制为储类型限制为data和和idata,如果将位变量的存储类型定
22、,如果将位变量的存储类型定义成其它存储类型都将编译出错。义成其它存储类型都将编译出错。如:如:bit * bit_pointer。如:如:bit b_array 。错错,不存在位数组不存在位数组位变量不能定义成一个指针位变量不能定义成一个指针第3章 51系列单片机程序设计(C部分) 例例1 位变量定义位变量定义sbit mybit0 = ibase0 ;/* mybit0定义为定义为ibase的第的第0位位 */sbit mybit15 = ibase15;/* mybit0定义为定义为ibase的第的第15位位 */sbit Ary07 = bary07 ;/* Ary07定义为定义为abr
23、y0的第的第7位位 */sbit Ary37 = bary37 ;/* Ary37定义为定义为abry3的第的第7位位 */然后可使用然后可使用sbit定义可独立寻址访问的对象位:定义可独立寻址访问的对象位:bdata int ibase; /* 定义定义ibase为为bdata整型变量整型变量 */bdata char bary4;/* bary4定义为定义为bdata字符型数组字符型数组 */先定义变量的数据类型和存储类型:先定义变量的数据类型和存储类型:第3章 51系列单片机程序设计(C部分) 3.5 数数 组组数组:数组是一组类型相同数组:数组是一组类型相同有序数据的集合。用数组名有序
24、数据的集合。用数组名和下标来唯一确定数组中的和下标来唯一确定数组中的元素。元素。第3章 51系列单片机程序设计(C部分) 3.5.1 一维数组一维数组注意注意:(1)C语言中,语言中,数组下标从数组下标从0开始开始. (2)C语言语言不允许不允许对数组的对数组的大小大小做做动态定义动态定义. 例如:例如:int n=5; int an;一、一维数组的定义一、一维数组的定义形式形式:类型说明符类型说明符 数组名数组名 常量表达式常量表达式例例 int a10 10个元素分别用:个元素分别用: a0、a1、a2、a3、a4、.、a8、a9。第3章 51系列单片机程序设计(C部分) 二、数组元素的引
25、用方式二、数组元素的引用方式 数组名数组名 下标下标 例例: : a0 = a5 + a7 - a2 a0 = a5 + a7 - a2* *33例例3.5.1 使数组元素使数组元素a0a9的值为的值为09,然后逆序输出。,然后逆序输出。 main () int i,a10; for (i=0;i=0; i-) printf(%d ,ai); 运行输出:运行输出: 9 8 7 6 5 4 3 2 1 0第3章 51系列单片机程序设计(C部分) 三、一维数组的初始化三、一维数组的初始化初始化初始化:在定义时指定初始值,编译器把初值赋给数组变量。:在定义时指定初始值,编译器把初值赋给数组变量。赋赋
26、 值:值:使用赋值语句,在程序运行时把值赋给数组变量,使用赋值语句,在程序运行时把值赋给数组变量, 如如a0 = 2。1、一般初始化,、一般初始化, int a10 = 0,1,2,3,4,5,6,7,8,9; 花括号后有分号花括号后有分号 int array10 = 1,2,3,4,5,6,7,8,9,10; 2、部分元素初始化,、部分元素初始化, int a10 = 0,1,2,3,4; 仅前仅前5个元素赋初值,后个元素赋初值,后5个元素未指顶初值。个元素未指顶初值。 3、全部元素均初始化为、全部元素均初始化为0, int a10 = 0,0,0,0,0,0,0,0,0,0; /*a0a9
27、=0*/ 4、在对全部数组元素赋初值是,可以不指定数组长度。、在对全部数组元素赋初值是,可以不指定数组长度。例如例如: int a5=1,2,3,4,5; 可以写成:可以写成:int a =1,2,3,4,5;第3章 51系列单片机程序设计(C部分) 例例3.5.2用选择法对用选择法对10个整数按由小到大排序。个整数按由小到大排序。#include stdio.hmain() int i, j, min, t, a10; for(i=0; i10; i+) scanf(%d, &ai); for(i=0; i9; i+) min=i; for(j=i+1; jaj) min=j; if
28、(min!=i) t=ai;ai=amin;amin=t; for(i=0; imaxaijmax,把,把aijaij作为新的临时最大值,并作为新的临时最大值,并记录下其下标记录下其下标i i和和j j。当全部元素。当全部元素比较完后,比较完后,maxmax是整个矩阵全部元是整个矩阵全部元素的最大值。素的最大值。25101067894321例例3.5.3 有一个有一个34的矩阵的矩阵(如下图),要求编程序以如下图),要求编程序以求出其中值最大的那个元素的值及其所在的行号和列求出其中值最大的那个元素的值及其所在的行号和列号。号。第3章 51系列单片机程序设计(C部分) main () main
29、() int int i,j,row=0,colum=0,max; i,j,row=0,colum=0,max; int int a34=1,2,3,4,9,8,7,6,-10,10,-5,2; a34=1,2,3,4,9,8,7,6,-10,10,-5,2; max = a00; / max = a00; /* *首先把第一个元素首先把第一个元素a00a00作为临时最大值作为临时最大值maxmax* */ / for(i=0; i=2; i+) / for(i=0; i=2; i+) /* * 用两重循环遍历全部元用两重循环遍历全部元素素 * */ / for(j=0; j=3; j+) f
30、or(j=0; j max ) if (aij max ) max = aij; max = aij; row = i; row = i; colum colum = j; = j; printf(max=%d, row=%d, colum=%dn,max,row,colum printf(max=%d, row=%d, colum=%dn,max,row,colum); ); 25101067894321运行结果运行结果:max=10,row=2,colum=1 注意:本例中得到的行列值从注意:本例中得到的行列值从0始。始。第3章 51系列单片机程序设计(C部分) 3.5.3 字符数组字符数
31、组字符数组:存放字符数据的数组,每一个元素存放一个字符。字符数组:存放字符数据的数组,每一个元素存放一个字符。一、程序中定义字符数组一、程序中定义字符数组例、char c10; c0=I; c1= ; c2=a; c3=m; c4= ; c5=h; c6=a; c7=p; c8=p; c9=y; 第3章 51系列单片机程序设计(C部分) 二、字符数组的初始化二、字符数组的初始化1 1、逐个元素初始化、逐个元素初始化 char c10 = I, ,a,m, ,h,a,p,p,y;char c10 = I, ,a,m, ,h,a,p,p,y; 2 2、数据少于数组长度、数据少于数组长度, ,多余元
32、素自动为多余元素自动为“空空”。 char cchar c1313 = I, ,a,m, ,h,a,p,p,y; = I, ,a,m, ,h,a,p,p,y; 3 3、指定初值时,未指定数组长度,则长度等于初值个数。、指定初值时,未指定数组长度,则长度等于初值个数。 char c = I, ,a,m, ,h,a,p,p,y;char c = I, ,a,m, ,h,a,p,p,y; 10 10个初值,因此,数组个初值,因此,数组c c的长度是的长度是1010。 I a m h a p p y 0 0 0 0c0c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11c12c13I
33、a m h a p p y c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 第3章 51系列单片机程序设计(C部分) 三、字符数组的引用三、字符数组的引用引用一个元素,得到一个字符引用一个元素,得到一个字符。 例例3.5.43.5.4 输出一个字符串。输出一个字符串。main () main () char c10=I, ,a,m, ,a, ,b,o,y; char c10=I, ,a,m, ,a, ,b,o,y; int int i; i; for(i=0;i10;i+) for(i=0;i10;i+) printf(“%c”,ci printf(“%c”,ci); /); /*
34、 *引用数组元素引用数组元素cici,得到一个字,得到一个字符符* */ / printf(n printf(n); ); 输出结果:输出结果: I am a boy第3章 51系列单片机程序设计(C部分) 四、字符串四、字符串五、字符数组的输入输出五、字符数组的输入输出六、字符串处理函数六、字符串处理函数第3章 51系列单片机程序设计(C部分) 课堂课堂练习练习1.以下对一维数组以下对一维数组a的正确说明是的正确说明是: A) char a(10) ; B) int a10 ; C) int k=5,ak; D) char a =a,b,c;2.以下对二维数组以下对二维数组a的正确说明是的正
35、确说明是: A) char a105 ; B) int a23 ; C) int k=5,akk-2; D) char a43=“abc”,“bcd”,“cde”; E) int a34 = 1,5,9;第3章 51系列单片机程序设计(C部分) 3、以下程序是否正确?如果错了,怎么改?、以下程序是否正确?如果错了,怎么改?程序程序1 1:对两个字符串进行比较。:对两个字符串进行比较。#include main( )char str1 =abcdefg; char str2 =abcdefg;if (str1 = str2)printf(yes);else printf(no);程序程序2 2:
36、 输出一个字符串。输出一个字符串。main () char c10=I, ,a,m, ,a, ,b,o,y; int i; for(i=0;i10;i+) printf(“%c”,ci); printf(n); If(strcmp(str1,str2)= =0)第3章 51系列单片机程序设计(C部分) 程序程序3:输出一个字符串。:输出一个字符串。main() int i; char c1 = How are you?; printf(%s, c1 ); 程序程序4:输出一个字符串。:输出一个字符串。main( ) char c6=“China”; printf(%sn,c); puts(c)
37、; printf(%s, c1 );第3章 51系列单片机程序设计(C部分) 3.6 3.6 函数函数函数定义的一般形式函数定义的一般形式 函数参数和函数的值函数参数和函数的值 函数的调用函数的调用 数组作为函数参数数组作为函数参数函数的嵌套调用函数的嵌套调用 函数的递归调用函数的递归调用局部变量和全局变量局部变量和全局变量 内部函数和外部函数内部函数和外部函数 第3章 51系列单片机程序设计(C部分) 例例3.6.1float add(float x, float y); /* 声明自己写的add函数的原型 */ main () float a,b,c; scanf(%f,%f,&a
38、,&b); c = add(a,b); printf(sum is %f,c); float add(float x, float y) /*定义定义add函数函数 */ float z; z = x + y; return z; 在文件的开头声明函数原型。在文件的开头声明函数原型。float add(float x, float y ); 在在main的开头声明函数原型。的开头声明函数原型。不需要函数声明的情况不需要函数声明的情况1、返回值为整型的函数。、返回值为整型的函数。2、被调用函数的定义出现在主调用函数之前。、被调用函数的定义出现在主调用函数之前。3、在所有函数定义之前,文件
39、的开头,已经作、在所有函数定义之前,文件的开头,已经作了函数声明。了函数声明。第3章 51系列单片机程序设计(C部分) 有五个人坐在一起,求第有五个人坐在一起,求第5个人多少岁。个人多少岁。 第第5个人多少岁?个人多少岁? 比第比第4个人大个人大2岁。岁。 第第4个人多少岁?个人多少岁? 比第比第3个人大个人大2岁。岁。 第第3个人多少岁?个人多少岁? 比第比第2个人大个人大2岁。岁。 第第2个人多少岁?个人多少岁? 比第比第1个人大个人大2岁。岁。 第第1个人多少岁?个人多少岁? 我我10岁。岁。 例例3.6.2表达为:表达为:age(5) = age(4) + 2 age(4) = age
40、(3) + 2 age(3) = age(2) + 2 age(2) = age(1) + 2 age(1) = 10; 递归表达式递归表达式:第3章 51系列单片机程序设计(C部分) 求解过程求解过程:第3章 51系列单片机程序设计(C部分) 用一个函数用一个函数age()来求第来求第n个人多少岁。个人多少岁。main() int age(); /* 声明函数原型声明函数原型 */ printf(%dn,age(5);int age(int n) /* 求第求第n个人多少岁个人多少岁 */ int c; if (n=1) c = 10; else c = age(n-1) + 2; retu
41、rn c; 第3章 51系列单片机程序设计(C部分) 例例3.6.4写出下面程序的执行结果。写出下面程序的执行结果。int k=3;main() int k=7; printf(k=%dn,k); int k=11; printf(k=%dn,k); k+=1; printf(k=%dn,k); printf(k=%dn,k); printf(k=%dn,k); k=7k=11k=12k=12k=7第3章 51系列单片机程序设计(C部分) 例例3.6.5int f(int a) auto int b=0; /* 自动自动变量变量 */ static int c=3; /* 静态静态局部变量局部
42、变量 */ b = b + 1; c = c + 1; return (a+b+c); main () int a=2,i; for(i=0;i 0,累加它;,累加它; 如果如果100个数没有输入完,转步骤个数没有输入完,转步骤(1); 输入完输入完100个数后,输出累加和。个数后,输出累加和。第3章 51系列单片机程序设计(C部分) 例例3.7.1 算法描述算法描述 (流程图流程图) 开始 输入一个数 该数0 累加输入完100个数 输出累加和 结束起止框起止框处理框处理框判断框判断框流向线YYNN第3章 51系列单片机程序设计(C部分) 例例3.7.1 算法描述算法描述(N-S流程图流程图)
43、输入一个数 该数0满足 不满足加到累加和中 输入完100个数否 输出累加和处理判断重复第3章 51系列单片机程序设计(C部分) 算法的算法的C语句实现语句实现void main( ) int x; /* 存放输入数的单元 */ int count; /* 存放输入个数的单元 */ int sum; /* 存放累加和的单元 */ count = 0; sum = 0; /* 工作单元初值 */ do scanf (“%d” , &x); /* 输入一个数 */ count +; /* 每输入一个数,记一下数 */ if (x0) /* 判断输入数0否 */ sum = sum + x;
44、/* 是0,则加到累加和中 */ while ( count tempx - temp第3章 51系列单片机程序设计(C部分) 例例 对两个变量先输入两个值,然后交换这两个变量的值。对两个变量先输入两个值,然后交换这两个变量的值。x x temp temp y y步骤:步骤: 1 1 x - tempx - temp 2 2 x - yx tempx - temp 2 2 x - yx y 3 temp-y例例3.7.2 交换变量的值交换变量的值第3章 51系列单片机程序设计(C部分) 例例 对两个变量先输入两个值,然后交换这两个变量的值。对两个变量先输入两个值,然后交换这两个变量的值。x x
45、 temp temp y y步骤:步骤: 1 1 x - tempx - temp 2 2 x - yx y 3 temp-y例例3.7.2 交换变量的值交换变量的值第3章 51系列单片机程序设计(C部分) 对两个变量先输入两个值,然后交换这两个变量的值。对两个变量先输入两个值,然后交换这两个变量的值。main() int x, y, temp; scanf(“%d%d”, &x, &y); temp = x; x = y; y = temp; printf(“first=%d, second=%d”, x, y); 例例3.7.2 交换变量的值交换变量的值第3章 51系列单片
46、机程序设计(C部分) 二、选择结构二、选择结构 语句1 ; 语句2 ;条件?满足不满足条件满足不满足语句1 语句2第3章 51系列单片机程序设计(C部分) 选择结构举例选择结构举例例例3.7.3 输入变量输入变量x,计算,计算y值。值。 1 当当 x=0 y = -1 当当 x0满足 不满足 y = 1 y = -1main( ) int x, y; scanf(“%d”,&x); if (x0) y = 1; else y = -1; printf(“x=%d, y=%d”, x, y);第3章 51系列单片机程序设计(C部分) 三、循环结构三、循环结构 while()while()
47、语句的一般形式如下语句的一般形式如下: : while(while(表达式表达式) ) 循环体语句;循环体语句;其中其中while是前判循环语句的的关键字;表达式是循环控制条件表达式;循环体语句是前判循环语句的的关键字;表达式是循环控制条件表达式;循环体语句是循环语句的循环体。是循环语句的循环体。while( )while( )语句的执行过程是语句的执行过程是: : 先判断循环控制条件是否成立,若它的值为真,则执行循环先判断循环控制条件是否成立,若它的值为真,则执行循环体语句序列;若其值为假,则退出循环,执行体语句序列;若其值为假,则退出循环,执行while( )语句的后语句的后继语句继语句
48、。 第3章 51系列单片机程序设计(C部分) 举例:例举例:例3.7.4 编写检验一个正整数编写检验一个正整数n是否为素数的程序。是否为素数的程序。#include main() int n,i=1;printf(请输入一个正整数请输入一个正整数 : );scanf(%d,&n); while(+iexp6-1 请输入一个正整数请输入一个正整数 : 78 这个数不是个素数这个数不是个素数! C:TCexp6-1 请输入一个正整数请输入一个正整数 : 17 这个数是个素数这个数是个素数!第3章 51系列单片机程序设计(C部分) for()语句的一般格式是语句的一般格式是: for (表达
49、式表达式1;表达式;表达式2;表达式;表达式3) 循环体语句;循环体语句;for() 语句的执行过程语句的执行过程:1. 先对表达式先对表达式1进行计算。进行计算。2. 检测表达式检测表达式2,如果循环控制条件表达式的值为真,则执,如果循环控制条件表达式的值为真,则执行循环体,否则退出循环。行循环体,否则退出循环。3. 表达式表达式3一般不在循环体内,而在一般不在循环体内,而在for后的括号内,后的括号内, 每每次执行完循环体就转入对表达式次执行完循环体就转入对表达式3的修改操作;接着对表达式的修改操作;接着对表达式2进行检测以决定是否继续进行循环。进行检测以决定是否继续进行循环。第3章 51系列单片机程序设计(C部分) #includemain() int i,j;printf( 这是个乘法九九表n); for(i=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年汽车漆面抛光打蜡护理流程
- 2026年环境监测超标结果调查与纠正措施制定
- 2026年世界测绘技术演进与实景三维中国建设趋势
- 2026年科室消毒隔离工作年度总结
- 2026年保洁人员化学品安全使用与职业伤害预防
- 2026年家庭农场病虫害绿色防控技术
- 2026年洪涝灾害后卫生防疫与健康指导
- 某皮革厂产品研发流程细则
- 2026年气体分析仪比对验证试验方法
- 2026年基于理解的逆向教学设计模板
- Unit5OldtoysPartALet'sspell(课件)人教PEP版英语三年级下册
- 2026年深度学习及其应用-复旦大学中国大学mooc课后章节答案期末练习题(典型题)附答案详解
- 2026云南昆华医院投资管理有限公司(云南新昆华医院)招聘5人备考题库及答案详解参考
- 2026届陕西省西安市五校中考三模语文试题含解析
- 七年级下册数学几何题训练100题(含答案)
- 教科版四年级科学上册《第1单元声音 单元复习》教学课件
- 电梯井安全防护及施工操作平台监理细则(3篇)
- 上海市建筑施工风险管控与隐患排查实施导则
- 民法典宣传月普法宣传教育
- MOOC 理性思维实训-华南师范大学 中国大学慕课答案
- 冬虫夏草药品项目实施方案
评论
0/150
提交评论