第10章 单片机C语言程序设计_第1页
第10章 单片机C语言程序设计_第2页
第10章 单片机C语言程序设计_第3页
第10章 单片机C语言程序设计_第4页
第10章 单片机C语言程序设计_第5页
已阅读5页,还剩109页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 单片机资源(zyun)的C51编程实例 C51数据的存储类型(lixng)和存储模式 C51的数据类型与运算 单片机C语言概述 C51程序基本结构与相关语句 51单片机系统开发常用工具软件keil C51 C51的函数第10章 单片机C语言程序设计共一百一十四页 单片机C语言概述(i sh) C51的数据类型与运算 C51数据的存储类型和存储模式 C51程序基本结构与相关语句 C51的函数 单片机资源的C51编程实例 51单片机系统开发常用工具软件keil C51本章(bn zhn)知识点 共一百一十四页 随着单片机硬件性能的不断提高和应用技术的不断发展,开发者越来越注重目标系统的开发成效,

2、而开发成效在很大程度上取决于程序本身的编写效率。为了适应这种要求,出现了单片机高级语言C语言。 10.1 单片机C语言概述(i sh)共一百一十四页10.1.1 C语言的特点及程序结构 单片机的C语言编译器:德国的KEIL C51开发平台、加拿大DAVEDUNFIELD的MICRO-C51、美国Franklin软件公司的Franklin C51等。目前最流行的是Keil C51编译器。一C语言的特点1语言简洁、紧凑,使用方便、灵活。2运算符丰富。3数据结构丰富。具有现代化语言的各种数据结构。4可进行结构化程序设计。5可以直接对计算机硬件进行操作。6生成(shn chn)的目标代码质量高,程序执

3、行效率高。7可移植性好。共一百一十四页 C语言程序采用函数结构,每个C语言程序由一个或多个函数组成,在这些函数中至少应包含(bohn)一个主函数main(),也可以包含一个main()函数和若干个其它的功能函数。不管main()函数放于何处,程序总是从main()函数开始执行,执行到main()函数结束则结束。 二C语言(yyn)的程序结构共一百一十四页 用C51语言和汇编语言主要不同之处在于: 用汇编语言编写51单片机程序必须要考虑其存储器结构,尤其必须考虑其片内数据存储器与特殊功能寄存器的使用以及按实际地址处理端口数据。而用C51语言编写的51单片机应用程序,则不用具体组织、分配存储器资源

4、和处理端口数据。但在C51语言编程中,对数据类型与变量的定义(dngy),必须要与单片机的存储结构相关联,否则编译器不能正确地映射定位。10.1.2 C语言(yyn)与MCS-51单片机共一百一十四页C51语言与标准C语言程序区别: (1)C51中定义的库函数和标准C语言定义的库函数不同。后者是按通用微型计算机来定义的,而C51中的库函数是按MCS-51单片机相应情况来定义的; (2)数据类型有一定(ydng)的区别。在C51中增加了几种针对MCS-51单片机特有的数据类型;共一百一十四页 (3)C51中变量的存储模式与MCS-51单片机的存储器紧密相关; (4)C51中的输入输出是通过MCS

5、-51串行口来完成(wn chng)的,输入输出指令执行前必须要对串行口进行初始化; (5)C51中有专门的中断函数。共一百一十四页10.2 C51的数据类型与运算(yn sun) 10.2.1 C51的数据类型 分为基本数据类型和扩展(组合)数据类型。基本数据类型除了标准C中的字符型(char)、整型(int)、长整型(long)、单精浮点型(float)、双精浮点型(double)外,还有特殊功能(gngnng)寄存器型(sfr和sfr16两种)和位类型(bit和sbit两种)。扩展数据类型包括数组、指针型(*)以及结构(struct)和联合(union)等。共一百一十四页表10-1 KE

6、IL C51编译器支持(zhch)的基本数据类型基本数据类型说明符长度取值范围无符号字符型unsigned char1字节0255有符号字符型signed char1字节-128+127无符号整型unsigned int2字节065535有符号整型signed int2字节-32768+32767无符号长整型unsigned long4字节04294967295有符号长整型signed long4字节-2147483648+2147483647单精度浮点型float4字节1.175494E-383.402823E+38位 型bit1位0或1位 型sbit1位0或1特殊功能寄存器型sfr1字节0

7、255特殊功能寄存器型sfr162字节065535共一百一十四页一字符型char signed char:用于定义带符号字节数据(shj),其字节的最高位为符号位,“0”表示正数,“1”表示负数,补码表示,所能表示的数值范围是-128+127; unsigned char:用于定义无符号字节数据或字符,可以存放一个字节的无符号数,也可以存放西文字符,取值范围为0255。 共一百一十四页二int整型 分singed int和unsigned int。默认为signed int。它们的长度均为两个字节,用于存放一个双字节数据。对于signed int,用于存放两字节带符号数,补码表示(biosh)

8、,数的范畴为-32768+32767。对于unsigned int,用于存放两字节无符号数,数的范围为065535。三long长整型 分singed long和unsigned long。默认为signed long。它们的长度均为四个字节,用于存放一个四字节数据(shj)。对于signed long,用于存放四字节带符号数,补码表示,数的范畴为-2147483648+2147483647。对于unsigned long,用于存放四字节无符号数,数的范围为04294967295。共一百一十四页四float浮点型 长度为四个字节,包含指数和尾数两部分。最高位为符号位,“1”表示负数,“0”表示正

9、数。单片机中使用浮点应注意以下三点(sn din): 由于单片机中没有专门的浮点运算硬件,因此在运算时会比较慢。 由于51单片机本身是8位的,因此在计算中不可能达到太高的精度。 与单精浮点相比,双精浮点型(double)具有更高的计算精度,但计算时间会更长,速度更慢,C51不支持双精浮点型。 共一百一十四页五特殊功能寄存器型 分sfr和sfr16两种类型。 sfr:字节型特殊功能寄存器类型,占一个内存单元。利用它可以访问MCS-51内部的所有特殊功能寄存器; sfr16:双字节型特殊功能寄存器类型,占用两个(lin )字节单元。利用它可以访问MCS-51内部的所有两个(lin )字节的特殊功能

10、寄存器,如DPTR。 头文件reg51.h:包含了所有特殊功能寄存器和对其相应位的定义,通过在程序开头用#include reg51.h语句包含头文件可以很容易地进行新的扩展。共一百一十四页【例10-1】特殊功能(gngnng)寄存器型数据定义。sfr SCON=0X98; /定义 SCONsbit SM0=0X9F; /定义 SCON 的各位sbit SM1=0X9E;sbit SM2=0X9D;sbit REN=0 x9C;sbit TB8=0X9B;sbit RB8=0X9A;sbit TI=0X99;sbit RI=0X98;共一百一十四页六位类型 功能:用于访问MCS-51单片机中的

11、可寻址的位单元。 bit型:定义(dngy)的位变量在C51编译器编译时,在不同的时候位地址是可以变化的。 sbit型:定义的位变量必须与MCS-51单片机的一个可以寻址位单元或可位寻址的字节单元中的某一位联系在一起。在C51编译器编译时,其对应的位地址是不可变化的。共一百一十四页隐式转换:出现在运算中数据类型不一致时,按下列转换的优先级顺序: bitcharintlongfloat signedunsigned 例:当char型与int型进行运算时,先自动对char型扩展为int型,然后(rnhu)与int型进行运算,运算结果为int型。 强制类型转换符“()”:对数据类型进行人为的强制转换

12、。 共一百一十四页10.2.2 关于指针型数据 指针(*)是一种特殊(tsh)的数据类型,指向变量的地址,实质上指针就是存储单元的地址。 在C51中它的长度一般为13个字节。根据所指的变量类型不同,可以是字符型指针(char *)、整型指针(int *)、长整型指针(long *)、浮点型指针(float *)及结构指针(struct *)与联合指针(union *)。共一百一十四页 1. 一般指针 一般指针的声明和使用均与标准C相同,不过同时还能说明指针的存储类型,例如: long * state; /为一个指向long型整数的指针,而state本身则依存储模式存放。 char * xdat

13、a ptr; /ptr为一个指向char数据的指针,而ptr本身放于外部RAM区。 一般指针本身用3个字节存放,分别(fnbi)为存储器类型、高位偏移量、低位偏移量。 共一百一十四页 2. 存储器指针 基于存储(cn ch)器的指针说明时即指定了存储(cn ch)类型,例如: char data * str; /str指向data区中char型数据。 int xdata * pow; /pow指向外部RAM的int型整数。 存放时,只需一个字节或2个字节就够了,因为只需存放偏移量。共一百一十四页10.2.3 C51的运算符 运算符:完成某种特定运算的符号。C51常见的运算符有算术运算符、赋值运

14、算符、关系运算符、逻辑运算符、按位运算符和联合(复合赋值)运算符。除此之外,还有一些用于完成特殊任务的运算符,如逗号运算符、条件运算符、指针(zhzhn)与地址运算符。共一百一十四页1. 常见(chn jin)的运算符1). 算术运算符符 号意 义+加或取正值运算符-减或取负值运算符*乘运算符/除运算符+变量自加1-变量自减1%取余运算符共一百一十四页 在实际编程中,为了程序的简练,经常使用i+与+i这样(zhyng)的语句。i+是先进行运算,再执行i=i+1的操作;而+i则是先执行i=i+1的操作,再进行运算。 例:int x=0,y=0; y=x+; /执行后y的值仍为0 而 int x=

15、0,y=0; y=+x; /执行后y的值则为1共一百一十四页2). 赋值运算符“=”功能:将一个数据的值赋给一个变量,如x=10。 赋值表达式:利用赋值运算符将一个变量与一个表达式连接起来的式子称为(chn wi)赋值表达式。 赋值语句:在赋值表达式的后面加一个分号“;”就构成了赋值语句。一个赋值语句的格式如下: 变量=表达式; 执行时先计算出右边表达式的值,然后赋给左边的变量。例如:x=8+9; /将8+9的值赋绐变量x x=y=5; /将常数5同时赋给变量x和y 在C51中,允许在一个语句中同时给多个变量赋值,赋值顺序自右向左。共一百一十四页符 号意 义大于=大于等于3,结果为真(1),而

16、10=100,结果为假(0)。注意:关系运算符等于“=”是由两个“=”组成。共一百一十四页4). 逻辑运算符C51有3种逻辑运算符:| 逻辑或& 逻辑与! 逻辑非 关系运算符用于反映两个(lin )表达式之间的大小关系,逻辑运算符则用于求条件式的逻辑值,用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。 逻辑与,格式: 条件(tiojin)式1 & 条件式2 当条件式1与条件式2都为真时结果为真(非0值),否则为假(0值)。逻辑或,格式: 条件式1 | 条件式2 当条件式1与条件式2都为假时结果为假(0值),否则为真(非0值)。逻辑非,格式: !条件式 当条件式原来为真(非0值),

17、逻辑非后结果为假(0值)。当条件式原来为假(0值),逻辑非后结果为真(非0值)。例如:若a=8,b=3,c=0,则!a为假,a & b为真,b & c为假。共一百一十四页5). 位运算符 位运算是按位对变量进行运算,但并不改变参与运算的变量的值。如果要求(yoqi)按位改变变量的值,则要利用相应的赋值运算。C51中位运算符只能对整数进行操作,不能对浮点数进行操作。C51中的位运算符有:共一百一十四页符 号意 义&按位与|按位或按位取反按位异或右移共一百一十四页【例10-1】设a=0 x78=01111000B,b=0 x0f=00001111B,则a&b、a|b、ab、a、a2分别(fnbi)

18、为多少?a&b=00001000b=0 x08;a|b=01111111B=0 x7f;ab=01110111B=0 x77;a=10000111B=0 x87;a2=00000011B=0 x03;共一百一十四页 6). 联合(复合赋值)运算符 C51语言中支持在赋值运算符“=”的前面加上其它(qt)运算符,组成联合(复合赋值)。+=加法赋值-=减法赋值*=乘法赋值/=除法赋值%=取模赋值&=逻辑与赋值|=逻辑或赋值=逻辑异或赋值=逻辑非赋值=右移位赋值b) ? a:b的执行结果是将a和b中较大的数赋值给变量max。共一百一十四页 9). 指针与地址运算符 变量(binling)的指针就是该

19、变量(binling)的地址,还可以定义一个专门指向某个变量(binling)的地址的指针变量(binling)。 C51中提供了两个专门的运算符: * 指针运算符 & 取地址运算符共一百一十四页2. C51的运算量1). 常量 常量是指在程序执行过程中其值不能改变的量。C51支持整型常量、浮点型常量、字符型常量和字符串型常量。 整型常量 整型常量也就是整型常数(chngsh),根据其值范围在计算机中分配不同的字节数来存放。十进制整数。如234、-56、0等。十六进制整数。以0 x开头表示,如0 x12表示十六进制数12H。长整数。在存储器中占四个字节,另外,如一个整数后面加一个字母L,这个数

20、在存储器中也按长整型存放。如123L在存储器中占四个字节。共一百一十四页 浮点型常量(chngling) 浮点型常量也就是实型常数。有十进制表示形式和指数表示形式。 十进制表示形式又称定点表示形式,由数字和小数点组成。如 0.123、38.645等都是十进制数表示形式的浮点型常量。 指数表示形式为: 数字 .数字 e 数字例如:123.456e-3、-3.123e2等都是指数形式的浮点型常量。共一百一十四页 字符型常量字符型常量是用单引号引起的字符,如a、1、F等。可以是可显示的ASCII字符,也可以是不可显示的控制字符。对不可显示的控制字符须在前面加上反斜杠“”组成转义字符。利用它可以完成一

21、些特殊功能和输出时的格式(g shi)控制。常用的转义字符如表10-2所示。 共一百一十四页转义字符含 义ASCII码(十六进制数) o空字符(null)00H n换行符(LF)0AH r回车符(CR)0DH t水平制表符(HT)09H b退格符(BS)08H f换页符(FF)0CH 单引号27H ”双引号22H 反斜杠5CH共一百一十四页 字符串型常量 字符串型常量由双引号“”括起的字符组成。如“D”、“1234”、“ABCD”等。一个字符串常量在内存中存放(cnfng)时不仅双引号内的字符一个占一个字节,而且系统会自动的在后面加一个转义字符“o”作为字符串结束符。不要将字符常量和字符串常量

22、混淆,如字符常量A和字符串常量“A”是不一样的。共一百一十四页2). 变量 变量定义的格式如下: 存储种类 数据类型说明符 存储器类型 变量名1=初值,变量名2初值; 变量名由字母、数字和下划线三种字符组成,且第一个字母必须为字母或下划线。 变量名有两种:普通(ptng)变量名和指针变量名。它们的区别是指针变量名前面要带“*”号。共一百一十四页 另外,在C51中,为了增加程序(chngx)的可读性,允许用户为系统固有的数据类型说明符用typedef起别名,格式如下: typedef c51固有的数据类型说明符 别名; 定义别名后,就可以用别名代替数据类型说明符对变量进行定义。别名可以用大写,也

23、可以用小写,为了区别一般用大写字母表示。【例10-2】 typedef的使用。typedef unsigned int WORD;typedef unsigned char BYTE;BYTE a1=0 x12;WORD a2=0 x1234;共一百一十四页 变量的存储种类是指变量在程序执行过程中的作用范围。C51变量的存储种类有四种,分别是自动(auto)、外部(extern)、静态(static)和寄存器(register)。 auto 使用auto定义的变量称为自动变量,其作用范围在定义它的函数(hnsh)体或复合语句内部,自动变量一般分配在内存的堆栈空间中。定义变量时,如果省略存储种类

24、,则该变量默认为自动(auto)变量。共一百一十四页 extern使用extern定义的变量称为外部变量。在一个函数体内,要使用一个已在该函数体外或别的程序中定义过的外部变量时,该变量在该函数体内要用extern说明。外部变量被定义后分配固定的内存空间,在程序整个执行时间内都有效,直到程序结束才释放(shfng)。 static使用static定义的变量称为静态变量。它又分为内部静态变量和外部静态变量。在函数体内部定义的静态变量为内部静态变量,它在对应的函数体内有效;外部静态变量是在函数外部定义的静态变量。共一百一十四页 register使用register定义的变量称为寄存器变量。它定义的变

25、量存放在CPU内部的寄存器中,处理速度快,但数目(shm)少。C51编译器编译时能自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,用户可以无需专门声明。3). 位变量在C51中,允许用户通过位类型符定义位变量。位类型符有两个:bit和sbit。可以定义两种位变量。bit位类型符用于定义一般的可位处理位变量。它的格式如下: bit 位变量名;共一百一十四页 sbit位类型符用于定义在可位寻址字节或特殊功能寄存器中的位,定义时须指明其位地址,可以(ky)是位直接地址,也可以(ky)是可位寻址变量带位号,还可以(ky)是特殊功能寄存器名带位号。格式如下: 格式一: sbit位变量名=特殊

26、功能寄存器名带位号; 例如:sbit OV=PSW2 ; / 定义OV位为PSW.2,地址为D2H sbit CY=PSW7 ; / 定义CY位为PSW.7,地址为D7H 共一百一十四页格式(g shi)二:sbit位变量名= 寄存器的字节地址带位号;例如: sbit OV=0XD02 ;/ 定义OV位地址是D0H字节中的第2位 sbit CY=0XD07 ;/ 定义CY位地址是D0H字节中的第7位格式三:sbit 位变量名= 寻址位的绝对位地址;例如: sbit OV=0XD2 ;/ 定义OV位地址为D2H sbit CY=0XD7 ;/ 定义CY位地址为D7H 特殊功能位代表了一个独立的定

27、义类,不能与其它位定义和位域互换。共一百一十四页 4). 特殊功能寄存器变量 C51定义特殊功能寄存器变量的一般语法格式如下:sfr/sfr16 sfr-name = int constant; 或写为: sfr(或sfr16) 特殊功能寄存器名=地址(dzh)(整型常数); sfr16用于对双字节特殊功能寄存器进行定义,特殊功能寄存器名一般用大写字母表示。地址一般用直接地址形式,以整型常数表示,范围必须在SFR地址范围内,位于0 x800 xFF,不允许带有运算符的表达式。共一百一十四页【例10-3】特殊功能寄存器的定义举例。 sfr SCON=0 x98; / 串口控制寄存器地址98H s

28、fr TMOD=0 x89; / 定时器/计数器方式控制寄存器地址89H sfr P1=0 x90; /P1口的地址90H sfr16 DPTR=0 x82; /数据(shj)指针DPTR的地址82H共一百一十四页10.3.1 数据的存储类型 定义变量类型时,还必须定义它的存储类型,变量的存储类型是用于指明变量所处的单片机的存储器区域情况。C51编译器能识别(shbi)的存储类型有以下几种,如表10-3所示。 10.3 数据的存储(cn ch)类型和存储(cn ch)模式共一百一十四页表10-3 C51的变量(binling)的存储类型及其数据长度和值域 存储类型长度(位)值域范围描 述dat

29、a800FFH直接寻址的片内RAM低128B,访问速度快bdata字节访问:8位访问:1202FH007FH片内RAM的20H2FH单元,允许字节和位混合访问idata800FFH间接寻址访问的片内RAM,允许访问全部片内RAMpdata800FFH用Ri间接访问的片外RAM的低256Bxdata160000FFFFH用DPTR间接访问的64k片外RAMcode160000FFFFH程序存储器ROM 64k空间共一百一十四页 带存储类型的变量的定义的一般格式为: 数据类型 存储类型 变量名 访问内部数据存储器(idata)比访问外部数据存储器(xdata)相对要快一些。因此,可将经常使用的变量

30、置于内部数据存储器中,而将较大(jio d)及很少使用的数据变量置于外部数据存储器中。例如定义变量x语句:data char x (等价于char data x)。共一百一十四页【例10-4】变量(binling)定义过程中存储种类和存储器类型举例。 char data varl; /在片内RAM低128B定义用直接寻址方式访问的字符型变量var1 int idata var2; /在片内RAM256B定义用间接寻址方式访问的整型变量var2 unsigned int pdata sion; /在片外RAM的低256B定义无符号整型变量sion 共一百一十四页【例10-5】 带存储类型(lix

31、ng)的bit型变量的定义。bit data a1; /正确bit bdata a2; /正确bit pdata a3; /错误bit xdata a4; /错误共一百一十四页 10.3.2 存储模式 1. SMALL模式: SMALL模式称为小编译模式。在SMALL模式下,编译时参数及局部变量放入可直接寻址片内RAM的用户区中(最大128字节)。一般来说,如果系统所需要的内存数小于内部RAM 数时都应以小存储模式进行编译。优点:存取速度很快缺点:供用户(yngh)使用的存储空间小。共一百一十四页 2. COMPACT模式: COMPACT模式称为紧凑编译模式。在COMPACT模式下,编译时函

32、数参数及局部变量被放在片外RAM的低256字节空间,通过R0或R1间接访问(fngwn),存储器类型为pdata。 3. LARGE模式: LARGE模式称为大编译模式。在LARGE模式下,编译时函数参数和局部变量被默认在片外RAM的64K字节空间,使用数据指针DPTR来进行寻址,存储器类型为xdata。用此数据指针进行访问效率较低,尤其对两个或多个字节的变量,这种数据类型的访问机制直接影响代码的长度。共一百一十四页【例10-6】变量的存储(cn ch)模式。#pragma small /变量的存储模式为SMALLchar k1;int xdata m1;#pragma compact /变量

33、的存储模式为SMALLchar k2;int xdata m2;int func1(int x1, int y1) large /函数的存储模式为LARGEreturn(x1+y1);int func2(int x2, int y2) /函数的存储模式隐含为SMALL return(x2-y2);共一百一十四页 C51程序与标准的C程序在以下几个方面不同: 1C51中定义的库函数和标准C语言定义的库函数不同。标准的C语言定义的库函数是按通用微型(wixng)计算机来定义的,而C51中的库函数是按MCS-51单片机相应情况来定义的; 2 C51中的数据类型与标准C的数据类型也有一定的区别。在C5

34、1中还增加了几种针对MCS-51单片机特有的数据类型; 10.4 C51程序基本结构与相关(xinggun)语句共一百一十四页 3变量的存储模式不一样。C51中变量的存储模式是与MCS-51单片机的存储器紧密相关; 4 输入输出处理不一样。C51中的输入输出是通过(tnggu)MCS-51串行口来完成的,输入输出指令执行前必须要对串行口进行初始化; 5 C51与标准C在函数使用方面也有一定的区别,C51中有专门的中断函数。共一百一十四页10.4.1 C51程序基本结构 C语言程序的一般组成结构如下所示: 全局变量说明 /可被各函数引用 main( ) /主函数 局部变量说明 /只在本函数引用执

35、行语句(包括(boku)函数调用语句) fun1(形式参数表) /函数1 形式参数说明共一百一十四页局部变量说明(shumng) 执行语句(包括调用其他函数语句)funn(形式参数表) /函数n形式参数说明 局部变量说明 执行语句 共一百一十四页 1顺序结构 顺序结构程序是仅包含一个main( )函数的简单程序,程序只由低地址向高地址顺序执行指令代码,适当运用表达式语句就能设计出具有某特定功能的顺序结构C51程序。虽然该程序设计方法简单,但在具体运用中的算法仍然采用(ciyng)自顶向下逐步求精的方法进行设计。共一百一十四页2选择结构 也称为分支结构。当条件成立,即条件语句为“真”时,执行一个

36、分支,当条件不成立时,即条件语句为“假”时,执行另一个分支。在C51中,实现选择结构的语句为if-else,if-else-if语句。另外在C51中还支持多分支结构,多分支结构既可以通过if和else if语句嵌套实 3. 循环(xnhun)结构 循环结构的特点是:在给定条件成立时,反复执行某程序段,直到条件不成立时为止。循环结构有两种形式:当型循环和直到型循环,这和其它高级语言相同,不再赘述。在C51中,可以构成循环结构的语句主要有:while、do while、for、goto等。共一百一十四页10.4.1 C51相关语句 1. if 语句 if 语句一共有3种语句形式,分别简述(jin

37、sh)如下: 1). if 语句,格式如下: if(表达式)语句; 处理机理是:如果表达式为真,则执行语句,否则不执行该语句。当花括号中的语句不只一条,花括号不能省。 如 if (a=b) a+; /当a等于b时,a就加1 再如if (x!=y) printf(“x=%d, y=%dn”, x, y); /如果x不等于y,则输出x的值和y的值共一百一十四页 2). if-else语句,格式如下: if (表达式)语句1; else语句2; 处理机理是:当条件表达式成立(chngl)时,就执行语句1,否则就执行语句2 如: if (a=b) a+; else a-; 当a等于b时,a加1,否则a

38、-1。共一百一十四页 3). if-else多重嵌套语句,格式如下: if (条件表达式1) 语句1 else if (条件表达式2) 语句2 else if (条件表达式3) 语句3 else if (条件表达式m) 语句n else 语句m 实现多方向条件分支,使用应注意if 和else的配对使用,记住else 总是与最临近的if 相配对。 如果(rgu)分支数量较多时最好选用下面将要介绍的switch开关语句。共一百一十四页 2. switch语句 又称开关语句,它可以从多种情况中选择满足条件的一种情况,是多分支选择结构(jigu)语句。 它的格式如下:switch (表达式)case

39、常量表达式1:语句1;break; case 常量表达式2:语句2;break; case 常量表达式n:语句n;break; default:语句n+1;共一百一十四页【例10-7】 根据flag的值设置上(up)下(down)左(left)右(right)标志位void main( ) unsigned int flag=0, up=0, down=0, left=0, right=0;switch(flag) case 1:up=1;break; /置标志case 2:down=1;break;case 3:left=1;break;case 4:right=1;break;defaul

40、t:error=1;break; 本例中输入一个(y )无符号整数,经switch判断后,将相应标志置1,若整数不在14的范围内时就输出“error”。共一百一十四页 3. for语句 for循环控制语句的语法结构如下(rxi): f or(表达式1; 表达式2; 表达式3) 处理程序; 处理机理是:首先计算“表达式1”的值;再计算“表达式2”的值,若值为“真”则执行循环体一次,否则跳出循环;然后再计算“表达式3”的值,转回第2步重复执行。在整个for循环过程中,“表达式1”只计算一次,作为for的入口语句条件,“表达式2”和“表达式3”则可能计算多次。循环体也可能多次执行,也可能一次都不执行

41、。例如:共一百一十四页void main( )int n, sum=0;for(n=0; n=50; n+)sum+=n;在使用for语句(yj)中有几点要特别注意:. 循环体内的处理程序可以为空操作;. for语句的各表达式都可以省略,而分号不能省略。在省略各表达式时要特别小心分析,防止造成无限死循环。 共一百一十四页4. while语句 实现当型循环结构,它的格式如下: while(表达式) 语句; /循环体 当表达式为非0(真)时,就重复执行循环体内的语句;当表达式为0(假)时,则中止while循环,程序将执行循环结构之外的下一条语句。它的特点是: 先判断条件,后执行循环体。如条件第一次

42、就不成立,则循环体一次也不执行。 【例10-8】 下面程序是通过while语句实现计算并输出1100的累加和。#include /包含(bohn)特殊功能寄存器库#include /包含I/O函数库void main(void) /主函数共一百一十四页 int i, s=0; /定义(dngy)整型变量x和y i=1; SCON=0 x52; /串口初始化 TMOD=0 x20; TH1=0 xf3; TR1=1; while (i=100) /累加1100之和在s中 s=s+i; i+; printf(“1+2+3+100=%dn”, s); while(1); 共一百一十四页5. do w

43、hile语句 do while语句在C51中用于实现直到型循环(xnhun)结构,它的格式如下: do 语句; /循环体 while(表达式); 它的特点是:先执行循环体中的语句,后判断表达式。如表达式成立(真),则再执行循环体,然后又判断,直到有表达式不成立(假)时,退出循环,执行do while结构的下一条语句。【例10-9】 通过do while语句实现计算并输出1100的累加和。#include /包含特殊功能寄存器库#include /包含I/O函数库void main(void) /主函数 共一百一十四页 int i, s=0; /定义(dngy)整型变量x和y i=1; SCON

44、=0 x52; /串口初始化 TMOD=0 x20; TH1=0XF3; TR1=1; do /累加1100之和在s中 s=s+i; i+; while (i=100); printf(“1+2+3+100=n”, s); while(1); 共一百一十四页 6. break和continue语句 1)break语句 用break语句可以跳出switch结构,使程序继续执行switch结构后面(hu mian)的一个语句。使用break语句还可以从循环体中跳出循环,提前结束循环而接着执行循环结构下面的语句。它不能用在除了循环语句和switch语句之外的任何其它语句中。 【例10-10】用C51

45、编程计算圆的面积,当计算到面积大于100时,由break语句跳出循环。for (r=1; r100) break; printf(“%fn”, area);共一百一十四页 2).continue语句 continue语句用于结束本次循环,跳过循环体中continue下面尚未执行的语句,直接进行下一次是否(sh fu)执行循环的判定。 continue语句和break语句的区别在于:continue语句只是结束本次循环而不是终止整个循环;break语句则是结束循环,不再进行条件判断。 【例10-11】输出100200间不能被3整除的数。for (i=100; i=200; i+) if (i%3

46、=0) continue; printf(“%d ” ; i ); 在程序中,当i能被3整除时,执行continue语句,结束本次循环,跳过printf()函数,只有能被3整除时才执行printf()函数。共一百一十四页7.return语句 return语句放在函数的最后位置,用于终止(zhngzh)函数的执行,并控制程序返回调用该函数时所处的位置。返回时还可以通过return语句带回返回值。格式有两种: 1).return; 2).return (表达式); 如果后面带有表达式,则要计算表达式的值,并将表达式的值作为函数的返回值。若不带表达式,则函数返回时将返回一个不确定的值。 共一百一十四

47、页 8.goto语句 goto是一个无条件的转向语句,只要执行到这个语句,程序指针就会跳转到goto后的标号所在(suzi)的程序段。语法如下: goto 语句标号;其中的语句标号为一个带冒号的标识符。 【例10-12】void main(void) unsigned char a; start: a+; if (a=10) goto end; goto start; end:;共一百一十四页 该程序是一个(y )死循环,只是说明一下goto的用法。这段程序的意思是在程序开始处用标识符start:标识,表示程序这是程序的开始,end:标识程序的结束,程序执行a+,a的值加1,当a等于10时程序

48、会跳到end标识处结束程序,否则跳回到start标识处继续a+,直到a等于10。 共一百一十四页 函数是C51程序的基本单位,一个C51程序就是一堆函数的集合,有且只有一个名为main的函数(主函数)。 C51中函数分为两大类,一类是库函数,一类是用户定义函数库函数:用户在编程时只要用include预处理指令将头文件包含在用户文件中,直接调用即可。用户函数是用户自己(zj)定义和调用的一类函数。 一个函数在程序中可以有三种形态:函数定义、函数调用和函数说明。10.5 C51的函数(hnsh)共一百一十四页 1. 函数的定义 C51函数定义的一般格式如下(rxi): 函数类型 函数名(形式参数表

49、) reentrantinterrupt musing n 形式参数说明局部变量定义函数体 有关修饰符interrupt m和using n的介绍见10.6.3节。共一百一十四页 2函数的调用 函数调用的一般(ybn)形式如下: 函数名(实参列表); 函数调用方式有以下三种: 1). 函数语句。把被调用函数作为主调用函数的一个语句。 2). 函数表达式。函数被放在一个表达式中,以一个运算对象的方式出现。 3). 函数参数。被调用函数作为另一个函数的参数。共一百一十四页 3. 自定义函数的声明 在C51中,函数原型(yunxng)一般形式如下: extern 函数类型 函数名(形式参数表); 函

50、数的声明是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便调用函数时系统进行对照检查。函数的声明后面要加分号。 如果声明的函数不在文件内部,声明时须带extern共一百一十四页【例10-13】外部(wib)函数的使用 程序serial_initial.c#include /包含特殊功能寄存器库#include /包含I/O函数库void serial_initial(void) /主函数 SCON=0 x52; /串口初始化 TMOD=0 x20; TH1=0XF3; TR1=1; 共一百一十四页程序(chngx)x.c#include /包含特殊功能寄存器库#include

51、 /包含I/O函数库extern serial_initial();void main(void) int a, b; serial_initial(); scanf(“please input a, b:%d, %d”, &a, &b); printf(“n”); printf(“max is:%dn”, a=b?a:b); while(1); 上述程序x.c中,由于函数serial_initial( )不在文件内部,而在另一个文件中,因此在声明时带了extern。共一百一十四页10.6.1 C51程序的反汇编程序 【例10-14】用C51语言编程完成外部RAM的000EH单元和000FH单

52、元的内容(nirng)交换。 #include /该头文件的主要功能是通过定义的宏来访问绝对地址 main( ) char c; for( ; ; ) c=XBYTE0 x000E; XBYTE0 x000E=XBYTE0 x000F; XBYTE0 x000F=c; 10.6 单片机资源(zyun)的C51编程实例共一百一十四页 程序中为方便反复观察,使用了死循环语句for( ; ; )只要用Ctrl+C即可退出死循环。上面程序通过编译,生成的机器(j q)代码和反汇编程序如下:0000 020014 LJMP 0014H 0003 90000E MOV DPTR,#000EH0006 E0

53、 MOVX A,DPTR0007 FF MOV R7,A0008 A3 INC DPTR 0009 E0 MOVX A,DPTR000A 90000E MOV DPTR,#000EH 000D F0 MOVX DPTR,A 000E A3 INC DPTR 000F EF MOV A,R7共一百一十四页0010 F0 MOVX DPTR,A 0011 80F0 SJMP 0003H 0013 22 RET 0014 787F MOV R0,#7FH 0016 E4 CLR A 0017 F6 MOV R0,A 0018 D8FD DJNZ R0,0017H 001A 758107 MOV SP

54、,#07H 001D 020003 LJMP 0003H 共一百一十四页 从本例可以看出: 1.一进入C语言程序,首先执行初始化,将内部RAM的07FH 128个单元清零,然后置SP为07H(视变量多少不同,SP置不同值,依程序而定) 2. C语言程序设定的变量,C51自行安排寄存器或存储器作参数传递区,通常在R0R7(一组或两组,视参数多少定) 3. 如果不特别指定(zhdng)变量的存储类型,通常被安排在内部RAM中。 共一百一十四页10.6.2 并行口及键盘、显示器接口的C51编程【例10-15】设P1口做输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。 说明:由准双向口结构可

55、知(k zh)当P1口用为输入口时,必须先对它置“1”。 P1口循环点灯的C51程序如下:#include void delay( ) /定义延时函数 unsigned int i; for (i=0; i20000; i+) 共一百一十四页void main() unsigned char index; unsigned char LED; while (1) LED = 1; for (index=0; index 8; index+) P1 = LED; LED = 1; /右移(yu y)一位 delay( ); 共一百一十四页【例10-16】 将AT89C51单片机的P0.0p0.7

56、分别(fnbi)和一位共阴数码管的ah的笔段相连接,数码管的公共端接地,用C51编程让数码管循环显示09十个数字的功能,时间间隔0.2秒。对应的C51程序如下:#include unsigned char code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66, 0 x6d,0 x7d,0 x07,0 x7f,0 x6f; /共阴极数码管字型码表unsigned char dispcount; void delay02s(void) /定义延时函数 unsigned char i,j,k; for(i=20;i0;i-) for(j=20;j0;j-) for(k=2

57、48;k0;k-); 共一百一十四页void main(void) while(1) for(dispcount=0;dispcount10;dispcount+) P0=tabledispcount; delay02s( ); 共一百一十四页【例10-17】如图10-1所示,行列式键盘接口中以P1.0P1.3作输出线,以P1.4P1.7作输入线,编写(binxi)相应的键盘扫描处理程序。 图10-1 44矩阵(j zhn)键盘共一百一十四页 C51程序清单如下:#include#define uchar unsigned char#define uint unsigned intvoid d

58、lms (void);uchar kbscan(void); / 函数说明void main (void); uchar key; while (1) key=kbscan( ); / 键盘(jinpn)扫描函数,返回键码送key保存 dlms( ); 共一百一十四页void dlms (void) / 延时 uchar i; for (i=200;i0;i- -) uchar kbscan(void) / 键盘扫描函数(hnsh) uchar sccode,recode; P1=0 xf0; /P1.0P1.3发全0,P1.4P1.7输入 if ( (P1 & 0 xf0)! =0 xf0)

59、 /如P1口高四位不全为1有键按下 dlms( ); / 延时去抖动 if ( (P1 & 0 xf0) ! =0 xf0) / 在读输入值 sccode =0 xfe / 最低位置0 共一百一十四页 while ( ( sccode & 0 x10)! =0) / 不到最后一行循环 P1 =sccode; /P1口输出扫描码 If ( (P1 & 0 xf0)! =0 xf0) / 如P1.4P1.7不全为1,该行有键按下 recode = (P1 & 0 xf0; ); / 保留P1口高四位,低四位变“1”,作为列值 return( (sccode) + (recode) ); /行码+列

60、值=键编码(bin m)返回主程序 else sccode =(sccode1) | 0 x01; / 如该行无键按下,查下一行,行扫描值左移一位 return(0); / 无键按下,返回值为0 共一百一十四页 10.6.3 C51中断程序的编制 中断服务程序定义为函数,函数的完整定义如下。 返回值 函数名(参数)模式再入interrupt musing n 必选项 interrupt m表示将函数声明为中断服务函数,系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按MCS-51系统中断的处理方式自动把它安排在程序存储器中的相应位置。m可以(ky)是031间的整数,对应的中断情况

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论