单片机的C语言编程_第1页
单片机的C语言编程_第2页
单片机的C语言编程_第3页
单片机的C语言编程_第4页
单片机的C语言编程_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、 单片机的单片机的C C语言编程称为语言编程称为C51C51编程编程,应用,应用C51C51编程具有以下优点:编程具有以下优点: (1 1)C51C51编译器编译器管理内部寄存器和存贮器的分配,编程时,无需管理内部寄存器和存贮器的分配,编程时,无需考虑不同存储器的寻址和数据类型等细节问题考虑不同存储器的寻址和数据类型等细节问题; (2 2)程序有规范的结构,可分成不同的函数,这种方式具有良)程序有规范的结构,可分成不同的函数,这种方式具有良好的好的模块化结构,使已编好程序容易移植模块化结构,使已编好程序容易移植; (3 3)有丰富的)有丰富的子程序库子程序库可直接引用,可直接引用,具有较强的数

2、据处理能力具有较强的数据处理能力,从而大大减少用户编程的工作量;从而大大减少用户编程的工作量; (4 4)C C语言和汇编语言可以交叉使用语言和汇编语言可以交叉使用。 汇编语言程序代码短、运行速度快、但复杂运算编程耗时。汇编语言程序代码短、运行速度快、但复杂运算编程耗时。用用汇编语言编写与硬件有关的部分程序汇编语言编写与硬件有关的部分程序,用用C C语言编写与硬件无关的语言编写与硬件无关的运算部分程序运算部分程序,充分发挥两种语言的长处,提高开发效率。,充分发挥两种语言的长处,提高开发效率。 第第4 4章章 单片机的单片机的C C语言编程语言编程4.1 C514.1 C51程序结构特点程序结构

3、特点 同标准同标准C C一样,一样,C51C51的程序是由函数组成。的程序是由函数组成。C C语言的函数以语言的函数以“”开始,以开始,以“”结束。结束。 其中必须有一个其中必须有一个主函数主函数mainmain()(),程序的执行从主函数,程序的执行从主函数main() main() 开始,调用其开始,调用其他函数后返回主函数他函数后返回主函数main()main(),最后,最后在主函数中结束整个程序在主函数中结束整个程序, ,而不管函数的排列而不管函数的排列顺序如何。顺序如何。 C C语言的语句规则:语言的语句规则: 1.1.每个变量必须先说明后引用。每个变量必须先说明后引用。 2.C2.

4、C语言程序一行可以书写多条语句,但每个语句必须以语言程序一行可以书写多条语句,但每个语句必须以“;”结尾,一个语句也可以多行书写。结尾,一个语句也可以多行书写。 3.C3.C语言的注释用语言的注释用/ /* * */ /表示。表示。 4.“”4.“”花括号必须成对花括号必须成对,位置随意,多个花括号可同行书写,位置随意,多个花括号可同行书写,也可逐行书写。也可逐行书写。 C C语言程序的组成结构:语言程序的组成结构: 全局变量全局变量说明说明 / /* *可被各函数引用可被各函数引用* */ / mainmain( ) /( ) /* *主函数主函数* */ / 局部变量局部变量说明说明 /

5、/* *只在本函数引用只在本函数引用* */ /执行语句执行语句( (包括函数调用语句包括函数调用语句); ); fun1fun1( (形式参数表形式参数表) /) /* *函数函数1 1* */ / 形式参数说明形式参数说明 局部变量说明局部变量说明 执行语句执行语句( (包括调用其他函数语句包括调用其他函数语句) ) funnfunn( (形式参数表形式参数表) /) /* *函数函数n n* */ / 形式参数说明形式参数说明 局部变量说明局部变量说明 执行语句执行语句 标识符标识符用来标识源程序中某个对象的名字,这些对象可以是用来标识源程序中某个对象的名字,这些对象可以是语句、数据类型

6、、函数、变量、数组等。语句、数据类型、函数、变量、数组等。标识符区分大小写,标识符区分大小写,第一个字符必须是字母或下划线。第一个字符必须是字母或下划线。 C51C51中有些库函数的标识符是以下划线开头的,所以中有些库函数的标识符是以下划线开头的,所以一般不一般不要以下划线开头命名标识符要以下划线开头命名标识符。 C51C51编译器规定标识符只有编译器规定标识符只有3232个字符在编译时有效个字符在编译时有效,因此在,因此在编写源程序时标识符的长度不要超过编写源程序时标识符的长度不要超过3232个字符个字符。 关键字关键字是编程语言保留的特殊标识符,是编程语言保留的特殊标识符,在在C C语言的

7、程序编写语言的程序编写中不允许标识符与关键字相同中不允许标识符与关键字相同。 Keil C51 Keil C51编译器的关键字除了有编译器的关键字除了有ANSI CANSI C标准的标准的3232个关键字个关键字外还根据外还根据5151单片机的特点单片机的特点扩展了相关的关键字扩展了相关的关键字。4.2 C514.2 C51的标识符和关键字的标识符和关键字关键字用途说明auto存储种类说明用以说明局部变量,缺省值为此break程序语句退出最内层循环体case程序语句switch语句中的选择项char数据类型说明单字节整型数或字符型数据const存储类型说明在程序执行过程中不可更改的常量值con

8、tinue程序语句转向下一次循环default程序语句switch语句中的失败选择项do程序语句构成dowhile循环结构double数据类型说明双精度浮点数else程序语句构成ifelse选择结构enum数据类型说明枚举extern存储种类说明在其他程序模块中说明了的全局变量float数据类型说明单精度浮点数for程序语句构成for循环结构goto程序语句构成goto转移结构if程序语句构成ifelse选择结构ANSI CANSI C标准关键字(标准关键字(1 1)ANSI CANSI C标准关键字(标准关键字(2 2)关键字用途说明int数据类型说明基本整型数long数据类型说明长整型数r

9、egister存储种类说明使用CPU内部寄存的变量return程序语句函数返回short数据类型说明短整型数signed数据类型说明有符号数,二进制数据的最高位为符号位sizeof运算符计算表达式或数据类型的字节数static存储种类说明静态变量struct数据类型说明结构类型数据switch程序语句构成switch选择结构typedef数据类型说明重新进行数据类型定义union数据类型说明联合类型数据unsigned数据类型说明无符号数据void数据类型说明无类型数据volatile数据类型说明该变量在程序执行中可被隐含地改变while程序语句构成while和dowhile循环结构Keil

10、C51Keil C51编译器扩展的关键字(编译器扩展的关键字(1 1)关键字用途说明_at_地址定位为变量定义存储空间绝对地址alien函数特性说明声明与PL/M51兼容的函数bdata存储器类型说明可位寻址的内部RAMbit位标量声明声明一个位标量或位类型的函数code存储器类型说明程序存储器空间compact存储器模式使用外部分页RAM的存储模式data存储器类型说明直接寻址的8051内部数据存储器idata存储器类型说明间接寻址的8051内部数据存储器interrupt中断函数声明定义一个中断函数large存储器模式使用外部RAM的存储模式pdata存储器类型说明“分页”寻址的8051外

11、部数据存储器_priority_多任务优先声明RTX51的任务优先级reentrant再入函数声明定义一个再入函数sbit位变量声明声明一个可位寻址变量sfr特殊功能寄存器声明声明一个特殊功能寄存器(8位)Keil C51Keil C51编译器扩展的关键字(编译器扩展的关键字(2 2)关键字用途说明sfr16特殊功能寄存器声明声明一个16位的特殊功能寄存器small存储器模式内部RAM的存储模式_task_任务声明定义实时多任务函数using寄存器组定义定义8051的工作寄存器组xdata存储器类型说明8051外部数据存储器4.3 C514.3 C51的数据类型的数据类型 C51C51的数据有

12、常量和变量之分。的数据有常量和变量之分。 常量常量 在程序运行中在程序运行中其值不变其值不变的量。的量。 变量变量 在程序运行中其值可以改变的量。在程序运行中其值可以改变的量。 定义一个变量,编译系统就会自动为它安排一个存贮区,具定义一个变量,编译系统就会自动为它安排一个存贮区,具体的地址值体的地址值 ,用户不必在意。,用户不必在意。 一个变量由一个变量由变量名变量名和和变量值变量值构成构成. . 变量名:存贮单元地址的符号表示。变量名:存贮单元地址的符号表示。 变量的值:变量所在地址单元存放的内容。变量的值:变量所在地址单元存放的内容。 数据类型:数据的长度。数据类型:数据的长度。 C51C

13、51编译器支持数据类型编译器支持数据类型 数数 据据 类类 型型长长 度度值值 域域位位 型型bit1Bit0或或1字字符符型型signed char1Byte-128+127unsigned char1Byte0255 整整 形形signed int2Byte-32768+32767unsigned int2Byte065535signed long4Byte-2147483648+2147483647unsigned long4Byte04294967295实型实型Float4Byte1.176E-383.40E+38指针型指针型data/idata/ pdata1Byte 1字节地址字节

14、地址code/xdata2Byte2字节地址字节地址通用指针通用指针3Byte其中其中1字节为储存器类型编码,字节为储存器类型编码,2,3字节为地字节为地址偏移量址偏移量访问访问SFR的数据类的数据类型型sbit1Bit0 或或 1sfr1Byte0255sfr162Byte0655358:52118:52128:52138:52148:52158:52168:52178:5218对位变量的定义对位变量的定义C51对位变量的定义方法有三种:对位变量的定义方法有三种: 1. 定义定义bit类型变量类型变量 如如 bit mnbit mn;mnmn为位变量,其值只能是为位变量,其值只能是“0 0”

15、或或“1 1”,其位,其位地址地址C51C51自行安排在可位寻址区的自行安排在可位寻址区的bdatabdata区。区。 2.采用采用字节寻址变量字节寻址变量.位位的方法的方法 如如 bdata int ibasebdata int ibase; /*ibase定义为整型变量定义为整型变量*/ sbit mybit=ibase15sbit mybit=ibase15; /*mybit定义为定义为 ibase的的D15位位*/ 这里位是运算符这里位是运算符 “” 相当于汇编中的相当于汇编中的 “”,其后的最大取,其后的最大取值依赖于该位所在的变量的类型,如定义为值依赖于该位所在的变量的类型,如定义

16、为char最大值只能为最大值只能为7。 3.对特殊功能寄存器的位的定义对特殊功能寄存器的位的定义 方法方法1:使用头文件及:使用头文件及sbit定义符;多用于无位名的可寻址位。定义符;多用于无位名的可寻址位。 如如 #include #include sbit P1_1=P11sbit P1_1=P11; /*P1_1为为P1口的第口的第1位位*/ sbit ac=ACC7sbit ac=ACC7; /*ac定义为累加器定义为累加器A的第的第7位位*/方法方法2:使用头文件:使用头文件reg51.h,再直接用位名称。,再直接用位名称。 例如例如 #include #include RS1=1

17、RS1=1; RS0=0RS0=0; 方法方法3:用字节地址位表示:用字节地址位表示 如如 sbit OV=0 xD02sbit OV=0 xD02;方法方法4:用寄存器名:用寄存器名.位定义位定义 如如 sfr PSW=0 xd0sfr PSW=0 xd0; / /* *定义定义PSWPSW地址为地址为d0Hd0H* */ / sbit CY=PSW7 sbit CY=PSW7; / /* *CYCY为为PSWPSW7 7* */ / 8:5221-应用实例应用实例 C5l C5l编译器除了能支持以上这些基本数据类型之外,编译器除了能支持以上这些基本数据类型之外,还能支持一些复杂的组合型数据

18、类型,如数组类型、还能支持一些复杂的组合型数据类型,如数组类型、指针类型、结构类型、联合类型等这些复杂的数据类指针类型、结构类型、联合类型等这些复杂的数据类型。型。 使用头文件使用头文件 C51建有头文件建有头文件 reg51.h、 reg52.h ,在该头文件中对,在该头文件中对51或或52系列单片机所有的特殊功能寄存器的进行了系列单片机所有的特殊功能寄存器的进行了sfr定义,定义,对特殊功能寄存器的有位名称的可寻址位进行了对特殊功能寄存器的有位名称的可寻址位进行了sbit定义,因定义,因此,只要用包含语句此,只要用包含语句#include 就可以直接引用特就可以直接引用特殊功能寄存器名,或

19、直接引用位名称。殊功能寄存器名,或直接引用位名称。 要特别注意:在引用时特殊功能寄存器或者位名称必须要特别注意:在引用时特殊功能寄存器或者位名称必须大写。大写。 4.4 4.4 数据的存储类型和存储模式数据的存储类型和存储模式 同同ANSI CANSI C一样,一样,C51C51规定变量必须先定义后使用。规定变量必须先定义后使用。C51C51对对变量的进行定义的格式如下:变量的进行定义的格式如下: 存储种类存储种类 数据类型数据类型 存储器类型存储器类型 变量名表变量名表 其中,存储种类和存储器类型是可选项。其中,存储种类和存储器类型是可选项。存储类型是存储类型是C51C51中增加的。中增加的

20、。一、变量的存储种类一、变量的存储种类 按变量的有效作用范围可以将其划分为局部变量和全局变按变量的有效作用范围可以将其划分为局部变量和全局变量;还可以按变量的的存储方式为其划分存储种类。量;还可以按变量的的存储方式为其划分存储种类。 在在C C语言中变量有四种存储种类,即自动语言中变量有四种存储种类,即自动(auto)(auto)、外部、外部(extern)(extern)、静态、静态(static)(static)和寄存器和寄存器(register)(register)。二、数据的存储类型二、数据的存储类型 C51C51是面向是面向8XX518XX51系列单片机及硬件控制系统的开发语言,系列

21、单片机及硬件控制系统的开发语言,它定义的它定义的任何变量必须以一定的存储类型的方式定位任何变量必须以一定的存储类型的方式定位在在8XX518XX51的的某一存储区中某一存储区中,否则便没有意义。因此在定义变量类型时,还,否则便没有意义。因此在定义变量类型时,还必须定义它的存储类型,必须定义它的存储类型,C51C51的变量有如下几种存储类型:的变量有如下几种存储类型:存储器类型存储器类型 描描 述述 data直接寻址内部数据存储区直接寻址内部数据存储区,00H-7FH(128 Byte)bdata可为寻址内部数据存储区可为寻址内部数据存储区,20H-2FH,允许位与字节混合访问允许位与字节混合访

22、问(16 Byte)idata间接寻址内部数据存储区间接寻址内部数据存储区,可访问全部内部地址空间可访问全部内部地址空间00H-FFH(256 Byte)pdata分页分页(256Byte)外部数据存储区外部数据存储区,由操作码由操作码MOVX Ri 访问访问xdata外部数据存储区外部数据存储区(64KB),由操作码由操作码 MOVX DPTR 访问访问code程序存储区程序存储区(64KB),由操作码由操作码 MOVC A+DPTR 访问访问 如果在变量定义时省略了存储器类型标识符,如果在变量定义时省略了存储器类型标识符,C51C51编译器编译器会选择默认的存储器类型。默认的存储器类型由会

23、选择默认的存储器类型。默认的存储器类型由SMALLSMALL、COMPACTCOMPACT和和LARGELARGE存储模式指令决定。存储模式指令决定。1 1)datadata区区 对对datadata区的寻址是最快的,所以应该把使用频率高的变量区的寻址是最快的,所以应该把使用频率高的变量放在放在datadata区,由于空间有限,必须注意使用区,由于空间有限,必须注意使用datadata区,区,datadata区除区除了包含程序变量外,还包含了堆栈和寄存器组了包含程序变量外,还包含了堆栈和寄存器组datadata区。区。 在在SMALLSMALL存储模式下,未说明存储器类型时,变量默认被存储模式

24、下,未说明存储器类型时,变量默认被定位在定位在datadata区。区。2 2)bdatabdata区区 当在当在DATADATA区的位寻址区定义变量,这个变量就可进行位寻区的位寻址区定义变量,这个变量就可进行位寻址,并且声明位变量。这对状态寄存器来说十分有用,因为它址,并且声明位变量。这对状态寄存器来说十分有用,因为它可以单独使用变量的每一位,而不一定要用位变量名引用位变可以单独使用变量的每一位,而不一定要用位变量名引用位变量。量。 3 3)idataidata区区 idata idata区也可以存放使用比较频繁的变量,使用寄存器作区也可以存放使用比较频繁的变量,使用寄存器作为指针进行寻址。在

25、寄存器中设置为指针进行寻址。在寄存器中设置8 8位地址进行间接寻址,与位地址进行间接寻址,与外部存储器寻址比较,它的指令执行周期和代码长度都比较短。外部存储器寻址比较,它的指令执行周期和代码长度都比较短。 4 4)pdatapdata和和xdataxdata区区 在这两个区声明变量和在其他区的语法是一样的,在这两个区声明变量和在其他区的语法是一样的,pdatapdata区只有区只有256B256B,而,而xdataxdata区可达区可达65536B 65536B 5 5)codecode区区 code code区即区即80C5180C51的程序代码区,所以代码区的数的程序代码区,所以代码区的数

26、据是不可改变的,据是不可改变的,80C5180C51的代码区不可重写。一般代的代码区不可重写。一般代码区中可存放数据表,跳转向量和状态表。码区中可存放数据表,跳转向量和状态表。 如果用户不对变量的存贮类型定义,则编译器承如果用户不对变量的存贮类型定义,则编译器承认默认存贮类型,默认的存贮类型由编译控制命令的认默认存贮类型,默认的存贮类型由编译控制命令的存贮的模式部分决定。存贮的模式部分决定。例例: : data char var; /*字符变量字符变量var定位在片内定位在片内RAM区区*/char code MSG=ENTER PARAMETER: /*字符数组定位在程序存贮区字符数组定位在

27、程序存贮区*/ unsigned long xdata array100; /* 无符号长型数组定位在片外无符号长型数组定位在片外 RAM区,每区,每 元素占元素占4bytes*/ float idata x,y,z; /*实型变量实型变量x,y,z,定位在片内用间址访问的内部,定位在片内用间址访问的内部RAM区区*/ bit lock; /*位变量位变量Lock定位在片内定位在片内RAM可位寻址区可位寻址区*/unsigned int pdata dimension; /* 无符号整型变量无符号整型变量 dimension定位在分页的外部定位在分页的外部RAM区区 */ unsigned c

28、har xdata vector 1044; /* 无符号字符型三无符号字符型三 维数组,维数组, 定位在片外定位在片外RAM区区*/ 三、数据的存储模式三、数据的存储模式 在固定的存贮器地址进行变量参数传递是在固定的存贮器地址进行变量参数传递是C51C51的一个标准特征,的一个标准特征,定义了变量、参数传递区的存贮器模式,也就是默认了变量和参数定义了变量、参数传递区的存贮器模式,也就是默认了变量和参数传递区存贮器类型、无需再对变量和参数传递区的存贮器类型进行传递区存贮器类型、无需再对变量和参数传递区的存贮器类型进行说明。说明。 存贮器模式决定了变量的默认存贮器类型、参数传递区和无明存贮器模式

29、决定了变量的默认存贮器类型、参数传递区和无明确存贮区类型的说明。确存贮区类型的说明。 有三种存贮器模式:有三种存贮器模式:SMALLSMALL、LARGELARGE和和COMPACTCOMPACT存储器模式存储器模式 描描 述述 SMALL参数及局部变量放入可直接寻址的内部数据存储参数及局部变量放入可直接寻址的内部数据存储区(区(128 Byte,默认存储器类型是默认存储器类型是DATA)COMPACT参数及局部变量放入分页外部数据存储区(最大参数及局部变量放入分页外部数据存储区(最大256Byte,默认存储类型是默认存储类型是PDATA)LARGE参数及局部变量直接放入外部数据存储器(最大参

30、数及局部变量直接放入外部数据存储器(最大64KB,默认存储器类型为,默认存储器类型为XDATA)1 1小小(SMALL)(SMALL)模式模式 所有变量都默认在所有变量都默认在80518051的内部数据存储器中。这和用的内部数据存储器中。这和用datadata显式定义变量起到相同的作用。显式定义变量起到相同的作用。 2 2紧凑紧凑(COMPACT)(COMPACT)模式模式 此模式中,所有变量都默认在此模式中,所有变量都默认在80518051的外部数据存储器的一的外部数据存储器的一页中。页中。 3 3大大(LARGE)(LARGE)模式模式 在大模式下,所有的变量都默认在外部存储器中在大模式下

31、,所有的变量都默认在外部存储器中(xdata)(xdata)。 例如:例如: 设设C语言源程序为语言源程序为PROR.C,若使程序中的变量类型和参,若使程序中的变量类型和参数传递区数传递区限定在外部数据存贮区限定在外部数据存贮区 ,有两种方法有两种方法: 方法方法1:在程序的第一句加预处理命令:在程序的第一句加预处理命令 #pragma compact。 方法方法2:用:用C51对对PROR.C进行编译时,使用编译控制命令进行编译时,使用编译控制命令: C51 PROR.C COMPACT。 如果在变量说明时略去存贮器类型标志符,编译如果在变量说明时略去存贮器类型标志符,编译器会自动选择默认的

32、存贮器类型。默认的存器会自动选择默认的存贮器类型。默认的存 贮器类型贮器类型进一步由控制指令进一步由控制指令SMALL、COMPACT和和LARGE限限制。制。例:例:如果声明如果声明char var,则默认,则默认 的存贮器模式为的存贮器模式为SMALL,var放在放在data存贮区;存贮区;如果使用如果使用COMPACT模式,模式,var放入放入idata存贮区存贮区 ;使用使用LARGE模式,模式,var被放入外部存贮区被放入外部存贮区(xdata存贮存贮区区)。 四、对存贮器和外接四、对存贮器和外接I/OI/O口的绝对地址访问口的绝对地址访问 C51对存贮器和外接对存贮器和外接I/O口

33、的绝对地址访问可以通过指针访问,口的绝对地址访问可以通过指针访问,也可以通过函数访问。也可以通过函数访问。 1. 对存贮器的绝对地址访问对存贮器的绝对地址访问 利用绝对地址访问的头文件利用绝对地址访问的头文件absacc.h可对不同的存贮区进行访可对不同的存贮区进行访问。该头文件的函数有问。该头文件的函数有: CBYTE CBYTE (访问访问code区字符型区字符型) DBYTE DBYTE (访问访问data区字符型区字符型) PBYTE PBYTE (访问访问pdata或或I/O) XBYTEXBYTE (访问访问xdata或或I/O) 还有还有CWORD、DWORD、PWORD和和XWORD四个函数,它

温馨提示

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

评论

0/150

提交评论