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

下载本文档

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

文档简介

单片机的C语言编程称为C51编程,应用C51编程具有以下优点:

(1)C51编译器管理内部寄存器和存贮器的分配,编程时,无需考虑不同存储器的寻址和数据类型等细节问题;

(2)程序有规范的结构,可分成不同的函数,这种方式具有良好的模块化结构,使已编好程序容易移植;(3)有丰富的子程序库可直接引用,具有较强的数据处理能力,从而大大减少用户编程的工作量;(4)C语言和汇编语言可以交叉使用。

汇编语言程序代码短、运行速度快、但复杂运算编程耗时。用汇编语言编写与硬件有关的部分程序,用C语言编写与硬件无关的运算部分程序,充分发挥两种语言的长处,提高开发效率。

第4章单片机的C语言编程4.1C51程序结构特点

同标准C一样,C51的程序是由函数组成。C语言的函数以“{”开始,以“}”结束。

其中必须有一个主函数main(),程序的执行从主函数main()开始,调用其他函数后返回主函数main(),最后在主函数中结束整个程序,而不管函数的排列顺序如何。

C语言的语句规则:

1.每个变量必须先说明后引用。

2.C语言程序一行可以书写多条语句,但每个语句必须以“;”结尾,一个语句也可以多行书写。

3.C语言的注释用/*……*/表示。

4.“{”花括号必须成对,位置随意,多个花括号可同行书写,也可逐行书写。

C语言程序的组成结构:

全局变量说明/*可被各函数引用*/

main()/*主函数*/ {

局部变量说明 /*只在本函数引用*/ 执行语句(包括函数调用语句); }

fun1(形式参数表)/*函数1*/ 形式参数说明

{ 局部变量说明 执行语句(包括调用其他函数语句) }

funn(形式参数表)/*函数n*/ 形式参数说明

{ 局部变量说明 执行语句

}

标识符用来标识源程序中某个对象的名字,这些对象可以是语句、数据类型、函数、变量、数组等。标识符区分大小写,第一个字符必须是字母或下划线。

C51中有些库函数的标识符是以下划线开头的,所以一般不要以下划线开头命名标识符。

C51编译器规定标识符只有32个字符在编译时有效,因此在编写源程序时标识符的长度不要超过32个字符。

关键字是编程语言保留的特殊标识符,在C语言的程序编写中不允许标识符与关键字相同。KeilC51编译器的关键字除了有ANSIC标准的32个关键字外还根据51单片机的特点扩展了相关的关键字。4.2C51的标识符和关键字关键字用途说明auto存储种类说明用以说明局部变量,缺省值为此break程序语句退出最内层循环体case程序语句switch语句中的选择项char数据类型说明单字节整型数或字符型数据const存储类型说明在程序执行过程中不可更改的常量值continue程序语句转向下一次循环default程序语句switch语句中的失败选择项do程序语句构成do…while循环结构double数据类型说明双精度浮点数else程序语句构成if…else选择结构enum数据类型说明枚举extern存储种类说明在其他程序模块中说明了的全局变量float数据类型说明单精度浮点数for程序语句构成for循环结构goto程序语句构成goto转移结构if程序语句构成if…else选择结构ANSIC标准关键字(1)ANSIC标准关键字(2)关键字用途说明int数据类型说明基本整型数long数据类型说明长整型数register存储种类说明使用CPU内部寄存的变量return程序语句函数返回short数据类型说明短整型数signed数据类型说明有符号数,二进制数据的最高位为符号位sizeof运算符计算表达式或数据类型的字节数static存储种类说明静态变量struct数据类型说明结构类型数据switch程序语句构成switch选择结构typedef数据类型说明重新进行数据类型定义union数据类型说明联合类型数据unsigned数据类型说明无符号数据void数据类型说明无类型数据volatile数据类型说明该变量在程序执行中可被隐含地改变while程序语句构成while和do…while循环结构KeilC51编译器扩展的关键字(1)关键字用途说明_at_地址定位为变量定义存储空间绝对地址alien函数特性说明声明与PL/M51兼容的函数bdata存储器类型说明可位寻址的内部RAMbit位标量声明声明一个位标量或位类型的函数code存储器类型说明程序存储器空间compact存储器模式使用外部分页RAM的存储模式data存储器类型说明直接寻址的8051内部数据存储器idata存储器类型说明间接寻址的8051内部数据存储器interrupt中断函数声明定义一个中断函数large存储器模式使用外部RAM的存储模式pdata存储器类型说明“分页”寻址的8051外部数据存储器_priority_多任务优先声明RTX51的任务优先级reentrant再入函数声明定义一个再入函数sbit位变量声明声明一个可位寻址变量sfr特殊功能寄存器声明声明一个特殊功能寄存器(8位)KeilC51编译器扩展的关键字(2)关键字用途说明sfr16特殊功能寄存器声明声明一个16位的特殊功能寄存器small存储器模式内部RAM的存储模式_task_任务声明定义实时多任务函数using寄存器组定义定义8051的工作寄存器组xdata存储器类型说明8051外部数据存储器4.3C51的数据类型

C51的数据有常量和变量之分。

常量

——在程序运行中其值不变的量。变量

——在程序运行中其值可以改变的量。

定义一个变量,编译系统就会自动为它安排一个存贮区,具体的地址值,用户不必在意。一个变量由变量名和变量值构成.

变量名:存贮单元地址的符号表示。变量的值:变量所在地址单元存放的内容。数据类型:数据的长度。

C51编译器支持数据类型

型长

度值

域位型bit1Bit0或1字符型signedchar1Byte-128~+127unsignedchar1Byte0~255

整形signedint2Byte-32768~+32767unsignedint2Byte0~65535signedlong4Byte-2147483648~+2147483647unsignedlong4Byte0~4294967295实型Float4Byte1.176E-38~3.40E+38指针型data/idata/pdata1Byte1字节地址code/xdata2Byte2字节地址通用指针3Byte其中1字节为储存器类型编码,2,3字节为地址偏移量访问SFR的数据类型sbit1Bit0或1sfr1Byte0~255sfr162Byte0~65535*11C51增加的特殊的数据类型1.bit位标量bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量。它的值是一个二进制位,不是0,就是1。

bit位变量名例:bitlock;

/*将lock定义为位变量*/lock=1;*122.sfr特殊功能寄存器

MCS-51系列单片机片内有21个特殊功能寄存器(SFR),分散在片内RAM区的0x80~0xFF地址范围内。对SFR的操作只能用直接寻址方式。为了能直接访问这些特殊功能寄存器,C51提供了定义sfr的方法。sfr是一种C51扩充数据类型,占用一个内存单元,值域为0~255。语法如下:

sfr特殊寄存器名=寄存器地址

*13例如:sfrP1=0x90P1=255

定义一个特殊功能寄存器变量“P1”,0x90是指51单片机的P1端口地址90H,变量P1即指51单片机的P1端口。在后面的语句中可以用P1=255(对P1端口的所有引脚置高电平)之类的语句操作特殊功能寄存器。*14例:sfrPSW=0xD0;

/*定义程序状态字PSW,因MCS-51单片机的PSW地址为D0H*/sfrTMOD=0x89;/*定义定时/计数器方式控制寄存器TMOD,因MCS-51单片机的TMOD地址为89H*/sfrSCON=0x98;

/*定义串口控制寄存器SCON,因MCS-51单片机的SCON地址为8H*/*153.sfr1616位特殊功能寄存器sfr16也是一种C51扩充数据类型,用于定义存在于MCS-51单片机内部RAM的16位特殊功能寄存器,如定时器T0和T1。

sfr16型数据占用2个内存单元,取值范围为0~65535。

*16

sbit也是一种C51扩充数据类型,利用sbit访问芯片内部可寻址的特殊功能寄存器中的位。定义方法有如下三种:(1)sbit特殊功能寄存器位名=位地址

将位的绝对地址赋给位变量,位地址必须位于80H~FFH(特殊功能寄存器的位地址)之间。4.sbit可寻址位*17(2)sbit特殊功能寄存器位名=特殊功能寄存器名^位位置当可寻址位位于特殊功能寄存器中时,可采用这种方法。位位置是一个0~7之间的常数。(3)sbitsbit特殊功能寄存器位名=字节地址^位位置这种方法是以一个常数(字节地址)作为基地址,该常数必须在80H~FFH(特殊功能寄存器的字节地址)之间。位位置是一个0~7之间的常数。*18例:sfr

PSW=0xD0; /*首先定义程序状态字PSW,

因MCS-51单片机的PSW地址为D0H*/sbitOV=PSW^2;

/*在前面定义了PSW后,OV位于PSW的第2位*/sbitAC=0xD0^6;

/*D0H是程序状态字PSW的字节地址,

辅助进位标志位AC位于PSW的第6位*/sbitRS0=0xD0^3;

/*工作寄存器组控制位RS0位于PSW的第3位*/sbitCY=0xD7;

/*进位标志位Cy的绝对位地址为D7H*/对位变量的定义C51对位变量的定义方法有三种:1.定义bit类型变量

如bitmn;mn为位变量,其值只能是“0”或“1”,其位地址C51自行安排在可位寻址区的bdata区。

2.采用字节寻址变量.位的方法如bdataintibase;

/*ibase定义为整型变量*/

sbitmybit=ibase^15;

/*mybit定义为ibase的D15位*/

这里位是运算符“^”相当于汇编中的“·”,其后的最大取值依赖于该位所在的变量的类型,如定义为char最大值只能为7。

3.对特殊功能寄存器的位的定义方法1:使用头文件及sbit定义符;多用于无位名的可寻址位。如#include<reg51.h>

sbitP1_1=P1^1;

/*P1_1为P1口的第1位*/

sbitac=ACC^7;/*ac定义为累加器A的第7位*/方法2:使用头文件reg51.h,再直接用位名称。例如#include<reg51.h>RS1=1;

RS0=0;

方法3:用字节地址位表示如sbitOV=0xD0^2;方法4:用寄存器名.位定义

如sfrPSW=0xd0;/*定义PSW地址为d0H*/

sbitCY=PSW^7;/*CY为PSW·7*/*21例5-2

特殊功能寄存器的访问。#include”reg51.h”sbitP10=P1^0; /*定义P10为P1口第0位,即P1.0口*/sbitP12=P1^2; /*定义P12为P1口第2位,即P1.2口*/

voidmain() { P10=1; /*置位P1.0口*/ P12=0; /*复位P1.2口*/ PSW=0x08; /*程序状态字置0x08*/ …… }----应用实例C5l编译器除了能支持以上这些基本数据类型之外,还能支持一些复杂的组合型数据类型,如数组类型、指针类型、结构类型、联合类型等这些复杂的数据类型。

使用头文件

C51建有头文件reg51.h、reg52.h,在该头文件中对51或52系列单片机所有的特殊功能寄存器的进行了sfr定义,对特殊功能寄存器的有位名称的可寻址位进行了sbit定义,因此,只要用包含语句#include<reg51.h>就可以直接引用特殊功能寄存器名,或直接引用位名称。要特别注意:在引用时特殊功能寄存器或者位名称必须大写。

4.4数据的存储类型和存储模式

同ANSIC一样,C51规定变量必须先定义后使用。C51对变量的进行定义的格式如下:

[存储种类]数据类型[存储器类型]变量名表其中,存储种类和存储器类型是可选项。存储类型是C51中增加的。一、变量的存储种类

按变量的有效作用范围可以将其划分为局部变量和全局变量;还可以按变量的的存储方式为其划分存储种类。在C语言中变量有四种存储种类,即自动(auto)、外部(extern)、静态(static)和寄存器(register)。二、数据的存储类型

C51是面向8XX51系列单片机及硬件控制系统的开发语言,它定义的任何变量必须以一定的存储类型的方式定位在8XX51的某一存储区中,否则便没有意义。因此在定义变量类型时,还必须定义它的存储类型,C51的变量有如下几种存储类型:存储器类型

描述data直接寻址内部数据存储区,00H-7FH(128Byte)bdata可为寻址内部数据存储区,20H-2FH,允许位与字节混合访问(16Byte)idata间接寻址内部数据存储区,可访问全部内部地址空间00H-FFH(256Byte)pdata分页(256Byte)外部数据存储区,由操作码MOVX@Ri访问xdata外部数据存储区(64KB),由操作码MOVX@DPTR访问code程序存储区(64KB),由操作码MOVC@A+DPTR访问如果在变量定义时省略了存储器类型标识符,C51编译器会选择默认的存储器类型。默认的存储器类型由SMALL、COMPACT和LARGE存储模式指令决定。1)data区对data区的寻址是最快的,所以应该把使用频率高的变量放在data区,由于空间有限,必须注意使用data区,data区除了包含程序变量外,还包含了堆栈和寄存器组data区。在SMALL存储模式下,未说明存储器类型时,变量默认被定位在data区。2)bdata区当在DATA区的位寻址区定义变量,这个变量就可进行位寻址,并且声明位变量。这对状态寄存器来说十分有用,因为它可以单独使用变量的每一位,而不一定要用位变量名引用位变量。3)idata区idata区也可以存放使用比较频繁的变量,使用寄存器作为指针进行寻址。在寄存器中设置8位地址进行间接寻址,与外部存储器寻址比较,它的指令执行周期和代码长度都比较短。4)pdata和xdata区在这两个区声明变量和在其他区的语法是一样的,pdata区只有256B,而xdata区可达65536B5)code区code区即80C51的程序代码区,所以代码区的数据是不可改变的,80C51的代码区不可重写。一般代码区中可存放数据表,跳转向量和状态表。如果用户不对变量的存贮类型定义,则编译器承认默认存贮类型,默认的存贮类型由编译控制命令的存贮的模式部分决定。例:

datacharvar;

/*字符变量var定位在片内RAM区*/charcodeMSG[]=″ENTERPARAMETER:″

/*字符数组定位在程序存贮区*/

unsignedlongxdataarray[100];

/*无符号长型数组定位在片外RAM区,每元素占4bytes*/

floatidatax,y,z;

/*实型变量x,y,z,定位在片内用间址访问的内部RAM区*/

bitlock;

/*位变量Lock定位在片内RAM可位寻址区*/unsignedintpdatadimension;

/*无符号整型变量

dimension定位在分页的外部RAM区*/unsignedcharxdatavector[10][4][4];

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

描述SMALL参数及局部变量放入可直接寻址的内部数据存储区(128Byte,默认存储器类型是DATA)COMPACT参数及局部变量放入分页外部数据存储区(最大256Byte,默认存储类型是PDATA)LARGE参数及局部变量直接放入外部数据存储器(最大64KB,默认存储器类型为XDATA)1.小(SMALL)模式所有变量都默认在8051的内部数据存储器中。这和用data显式定义变量起到相同的作用。

2.紧凑(COMPACT)模式此模式中,所有变量都默认在8051的外部数据存储器的一页中。3.大(LARGE)模式

在大模式下,所有的变量都默认在外部存储器中(xdata)。例如:设C语言源程序为PROR.C,若使程序中的变量类型和参数传递区限定在外部数据存贮区,有两种方法:方法1:在程序的第一句加预处理命令

#pragmacompact。方法2:用C51对PROR.C进行编译时,使用编译控制命令:C51PROR.CCOMPACT。

如果在变量说明时略去存贮器类型标志符,编译器会自动选择默认的存贮器类型。默认的存贮器类型进一步由控制指令SMALL、COMPACT和LARGE限制。例:如果声明charvar,则默认的存贮器模式为SMALL,var放在data存贮区;如果使用COMPACT模式,var放入idata存贮区;使用LARGE模式,var被放入外部存贮区(xdata存贮区)。

四、对存贮器和外接I/O口的绝对地址访问

C51对存贮器和外接I/O口的绝对地址访问可以通过指针访问,也可以通过函数访问。

1.对存贮器的绝对地址访问

利用绝对地址访问的头文件absacc.h可对不同的存贮区进行访问。该头文件的函数有:

CBYTE (访问code区字符型)

DBYTE (访问data区字符型)

PBYTE (访问pdata或I/O)

XBYTE (访问xdata或I/O)

还有CWORD、DWORD、PWORD和XWORD四个函数,它们的访问区域同上,只是访问的类型为int型

例: #include<absacc.h>

#definecomXBYTE[0x07ff]

那么后面程序com变量出现的地方,就是对地址为07ffH外部RAM或I/O口进行访问。例:XWORD[0]=0x9988;

即将9988H(int类型)送入外部RAM的0号和1号单元。使用中要

温馨提示

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

评论

0/150

提交评论