收藏 分享(赏)

第5章项目三 单片机存储结构及C51语言.ppt

上传人:Facebook 文档编号:2348550 上传时间:2018-09-11 格式:PPT 页数:131 大小:1.36MB
下载 相关 举报
第5章项目三 单片机存储结构及C51语言.ppt_第1页
第1页 / 共131页
第5章项目三 单片机存储结构及C51语言.ppt_第2页
第2页 / 共131页
第5章项目三 单片机存储结构及C51语言.ppt_第3页
第3页 / 共131页
第5章项目三 单片机存储结构及C51语言.ppt_第4页
第4页 / 共131页
第5章项目三 单片机存储结构及C51语言.ppt_第5页
第5页 / 共131页
点击查看更多>>
资源描述

1、项目三 基本功,任务一 MCS-51单片机基础 任务二 单片机C51语言程序设计基础,按功能可分成8个部件,通过片内单一总线连接起来,1.微处理器,2.数据存储器,3.程序存储器,4.I/O口,5.串行口,6.定时/计数器,7.中断系统,8.特殊功能寄存器,控制方式:SFR对各功能部件集中控制,片内总线,任务一 MCS-51单片机基础,一、MCS-51单片机内部结构及功能部件,二、MCS-51单片机存储器及存储空间,1、存储器的概念 什么是存储器呢? 存储器好比一栋楼,假如这栋楼共有256层,我们称存储器 的空间是256字节Byte),又叫256个单元,表示为256B;每 个单元共有8位(bi

2、t),相当于8个房间,每位(bit)可以 存放一位二进制数“0”或“1”,那么每个单元可以存放8位二进 制。在访问存储器时,有的单元只能8位同时存入或者8位同 时取出,这种操作叫字节操作;有的单元既能字节操作,又 能对该单元中的某1位单独操作,这种操作叫位操作。要想 进行位操作,通常要给每位分配一个地址,这个地址叫位地 址,用十六进制表示为00H,01H,2、MCS-51单片机存储器分类及配置,存储器分为两种: 一种是用于数据缓冲和数据暂存,称为数据存储器,简称为 RAM,其特点是可以通过指令对其数据进行读写操作,掉电 后数据即丢失; 另一种是用于存放程序和数据表格,称为程序存储器,简称 为R

3、OM,其特点是其数据通过指令只能读取而不能写入和修 改,数据能长久保存,即使掉电也能保存十年以上。,采用数据与程序空间分开的哈佛(Har-vard)结构。 一、程序存储器空间:1、内部: 8051(4K)、 8052(8K)、8031(无)。2、总寻址能力64K(内部外部、或外64K)。 二、数据存储器空间: 1、内部(以8051为例):(1) 128字节通用存储器(00-7FH):分工作寄存器区、可位寻址区、用户RAM区。(2) 特殊功能寄存器SFR (80-FFH):只使用21字节,其余字节不可用。2、外部64K。 3、总寻址能力内部外部 。,程序存储器 存放应用程序和表格数据等常数,分片

4、内和片外两部分,其访问由EA引脚所接电平确定。总寻址能力64K内部外部、或外64K。 6个单元具有特殊用途 0000H 系统程序的复位(起始)地址 0003H 外中断0中断入口地址 000BH 定时器T0中断入口地址 0013H 外中断1中断入口地址 001BH 定时器T1中断入口地址 0023H 串行口中断入口地址,数据存储器 1、内部:(1) 128字节通用存储器, 分工作寄存器区、可位寻址区、用户RAM区。(2) 特殊功能寄存器SFR , 只使用21字节,其余不可用。 2、外部64K。 3、总寻址能力内部外部。 4、可位寻址区16字节共128位,每位有地址(位地址),可进行位操作。,特殊

5、功能寄存器SFR 80H-FFH中,使用21字节,其中地址低半字节为0或8的单元可位寻址(有位地址),见P21表2-2。 1、堆栈指针SP 指示堆栈栈顶在内部RAM块中的位置。堆栈:在内部RAM通用存储区中开辟的一块单元,用以保护中断断点地址和程序调用返回地址。 向上生长型。 2、数据指针DPTR 访问外部RAM所用单元指针,分高字节DPH和低字节DPL。 3、I/O端口锁存器P0P3,分别为I/O端口P0P3的锁存器。,4、寄存器B执行乘法和除法操作所用,在不执行乘、除的情况下,可当作一个普通寄存器来使用。 5、串行口数据缓冲器SBUF 存放欲发送或已接收的数据,物理上由两个独立的寄存器组成

6、,一个发送一个接收。但用一个字节地址,按接收、发送功能自动访问不同的寄存器。 6、定时器/计数器 两个16位定时器/计数器T1和T0,各由两个独立的8位寄存器组成: TH1、TL1、TH0、TL0,只能字节寻址,但不能把T1或T0当作一个16位寄存器来寻址访问。,位地址空间211个(128个+83个)寻址位。位地址范围为:00HFFH。 内部RAM的可寻址位128个(字节地址20H2FH) 。特殊功能寄存器SFR为83个可寻址位。,2.4.5 外部数据存储区一、外部程序存储区与数据存储区分别为64K,地址是重叠的,访问时指令不同、时序不同。 二、外部程序存储区一般用于外扩程序存储器(ROM)。

7、三、外部数据存储区除用于外扩数据存储器(RAM)外,还可外接I/O端口,此时,RAM与I/O端口统一编址,使用与访问外部数据存储器相同的传送指令。,P0P3,4个双向的8位并行I/O端口,属于特殊功能寄存器,可位寻址。P0口:双向8位三态I/O口,通用I/O、地址总线低8位及数据总线分时复用。P1口:8位准双向I/O口,通用I/O 。P2口:8位准双向I/O口,通用I/O、地址总线高8位复用。P3口:8位准双向I/O口,通用I/O、功能复用口。 注意: 准双向口与双向三态口的差别:1、准双向I/O口作输入口使用时,要向该口先写“1”。2、准双向I/O口无高阻的“浮空”状态。3、双向三态口作通用

8、I/O口时,要外接上拉电阻。,三、进一步了解并行I/O端口,只作通用I/O;内部有上拉电阻,不需外接。无高阻状态,非三态,所以为准双向口。 一、输出 写锁存器,反相输出后控制场效应管通断。,二、输入1、先向口锁存器写入 “1”,使场效应管截止,否则,引脚恒为02、区分“读引脚”和“读锁存器”。 “读引脚”,读端口指令用,引脚状态经下方缓冲器读入内部总线; “读锁存器”,读-修改-写指令用,锁存器Q端状态经上面缓冲器读入内部总线。,P1端口,二、地址或数据线控制信号为1,MUX打向上边,输出驱动电路由于上下两 个FET处于反相,形成推拉式电路结构,大大提高负载能力。,控制线=0,MUX接锁存器,

9、通用I/O; 控制线=1,MUX接地址/数据。一、通用I/O口双向三态口,需外接上拉电阻。,P0端口,P2端口,由控制线控制MUX,作通用I/O口和高8位地址总线 一、通用I/O口,准双向口。 二、高8位地址总线 。,通用I/O、第二功能引脚 一、通用I/O口 “第二输出功能”线保持为1二、第二功能引脚 1、输出 由“第二输出功能”线输出,这时,口锁存器应先置1,否则,引脚恒为0。,2、输入 由引脚输入,这时, “第二输出功能”线保持为1。 口锁存器应先置1, 否则,引脚恒为0。,P3端口,一 C51的数据 二 C51对单片机主要资源的控制 三 C51的基本运算与流程控制 四 C51的数组与指

10、针 五 C51函数 六 C51的预处理命令,任务二 单片机C51语言程序设计基础,一、C51的数据,1 数据类型 2 常量与变量 3 数据存储类型 4 局部变量与全局变量,1 数据类型,2 常量与变量,常量C51语言中的常量是不接受程序修改的固定值,常量可以是任意数据类型。C51中的常量有整型常量、实型常量、字符型常量、字符串常量符号常量等。,(1)整型常量,在整型常量后加一个字母“L”或“l”,表示该数位长整型。例如23L、0Xfd4l等。如果需要的是负值,则必须将负号“-”放置于常量表达式的最前面,例如-0x56、-9等。,(2)实型常量,实型常量又称浮点常量,是一个十进制表示的符号实数。

11、实型常量的值包括整数部分、尾数部分和指数部分。实型常量的形式如下:digits.digitsE+/-digits一些实型常量的示例如下:15.75、1.575E1、1575E-3、-0.0025、-2.5e-3、25E-4。,(3)字符型常量,字符型常量是指用一对单引号括起来的一个字符。如a、9、!等。字符常量中的单引号只起定界作用并不表示字符本身。在C51语言中,字符是按其对应的ASCII码值来存储的,1个字符占1个字节,(4)字符串常量,字符串常量是指用一对双引号括起来的一串字符,双引号只起定界作用,如“China”、“123456”等。 字符串常量在内存中存储时,系统自动在字符串的末尾加

12、一个串结束标志,即ASCII码值中为0的字符NULL,常用0表示。 字符常量与字符串常量的区别:字符A只占用1个字节字符串“A”占用2个字节,(5)符号常量,C51语言中允许将程序中的常量定义为一个标识 符,称为符号常量。符号常量一般使用大写英文字母表示,以区别于 一般用小写字母表示的变量。符号常量在使用前必须先定义,定义的形式是:#define 标识符 常量#define PI 3.1415926 注:符号常量一般使用大写英文字母表示,以区别 一般用小写字母表示的变量。,2变量,变量的定义:数据类型 变量名;int i,j,k;unsigned char si;unsigned int ui

13、;double balance,profit,loss;C51中常用的:bit、char、int,(1)整型变量(int) 16位数据,有符号:signed int-32 76832 767 无符号:unsigned int 065 535 C51语言将int型变量的高位存放在低字节如:0x1234存储形式,(2)长整型变量(long int)长整型变量长度是32位,占用4个字节 (byte),其他方面和整型变量(int)相似。,(3)实型变量,分为单精度(float)型和双精度(double)型。其定义形式为:float x,y; /指定x,y为单精度实数double z; /指定z为双精度

14、实数在一般系统中,一个float型数据在内存中占4个字节(32位),一个double型数据占8个字节(64位)。单精度实数提供7位有效数字,双精度实数提供1516位有效数字。,(5)字符变量char,字符变量用来存放字符常量。注意只能存放1个字符。字符变量的定义形式如下:char 变量名;例如: char c1,c2; 它表示c1和c2为字符变量,各存放1个字符。可以用下面的语句对c1、c2赋值:c1=a;c2=b;字符变量的长度是1字节(byte)即8位。这很适合于8051单片机,因为8051单片机每次可以处理8位数据。,(6)位变量(bit),变量的类型是位,位变量的值可以是1(true)

15、或0(false)。与8051硬件特性操作有关的位变量必须定位在8051单片机片内存储区(RAM)的可位寻址空间中。注意:在编程时必须慎重地进行变量和数据类型的选择,3有符号/无符号问题说明,(1)尽量使用无符号变量,且尽可能地使用无符号 字符变量、位变量(能被单片机更好地接受) (2)在编程时,为了书写方便,经常使用简化的缩 写形式来定义变量的数据类型:#define uchar unsigned char#define uint unsigned int,3 数据存储类型,数据时存放在51单片机的存储器中的,因此要规定数据的存储类型。常用:data、xdata、code另外:bdata,(

16、1)data区,data区的寻址是最快的,所以应该把经常使用的变量放在data区,但是data区的空间是有限的,data区除了包含程序变量外,还包含了堆栈和寄存器组。 data区声明中的存储类型标式符为data,通常指片内RAM的低128字节的内部数据存储的变量,可直接寻址。 声明举例如下:unsigned char data system_status=0;unsigned int data unit_id2;char data inp_string16;,(2)bdata,bdata实际是data中的位寻址区,在这个区中声明变量就可以进行位寻址。位变量的声明对状态寄存器来说是十分有用的,因

17、为它可能仅仅需要某一位,而不是整个字节。 bdata区声明中的存储类型标识符为bdata,指内部可位寻址的16字节存储区(20H到2FH),数据类型是可位寻址变量的数据类型。 以下是在bdata区中声明的位变量和使用位变量的例子:,unsigned char bdata status_byte;unsigned int bdata status_word;unsigned long bdata status_dword;sbit stat_flag=status_byte4;if(status_word15) stat_flag=1;,(3)idata区,idata区也可以存放使用比较频繁的变

18、量,使用寄存器作为指针进行寻址。idata区声明中的存储类型标识符为idata,指内部的256字节的存储区,但是只能间接寻址,速度比直接寻址慢。 声明举例如下:unsigned char idata system_status=0;unsigned int idata unit_id2;char idata inp_string16;float idata out_value;,(4)pdata区和xdata区,pdata区和xdata区属于外部数据存储区,外部数据区是可读可写的存储区,最多可以有64KB。 在这两个区,变量的声明与在其他区的语法是一样的,但pdata区只有256字节而xdat

19、a区可达65 536字节。,声明举例如下:,unsigned char xdata system_status=0;unsigned int pdata unit_id2 ;char xdata inp_string16 ;float pdata out_value; 外部地址段中除了包含存储器地址外,还包含I/O器件的地址。对外部器件寻址可以通过指针或C51提供的宏,使用宏对外部器件I/O口进行寻址更具可读性。,(5)程序存储区code,程序存储区的数据是不可改变的,跳转向量和状态表对code段访问和对xdata区访问的时间是一样的。编译的时候要对程序存储区中的对象进行初始化,否则就会产生错

20、误。程序存储区code声明的标识符为code,在C51语言编译器中可以用code存储区类型标识符来访问程序存储区。 下面是程序存储区声明的例子:unsigned char code a = 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15;,单片机访问片内RAM比访问片外RAM相对快一些,(1)应当将使用频繁的变量置于片内数据存储器,即采用data、bdata或idata存储类型; (2)将容量较大的或使用不怎么频繁的变量置于片外RAM,即采用pdata或xdata存储类型。 (3)常

21、量只能采用code存储类型。,变量存储类型定义举例: char data var1; bit bdata flags; float idata x,y,z; unsigned int pdata dimension; unsigned char xdata vector1044;,(6)存储模式,SMALL模式 所有变量都默认位于51单片机的内部的数据存储器,这与使 用data指定存储器类型的方式一样。 COMPACT模式 所有变量都默认位于外部数据存储器的1页内,这与使用 pdata指定存储器类型的方式一样。该存储器类型适用于变 量不超过256字切的情况。与SMALL模式相比,该存储器模式

22、的效率比较低,对变量访问的速度也慢一些,但比LARGE模 式快。 LARGE模式 所有变量都默认位于外部数据存储器,并使用数据指针DPTR 进行寻址,该模式要比SMALL和COMPACT模式产生更多的代码。,4 局部变量与全局变量,从变量的作用范围来区分,变量可以被分为全局变量和局部变量;某些变量在程序运行过程中是始终存在的-全局变量。某些变量只是在进入某个函数时才开始存在-局部变量。,1局部变量,局部变量是在某个函数中存在的变量,也可以称为内部变量,它只在该函数内部有效。局部变量可以分为动态局部变量和静态局部变量,使用关键词auto定义动态局部变量(auto可以省略),使用关键词static

23、定义静态局部变量,例如:auto int a;static unsigned char j;,动态局部变量和静态局部变量的区别如下:,动态局部变量在函数被调用时分配存储空间和初始化,每次函数调用时都需要初始化;静态局部变量在编译程序时分配存储空间和初始化,仅初始化一次。 动态局部变量存放在动态存储区,在每次退出所属函数时释放;静态局部变量存放在静态存储区,每次调用后函数不释放,保持函数执行完毕之后的数值到下一次调用。 如果在建立时动态局部变量不初始化则为一个不确定的数,静态局部变量不初始化,则它们的值为0或者是空字符。,2全局变量,全局变量是在整个源文件中都存在的变量,又称为外部变量。全局变量

24、的有效区间是从定义点开始到源文件结束,其中的所有函数都可以直接访问该变量,如果定义点之前的函数需要访问该变量,则需要使用extern关键词对该变量进行声明,如果全局变量声明文件之外的源文件需要访问该变量,也需要使用extern关键词进行声明。,全局变量有以下特点:,全局变量是整个文件都可以访问的变量,可以用于在函数之间共享大量的数据,存在周期长,在程序编译时就存在,如果两个函数需要在不互相调用时共享数据,则可以使用全局变量进行参数传递; C51语言程序的函数只支持一个函数返回值,如果一个函数需要返回多个值,除了使用指针外,还要使用全局变量; 使用全局变量进行参数传递可以减少从实际参数向形式参数

25、传递时所必需的堆栈操作;,在一个文件中,如果某个函数的局部变量和全局变量同名,则在这个局部变量的作用范围内局部变量不起作用,全局变量起作用; 全局变量一直存在,占用了大量的内存单元,并且加大了程序的耦合性,不利于程序的移植或复用。 静态局部变量的作用范围仅仅是在定义的函数内,不能被其他的函数访问,全局变量的作用范围是整个程序,静态全局变量的作用范围是该变量定义的文件; 静态局部变量是在函数内部定义,全局变量是在所有函数外定义;,静态局部变量仅仅在第1次调用时被初始化,再次调用时使用上次调用结束时的数值,全局变量在程序运行时建立,值为最近一条访问该全局变量的语句执行的结果。,main函数虽然是.

26、c文件的主文件,但也是一个函数,在其内部定义的变量也属于局部变量。 全局变量一般在.c文件的开始部分定义或在.h文件中定义,由.c文件引用。 C51语言程序多使用全局变量传递参数,因为这样可以降低程序处理的难度,加快程序执行的速度,提高程序的时效性。,二、C51对单片机资源的控制,1 特殊功能寄存器的C51语言定义 2 绝对地址的访问 3 位变量的C51语言定义,1 特殊功能寄存器的C51定义,21个特殊功能寄存器。两种方式: (1)使用关键字sfr定义sfr 特功器名字=特殊功能寄存器地址;sfr SCON=0x98;/*串口控制寄存器地址98H*/sfr TMOD=0X89;/*定时器/计

27、数器方式控制寄存器地址89H*/,(2)通过头文件访问SFR,#include /使用的单片机为Intel公司的MCS-51void main(void) TL0=0xb0; TH0=0x3c;TR0=1; /启动定时器0.,(3)SFR中位定义3种方式,(a)第1种方法sbit 位名=特殊功能寄存器名位置; (b)第2种方法sbit 位名=字节地址位置; (c)第3种方法sbit 位名=位地址;,sfr PSW=0xD0;sbit OV=PSW2;sbit OV=0xD02;sbit OV=0xD2;unsigned char bdata flag;sbit flag0=flag0;sfr

28、P1=0x90;sbit P1_0=P10;sbit P1_1=P11;sbit P1_6=P16;sbit P1_7=P17;,例:,2 绝对地址的访问,包括:片内RAM、片外RAM及I/O口可以有两种方式:(a)通过宏定义(b)_at_,(a)通过宏定义,用#include可使用其中声明的宏来访问 绝对地址, DBYTE以字节形式对data区寻址; DWORD以字形式对data区寻址; XBYTE以字节形式对xdata区寻址; XWORD以字形式对xdata区寻址; CBYTE以字节形式对code区寻址; CWORD以字形式对code区寻址; PBYTE以字节形式对pdata区寻址; PW

29、ORD以字形式对pdata区寻址。,如:,#include #define PORTA XBYTE0xFFC0/*将PORT定义为外部I/O口,地址为0xFFC0,长度为8位*/ #define NRAM DBYTE0x40/*将NRAM定义为片内RAM,地址为40H,长度为8位*/,例3-5( P61 ),#include #define PA XBYTE0xffec/将PA定义为外部I/O口,地址为0xffec #define NRAM DBYTE0x40/*将NRAM定义为片内RAM,地址为40H,长度为8位*/void main( ) PA=0x3A; NRAM=0x01; ,(2)_

30、at_关键词,可以使用关键字_at_对指定的存储器空间的绝对地址进行访问。一般格式如下: 【存储类型】 数据类型符 变量名 _at_ 地址常数;,可省略,例3-6(P62),data unsigned char x1 _at_ 0x40; /*在data区定义字节变量x1,它的地址为40H*/ xdata unsigned int x2 _at_ 0x2000;/*在xdata区定义字变量x2,它的地址为2000H*/ void main(void) x1=0xff; x2=0x1234H;.while(1); ,3 位变量的C51语言定义,(1)位变量的C51语言定义采用关键字bit进行定义

31、。例如:bit direction_bit; bit lock_pointer;bit display_invers;,(2)可位寻址对象,可位寻址对象指可以字节或位寻址的对象。该对象应位于8051片内可位寻址RAM区中。 位变量的存储类型只能是bdata。在程序设计时,对于可位寻址的对象,即可以字节寻址也可以位寻址的变量,但其存储类型只能是bdata。bdata使用时应先说明字节变量的数据类型和存储类型,然后可使用bit定义可独立寻址访问的对象位。,例如:,bdata int ibase; bdata char bary4;sbit mybit0=ibase0; sbit mybit15=i

32、base15;sbit Ary07=bary07; sbit Ary37=bary37;Ary37=0;bary3=a;,sbit定义要求基址对象的存储类型为bdata,只有这样其特殊位定义(sbit)是合法的。位置(操作符)后的最大值依赖于指定的基类型,对于char/uchar而言是07,对于int/uint而言是015,对于long/ulong而言是031。,三、C51的基本运算与流程控制,1 基本运算 2 选择(分支)控制语句 3 循环结构流程控制语句 4 break语句、continue语句、goto语句,1 基本运算(运算符),运算符是表示特定的算术或逻辑运算的符号,也称操作符。在C

33、51语言中把需要进行运算的各个量通过运算符连接起 来,便构成表达式。 算术运算符、关系运算符、 逻辑运算符、位运算符、 赋值运算符、特殊运算符,算术运算,算术运算的操作符: + (加法运算符)、- (减法运算符) * (乘法运算符)、/ (除法运算符) (模运算或取余运算符) + 为自增运算符 - 为自减运算符,注意:,/:结果的整数部分 %:结果的余数部分 -:除进行减法外,还可以进行取负操作。 +:自增。表示操作数加1。 X+ 等同于X=X+1。+X 表示先加1,再取值X+表示先取值,再加1。,关系运算成立或不成立,主要用于比较操作数的大小关系。 包括:(大于)、= (大于等于)、 = =

34、 (等于)、!= (不等于) 看关系是否成立。结果:0或1,例3-9 关系运算符运算的程序示例,#include void main( ) int a, b, c, d;a=-2.30; b=71=32;c=7!=0; d=-12=0;printf(“a=%d, b=%d, c=%d,d=%dn”, a, b, c, d); ,逻辑运算结果是真或假,进行逻辑运算的操作符。包括: & (逻辑与)、| (逻辑或)、 !(逻辑非) 看结果是否为真。结果:0或1。,例3-10 逻辑运算的程序示例,#include void main( ) int a, b, c, d, e ;a=!0 ; b=15

35、,位运算,将两个操作数按二进制数展开,然后对应位进行逻辑运算。包括: &(按位与)、|(按位或)、(按位异或)、(按位取反)、(位右移) 位运算的操作对象只能是整型和字符型数据。 这些位运算和汇编语言中的位操作指令十分类似。位操作指令是单片机的重要特点,所以位运算在C51语言控制类程序设计中的应用比较普遍。,例3-11 位运算程序示例,将a值循环右移2位 main( ) unsigned char a=0xc3,b,c;int n=2;b=an;a=c|b; ,例3-12 位运算程序示例,#include void main( ) int a, b,c; a=23; b=217;c=a ,赋值

36、运算,变量名=表达式; 例如: a=(b=4)+(c=6); 该表达式的值为10,变量a的值为10。,复合赋值运算符:,赋值符号前加上其他运算符构成复合运算符。C51语言提供以下10种复合运算符: +=,-=,*=,=,=,=,=,=,= 例如: a+=b; /等价于a=(a+b) x*=a+b; /等价于x=(x*(a+b) a /等价于a=(a4),算术运算符、逻辑运算符、关系运算符、赋值运算符的优先级,2 选择(分支)控制语句,通过选择结构,可以使计算机具有决策能力,从而使计算机能够按照我们的意志在某个特定条件下完成相应的操作,能够“随机应变”。包括:if语句、switch语句,if语句

37、,if语句用来判定所给定的条件是否满足,根据判定结果决定执行给出的两种操作之一。if语句的基本结构如下:if(表达式) 语句; 括号中的表达式成立时,程序执行大括号内的语句,否则程序跳过大括号中的语句部分而直接执行下面其他语句。 C51语言提供3种形式的if语句:,形式一: if(表达式)语句;,if(xy) max=x; min=y; ,形式二: if(表达式)语句1; else 语句2;,if(xy) max=x; else min=y;,形式三:,if(表达式1)语句1; else if(表达式2)语句2; else if(表达式3)语句3; else if(表达式m)语句m; else

38、 语句n;,如: if(x1000) y=1; else if(x500) y=2;else if(x300) y=3;else if(x100) y=4;else y=5;,例3-16:,#include void main( ) int score; char grade; score=45;if(score=90) grade=A;else if(score=80) grade=B;else if(score=70) grade=C;else if(score=60) grade=D;else grade=E;printf(“score=%d,grade=%cn“,score,grade

39、); ,switch语句,switch语句是多分支选择语句一般形式如下: switch(表达式) case 常量表达式1:语句1; break;case 常量表达式2:语句2; break;.case 常量表达式n:语句n; break;default:语句n+1; ,例3-17,3 循环结构流程控制语句,四种形式:if gotowhiledo-whilefor,基于if和goto构成的循环,1、采用if和goto可以构成“当型”循环loop: if(表达式) 语句;goto loop; 2、采用if和goto也可以构成“直到型”循环程序 loop: 语句;if(表达式) goto loop;

40、 3、goto语句为无条件转向语句 goto 语句标号;,while,while(表达式) 语句; ,注意: 先判断,后执行; 如果循环体内只有一个语句,可以不用 While循环体 后无分号;,do-while,do 语句; while (表达式);,注意: 先执行, 后判断; 如果循环体内只有一个语句,可以不用 循环体 后无分号; while(表达式)后的分号不能省;,for语句,for(表达式1;表达式2;表达式3) 语句; for(y=0;y=99;y=y+3) delay(33);px=px; ,注意: 3个表达式都是可选项,可以任意省略,但“;”不能省。 省1是不对循环变量赋初值;

41、省2是不判断循环条件的真假; 省3是不对循环变量操作。 for( ; ;)表示无限循环。,时间延时程序举例: void msec(unsigned int x) unsigned char j;while(x-) for(j=0;j125;j+) ;,无限循环的实现:(1)for(; ;) 代码段;(2)while(1) 代码段; (3)do 代码段; while(1);,4 break语句、continue语句、goto语句,在循环语句执行过程中,如果需要在满足循环判定条件的情况下跳出代码段,可以使用break或continue语句;如果要从任意地方跳转到代码的某个地方,可以使用goto语句

42、。,1、break,break语句用于从循环代码中退出,然后执行循环语句之后的语句,不再进入循环 。 形式:break; 注意:一个break只能跳出一层循环,例:,#include void main( ) int i, s; i=0; s=0;while(1) s=s+i; i+;if(i100)break;printf(“1+2+100=%dn”,s); ,2、continue,continue语句用于退出当前循环,不再执行本轮循环,程序代码从下一轮循环开始执行,直到判断条件不满足为止。 与break的区别是该语句不是退出整个循环。 形式:continue;,3、goto,goto是一个

43、无条件转移语句。 当执行goto语句时,将程序指针跳转到goto给出的下一条代码,基本格式如下:goto 标号;,例:,void main(void) unsigned char counter;int sum ; sum=0;sumadd: sum=sum+counter;counter+;if(counter101) goto sumadd; ,4 C51的数组与指针,C51语言的构造数据类型主要有数组、指针和结构等。在单片机系统中,数组的应用比较广泛,指针则次之,结构用的相对较少。这里我们只讨论数组和指针。,数组,数组是同类型变量的一个有序集合。 数组用一个名字来标识,称为数组名。数组中

44、的每个变量称为数组元素。 数组有一维、二维、三维和多维数组之分。C51语言中常用的一维、二维数组和字符数组。数组中各元素的顺序用下标表示,下标为n 的元素可以表示为数组名n。改变 中的下标就可以访问数组中所有的元素。,1一维数组,类型说明符 数组名元素个数;int demo110; 初始化:int a5=1,2,3,4,5; int b6=1,2,6;,例3-23:,2二维数组或多维数组,类型说明符 数组名行数列数;float demo234;/demo2 数组有3 行4 列共12 个实型元素int a34=1,2,3,4,5,6,7,8,9,10,11,12;/全部初始化,3字符数组,若一个

45、数组的元素是字符型的,则该数组就是一个字符数组。例如:char a12=“Chong Qing“; /字符数组char add36=“weight“,“height“,“width“; /字符串数组,4查表,#define uchar unsigned charuchar code tempt=32,34,36,37,39,41;/*数组,设置在EPROM中,长度为实际输入的数值数 */uchar ftoc(uchar degc) return temptdegc; void main( ) uchar x;x=ftoc(5);/* 得到与5相应的华氏温度值 */ 共阴极LED的显示字符段码表

46、 char code SEG11=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;,5 C51函数,函数是指能够执行特定功能和任务的程序代码段。 一个完整的C51程序是由一个主函数和若干个其他函数组成。 主函数是main( )函数。有且只有一个main( )函数。 使用函数时注意: 函数数目不限制; main( )函数是主函数,可以调用其他函数,而不允许被其他函数调用。 除主函数外,其他函数之间允许互相调用。,函数分类,可以从不同的角度分类: (1)有无返回值角度 (2)数据传送角度 (3)函数定义角度,(1)有无返回值角度,无返回值函数、有

47、返回值函数 无返回值函数:执行完成后不向主调函数返回函数值。类型说明符为:void 有返回值函数:执行完成后向主调函数返回一个执行的结果返回值。,(2)数据传送角度,有参函数和无参函数。 无参函数:主调函数和被调函数之间不进行参数的传递。 有参函数:主调函数和被调函数之间存在参数的传递。-形式参数和实际参数,(3)函数定义角度,主函数、自定义函数、库函数 自定义函数:是用户根据自己的需要而编写的函数。从函数定义的形式上可以将其划分无参函数、有参函数和空函数。 无参函数 有参函数 空函数,函数定义,有参函数和无参函数定义。 (1)无参函数的定义方法无参函数的定义形式为:返回值类型标识符 函数名(

48、 )函数体; 无参函数一般不带返回值,因此函数返回值类型标识符可以省略。,(2)有参函数的定义方法有参函数的定义形式为:返回值类型标识符 函数名(形式参数列表)形式参数说明;函数体;,函数定义举例:,#include iInt max(x1,x2) int x1,x2; if(x1x2)return x1;else return x2; void main( ) int x1=17;x2=9;printf(“x1=%d,x2=%d”,x1,x2);printf(“max(x1,x2)=%dn”,max(x1,x2); ,在程序中定义函数应注意:,(1)可将形参类型说明放在形参列表中,如:int max(int x1,int x2) (2)函数位置与声明,函数的参数,形式参数:在定义函数时,函数名后面括号中的变量名称为形式参数,简称形参。 实际参数:函数调用时,主调函数名后面括号中的表达式称为实际参数,简称实参。,函数的返回值,函数调用语句 print_message();函数结果作为表达式的一个运算对象 result=2*gcd(a,b);函数参数 m=max(a,gcd(u,v);,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 中等教育 > 小学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报