单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第2章 单片机高级语言设计,C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它的优点:简洁紧凑、灵活方便、适用范围大,可移植性好。单片机程序开发中,C语言是技术人员必不可少的一个工具,具有开发周期短、程序可视性好、通用性强等功能,支持多种类型单片机。,学习目标,掌握C51基本结构,掌握C51数据类型,掌握C51常用语句,了解并学会使用C51程序的库函数,用C语言进行简单编程,2.1 C与C51,2.2 C51常用运算符,2.3 C51基本语句,2.4 C51数据类型,2.5 C51存储器类型,2.6 C51程序基本结构,2.7 C51重要库函数,2.8 C51标识符,实训项目电子时钟,2.1 C与C51,C语言具有下列特点,:,(1)将高级语言的基本结构、语句与低级语言的实用性结合起来,可以对位、字节和地址进行操作。,(2)是结构式语言,以函数形式提供给用户。,(3)功能齐全,具有各种各样的数据类型,并引入了指针概念,使程序效率更高。,(4)适用范围大,适合于多种操作系统,也适用于多种机型。,C51语言,是以C语言作基础,在结构上、定义及函数表达方式等两者是相同,不同的地方是C51的寄存器、位操作、数据分区等的表述应用方式。,2.2 C51常用运算符,与C 语言相同,,C51的基本运算,主要有:算术运算符,关系运算符,逻辑运算符,字位左移、右移,字位运算符,条件运算符,逗号运算符,指针运算符,长度计算符,强制类型转换运算符,分量运算符,下标运算符,函数调用运算符,自增自减运算符,复合赋值表达式,逗号表达式,16种,。,2.3 C51基本语句,C51常用基本语句主要有8种,(1)if语句,if(表达式1),语句1;,else,语句2;,如果表达式1成立就执行语句1,否则执行语句2,可以嵌套。,(2)switch 语句,多分支选择,switch(表达式),case 常量表达式1:语句1;break;,case 常量表达式2:语句2;break;,:,case 常量表达式N:语句N;break;,default:语句;break;,根据表达式值选择执行。如果都不是,执行default语句。,(3)goto语句,goto语句标号:无条件转移,(4)while语句,while(表达式)语句,先判断,后执行,当表达式为非0值时执行语句,表达式为0值时,不执行内嵌语句。,(5)do.while语句,do 语句;,while(表达式);,先执行语句,再判断表达式,当表达式不为0,执行,为零则不执行。注意与while区别。,(6)for语句,for(表达式1;表达式2;表达式3)语句;,先求解表达式1,求解表达式2,均为非0,则执行语句,然后求解表达式3,转回求解式2,式2为0值,则结束。否则继续。,(7)break语句,中断当前循环,通常在 switch 语句和 while、for或 do.while 循环中使用 break 语句。执行 break 语句会退出当前循环或语句,并开始执行紧接着的语句。,(8)continue 语句,其作用为结束本次循环。即跳出循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。,continue语句和break语句的区别是:,continue语句只结束本次循环,而不终止整个循环的执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。,continue语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。,continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用,用来加速循环。,2.4 C51数据类型,序号,数据类型,长 度,值 域,1,unsigned char,单字节,0255,signed char,单字节,-128+127,2,unsigned int,双字节,065535,signed int,双字节,-32768+32767,3,unsigned long,四字节,04294967295,signed long,四字节,-2147483648+2147483647,4,float,四字节,1.175494E-383.402823E+38,5,*,13 字节,对象的地址,6,bit,位,0 或 1,7,sfr,单字节,0255,8,sfr16,双字节,065535,9,sbit,位,0 或 1,(1)char 字符类型,char 类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。分无符号字符类型 unsigned char 和有符号字符类型 signed char,默认值为 signed char 类型。unsigned char 类型用字节中所有的位来表示数值,所能表达的数值范围是 0255。signed char 类型用字节中最高位字节表示数据的符号,“0”表示正数,“1”表示负数,负数用补码表示。所能表示的数值范围是-128+127。unsigned char 常用于处理 ASCII 字符或用于处理小于或等于 255 的整型数。,(2)int 整型,int 整型长度为两个字节,用于存放一个双字节数据。分有符号 int 整型数 signed int 和无符号整型数 unsigned int,默认值为 signed int 类型。signed int 表示的数值范 围是-32768+32767,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数。unsigned int 表示的数值范围是 065535。,(3)long 长整型,long 长整型长度为四个字节,用于存放一个四字节数据。分有符号 long 长整型 signed long 和无符号长整型 unsigned long,默认值为 signed long 类型。signed int 表示 的数值范围是-2147483648+2147483647,字节中最高位表示数据的符号,“0”表示正 数,“1”表示负数。unsigned long 表示的数值范围是 04294967295。,(4)float 浮点型,float 浮点型在十进制中具有 7 位有效数字,是符合 IEEE754 标准的单精度浮点型数 据,占用四个字节。因浮点数的结构较复杂在以后的章节中再做详细的讨论。,(5)*指针型,指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量 要占据一定的内存单元,对不一样的处理器长度也不尽相同,在 c51 中它的长度一般为 13 个字节。指针变量也具有数据类型,C51支持的指针是一般指针和存储器指针。C51编译器支持用星号(*)进行指针声明。可以用指针完成在标准C语言中有的所有操作。由于80C51及其派生系列所具有的独特结构,C51编译器支持两种不同类型的指针:,通用指针,和,存储器指针,。,(6)bit 位标量,bit 位标量是 c51 编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义 位指针,也不能定义位数组。它的值是一个二进制位,不是 0 就是 1,类似一些高级语 言中的 Boolean 类型中的 True 和 False。,(7)sfr 特殊功能寄存器,sfr 也是一种扩充数据类型,是定义8位的特殊功能寄存器。利用它能访问 51 单片机内部的所有特殊功能寄存器。如用 sfr P1=0 x90 这一句定 P1 为 P1 端口在片内 的寄存器,在后面的语句中可用 P1=255(对 P1 端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。,sfr关键字后面是一个要定义的名字,等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内,(0X800XFF),(8)sfr16 16位特殊功能寄存器,sfr16也是一种扩充数据类型,是用来定义16位特殊功能寄存器,sfr16关键定后面是一个要定义的名字,等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(0X800XFF)。sfr16 和 sfr 一样用于操作特殊功能寄存 器,所不一样的是它用于操作占,两个字节的寄存器,。,(9)sbit 可寻址位,sbit是单片机c语言中的一种扩充数据类型,利用它能访问芯片内部的 RAM 中的可寻址位或特殊功能寄存器中的可寻址位,如访问特殊功能寄存器中的某位。,如要访问P1口中的第2个引脚P1.1,定义方法如下:,(A)sbit 位变量名位地址,sbit P1_1=0 x91;,这样是把位的绝对地址赋给位变量。同sfr一样sbit的位地址必须位于0X80-0XFF之间。,(B)sbit 位变量名特殊功能寄存器名位位置,sft P1=0 x90;,sbit P1_1=P1 1;,/先定义一个特殊功能寄存器名,再指定位变量名所在的位置,当可寻址位位于特殊功能寄存器中时可采用这种方法。,(C)sbit 位变量名字节地址位位置,sbit P1_1=0 x90 1;,这种方法其实和(B)是一样的,只是把特殊功能寄存器的位址直接用常数表示。,在C51存储器类型中提供有一个,bdata,的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区(内部RAM 0 x20-0 x2f字节单元)中,可以将要求可位寻址的数据定义为bdata。如:,unsigned char bdata ib;/在可位录址区定义ucsigned char类型的变量ib,int bdata ab2;/在可位寻址区定义数组ab2,这些也称为可寻址位对象,sbit ib7=ib7/用关键字sbit定义位变量来独立访问可寻址位对象的其中一位,sbit ab12=ab112;,操作符“”后面位的最大值取决于指定的基址类型,char型 0-7,int型 0-15,long型 0-31。,2.5 C51存储器类型,从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应,code,、,data,、,xdata,、,idata,以及根据51系列特点而设定的,pdata,类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率。,在51系列中data,idata,xdata的区别:,data:,固定指前面0 x00-0 x7f的128个RAM,速度最快,生成的代码也最小。,idata:,固定指前面0 x00-0 xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。,xdata:,外部扩展RAM,指外部0 x0000-0 xffff空间,用类似C中的指针方式访问或用绝对地址方式访问。,表2.3 存储器类型,存储器类型,说明,data,直接访问内部数据存储器(128字节),访问速度最快,bdata,可位寻址内部数据存储器(16字节),允许位与字节混合访问,idata,间接访问内部数据存储器(256字节),允许访问全部内部地址,pdata,分页访问外部数据存储器(256字节),xdata,外部数据存储器(64KB),code,程序存储器(64KB),2.6 C51程序基本结构,(1)C51基本结构,#include/*头文件说明部份,预处理部分*/,unsigned char x1,x2;/*全局变量声明部份*/,Function1()/*功能函数定义部份*/,main(),inti,j;/*整型变量声明部份*/,Function1();/*功能函数说明部份,函数声明,先声明后调用*/,(2)C51程序的一般结构:,预处理,全局变量说明,函数1说明,函数n 说明,main()/*在一个工程中必须有、且只有一个小写的main()函数*/,局部变量说明;,执行语句;,函数调用;,返回类型