《(15)--[4.1]-Keil C51程序设计单片机设计及应用.ppt》由会员分享,可在线阅读,更多相关《(15)--[4.1]-Keil C51程序设计单片机设计及应用.ppt(183页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Keil C51Keil C51程程 序序 设设 计计Keil C51程序设计主要内容:主要内容:nKeil C51Keil C51编程语言;编程语言;nC51C51语言程序设计方法;语言程序设计方法;4.1 Keil C51编程语言Keil C51(由美国Keil Software 公司推出)是目前最流行的51系列单片机C语言软件开发平台,具有程序的编辑、编译、连接、目标文件格式转换、调试和模拟仿真等功能。C51是其中的一个编译器,它具有ANSIC标准C所有的功能,并针对51系列单片机的硬件特点做了扩展。Keil uVision4是众多单片机应用开发软件中最新、最优秀的软件之一,它支持众多不
2、同公司的MCS51架构的芯片,甚至ARM系统,它集编辑,编译,仿真等多种功能于一体,它的界面和常用的微软VC+的操作界面相似,人机交互友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。4.1 Keil C51编程语言pKeil Vision4的使用方法p标准C的基本语法概括性介绍pC51的扩展功能4.1.1 Keil C51的简介Keil C51语言是在ANSI C的基础上针对51单片机的硬件特点进行的扩展,并向51单片机上移植,经过多年努力,C51语言已经成为公认的高效、简洁而又贴近5 1单片机硬件的实用高级编程语言。目前大多数的51单片机用户都在使用C51语言来进行程序设计。用C5
3、1进行单片机软件开发,有如下优点:可读性好。模块化开发与资源共享。可移植性好。代码效率高。4.1.1 Keil C51的简介4.1.2 Keil C51的开发环境pKeil公司目前已推出V7.0以上版本的C51编译器,为5 1单片机软件开发提供了全新的C语言环境,同时保留了汇编代码高效、快速的特点。4.1.2 Keil C51的开发环境p现在,Keil C51已被完全集成到一个功能强大的全新集成开发环境(IDE)Vision4中,该环境下集成了文件编辑处理、编译链接、项目管理、窗口、工具引用和仿真软件模拟器以及Monitor51硬件目标调试器等多种功能,这些功能均可在Keil Vision4环
4、境中极为简便地进行操作。本章用到Keil C51和Keil Vision4两个术语。分别是51单片机编程所用的C语言和51单片机的C51程序编写、调试的集成开发环境。4.1.2 Keil C51的开发环境4.1.3 Keil Vision4初步应用方法p使用汇编语言或C语言要用到编译器,以便把写好的程序编译为机器码,随后才能把HEX可执行文件写入单片机内。4.1.3 Keil Vision4初步应用方法pKeil Vision4是众多单片机应用开发软件中最新、最优秀的软件之一。支持众多不同公司的MCS51架构的芯片,甚至ARM系统;集编辑,编译,仿真等多种功能于一体;界面和常用的微软VC+的操
5、作界面相似,人机交互友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。运行Keil Vision4的首个画面:建立第一个建立第一个Keil Keil Vision4 CVision4 C语言项目语言项目4.1.3 Keil Vision4初步应用方法(1)在Project菜单,选择弹出的下拉式菜单中的New Project,创建新的 Vision项目。注意,这里的项目文件扩展名是uvproj。(2)选择所要的单片机,这里我们选择常用的MCU单片机芯片是Atmel公司的AT89C51。(3)创建新的程序文件如例4-1的串口输出字符串“Hello World!”程序。4.1.3 Keil
6、Vision4初步应用方法4.1.3 Keil Vision4初步应用方法【例例4-14-1】串口输出字符串串口输出字符串“Hello WorldHello World!”#include#include void main(void)SCON=0 x50;/串口方式串口方式1,允许接收允许接收TMOD=0 x20;/定时器定时器1定时方式定时方式2TCON=0 x40;/设定时器设定时器1开始计数开始计数TH1=0 xE8;/11.0592MHz 1200波特率波特率TL1=0 xE8;TI=1;TR1=1;/启动定时器启动定时器 while(1)printf(Hello World!n);
7、/显示显示Hello World!4.1.3 Keil Vision4初步应用方法(4)保存新建的C语言程序可以用File菜单的Save或快捷键Ctrl+S进行保存。如图4-3所示,我们把第一个程序命名为example401.c,保存在项目所在的目录中。4.1.3 Keil Vision4初步应用方法(4)保存新建的C语言程序如图4-3鼠标在屏幕左边project项目区域中的Target 1,点击其左侧的+号;然后,在Source Group1文件夹图标上右击弹出菜单,在这里可以实现在项目中增加减少文件等操作。4.1.3 Keil Vision4初步应用方法(4)保存新建的C语言程序我们点击A
8、dd File to Group Source Group 1弹出文件窗口,选择刚刚保存的example401.c文件,按ADD按钮,实现添加example401.c文件到项目工程,如图4-4所示;然后,点击CLOSE按钮,实现关闭文件窗口并退出。4.1.3 Keil Vision4初步应用方法(4)保存新建的C语言程序这时在Target 1项目文件夹下的Source Group1文件夹图标左边出现了一个小+号说明,文件组中有了文件,点击它可以展开查看。4.1.3 Keil Vision4初步应用方法(5)设置Options for Target Target1在Project下拉菜单中或者在
9、Target 1图标上点击右键,打开Options for Target Target1,弹出项目选项设置窗口。4.1.3 Keil Vision4初步应用方法(5)设置Options for Target Target1如图4-5所示,Output选项页中1是选择编译输出的路径,2是设置编译输出生成的文件名,3则是决定是否要创建HEX文件,选中它就可以输出HEX文件到指定的路径中。4.1.3 Keil Vision4初步应用方法(6)项目的编译运行 (7)进入调试模式在下拉菜单Debug中StartStop Debug Session,或者,快捷键为Ctrl+F5。点击下拉菜单Debug中的
10、Run,或者,快捷键F5,程序连续运行。4.1.3 Keil Vision4初步应用方法(6)项目的编译运行 (7)进入调试模式显示内容见图,在此画面中同时打开了了Serial Windows,以观察字符串的输出情况。4.1.3 Keil Vision4初步应用方法(6)项目的编译运行 (7)进入调试模式图中1为运行按钮,当程序处于停止状态时才有效,图中2为停止按钮,程序处于运行状态时才有效。图中3是复位按钮,模拟芯片的复位,程序回到最开头处执行。4.1.3 Keil Vision4初步应用方法(6)项目的编译运行 (7)进入调试模式按图中的Peripherals下拉菜单中我们可以打开串行调试
11、窗口,如图4所示。这个窗口我们可以看到从51芯片的串行口输入输出的字符,“Hello World!”。4.1.3 Keil Vision4初步应用方法(6)项目的编译运行 (7)进入调试模式最后我们要停止程序运行回到文件编辑模式中,就要先按停止按钮再按StartStop Debug Session开启关闭调试模式按钮。4.1.3 Keil Vision4初步应用方法4.2 MCS-51单片机C51语言程序设计方法p在单片机应用系统开发过程中,应用程序设计是整个应用系统开发的重要组成部分,它直接决定着应用系统开发周期的长短、性能。尽管采用汇编语言编写的应用程序可直接操纵系统的硬件资源,能编写出较
12、高运行效率的程序代码,程序运行速度快。4.2 MCS-51单片机C51语言程序设计方法p但因汇编语言学习困难、可读性差、修改调试困难,且编写比较复杂的数值计算程序非常繁复。因此,为了提高编制单片机系统和其应用程序的效率,改善程序的可读性和可移植性,最好采用高级语言编程,及类似于C语言的单片机开发语言。4.2.1 C514.2.1 C51与与MCS-51MCS-51汇编语言的比较汇编语言的比较C51要比MCS-51汇编语言的可读性好。程序由若干函数组成,为模块化结构。使用C51编写的程序可移植性好。编程及程序调试的时间短。C51中的库函数包含了许多标准的子程序对单片机中的寄存器分配、不同存储器的
13、寻址以及数据类型等细节可由编译器来管理。C51语言能直接对计算机的硬件进行操作,与汇编语言相比它具有如下优点:4.2.2 C51与标准C的主要区别(1)头文件的差异。Keil C51系列的头文件集中体现了各系列芯片的不同资源及功能。(2)数据类型的不同。51系列单片机包含位操作空间和丰富的位操作指令。(3)数据存储类型的不同。51系列单片机有片内、外程序存储器,还有片内、外数据存储器。(4)标准C语言没有处理单片机中断的定义。(5)Keil C51与标准C的库函数有较大的不同。(6)程序结构的差异。C51语言与传统的、通用的像K&R(Kernighan 和Ritchie)所著的C语言是有所区别
14、的。Thompson(左)和Ritchie(中)于1999年接受当时美国总统克林顿授予的国家技术勋章。4.2.2 C51与标准C的主要区别4.2.3 C51数据类型与MCS 51的存贮方式(1)字符集和词汇(2)标识符(3)关键字1C51的字符集、标示符与关键字4.2.3 C51数据类型与MCS 51的存贮方式以下是标准C规定的关键字:auto break case char const continue default do double else enum extern float for goto if int long register return short signed stat
15、ic struct switch typedef union unsigned void volatile while以下是C51扩展的关键字:_at_ alien bdata bit code compact data idata interrupt large pdata _priority_ reentrant sbit sfr sfr16 small _task_ using xdata4.2.3 C51数据类型与MCS 51的存贮方式数据类型数据类型长度(长度(bitbit)长度(长度(bytebyte)数据表示域数据表示域bit11/80,1unsigned char810255s
16、igned char81128127unsigned int162065535signed int1623276832767unsigned long32404294967295signed long32421474836482147483647float3241.176E383.40E+38(6位数字)double6481.176E383.40E+38(10位数字)指针类型243存贮空间0655364.2.3 C51数据类型与MCS 51的存贮方式2C51常量与变量的数据类型(1 1)常量)常量 整型常量:整型常量即整常数又称为标量,有3种表示形式:八进制整数,十六进制整数,十进制整数。字符
17、型常量普通字符和转义字符。常用转义字符及其含义见后页表:字符串常量 实型常量4.2.3 C51数据类型与MCS 51的存贮方式转义字符转义字符含义含义ASCII ASCII 码(码(16/10 16/10 进制数)进制数)0空字符(NULL)00H/0n换行符(LF)0AH/10r回车符(CR)0DH/13t水平制表符(HT)09H/9b退格符(BS)08H/8f换页符(FF)0CH/12单引号27H/39双引号22H/34反斜杠5CH/924.2.3 C51数据类型与MCS 51的存贮方式(2 2)变量)变量 变量定义格式51系列单片机有内部RAM、SFR、外部RAM/IO、程序存贮器等存贮
18、区域,为了能访问不同存贮区域的变量,C51对变量的定义增加了存贮器类型说明。4.2.3 C51数据类型与MCS 51的存贮方式(2 2)变量)变量 变量定义格式变量定义的一般格式为:存贮种类 数据类型 存贮器类型 变量名(或变量名表);定义格式中的方括号部分是可选项,可有可无。4.2.3 C51数据类型与MCS 51的存贮方式(2 2)变量)变量 整型变量:整型变量的类型符为int,有以下4种:有符号基本整型 signed int 无符号基本整型 unsigned int有符号长整型 long int 无符号长整型 unsigned long int 4.2.3 C51数据类型与MCS 51的
19、存贮方式(2 2)变量)变量 字符型变量有符号字符型 signed char 无符号字符型 unsigned char4.2.3 C51数据类型与MCS 51的存贮方式(2 2)变量)变量 实型变量C51支持单精度实型变量,长度为4字节,类型符为关键字float,又称为浮点型。4.2.3 C51数据类型与MCS 51的存贮方式C51语言运行的平台是MCS-51单片机。C51编译器要用一系列机器指令对其进行复杂的数据类型处理。在实际编程时最好采用无符号型数据和尽量少的数据变量类型,这样将明显提高代码的运行效率。3C51数据变量在MCS-51中的存贮方式4.2.3 C51数据类型与MCS 51的存
20、贮方式位型变量字符型变量整型变量长整型变量浮点数4.2.3 C51数据类型与MCS 51的存贮方式 浮点数变量数的表示方法可分为定点表示和浮点表示。浮点数则是小数点的位置是浮动的。通常,对于任意一个二进制数X,都可表示成:X=2EM4.2.3 C51数据类型与MCS 51的存贮方式 X=2EMM表示全部有效数字,称之为数X的尾数;E为数X的阶码,它指明了小数点的位置;2是阶码的底。M和E均为用二进制表示的数,它们可正可负。阶码常用补码表示法,尾数常为原码表示的纯小数。当E值可变时,表示是浮点数。4.2.3 C51数据类型与MCS 51的存贮方式(1)C51数据的存贮类型C51存贮类型与MCS-
21、51实际存贮空间的对应关系4.2.3 C51数据类型与MCS 51的存贮方式4C51数据的存贮类型与MCS51单片机的存贮关系存贮类型存贮类型与与MCSMCS 5151系列单片机存贮空间的对应关系系列单片机存贮空间的对应关系备备 注注data直接寻址片内数据存贮区,访问速度快片内RAM的00H7FH区域bdata位寻址片内数据存贮区,允许位与字节混合访问片内RAM的20H2FH区域idata间接寻址片内数据存贮区,可访问片内全部RAM,用R0,R1间接访问片内全部RAM,即00H0FFH区域pdata由MOVX R0,R1间接访问分页寻址片外数据存贮区,每页256字节,即00H0FFH区域xd
22、ata由MOVX DPTR访问的片外数据存贮区,64KB空间外部64K RAM 0000H0FFFFH区域code程序存贮区,64KB空间,由MOVC DPTR访问外部64K ROM 0000H0FFFFH区域4.2.3 C51数据类型与MCS 51的存贮方式C51允许在变量类型定义之前指定存贮模式。书写格式上,定义data char x与定义char data x是等价的,但应尽量使用后一种方法。在C51中有两种方法来指定存贮模式,例如,以下为两种方法来指定COMPACT模式:方法1:在编译时指定。如使用命令 C51 PROC.C COMPACT方法2:在程序的第一句加预处理命令#pragm
23、a compact4.2.3 C51数据类型与MCS 51的存贮方式(1)MCS-51系列单片机中,除了程序计数器PC,片内RAM低128个字节空间和4组工作寄存器组外。其它所有的寄存器均为特殊功能寄存器(SFR),离散地分布在片内RAM高128个字节中,地址范围为80H0FFH。SFR中地址为8的倍数的寄存器具有位寻址能力。5MCS-51特殊功能寄存器(SFR)及其C51定义方法4.2.3 C51数据类型与MCS 51的存贮方式为了能直接访问SFR,C51编译器提供了一种与标准C语言不兼容,而只适用于对MCS-51系列单片机进行C语言编程的SFR定义方法,其定义8位SFR语句的一般格式为:s
24、fr sfr-name=int constant;4.2.3 C51数据类型与MCS 51的存贮方式(2)由于SFR中地址为8的倍数的寄存器具有位寻址能力,在C51中规定了支持SFR位操作的定义,当然这也是与标准C语言不兼容的,使用“sbit”来定义SFR的位寻址单元。4.2.3 C51数据类型与MCS 51的存贮方式5MCS-51特殊功能寄存器(SFR)及其C51定义方法定义SFR的位寻址单元的语法格式有3种:第1种格式:sbit bit-name=sfr-name int constant第2种格式:sbit bit-name=int constant int constant第3种格式:
25、sbit bit-name=int constant4.2.3 C51数据类型与MCS 51的存贮方式(3)MCS-51位变量及其C51定义方法 位变量的C51定义的方法C51通过“bit”关键字来定义位变量,一般格式为:bit bit-name;5MCS-51特殊功能寄存器(SFR)及其C51定义方法4.2.3 C51数据类型与MCS 51的存贮方式 C51程序函数的参数及返回值C51程序函数可包含类型为“bit”的参数,也可以将其作为返回值。例如:bit func(bit b0,bit b1)/*位变量b0、b1作为函数的参数*/return(b1);/*变量b1作为函数的返回值*/4.2
26、.3 C51数据类型与MCS 51的存贮方式 对位变量的限制位变量不能说明为指针和数组。例如:bit*ptr;/*用位变量定义指针,错误*/bit b-array;/*用位变量定义数组,错误*/在定义位变量时,允许定义存贮类型,位变量都被放入一个位段,此段总位于MCS-51系列单片机片内RAM中,因此其存贮类型限制为data或idata,如果将其定义成其它类型都将在编译时出错。4.2.3 C51数据类型与MCS 51的存贮方式4.2.4 MCS-51并行接口及其C51定义方法MCS-51系列单片机片内有4个并行I/O口(P0P3),因这4个并行I/O口都是SFR,故这4个并行I/O口的定义采用
27、定义SFR的方法。MCS-51系列单片机在片外可扩展并行I/O口,因其外部I/O口与外部RAM是统一编址的,即把一个外部I/O口当作外部RAM的一个单元来看待。4.2.4 MCS-51并行接口及其C51定义方法利用绝对地址访问的头文件absacc.h可对不同的存贮区进行访问。该头文件的函数有:CBYTE(访问code区字符型)DBYTE(访问data区字符型)PBYTE(访问pdata区或I/O口字符型)XBYTE(访问xdata区或I/O口字符型)对于片外扩展的I/O口,根据硬件译码地址,将其看作片外RAM的一个单元,使用语句#define 进行定义。例如:#include /*必须要,不能
28、少*/#define PORTA XBYTE0 xFFC0/*定义外部I/O口PORTA的地址为外部RAM的0FFC0H*/4.2.4 MCS-51并行接口及其C51定义方法当然也可把对外部I/O口的定义放在一个头文件中,然后在程序中通过#include语句调用,一旦在头文件或程序中通过使用#define语句对片外I/O口进行了定义,在程序中就可以自由使用变量名(如PORTA)来访问这些外部I/O口了。4.2.4 MCS-51并行接口及其C51定义方法4.2.5 C51的运算符和表达式C语言的运算符有以下几类:算术运算符、逻辑运算符、位操作运算符、赋值运算符、条件运算符、逗号运算符、求字节数运
29、算符和一些特殊运算符。用运算符和括号将运算对象(也称为操作数)连接起来并符合C语法规则的式子称为表达式;C语言有算术表达式、赋值表达式、逗号表达式、关系表达式、逻辑表达式等。C运算符的优先级有15级(具体内容见相关通用C语言书籍)在表达式求值时,按运算的优先级由高至低的次序运算(例如先乘除后加减)若在一个运算分量的两侧出现两个相同优先级的运算待时,则按运算符的结合性处理。有的运算符具有左结合特性,按自左至右的次序计算;有的运算符具有右结合特性,按自右至左的次序运算。4.2.5 C51的运算符和表达式(1)算术运算符+(加)、-(减)、*(乘)、(除)都是双目运算符;%(求余数运算符,也称模运算
30、)为双目运算符;+(取正)、-(取负)都是单目运算符,具有右结合特性;+(自增1)、-(自减1)运算符。自增1和自减1运算符都是单目运算符,都具有右结合特性,它们只能用于变量的加1或减1:+i;-j;*先自加,后引用*i+;j-;*先引用,后自加*4.2.5 C51的运算符和表达式1算术运算符和算术表达式(2)算术表达式由算术运算符、括号将运算对象连接起来的式子称为算术表达式。例如:a、b、x、y都是整型变量,则下式 a+b、a*2/x、(x+y)*8 都是算术表达式4.2.5 C51的运算符和表达式1算术运算符和算术表达式位运算符的功能是对数据进行按位运算,使之能对单片机的硬件直接进行位操作
31、,位运算符只能用于字符型和整型数据,不能用于浮点数。4.2.5 C51的运算符和表达式2.位运算符和位运算C51共有以下6种位运算符。(1)按位与运算符&(2)按位或运算符|(3)按位异或 (4)按位取反 (5)左移运算符 4.2.5 C51的运算符和表达式(1)赋值运算符和赋值表达式赋值运算符的符号为“=”,其优先级别很低,仅仅高于最低优先级别的“,”逗号运算符。由赋值运算符将一个变量和一个表达式连起来称为赋值表达式,其一般形式为:变量=表达式;4.2.5 C51的运算符和表达式3.赋值运算符和赋值表达式(2)复合赋值运算符及表达式在赋值运算符“=”的前面加上其他双目运算符,就构成复合赋值运
32、算符。c的复合赋值运算符有如下十种:+=、-=、*=、=、%=、=、&=、=、|=由复合运算符将一个变量和表达式连起来也构成赋值表达式。一般形式为:变量 双目运算符=表达式;4.2.5 C51的运算符和表达式3.赋值运算符和赋值表达式“,”逗号是C的一种特殊运算符,其功能是把几个表达式连接起来,组成(逗)号表达式,一般形式为:表达式1,表达式2,表达式n;逗号表达式的功能是依次计算表达式1,表达式2,表达式n的值,整个逗号表达式的值为表达式n的值。逗号表达式在for(;)循环控制语句中用于对循环变量的初始化。4.2.5 C51的运算符和表达式4.逗号运算符和逗号表达式4.2.6 C51语句和结
33、构化程序设计C51语句是计算机执行的操作命令,一条语句以分号结尾(注意:程序中的变量、函数声明部分尽管不是语句,但也以分号结尾)。1.C51语句和程序结构表达式语旬的一般形式为如下:例如:x=y+z;*赋值语句*i+;*自增1语句*4.2.6 C51语句和结构化程序设计2表达式语句、复合语句和顺序结构程序顺序结构程序由按先后顺序执行的多个语句组成,在C语言中,将按顺序执行的多条语句用花括号括起来构成复合语句,复合语句中每个语句以分号结尾,复合语句花括号后不再加分号。4.2.6 C51语句和结构化程序设计2表达式语句、复合语句和顺序结构程序而没有内容,只有分号,不执行任意操作的语句称为空语句。像
34、赋值语句那种不包含其他语句的语句,称为简单语句。4.2.6 C51语句和结构化程序设计2表达式语句、复合语句和顺序结构程序(1)关系运算符和关系表达式比较两个量的大小关系的运算符称为关系运算符关系运算符有以下6种:(小于)、(大于)、.=(大于等于)、=(等于)、!=(不等于)4.2.6 C51语句和结构化程序设计3.选择语句和选择结构程序关系运算符都是双目运算符,都具有左结合特性。关系表达式的一般形式为:表达式1 关系运算符 表达式24.2.6 C51语句和结构化程序设计3.选择语句和选择结构程序(2)逻辑运算符和逻辑表达式逻辑运算符有&(逻辑与)、|(逻辑或)、!(逻辑非)这样三种。4.2
35、.6 C51语句和结构化程序设计3.选择语句和选择结构程序(3)if语句if语句用来判定所给的条件是否满足来决定执行的两种可能操作之一。if话句有3种形式。4.2.6 C51语句和结构化程序设计3.选择语句和选择结构程序 if(表达式)语句;括号中的表达式一般为关系表达式或逻辑表达式。当表达式的值为非零时,则执行语句;否则,不执行语句。语句可以是简单语句或复合语句。4.2.6 C51语句和结构化程序设计3.选择语句和选择结构程序 if(表达式)语句1;else 语句2;当括号中的表达式值为非零时执行语句1;否则,执行语句2。其中的语句1和语句2可以是简单语句或复合语句。4.2.6 C51语句和
36、结构化程序设计3.选择语句和选择结构程序 if(表达式1)语句1;else if(表达式2)语句2;:else if(表达式n)语句n;else 语句n+l;这种形式的if语句可以实现多种条件的选择。4.2.6 C51语句和结构化程序设计3.选择语句和选择结构程序(4)条件表达式在if(表达式)语句1;else 语句2;这种形式中,若语句1、语句2都是给同一个变量赋值,则可以用更加简洁的条件表达式来实现。条件表达式的一般形式为:表达式1?表达式2 :表达式34.2.6 C51语句和结构化程序设计3.选择语句和选择结构程序(4)条件表达式条件表达式求解时,先求表达式1的值,若非零(即表达式1为真
37、),则求解表达式2的值,并作为整个条件表达式的值;如果表达式1的值为零(即表达式1为假),则求解表达式3的值,并作为整个条件表达式的值。4.2.6 C51语句和结构化程序设计3.选择语句和选择结构程序(5)switch语句switch语句是直接处理多分支的选择语句,其功能类似于51的散转指令JMP A+DPTR。4.2.6 C51语句和结构化程序设计3.选择语句和选择结构程序一般形式为:switch(表达式)case常量表达式1:语句1;case常量表达式2:语句2;:case常量表达式n:语句n;default:语句n+l;4.2.6 C51语句和结构化程序设计【例例4-24-2】若在一个应
38、用系统中设置若在一个应用系统中设置5 5个单字符命令:个单字符命令:A A、F F、G G、WW、Z Z。变量。变量SIO_INSIO_IN为串行口输入的字符。要求设计一个程序,若为串行口输入的字符。要求设计一个程序,若SIO_INSIO_IN为合法的命令字符求出其命令号为合法的命令字符求出其命令号(0(0 4)4),非法字符则置为,非法字符则置为0FFH0FFH。设。设SIO_INSIO_IN、CMD_NCMD_N为已定义的无符号字符型变量,则程序如下:为已定义的无符号字符型变量,则程序如下:4.2.6 C51语句和结构化程序设计switch(SIO_IN)*SIO一IN为输入字符变量*ca
39、se A:CMD_N=0;break;*CMD N为命令号*case F:CMD_N=l;break;case G:CMD_N=2;break;case W:CMD_N=3;break;case Z:CMD_N=4;break;default:CMD_N=0 xff;4.2.6 C51语句和结构化程序设计(1)while语句while语句的一般形式为:while(表达式)语句;4.2.6 C51语句和结构化程序设计4循环语句和循环结构程序【例例4-34-3】求求S=1+2+3+100S=1+2+3+100和的程序,请用和的程序,请用whilewhile循环来实现:循环来实现:#include
40、void main()unsigned int s=0;*定义变量并初始化*unsigned char i=l;while(i=100)s+=i;*循环体为复合语句*i+;*修改循环变量xprintf(s=%dn,s);4.2.6 C51语句和结构化程序设计(2)do-while语句Do 语句;*循环体,可以是简单语句或复合语句*while(表达式);*其后分号不可少,表达式为关系表达式或逻辑表达式*4.2.6 C51语句和结构化程序设计【例例4-44-4】求求S=1+2+3+100S=1+2+3+100和的程序,请用和的程序,请用do-whiledo-while循环来实现:循环来实现:#in
41、clude void main()int i,s;i=1;s=0;do s=s+i;i=i+1;while(i=100);printf(s=%dn,s);4.2.6 C51语句和结构化程序设计【例例4-54-5】P1.1P1.1输出输出1616次跳变,产生次跳变,产生8 8个脉冲,个脉冲,P1.1P1.1初态为初态为0 0,则程序如下:,则程序如下:unsigned char i=0;*定义循环控制变量i*do P1=P10 x02;*P1.1求反,P1口其他位不变*i+;*修改循环控制变量*while(i16);*;号不可省*4.2.6 C51语句和结构化程序设计(3)for语句for语句的
42、一般形式为:for(表达式1;表达式2;表达式3)语句;for(循环变量赋初值;循环条件;循环控制变量修改)语句 *循环体,可以是简单语句、复合语句或空语句*4.2.6 C51语句和结构化程序设计【例例4-64-6】用用forfor语句实现语句实现S=1+2+3+100S=1+2+3+100的程序。的程序。unsigned int s;*标准形式*unsigned char i;for(i=1,s=0;i=100;i+)s+=i;unsigned int s=0;*省表达式l*unsigned char i=l;for(;i=100;i+)s+=i;unsigned int s;*缺省表达式3
43、*unsigned char i;for(i=l,s=0;i=100;)s+=i;i+;*循环体中修改变量i*4.2.6 C51语句和结构化程序设计(4)goto语句、break语句和continue语句 goto话句为无条件跳转语句,一般形式为:goto 语句标号;*goto语句尽量少用*break语句用来从循环体中跳出循环体,终止整个循环。一般形式为:Break;continue语句用于循环体中,其功能为跳过本次循环中尚未执行的语句,继续下次循环,而不终止整个循环,一般形式为:Continue;4.2.6 C51语句和结构化程序设计4.2.7 C51构造数据类型C51编译器支持的基本数据类
44、型有:位型(bit)、无符号字符(unsigned char)、有符号字符(signed char)、无符号整型(unsigned int)、有符号整型(signed int)、无符号长整型(unsigned long)、有符号长整型(signed long)、浮点(float)、双精度浮点(double)。4.2.7 C51构造数据类型C51提供扩展的数据类型由C51支持的基本数据类型按一定的规则组合成的数据类型,称之为构造数据类型。C51支持的构造数据类型有:数组、结构、指针、共同体(或者,也称为联合)、枚举等C51支持的构造数据类型与标准C语言是一样的,对构造数据类型的定义、引用以及运算
45、的规则也与标准的C语言相同。4.2.7 C51构造数据类型4.2.7 C51构造数据类型(1)数组(2)结构体(3)联合(共用)体(4)指针数组是相关的同类对象的集合,是一种构造类型的变量。数组中各元素的数据类型必须相同,元素的个数必须固定,数组中的元素按顺序存放,每个元素对应于一个序号(称为下标),各元素按下标存取。数组元素下标的个数由数组的维数确定,一维数组有一个下标,二维数组有两个下标。4.2.7 C51构造数据类型1数组(1)一维数组的定义(2)一维数组的引用(3)一维数组的初始化4.2.7 C51构造数据类型1数组【例例4-74-7】统计某班学生成绩中统计某班学生成绩中8080分以上
46、,分以上,6060分分8080分,分,6060分以下人分以下人数的程序。数的程序。unsigned char i=0,score_A=0,score_B=0,scroe _F=0;for(;i80)score_A+;*score_A 统计80分以上学生人数*else if(student_scorei=60)score_B+;*score_B 统计6080分之间学生人数*else score_F+;*score_F统计60分以下学生人数*4.2.7 C51构造数据类型结构是另一种构造类型数据。通过使用结构可以把一些数据类型可能不同的相关变量结合在一起,给它们一个共同的名称,以方便编程。4.2.
47、7 C51构造数据类型2.结构体的定义与引用(1)定义结构类型 定义结构类型的一般形式为:struct结构类型名*struct为结构类型关键字*成员表列 *对各个成员数据类型声明*;*分号不能省略*4.2.7 C51构造数据类型(2)定义结构类型变量定义结构类型以后,再定义这种结构类型的变量。一般形式为:结构类型名存贮器类型说明 结构变量名表;在定义结构类型时同时定义结构变量,一般形式为:struct结构类型名 成员表列 变量名表列;直接定义结构类型变量4.2.7 C51构造数据类型(3)结构变量的引用对结构变量的成员只能一个一个引用。引用结构变量成员的方法有两种:用结构变量名引用结构成员,其
48、形式为:结构变量名.成员名 例如:birth_day.year=1960;用指向结构的指针引用成员,其形式为:指针变量名-成员名 例如:birth_day-year=1960;4.2.7 C51构造数据类型联合也称为共用体,联合中的成员是几种不同类型变量,它们共用一个存贮区域,任意瞬间只能存取其中的一个变量,即一个变量被修改了,其他变量原来的值也就消失了。4.2.7 C51构造数据类型3.联合的定义与引用(1)定义联合类型和联合类型变量,定义形式为:union联合类型名 成员表列 变量名表;4.2.7 C51构造数据类型(2)联合类型变量成员引用 联合类型变量成员的引用方法类似于结构类型变量成
49、员的引用:变量名.成员名4.2.7 C51构造数据类型在C语言中,把存放数据的地址称为指针,把存放数据地址的变量称为指针变量。一般的数据变量表示存贮单元内容,而指针变量表示存贮单元的地址。利用指针变量访问数据对象类似于用DPTR间接寻址一样地方便。4.2.7 C51构造数据类型4.指针(1)定义指针变量指针变量也必须先定义后使用,C51指针变量定义的一般形式为:基类型 存贮器类型 *指针变量名表;4.2.7 C51构造数据类型C51支持“基于存贮器”的指针和“通用指针”两种指针类型。4.2.7 C51构造数据类型 基于存贮器的指针基于存贮器的指针以存贮类型为参量,在编译时确定。用这种指针可以高
50、效地访问指针指向单元的内容。这类指针的长度为1个字节(idata*,data*,pdata*)或2个字节(code*,xdata*)。4.2.7 C51构造数据类型 通用指针凡是在指针定义时未对指针指向的对象存贮空间进行修饰说明的,编译器都使用3个字节的通用指针。一个通用指针可以访问任何变量而不管它在MCS-51哪个存贮空间的什么位置。通用指针只在编译和连接/定位时才把存贮空间代码和地址填入预留的3个字节中。4.2.7 C51构造数据类型通用指针包括3个字节,其中1个字节为存贮类型,另2个字节为偏移地址。存贮类型决定了对象所占用的MCS-51存贮空间,偏移地址指向实际地址。4.2.7 C51构