您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 6 单片机C程序设计1_C规则
3Sept.2008Confidential第六章:单片机C程序设计目标:本章旨在向学员具体介绍8051单片机的功能部件及C语言程序设计,通过本章的学习,学员应该掌握如下知识:单片机的开发环境与编译过程数据类型与存储模式键盘接口技术LED接口技术LCD接口技术中断编程定时器/计数器串行口编程学时:16.0学时教学方法:讲授ppt+上机练习+点评+案例分析3Sept.2008Confidential六、单片机C程序设计之Copyright2008ByNeusoftGroup.AllrightsreservedC规则3Sept.2008Confidential第六章第一节:C规则目标:本章旨在向学员具体介绍8051单片机C语言程序设计规则,通过本章的学习,学员应该掌握如下知识:单片机的开发环境与编译过程数据类型与存储模式学时:6.0学时教学方法:讲授ppt+上机练习+点评+案例分析3Sept.2008Confidential用C语言编写单片机应用程序与编写标准的C语言程序的不同之处就在于根据单片机存储结构及内部资源定义相应的C语言中的数据类型和变量,其它的语法规定、程序结构及程序设计方法都与标准的C语言程序设计相同。6.1标准C与C51的差异用汇编程序设计单片机应用程序时,必须要考虑其存储器结构,尤其必须考虑其片内数据存储器与特殊功能寄存器正确、合理的使用以及按实际地址处理端口数据。用C语言编写单片机的应用程序,虽然不像用汇编语言那样具体地组织、分配存储器资源和处理端口数据,但在C语言编程中,对数据类型与变量的定义,必须要与单片机的存储结构相关联,否则编译器不能正确地映射定位。用C语言编写的应用程序必须经单片机的C语言编译器(简称C51),转换生成单片机可执行的代码程序。支持MCS–51系列单片机的C语言编译器有很多种。如AmericanAutomation、Auocet、BSO/TASKING、DUNFIELDSHAREWARE、KEIL/Franklin等。其中KEIL/Franklin以它的代码紧凑和使用方便等特点优于其它编译器。本章是针对这种编译器介绍MCS–51单片机C语言程序设计。3Sept.2008ConfidentialC语言源文件编译预处理语句分析工具代码生成器汇编语言文件汇编编译器object文件lib文件连接器机器语言文件汇编语言文件汇编编译器object文件6.2C程序编译过程(混合编程模式)图6-1编译过程汇编指令与机器指令基本上是一对一的关系,采用汇编语言来写程序,开发效率较低、缺乏代码的可移植性,同时汇编程序可读性不佳使得软件维护工作难以进行,所以在现代的嵌入式软件开发中一般都采用高级语言来编写代码。对于CISC体系,编译器在优化代码方面难度很大,有对性能有很高要求的项目中,嵌入式软件工程师需要分析程序性能,将计算复杂度较高的部分用汇编指令实现以提高代码的执行速度,这种方式称为混合编程模式。高级语言程序首先被高级语言编译器转换成汇编语言程序之后汇编编译器再将之转换为目标文件(obj文件)但高级语言程序中调用的相关函数还没有包含进来高级程序设计语言的标准库函数一般会预先编译好,以库(lib)文件的方式包含在编译环境中链接器(Linker)将相应的lib文件内容与obj文件连接在一起生成最终可以在目标处理器上执行的文件在混合编程时,汇编部分产生的obj文件也会在此时连接进来3Sept.2008Confidential6.3KeilCx51Compiler支持的基本数据类型表6-1KeilCx51Compiler支持的基本数据类型基本数据类型位数字节数数值范围bit10or1sbit10or1sfr810—255sfr161620—65535signedchar81-128—+127unsignedchar810—255signedshortint162-32768—+32767unsignedshortint1620—65535signedlongint324-2147483648—+2147483647unsignedlongint3240—4294967295float324±1.175494E-38—±3.402823E+38double648±1.175494E-38—±3.402823E+38KeilCx51编译器除了支持ANSIC中的各种基本数据类型之外,还引入了另外四种新的基本数据类型:bit、sbit、sfr、sfr163Sept.2008Confidential定义sfr变量语法:其中name---对应特殊功能寄存器SFR名称;address---对应特殊功能寄存器SFR地址。6.3.1sfr数据类型例如:sfrP0=0x80;sfrP1=0x90;sfrP2=0xA0;sfrP3=0xB0;sfrname=address;sfr数据类型是与特殊功能寄存器SFR相对应的。这两者中,一个是C语言扩展数据类型,一个是微控制器中的硬件。引进sfr数据类型是为了使程序员能够通过软件的方法来读写SFRs,通过sfr变量读写与之相对应的特殊功能寄存器SFR,实现对相关硬件部件的软件控制。sfr变量的变量名与对应的特殊功能寄存器同名。在C语言中,一个变量被定义为“内存的一块区域以及该区域的解释规则”,变量名对应的是就是该内存区域的地址。将sfr变量与具体的特殊功能寄存器SFR通过同一地址关联对应起来,这就是sfr变量定义的含义。经典的8051微控制器在0x80到0xFF的地址范围中为SFRs分配了地址,大多数8051系列微控制器采用了相同的地址分配方案,但特殊功能寄存器的数目和类型可能会有所变动。因此KeilCx51编译器只是在头文件reg51.h中定义了与经典8051微控制器中特殊功能寄存器地址分配相对应的sfr变量。编程人员在程序中简单地包含该头文件,就可以在程序中使用相应的sfr变量。也可以根据具体的微控制器结构以及SFRs地址分配,重新定义与特殊功能寄存器SFR对应的sfr变量。也就是说,sfr变量与特殊功能寄存器SFR之间的对应关系是由程序员负责的。3Sept.2008Confidential6.3.2sbit(SFRbit)数据类型sbit变量定义语法:其中name是sbit变量名;sfr-name是预先定义过的SFR名;bit-position是SFR比特在SFR中的位置;sfr-address是SFR的地址;sbit-address是SFRbit的地址。例如:sbitRXD=P3^0;//sfrP3=0XB0;sbitTXD=P3^1;sbitRXD=0xB0^0;sbitTXD=0xB1;sbitname=sfr-name^bit-position;sbitname=sfr-address^bit-position;sbitname=sbit-address;在典型的8051应用,经常需要读写特殊功能寄存器SFR中的某些位,以便读取、设置相关硬件部件的状态或控制对应输入输出上引脚上的信号。Cx51编译器提供了sbit(SFRbit)类型用来读写位可寻址的SFRs和其它位可寻址的变量的相应位数据。但是要注意,并不是所有特殊功能寄存器SFRs都是位可寻址的!sbit变量不能在函数体内定义。有三种定义方式,在第1种和第2种方式中,通过给出SFR名称或SFR地址指明SFRbit与具体特殊功能寄存器SFR的关系。这两种方式都是基于符号“^”,这个符号表明对应前面SFR或地址内容的第几位。第三种方式通过直接给出地址来定义,其中地址必须在0x80-0xFF范围中。注意符号“=”在SFR变量以及sbit变量定义中不是通常“赋值”的意义,而是说明变量对应的内存单元地址。可以用sbit变量来访问RAM中0x20到0x2F的位可寻址区域3Sept.2008Confidential练习6-1:微控制器的重要特点之一是能够以位来访问寄存器、RAM和I/O端口,而不必以字节为单位来访问它们。在8051中,只改变P0端口一个引脚的状态,不涉及P0其它引脚,相关的代码是什么?#includereg51.hsbitP0_1=P0^1;voidmain(void){unsignedchari;P0_1=1;i=P0;……P0=1;i=P0;……}3Sept.2008Confidential先定义变量的数据类型和存储类型:intbdataibase;/*定义ibase为bdata整型变量*/charbdatabary[4];/*bary[4]定义为bdata字符型数组*/然后可使用sbit定义可独立寻址访问的对象位:sbitmybit0=ibase^0;/*mybit0定义为ibase的第0位*/sbitmybit15=ibase^15;/*mybit0定义为ibase的第15位*/sbitAry07=bary[0]^7;/*Ary07定义为abry[0]的第7位*/sbitAry37=bary[3]^7;/*Ary37定义为abry[3]的第7位*/6.3.2sbit数据类型(续)---第二种用法sbit定义要位寻址对象所在字节基址对象的存储类型为“bdata”,否则只有绝对的特殊位定义(sbit)是合法的。“^”操作符后的最大值依赖于指定的基类型,对于char/uchar而言是0~7,对于int/uint而言是0~15,对于long/ulong而言是0~31。对于多字节数据进行位访问时需要特别注意。C51编译器假定要用sbit声明进行位读写的数据是按小端序(littleendian)存放的,也就是低位字节存放在低地址单元,而标准C数据类型在51中是以大端序(big-endian)存储的,也就是高位字节存放在低地址单元。这时位的逻辑位置与物理位置存在着差异,逻辑位置指位在数据表示中的位置,物理位置指位相对于首字节的偏移量,需要在sbit声明中给出。例如Cx51编译器中int类型变量Y是2个字节长度的,C标准数据类型采用大端序存储方式,LSBbit(最低位比特,逻辑位置0)是在第二字节,物理位置是8,位访问定义方式是sbitbit0=Y^8。bdata表示变量被放到20H-2FH可位寻址区域3Sept.2008Confidential6.3.3bit数据类型bit数据类型用来定义单比特变量,定义语法是:其中name是bit类型变量名,value是赋与这个bit变量的数值。bit类型与C语言中其它数据类型相似,可以用于变量声明、函数参数列表以及函数返回值声明等。例如:bitdone_flag=0;//bitvariablebittestfunc(bitflag1,bitflag2){/*somecodes.*/return(0);//bitreturnvalue}bitname=value;8051系列微控制器中,所有的bit类型变量都是在0x20到0x2F地址范围的RAM位可寻址区域里,该区域只有16个字节,所以最多只能定义128个bit变量。另外因为该区域只能用寄存器直接寻址和间接寻址的方式来访问,所以定义bit类型的指针以及bit类型的数组都是错误的。3Sept.2008Confidential//观察keil环境下flag变量所在位置bitflag=1;//阅读以下程序,查看内存情况#includereg51.hcharbdataflags=0x12;sbitflag1=flags^0;//只能定义成全局的!“^”---解释成“的”voidmain(void){bitflag0=flags^0;//异或的作用---“^”while(1);}6.3.3bit数据类型3Sept.2008Confidential6.3.4并行接口的定义使用C51进行编程时,单片机片内的I/O口与片外扩展的I/O可以统一在一个头文件中定义,也可以在程序中(一般在开始的位置)进行定义,其定义方法如下:对于片内I/O口按特殊功能寄存器方法定义。例如:sfrP0=0x80;/*定义P0口,地址
本文标题:6 单片机C程序设计1_C规则
链接地址:https://www.777doc.com/doc-3568970 .html