1、第四章 单片机 C语言程序设计第四章 单片机 C语言程序设计4.1 C语言与 MCS-51单片机4.1.1 C语言的特点及程序结构一 C语言的特点1语言简洁、紧凑,使用方便、灵活。2运算符丰富。3数据结构丰富。具有现代化语言的各种数据结构。4可进行结构化程序设计。5可以直接对计算机硬件进行操作。6生成的目标代码质量高,程序执行效率高。7可移植性好。第四章 单片机 C语言程序设计二 C语言的程序结构C语言程序采用函数结构,每个 C语言程序由一个或多个函数组成,在这些函数中至少应包含一个主函数 main(),也可以包含一个main()函数和若干个其它的功能函数。不管 main()函数放于何处,程序
2、总是从 main()函数开始执行,执行到 main()函数结束则结束。在main()函数中调用其它函数,其它函数也可以相互调用,但 main()函数只能调用其它的功能函数,而不能被其它的函数所调用。功能函数可以是 C语言编译器提供的库函数,也可以是由用户定义的自定义函数。在编制 C程序时,程序的开始部分一般是预处理命令、函数说明和变量定义等。 C语言程序结构一般如下:预处理命令 include函数说明 long fun1();float fun2();int x,y;float z;第四章 单片机 C语言程序设计功能函数主函数功能函数功能函数 1 fun1()函数体 主函数 main()主函数
3、体 功能函数 2 fun2()函数体 第四章 单片机 C语言程序设计其中,函数往往由 “函数定义 ”和 “函数体 ”两个部分组成。函数定义部分包括有函数类型、函数名、形式参数说明等,函数名后面必须跟一个圆括号(),形式参数在()内定义。函数体由一对花括号 “”组成,在 “”的内容就是函数体。如果一个函数内有多个花括号,则最外层的一对 “”为函数体的内容。函数体内包含若干语句,一般由两部分组成:声明语句和执行语句。声明语句用于对函数中用到的变量进行定义。也可能对函数体中调用的函数进行声明。执行语句由若干语句组成,用来完成一定功能。当然也有的函数体仅有一对 “”,其中内部既没有声明语句,也没有执行
4、语句。这种函数称为空函数。C语言程序在书写时格式十分自由,一条语句可以写成一行,也可以写成几行;还可以一行内写多条语句;但每条语句后面必须以分号 “; ”作为结束符。 C语言程序对大小写字母比较敏感,在程序中,同一个字母的大小写系统是作不同的处理。在程序中可以用 “/*/”或 “/”对 C程序中的任何部分作注释,以增加程序的可读性。C语言本身没有输入输出语句。输入和输出是通过输入输出函数scanf()和 printf()来实现的。输入输出函数是通过标准库函数形式提供给用户。 第四章 单片机 C语言程序设计4.1.2 C语言与 MCS-51单片机用 C语言编写 MCS-51单片机程序与用汇编语言
5、编写 MCS51单片机程序不一样,用汇编语言编写 MCS51单片机程序必须要考虑其存储器结构,尤其必须考虑其片内数据存储器与特殊功能寄存器的使用以及按实际地址处理端口数据。用 C语言编写的 MCS51单片机应用程序,则不用像汇编语言那样须具体组织、分配存储器资源和处理端口数据,但在 C语言编程中,对数据类型与变量的定义,必须要与单片机的存储结构相关联,否则编译器不能正确地映射定位。用 C语言编写单片机应用程序与标准的 C语言程序也有相应的区别:C语言编写单片机应用程序时,需根据单片机存储结构及内部资源定义相应的数据类型和变量,而标准的 C语言程序不需要考虑这些问题; C51包含的数据类型、变量
6、存储模式、输入输出处理、函数等方面与标准的 C语言有一定的区别。其它的语法规则、程序结构及程序设计方法等与标准的C语言程序设计相同。现在支持 MCS-51系列单片机的 C语言编译器有很多种,如American Automation、 Avocet、 BSO/TASKING、 DUNFIELD SHAREWARE、 KEIL/Franklin等。各种编译器的基本情况相同,但具体处理时有一定的区别,其中 KEIL/Franklin以它的代码紧凑和使用方便等特点优于其它编译器,现在使用特别广泛。本书以 KEIL/Franklin编译器介绍MCS-51单片机 C语言程序设计。第四章 单片机 C语言程序
7、设计4.1.3 C51程序结构C51的语法规定、程序结构及程序设计方法都与标准的 C语言程序设计相同,但 C51程序与标准的 C程序在以下几个方面不一样:( 1) C51中定义的库函数和标准 C语言定义的库函数不同。标准的 C语言定义的库函数是按通用微型计算机来定义的,而 C51中的库函数是按 MCS-51单片机相应情况来定义的;( 2) C51中的数据类型与标准 C的数据类型也有一定的区别,在C51中还增加了几种针对 MCS-51单片机特有的数据类型;( 3) C51变量的存储模式与标准 C中变量的存储模式不一样,C51中变量的存储模式是与 MCS-51单片机的存储器紧密相关;( 4) C5
8、1与标准 C的输入输出处理不一样, C51中的输入输出是通过 MCS-51串行口来完成的,输入输出指令执行前必须要对串行口进行初始化;( 5) C51与标准 C在函数使用方面也有一定的区别, C51中有专门的中断函数。第四章 单片机 C语言程序设计4.2 C51的数据类型C51的数据类型分为基本数据类型和组合数据类型,情况与标准 C中的数据类型基本相同,但其中 char型与 short型相同, float型与 double型相同,另外,C51中还有专门针对于 MCS-51单片机的特殊功能寄存器型和位类型。 一 字符型 char有 signed char和 unsigned char之分,默认为
9、 signed char。它们的长度均为一个字节,用于存放一个单字节的数据。对于 signed char,它用于定义带符号字节数据,其字节的最高位为符号位, “0”表示正数, “1”表示负数,补码表示,所能表示的数值范围是 -128+127;对于 unsigned char,它用于定义无符号字节数据或字符,可以存放一个字节的无符号数,其取值范围为 0255。 unsigned char可以用来存放无符号数,也可以存放西文字符,一个西文字符占一个字节,在计算机内部用 ASCII码存放。 二 int整型分 singed int和 unsigned int。默认为 signed int。它们的长度均
10、为两个字节,用于存放一个双字节数据。对于 signed int,用于存放两字节带符号数,补码表示,数的范畴为 -32768+32767。对于 unsigned int,用于存放两字节无符号数,数的范围为 065535。第四章 单片机 C语言程序设计三 long长整型分 singed long和 unsigned long。默认为 signed long。它们的长度均为四个字节,用于存放一个四字节数据。对于 signed long,用于存放四字节带符号数,补码表示,数的范畴为 -2147483648+2147483647。对于 unsigned long,用于存放四字节无符号数,数的范围为 04
11、294967295。四 float浮点型float型数据的长度为四个字节,格式符合 IEEE-754标准的单精度浮点型数据,包含指数和尾数两部分,最高位为符号位, “1”表示负数, “0”表示正数,其次的 8位为阶码,最后的 23位为尾数的有效数位,由于尾数的整数部分隐含为 “1”,所以尾数的精度为 24位。 五 * 指针型指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占用一定的内存单元,对不同的处理器其长度不一样,在 C51中它的长度一般为 13个字节。第四章 单片机 C语言程序设计六特殊功能寄存器型这是 C51扩充的数据类型,用于访问 MCS-51单片机中的
12、特殊功能寄存器数据,它分 sfr和 sfr16两种类型,其中 sfr为字节型特殊功能寄存器类型,占一个内存单元,利用它可以访问 MCS-51内部的所有特殊功能寄存器; sfr16为双字节型特殊功能寄存器类型,占用两个字节单元,利用它可以访问 MCS-51内部的所有两个字节的特殊功能寄存器。在 C51中对特殊功能寄存器的访问必须先用 sfr或 sfr16进行声明。七位类型这也是 C51中扩充的数据类型,用于访问 MCS-51单片机中的可寻址的位单元。在 C51中,支持两种位类型: bit型和 sbit型。它们在内存中都只占一个二进制位,其值可以是 “1”或 “0”。其中用 bit定义的位变量在C
13、51编译器编译时,在不同的时候位地址是可以变化的,而用 sbit定义的位变量必须与 MCS-51单片机的一个可以寻址位单元或可位寻址的字节单元中的某一位联系在一起,在 C51编译器编译时,其对应的位地址是不可变化的。第四章 单片机 C语言程序设计基本数据 类 型 长 度 取 值 范 围unsigned char 1字 节 0255signed char 1字 节 -128+127unsigned int 2字 节 065535signed int 2字 节 -32768+32767unsigned long 4字 节 04294967295signed long 4字 节 -2147483648+2147483647float 4字 节 1.175494E-383.402823E+38bit 1位 0或 1Sbit 1位 0或 1sfr 1字 节 0255sfr16 2字 节 065535