19单片机高级语言设计课件_第1页
19单片机高级语言设计课件_第2页
19单片机高级语言设计课件_第3页
19单片机高级语言设计课件_第4页
19单片机高级语言设计课件_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

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

文档简介

第2章单片机高级语言设计C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它的优点:简洁紧凑、灵活方便、适用范围大,可移植性好。单片机程序开发中,C语言是技术人员必不可少的一个工具,具有开发周期短、程序可视性好、通用性强等功能,支持多种类型单片机。第2章单片机高级语言设计C语言是一种计算机程序1学习目标掌握C51基本结构掌握C51数据类型掌握C51常用语句了解并学会使用C51程序的库函数用C语言进行简单编程学习目标掌握C51基本结构22.1C与C512.2C51常用运算符2.3C51基本语句2.4C51数据类型2.5C51存储器类型2.6C51程序基本结构2.7C51重要库函数2.8C51标识符

实训项目——电子时钟2.1C与C5132.1C与C51

C语言具有下列特点:(1)将高级语言的基本结构、语句与低级语言的实用性结合起来,可以对位、字节和地址进行操作。(2)是结构式语言,以函数形式提供给用户。(3)功能齐全,具有各种各样的数据类型,并引入了指针概念,使程序效率更高。(4)适用范围大,适合于多种操作系统,也适用于多种机型。2.1C与C51C语言具有下列特点:4C51语言是以C语言作基础,在结构上、定义及函数表达方式等两者是相同,不同的地方是C51的寄存器、位操作、数据分区等的表述应用方式。C51语言是以C语言作基础,在结构上、定义及函数表达方式等两52.2C51常用运算符与C语言相同,C51的基本运算主要有:算术运算符,关系运算符,逻辑运算符,字位左移、右移,字位运算符,条件运算符,逗号运算符,指针运算符,长度计算符,强制类型转换运算符,分量运算符,下标运算符,函数调用运算符,自增自减运算符,复合赋值表达式,逗号表达式16种。2.2C51常用运算符与C语言相同,C5162.3C51基本语句

C51常用基本语句主要有8种(1)if语句if

(表达式1)

语句1;else

语句2;如果表达式1成立就执行语句1,否则执行语句2,可以嵌套。

2.3C51基本语句C51常用基本语句主要有8种7(2)switch语句,多分支选择switch

(表达式){

case常量表达式1:语句1;break;

case常量表达式2:语句2;break;

:

case常量表达式N:语句N;break;

default:

语句;break;}根据表达式值选择执行。如果都不是,执行default语句。(2)switch语句,多分支选择8(3)goto语句goto

语句标号

:无条件转移(4)while语句while(表达式)语句先判断,后执行,当表达式为非0值时执行语句,表达式为0值时,不执行内嵌语句。(3)goto语句9(5)do...while语句do语句;while(表达式);先执行语句,再判断表达式,当表达式不为0,执行,为零则不执行。注意与while区别。(5)do...while语句10(6)for语句for(表达式1;表达式2;表达式3)语句;先求解表达式1,求解表达式2,均为非0,则执行语句,然后求解表达式3,转回求解式2,式2为0值,则结束。否则继续。(6)for语句11(7)break语句中断当前循环,通常在switch语句和while、for或do...while循环中使用break语句。执行break语句会退出当前循环或语句,并开始执行紧接着的语句。(7)break语句12(8)continue语句其作用为结束本次循环。即跳出循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。continue语句和break语句的区别是:continue语句只结束本次循环,而不终止整个循环的执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。continue语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用,用来加速循环。(8)continue语句132.4C51数据类型序号数据类型长度值域1unsignedchar单字节0~255signedchar单字节-128~+1272unsignedint双字节0~65535signedint双字节-32768~+327673unsignedlong四字节0~4294967295signedlong四字节-2147483648~+21474836474float四字节±1.175494E-38~±3.402823E+385*1~3字节对象的地址6bit位0或17sfr单字节0~2558sfr16双字节0~655359sbit位0或12.4C51数据类型数据类型长度值域1unsigned14(1)char字符类型char类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。分无符号字符类型unsignedchar和有符号字符类型signedchar,默认值为signedchar类型。unsignedchar类型用字节中所有的位来表示数值,所能表达的数值范围是0~255。signedchar类型用字节中最高位字节表示数据的符号,“0”表示正数,“1”表示负数,负数用补码表示。所能表示的数值范围是-128~+127。unsignedchar常用于处理ASCII字符或用于处理小于或等于255的整型数。(1)char字符类型char类15(2)int整型int整型长度为两个字节,用于存放一个双字节数据。分有符号int整型数signedint和无符号整型数unsignedint,默认值为signedint类型。signedint表示的数值范围是-32768~+32767,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数。unsignedint表示的数值范围是0~65535。(2)int整型int整型长度为两个字节,用于存放一个16(3)long长整型long长整型长度为四个字节,用于存放一个四字节数据。分有符号long长整型signedlong和无符号长整型unsignedlong,默认值为signedlong类型。signedint表示的数值范围是-2147483648~+2147483647,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数。unsignedlong表示的数值范围是0~4294967295。(3)long长整型long长整型长度为四个字节,用于17(4)float浮点型float浮点型在十进制中具有7位有效数字,是符合IEEE-754标准的单精度浮点型数据,占用四个字节。因浮点数的结构较复杂在以后的章节中再做详细的讨论。(4)float浮点型float浮点型在十进制中具有18(5)*指针型指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占据一定的内存单元,对不一样的处理器长度也不尽相同,在c51中它的长度一般为1~3个字节。指针变量也具有数据类型,C51支持的指针是一般指针和存储器指针。C51编译器支持用星号(*)进行指针声明。可以用指针完成在标准C语言中有的所有操作。由于80C51及其派生系列所具有的独特结构,C51编译器支持两种不同类型的指针:通用指针和存储器指针。(5)*指针型指针型本身就是一个变量,在这个变量中存放的指19(6)bit位标量bit位标量是c51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。(6)bit位标量bit位标量是c51编译器的一种20(7)sfr特殊功能寄存器sfr也是一种扩充数据类型,是定义8位的特殊功能寄存器。利用它能访问51单片机内部的所有特殊功能寄存器。如用sfrP1=0x90这一句定P1为P1端口在片内的寄存器,在后面的语句中可用P1=255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。sfr关键字后面是一个要定义的名字,等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(0X80-0XFF)

(7)sfr特殊功能寄存器sfr也是一种扩充数据类型,21(8)sfr1616位特殊功能寄存器sfr16也是一种扩充数据类型,是用来定义16位特殊功能寄存器,sfr16关键定后面是一个要定义的名字,等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(0X80-0XFF)。sfr16和sfr一样用于操作特殊功能寄存器,所不一样的是它用于操作占两个字节的寄存器。(8)sfr1616位特殊功能寄存器sfr16也是一种扩充22(9)sbit可寻址位sbit是单片机c语言中的一种扩充数据类型,利用它能访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位,如访问特殊功能寄存器中的某位。(9)sbit可寻址位sbit是单片机c语言中的一种扩充23如要访问P1口中的第2个引脚P1.1,定义方法如下:(A)sbit位变量名=位地址sbitP1_1=0x91;这样是把位的绝对地址赋给位变量。同sfr一样sbit的位地址必须位于0X80-0XFF之间。如要访问P1口中的第2个引脚P1.1,定义方法如下:24(B)sbit位变量名=特殊功能寄存器名^位位置sftP1=0x90;

sbitP1_1=P1^1;//先定义一个特殊功能寄存器名,再指定位变量名所在的位置,当可寻址位位于特殊功能寄存器中时可采用这种方法。(B)sbit位变量名=特殊功能寄存器名^位位置25(C)sbit位变量名=字节地址^位位置

sbitP1_1=0x90^1;这种方法其实和(B)是一样的,只是把特殊功能寄存器的位址直接用常数表示。(C)sbit位变量名=字节地址^位位置26在C51存储器类型中提供有一个bdata的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区(内部RAM0x20-0x2f字节单元)中,可以将要求可位寻址的数据定义为bdata。如:在C51存储器类型中提供有一个bdata的存储器类型,这个是27unsignedcharbdataib;//在可位录址区定义ucsignedchar类型的变量ibintbdataab[2]; //在可位寻址区定义数组ab[2],这些也称为可寻址位对象sbitib7=ib^7 //用关键字sbit定义位变量来独立访问可寻址位对象的其中一位sbitab12=ab[1]^12;操作符“^”后面位的最大值取决于指定的基址类型,char型0-7,int型0-15,long型0-31。unsignedcharbdataib;//在可位录282.5C51存储器类型

从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率。2.5C51存储器类型从数据存储类型来29在51系列中data,idata,xdata的区别:data:固定指前面0x00-0x7f的128个RAM,速度最快,生成的代码也最小。idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。xdata:外部扩展RAM,指外部0x0000-0xffff空间,用类似C中的指针方式访问或用绝对地址方式访问。在51系列中data,idata,xdata的区别:30表2.3存储器类型存储器类型说明data直接访问内部数据存储器(128字节),访问速度最快bdata可位寻址内部数据存储器(16字节),允许位与字节混合访问idata间接访问内部数据存储器(256字节),允许访问全部内部地址pdata分页访问外部数据存储器(256字节)xdata外部数据存储器(64KB)code程序存储器(64KB)表2.3存储器类型说明data直接访问内部数据存储器(1312.6C51程序基本结构

(1)C51基本结构#include<reg51.h>

/*头文件说明部份,预处理部分*/unsignedcharx1,x2;

/*全局变量声明部份*/…Function1(…){

……}/*功能函数定义部份*/main(){inti,j;

/*整型变量声明部份*/Function1(…);

/*功能函数说明部份,函数声明,先声明后调用*/……}2.6C51程序基本结构(1)C51基本结构32(2)C51程序的一般结构:预处理全局变量说明函数1说明……函数n说明main(){/*在一个工程中必须有、且只有一个小写的main()函数*/局部变量说明;执行语句;函数调用;}返回类型函数1名(形参说明){局部变量说明;执行语句;函数调用;}…….返回类型函数n名(形参说明){局部变量说明;执行语句;函数调用;}

C51程序与C程序一样遵循“先声明后调用”原则。(2)C51程序的一般结构:332.7C51重要库函数

除了可以使用C语言的常用库函数,C51还有包含寄存器库函数和本征库函数,对使用C51语言编程是比较重要的。(1)absacc.h该文件中实际只定义了几个宏,以确定各存储空间的绝对地址。包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD具体使用可看一看absacc.h便知。例如:rval=CBYTE[0x0002];指向程序存贮器的0X0002地址rval=XWORD[0x0002];指向外RAM的0X0004地址2.7C51重要库函数除了可以使用C语言的常用库函数34(2)intrins.h

在C51单片机编程中,头文件INTRINS.H的函数使用起来,就会让你像在用汇编时一样简便。原型:unsignedchar_crol_(unsignedcharval,unsignedcharn);字符循环左移unsignedint_irol_(unsignedintval,unsignedcharn);整数循环左移unsignedint_lrol_(unsignedintval,unsignedcharn);长整数循环左移例:#include<intrins.h>main(){unsignedinty;y=0x00ff;y=_irol_(y,4);//将y值按二进制左移4位,成0X0FF0}(2)intrins.h35原型:unsignedchar_cror_(unsignedcharval,unsignedcharn);字符循环右移unsignedint_iror_(unsignedintval,unsignedcharn);整数循环右移unsignedint_lror_(unsignedintval,unsignedcharn);长整数循环右移例:#include<intrins.h>main(){unsignedinty;y=0x0ff00;y=_iror_(y,4);//将y值按二进制右移4位,成0x00ff0}原型:36原型:void_nop_(void);产生一个NOP指令,该函数可用作C程序的时间延时。例:P1_1=1;_nop_();P1_1=0;原型:bit_testbit_(bitx);该函数测试一个位,当置位时返回1,否则返回0。如果该位置为1,则将该位复位为0。_testbit_只能用于可直接寻址的位;在表达式中使用是不允许的。原型:void_nop_(void);37(3)REG51.h标准的8051头文件,定义了所有的特殊功能寄存器SFR名及位名定义,一般系统都必须包括本文件。(4)stdlib.h动态内存分配函数。(5)string.h缓冲区处理函数,中包括拷贝比较移动等函数。Memccpy,memchr,memcmp,memcpy,memmove,memset。(6)stdio.h输入输出流函数。8051的串口或用户定义的I/O口读写数据,缺省为8051串口,如要修改,可修改lib目录中的getkey.c及putchar.c源文件,然后在库中替换它们即可。(3)REG51.h382.8C51标识符

一、C语言关键字具有固定名称的特殊标识符,是编译器保留的,在编写C程序时,标识符命名不能于关键字相同。2.8C51标识符一、C语言关键字39表2.4C语言关键字关键字

用途说明auto

存储种类声明

用于声明局部变量,默认值是此break

程序语句

退出最内层循环体case

程序语句

switch语句中的选择项char

数据类型声明

单字节整型或字符型数据const

存储类型声明

在程序执行过程中不可修改的变量值continue

程序语句

退出本次循环,转向下一次defaut

程序语句

switch语句中的失败选择项do

程序语句

构成do...wihile循环结构double

数据类型声名

双精度浮点数else

程序语句

构成if....else选择结构enum

数据类型

枚举表2.4C语言关键字关键字

用途说明auto

40extent

存储类型

全局变量float

数据类型

单精度浮点数for

程序语句goto

程序语句if

程序语句int

数据类型

基本整型数long

数据类型

长整型数register

存储类型

CPU内部的寄存器变量return

程序语句

函数返回short

数据类型

短整型signed

数据类型

有符号数sizeof

运算符

计算表达式或数据类型的字节数static

存储类型

静态变量struct

数据类型声明

结构类型switch

程序语句typedef

数据类型

重新进行数据类型定义union

数据类型

联合类型数据unsigned

数据类型

无符号数

void

数类型型

无类型数据volatile

数据类型

声名该变量在程序执行中可被隐含改变while

程序语句extent

存储类型

全局变量flo41表2.5C51编译器的扩展关键字关键字用途

_at_绝对地址定义定义一个地址数据bit位标量声明声明一个位标量或位类型的函数sbit位标量声明声明一个可位寻址变量Sfr特殊功能寄存器声明声明一个特殊功能寄存器Sfr16特殊功能寄存器声明声明一个16位的特殊功能寄存器data存储器类型说明直接寻址的内部数据存储器bdata存储器类型说明可位寻址的内部数据存储器idata存储器类型说明间接寻址的内部数据存储器pdata存储器类型说明分页寻址的外部数据存储器xdata存储器类型说明外部数据存储器code存储器类型说明程序存储器interrupt中断函数说明定义一个中断函数reentrant再入函数说明定义一个再入函数using寄存器组定义定义芯片的工作寄存器表2.5C51编译器的扩展关键字用途

明422、预定义标识符这类标识符在C语言中的特定的含义,一般不要作它用,如include、

define等3、用户标识符用户根据需要定义的标识符,要遵循一定的命名规则,建议以字母开头,按类别定义。2、预定义标识符43二、运算符及优先级1、算术运算符:+-*/%

:加减乘除取余2、关系运算符:>

<

==

>=

<=

!=:大于,小于,等于,大于等于,小于等于,不等于3、逻辑运算符:&&||!(左结合)

4、字位左移、右移:<<

>>5、字位按位与、异或、或、取反:&^|

~6、条件运算符:?

:7、逗号运算符:,8、指针运算符:*

&9、长度计算符:sizeof10、强制类型转换运算符:

()二、运算符及优先级4411、分量运算符:.

→12、下标运算符:[]13、函数调用运算符()14、自增自减运算符++

--

(向右结合:I++I计算后再+1,++I把I加1后再运算)15、复合赋值表达式:+=-=

*=

/=

%=

<<=

>>=

&=

^=

|=

(如I+=1等价于I=I+1)16、逗号表达式:,将两个表达式连起来,从左到右运算,优先级别最低。11、分量运算符:.

→45C语言有以下6种关系运算符:

<

<=

>

>=

==

!=

。前四种优先级别相同,后两种相同,前四种高于后两种,都是双目运算符,自左至右结合,优先级都低于算术运算符,高于赋值运算符。C语言有以下6种关系运算符:

<

<=

>

>=46应用案例

//功能是将地址从1000至1499中的数据,复制到2000至2499单元中#include<reg51.h>#includeuintunsignedint#includeucharunsignedcharucharxdata*Addr1=0x1000;ucharxdata*Addr2=0x2000;intmain(){ uintn=0;ucharmdata; for(n=0;n<500;n++) { mdata=*Addr1;*Addr2=mdata; Addr1++;Addr2++; }}应用案例//功能是将地址从1000至1499中的数据,复制47实训项目——电子时钟

一、实训目的掌握利用C语言相关函数开发电子时钟的基本原理训练学生的基本编程能力

二、系统功能描述该模块主要实现数字时钟的显示和数字时钟的修改。数字时钟的修改,用户可以先按Tab键定位需要修改内容的位置,然后通过按光标上移(↑)或下移(↓)键来修改当前时间。三、参考程序见教材。实训项目——电子时钟一、实训目的48本章小结C51常用运算符算术运算符,关系运算符,逻辑运算符,字位左移、右移,字位运算符,条件运算符,逗号运算符,指针运算符,长度计算符,强制类型转换运算符,分量运算符,下标运算符,函数调用运算符,自增自减运算符,复合赋值表达式,逗号表达式C51基本语句if语句、switch语句、while语句、while(表达式)语句、do...while语句、for语句、break语句、continue语句C51数据类型unsignedchar、signedchar、unsignedint、signedint、unsignedlong、signedlong、float、*、bit、sfr、sfr16、sbitC51存储器类型data、bdata、idata、pdata、xdata、codeC51程序基本结构预处理、全局变量说明、函数、main本章小结C51常用运算符算术运算符,关系运算符,逻辑运算符,49第2章单片机高级语言设计C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它的优点:简洁紧凑、灵活方便、适用范围大,可移植性好。单片机程序开发中,C语言是技术人员必不可少的一个工具,具有开发周期短、程序可视性好、通用性强等功能,支持多种类型单片机。第2章单片机高级语言设计C语言是一种计算机程序50学习目标掌握C51基本结构掌握C51数据类型掌握C51常用语句了解并学会使用C51程序的库函数用C语言进行简单编程学习目标掌握C51基本结构512.1C与C512.2C51常用运算符2.3C51基本语句2.4C51数据类型2.5C51存储器类型2.6C51程序基本结构2.7C51重要库函数2.8C51标识符

实训项目——电子时钟2.1C与C51522.1C与C51

C语言具有下列特点:(1)将高级语言的基本结构、语句与低级语言的实用性结合起来,可以对位、字节和地址进行操作。(2)是结构式语言,以函数形式提供给用户。(3)功能齐全,具有各种各样的数据类型,并引入了指针概念,使程序效率更高。(4)适用范围大,适合于多种操作系统,也适用于多种机型。2.1C与C51C语言具有下列特点:53C51语言是以C语言作基础,在结构上、定义及函数表达方式等两者是相同,不同的地方是C51的寄存器、位操作、数据分区等的表述应用方式。C51语言是以C语言作基础,在结构上、定义及函数表达方式等两542.2C51常用运算符与C语言相同,C51的基本运算主要有:算术运算符,关系运算符,逻辑运算符,字位左移、右移,字位运算符,条件运算符,逗号运算符,指针运算符,长度计算符,强制类型转换运算符,分量运算符,下标运算符,函数调用运算符,自增自减运算符,复合赋值表达式,逗号表达式16种。2.2C51常用运算符与C语言相同,C51552.3C51基本语句

C51常用基本语句主要有8种(1)if语句if

(表达式1)

语句1;else

语句2;如果表达式1成立就执行语句1,否则执行语句2,可以嵌套。

2.3C51基本语句C51常用基本语句主要有8种56(2)switch语句,多分支选择switch

(表达式){

case常量表达式1:语句1;break;

case常量表达式2:语句2;break;

:

case常量表达式N:语句N;break;

default:

语句;break;}根据表达式值选择执行。如果都不是,执行default语句。(2)switch语句,多分支选择57(3)goto语句goto

语句标号

:无条件转移(4)while语句while(表达式)语句先判断,后执行,当表达式为非0值时执行语句,表达式为0值时,不执行内嵌语句。(3)goto语句58(5)do...while语句do语句;while(表达式);先执行语句,再判断表达式,当表达式不为0,执行,为零则不执行。注意与while区别。(5)do...while语句59(6)for语句for(表达式1;表达式2;表达式3)语句;先求解表达式1,求解表达式2,均为非0,则执行语句,然后求解表达式3,转回求解式2,式2为0值,则结束。否则继续。(6)for语句60(7)break语句中断当前循环,通常在switch语句和while、for或do...while循环中使用break语句。执行break语句会退出当前循环或语句,并开始执行紧接着的语句。(7)break语句61(8)continue语句其作用为结束本次循环。即跳出循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。continue语句和break语句的区别是:continue语句只结束本次循环,而不终止整个循环的执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。continue语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用,用来加速循环。(8)continue语句622.4C51数据类型序号数据类型长度值域1unsignedchar单字节0~255signedchar单字节-128~+1272unsignedint双字节0~65535signedint双字节-32768~+327673unsignedlong四字节0~4294967295signedlong四字节-2147483648~+21474836474float四字节±1.175494E-38~±3.402823E+385*1~3字节对象的地址6bit位0或17sfr单字节0~2558sfr16双字节0~655359sbit位0或12.4C51数据类型数据类型长度值域1unsigned63(1)char字符类型char类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。分无符号字符类型unsignedchar和有符号字符类型signedchar,默认值为signedchar类型。unsignedchar类型用字节中所有的位来表示数值,所能表达的数值范围是0~255。signedchar类型用字节中最高位字节表示数据的符号,“0”表示正数,“1”表示负数,负数用补码表示。所能表示的数值范围是-128~+127。unsignedchar常用于处理ASCII字符或用于处理小于或等于255的整型数。(1)char字符类型char类64(2)int整型int整型长度为两个字节,用于存放一个双字节数据。分有符号int整型数signedint和无符号整型数unsignedint,默认值为signedint类型。signedint表示的数值范围是-32768~+32767,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数。unsignedint表示的数值范围是0~65535。(2)int整型int整型长度为两个字节,用于存放一个65(3)long长整型long长整型长度为四个字节,用于存放一个四字节数据。分有符号long长整型signedlong和无符号长整型unsignedlong,默认值为signedlong类型。signedint表示的数值范围是-2147483648~+2147483647,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数。unsignedlong表示的数值范围是0~4294967295。(3)long长整型long长整型长度为四个字节,用于66(4)float浮点型float浮点型在十进制中具有7位有效数字,是符合IEEE-754标准的单精度浮点型数据,占用四个字节。因浮点数的结构较复杂在以后的章节中再做详细的讨论。(4)float浮点型float浮点型在十进制中具有67(5)*指针型指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占据一定的内存单元,对不一样的处理器长度也不尽相同,在c51中它的长度一般为1~3个字节。指针变量也具有数据类型,C51支持的指针是一般指针和存储器指针。C51编译器支持用星号(*)进行指针声明。可以用指针完成在标准C语言中有的所有操作。由于80C51及其派生系列所具有的独特结构,C51编译器支持两种不同类型的指针:通用指针和存储器指针。(5)*指针型指针型本身就是一个变量,在这个变量中存放的指68(6)bit位标量bit位标量是c51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。(6)bit位标量bit位标量是c51编译器的一种69(7)sfr特殊功能寄存器sfr也是一种扩充数据类型,是定义8位的特殊功能寄存器。利用它能访问51单片机内部的所有特殊功能寄存器。如用sfrP1=0x90这一句定P1为P1端口在片内的寄存器,在后面的语句中可用P1=255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。sfr关键字后面是一个要定义的名字,等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(0X80-0XFF)

(7)sfr特殊功能寄存器sfr也是一种扩充数据类型,70(8)sfr1616位特殊功能寄存器sfr16也是一种扩充数据类型,是用来定义16位特殊功能寄存器,sfr16关键定后面是一个要定义的名字,等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(0X80-0XFF)。sfr16和sfr一样用于操作特殊功能寄存器,所不一样的是它用于操作占两个字节的寄存器。(8)sfr1616位特殊功能寄存器sfr16也是一种扩充71(9)sbit可寻址位sbit是单片机c语言中的一种扩充数据类型,利用它能访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位,如访问特殊功能寄存器中的某位。(9)sbit可寻址位sbit是单片机c语言中的一种扩充72如要访问P1口中的第2个引脚P1.1,定义方法如下:(A)sbit位变量名=位地址sbitP1_1=0x91;这样是把位的绝对地址赋给位变量。同sfr一样sbit的位地址必须位于0X80-0XFF之间。如要访问P1口中的第2个引脚P1.1,定义方法如下:73(B)sbit位变量名=特殊功能寄存器名^位位置sftP1=0x90;

sbitP1_1=P1^1;//先定义一个特殊功能寄存器名,再指定位变量名所在的位置,当可寻址位位于特殊功能寄存器中时可采用这种方法。(B)sbit位变量名=特殊功能寄存器名^位位置74(C)sbit位变量名=字节地址^位位置

sbitP1_1=0x90^1;这种方法其实和(B)是一样的,只是把特殊功能寄存器的位址直接用常数表示。(C)sbit位变量名=字节地址^位位置75在C51存储器类型中提供有一个bdata的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区(内部RAM0x20-0x2f字节单元)中,可以将要求可位寻址的数据定义为bdata。如:在C51存储器类型中提供有一个bdata的存储器类型,这个是76unsignedcharbdataib;//在可位录址区定义ucsignedchar类型的变量ibintbdataab[2]; //在可位寻址区定义数组ab[2],这些也称为可寻址位对象sbitib7=ib^7 //用关键字sbit定义位变量来独立访问可寻址位对象的其中一位sbitab12=ab[1]^12;操作符“^”后面位的最大值取决于指定的基址类型,char型0-7,int型0-15,long型0-31。unsignedcharbdataib;//在可位录772.5C51存储器类型

从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率。2.5C51存储器类型从数据存储类型来78在51系列中data,idata,xdata的区别:data:固定指前面0x00-0x7f的128个RAM,速度最快,生成的代码也最小。idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。xdata:外部扩展RAM,指外部0x0000-0xffff空间,用类似C中的指针方式访问或用绝对地址方式访问。在51系列中data,idata,xdata的区别:79表2.3存储器类型存储器类型说明data直接访问内部数据存储器(128字节),访问速度最快bdata可位寻址内部数据存储器(16字节),允许位与字节混合访问idata间接访问内部数据存储器(256字节),允许访问全部内部地址pdata分页访问外部数据存储器(256字节)xdata外部数据存储器(64KB)code程序存储器(64KB)表2.3存储器类型说明data直接访问内部数据存储器(1802.6C51程序基本结构

(1)C51基本结构#include<reg51.h>

/*头文件说明部份,预处理部分*/unsignedcharx1,x2;

/*全局变量声明部份*/…Function1(…){

……}/*功能函数定义部份*/main(){inti,j;

/*整型变量声明部份*/Function1(…);

/*功能函数说明部份,函数声明,先声明后调用*/……}2.6C51程序基本结构(1)C51基本结构81(2)C51程序的一般结构:预处理全局变量说明函数1说明……函数n说明main(){/*在一个工程中必须有、且只有一个小写的main()函数*/局部变量说明;执行语句;函数调用;}返回类型函数1名(形参说明){局部变量说明;执行语句;函数调用;}…….返回类型函数n名(形参说明){局部变量说明;执行语句;函数调用;}

C51程序与C程序一样遵循“先声明后调用”原则。(2)C51程序的一般结构:822.7C51重要库函数

除了可以使用C语言的常用库函数,C51还有包含寄存器库函数和本征库函数,对使用C51语言编程是比较重要的。(1)absacc.h该文件中实际只定义了几个宏,以确定各存储空间的绝对地址。包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD具体使用可看一看absacc.h便知。例如:rval=CBYTE[0x0002];指向程序存贮器的0X0002地址rval=XWORD[0x0002];指向外RAM的0X0004地址2.7C51重要库函数除了可以使用C语言的常用库函数83(2)intrins.h

在C51单片机编程中,头文件INTRINS.H的函数使用起来,就会让你像在用汇编时一样简便。原型:unsignedchar_crol_(unsignedcharval,unsignedcharn);字符循环左移unsignedint_irol_(unsignedintval,unsignedcharn);整数循环左移unsignedint_lrol_(unsignedintval,unsignedcharn);长整数循环左移例:#include<intrins.h>main(){unsignedinty;y=0x00ff;y=_irol_(y,4);//将y值按二进制左移4位,成0X0FF0}(2)intrins.h84原型:unsignedchar_cror_(unsignedcharval,unsignedcharn);字符循环右移unsignedint_iror_(unsignedintval,unsignedcharn);整数循环右移unsignedint_lror_(unsignedintval,unsignedcharn);长整数循环右移例:#include<intrins.h>main(){unsignedinty;y=0x0ff00;y=_iror_(y,4);//将y值按二进制右移4位,成0x00ff0}原型:85原型:void_nop_(void);产生一个NOP指令,该函数可用作C程序的时间延时。例:P1_1=1;_nop_();P1_1=0;原型:bit_testbit_(bitx);该函数测试一个位,当置位时返回1,否则返回0。如果该位置为1,则将该位复位为0。_testbit_只能用于可直接寻址的位;在表达式中使用是不允许的。原型:void_nop_(void);86(3)REG51.h标准的8051头文件,定义了所有的特殊功能寄存器SFR名及位名定义,一般系统都必须包括本文件。(4)stdlib.h动态内存分配函数。(5)string.h缓冲区处理函数,中包括拷贝比较移动等函数。Memccpy,memchr,memcmp,memcpy,memmove,memset。(6)stdio.h输入输出流函数。8051的串口或用户定义的I/O口读写数据,缺省为8051串口,如要修改,可修改lib目录中的getkey.c及putchar.c源文件,然后在库中替换它们即可。(3)REG51.h872.8C51标识符

一、C语言关键字具有固定名称的特殊标识符,是编译器保留的,在编写C程序时,标识符命名不能于关键字相同。2.8C51标识符一、C语言关键字88表2.4C语言关键字关键字

用途说明auto

存储种类声明

用于声明局部变量,默认值是此break

程序语句

退出最内层循环体case

程序语句

switch语句中的选择项char

数据类型声明

单字节整型或字符型数据const

存储类型声明

在程序执行过程中不可修改的变量值continue

程序语句

退出本次循环,转向下一次defaut

程序语句

switch语句中的失败选择项do

程序语句

构成do...wihile循环结构double

数据类型声名

双精度浮点数else

程序语句

构成if....else选择结构enum

数据类型

枚举表2.4C语言关键字关键字

用途说明auto

89extent

存储类型

全局变量float

数据类型

单精度浮点数for

程序语句goto

程序语句if

程序语句int

数据类型

基本整型数long

数据类型

长整型数register

存储类型

CPU内部的寄存器变量return

程序语句

函数返回short

数据类型

短整型signed

数据类型

有符号数sizeof

运算符

计算表达式或数据类型的字节数static

存储类型

静态变量struct

数据类型声明

结构类型switch

程序语句typedef

数据类型

重新进行数据类型定义union

数据类型

联合类型数据unsigned

数据类型

无符号数

void

数类型型

无类型数据volatile

数据类型

温馨提示

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

评论

0/150

提交评论