您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第4章—单片机的C51语言
第4章单片机的C51语言4.1C51的程序结构4.2C51的基本语句4.3C51与汇编语言的混合编程4.4C51仿真开发环境4.5C51初步应用编程第4章单片机的C51语言51汇编语言能直接操作单片机的系统硬件,指令执行速度快。但其程序可读性差,且编写、移植困难。C51是为51系列单片机设计的一种C语言,其特点:C51语言已成为51系列单片机程序开发的主流软件方法。•结构化语言,代码紧凑——效率可与汇编语言媲美•接近真实语言,程序可读性强——易于调试、维护•库函数丰富,编程工作量小——产品开发周期短•机器级控制能力,功能很强——适合于嵌入式系统开发•与汇编指令无关,易于掌握——在单片机基础上上手快第4章单片机的C51语言C51与标准C语言对比相同之处:语法规则、程序结构、编程方法差异之处:数据类型、存储模式、中断处理教学安排:①介绍C51语言的数据结构及C51编程手段;②介绍单片机I/O口的初步应用及C51编程方法。第4章单片机的C51语言4.1C51的程序结构4.2C51的基本语句4.3C51与汇编语言的混合编程4.4C51仿真开发环境4.5C51初步应用编程第4章单片机的C51语言KeilC51程序的一般结构与标准C语言相同,KeilC51程序由一个或多个函数构成,其中应至少包含一个main函数。一般结构如下:预处理命令/*用于包含头文件等*/全局变量说明/*全局变量可被本程序的所有函数引用*/功能函数说明/*说明自定义函数,以便调用*/main(){/*主函数*/局部变量说明;/*局部变量只能在所定义函数内部引用*/执行语句;函数调用;}/*其他函数定义*/第4章单片机的C51语言举例:LED闪烁控制功能第4章单片机的C51语言预处理命令---------函数说明------------全局变量定义------主函数------------调用函数------------局部变量定义---------程序体程序体------第4章单片机的C51语言4.1C51的程序结构4.2C51的基本语句1.C51的变量2.C51的指针4.3C51与汇编语言的混合编程4.4C51仿真开发环境4.5C51初步应用编程第4章单片机的C51语言在程序执行过程中,数值可以发生改变的量称为变量。变量名与存储单元地址相对应,变量值与存储单元的内容相对应。例如在哈佛结构的存储空间中如何建立变量概念?第4章单片机的C51语言【存储种类】数据类型【存储类型】变量名存储地址(标准C)作用范围(标准C)*方括号项——可以缺省C51变量定义的四个要素:存储空间(C51特有)数据格式(C51扩充)第4章单片机的C51语言①自动变量(auto)——在函数内部定义的变量,退出函数后,分配给该变量的存储单元即自行消失(局部变量)。【存储种类】数据类型【存储类型】变量名②外部变量(extern)——在函数外部定义的变量,可始终保持变量的数值(全局变量)。【强调】一个外部变量只能被定义一次,在定义文件之外的地方使用时需用extern进行声明。③静态变量(static)——静态局部变量/静态全局变量④寄存器变量(register)——以寄存器为存储空间的变量*若省略存储种类选项,则变量默认为自动变量第4章单片机的C51语言数据的不同格式叫做数据类型*有符号数类型可以忽略signed标识符标准C语言的数据类型【存储种类】数据类型【存储类型】变量名第4章单片机的C51语言C51扩充数据类型:bit、sfr或sfr16、sbitbit型用bit定义一个位变量,语法规则如下:bitbit_name[=常数0~1];例如:bitdoor=0;//定义一个叫door的变量且初值为0与标准C的变量定义及初始化用法是一致的,例如:inta=5;unsignedcharsum=0x10;第4章单片机的C51语言Sfr或sfr16型sfr定义特殊功能寄存器SFR,语法规则如下:sfr或sfr16sfr_name=字节地址常数;第4章单片机的C51语言例如,sfrP0=0x80;//定义P0口地址80HsfrPCON=0x87;//定义PCON地址87Hsfr16DPTR=0x82;//定义DPTR的低端地址82H第4章单片机的C51语言sbit型将SFR范围内的位地址(0x80~0xFF)定义为位变量序号特殊功能寄存器名称符号字节地址位地址第4章单片机的C51语言1)sbitbit_name=位地址常数;将位于SFR字节地址内的绝对位地址定义为位变量名。例如,sbitCY=0xD7;序号特殊功能寄存器名称符号字节地址位地址2)sbitbit_name=sfr_name^位位置;将已有定义的SFR的0~7位定义为位变量名。例如:sfrPSW=0xD0;sbitCY=PSW^7;第4章单片机的C51语言序号特殊功能寄存器名称符号字节地址位地址第4章单片机的C51语言3)sbitbit_name=sfr字节地址^位位置;将SFR字节地址的相对位地址定义为位变量名。例如:sbitCY=0xD0^7;序号特殊功能寄存器名称符号字节地址位地址C51编译器在头文件“reg51.h”中定义了全部sfr/sfr16和sbit变量。第4章单片机的C51语言用一条预处理命令#includereg51.h把这个头文件包含到C51程序中,无需重定义即可直接使用它们的名称。KeilC51能够识别的数据类型数据类型长度值域unsignedchar单字节0~255signedchar单字节-128~127unsignedint双字节0~65536signedint双字节-32768~32767unsignedlong四字节0~4294967295signedlong四字节-2147483648~2147483647float四字节±1.175494E-38~±3.402823E+38*1~3字节对象的地址bit位0或1sfr单字节0~255sfr16双字节0~65536sbit位0或1第4章单片机的C51语言应用举例:51系列单片机有三个逻辑存储空间:第4章单片机的C51语言【存储种类】数据类型【存储类型】变量名片内数据存储器,片外数据存储器和程序存储器。第4章单片机的C51语言建立C51存储类型与存储空间的对应关系data区xdata区code区bdata区第4章单片机的C51语言C51的存储类型与存储空间对应关系表C51编译器指定了三种默认存储类型:第4章单片机的C51语言【存储种类】数据类型【存储类型】变量名C51编译器的三种编译模式:小编译模式(SMALL)、紧凑编译模式(COMPACT)和大编译模式(LARGE)变量名可以由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,变量名长度随编译系统而定。变量名具有字母大小写的敏感性,如SUM和sum代表不同的变量。强调:头文件中定义的变量都是大写的第4章单片机的C51语言【存储种类】数据类型【存储类型】变量名第4章单片机的C51语言C51扩展的若干关键字一览表变量名不得使用标准C语言和C51语言的关键字。unsignedchardatasystem_status=0;第4章单片机的C51语言//定义system_status为无符号字符型自动变量,该变量位于data区中且初值为0。数据结构定义举例变量名为system_status位与片内RAM区无符号字符型自动型初值为零第4章单片机的C51语言unsignedcharbdatastatus_byte;unsignedintcodeunit_id[2]={0x1234,0x89ab};staticcharm,n;//定义status_byte为无符号字符型自动变量,该变量位于bdata区//定义unit_id[2]为无符号整型自动变量,该变量位于code区中,是长度为2的数组,且初值为0x1234和0x89ab。//定义m和n为2个位于data区中的有符号字符型静态变量。第4章单片机的C51语言4.1C51的程序结构4.2C51的数据结构1.C51的变量2.C51的指针4.3C51与汇编语言的混合编程4.4C51仿真开发环境4.5C51初步应用编程C51的指针与标准C的指针几乎是一样的,都可以简单理解为“存储地址的变量”,例如:2.C51的指针第4章单片机的C51语言int*b=&a;取变量a的地址指针变量inta;//定义一个整型变量a//定义一个整型指针变量b,其初值为a的地址第4章单片机的C51语言在C51里定义指针,还需要额外指明两个问题:1)指针变量自身位于哪个存储区域;2)该指针的值代表的是哪个存储区域里的地址。以SMALL编译模式(默认data区存储类型)为例:例1charxdataa=‘A’;//定义xdata区里的变量a,初值‘A’char*ptr=&a;解:ptr是一个char型的指针变量,它本身位于data存储区,它的初值是位于xdata区里变量a的地址。【存储种类】数据类型【存储类型】变量名第4章单片机的C51语言解:unsignedcharidataa=‘A’;例2若ptr是一个unsignedchar型指针变量,它本身位于idata存储区,它的初值是位于idata存储区里的unsignedchar型自动变量a(初值为‘A’)的地址。试据此完成相关变量的定义和初始化。unsignedchar*idataptr=&a;中断服务函数与寄存器组定义KeilC51编译器支持在C语言源程序中直接编写8051单片机的中断服务函数程序,一般形式为:函数类型函数名(形式参数表)[interruptn][usingn]关键字intrrupt后面的n是中断号,n的取值范围为0~31。编译器从8n+3处产生中断向量,具体的中断号n和中断向量取决于8051系列单片机芯片型号。关键字using用来选择8051单片机中不同的工作寄存器组。using后面的n是一个0~3的常整数,分别选中4个不同的工作寄存器组。常用中断号与中断向量中断号n中断源中断向量8n+30外部中断00003H1定时器0000BH2外部中断10013H3定时器1001BH4串行口0023HKeilC51的库函数本征库函数本征库函数是指编译时直接将固定的代码插入到当前行,而不是用汇编语言中的“ACALL”和“LCALL”指令来实现调用,从而大大提高函数的访问效率。非本征库函数则必须由“ACALL”和“LCALL”指令来实现调用。KeilC51的本征库函数只有9个,数量虽少,但非常有用。本征库函数在头文件INTRINS.H中定义。字符判断转换库函数字符判断转换库函数的原型声明在头文件CTYPE.H中定义。KeilC51的库函数输入输出库函数输入输出库函数的原型声明在头文件STDIO.H中定义,通过8051系列单片机的串行口工作,如果希望支持其它I/O接口,只需要改动_getkey()和putchar()函数,库中所有其它I/O支持函数都依赖于这两个函数模块,在使用8051系列单片机的串行口之前,应先对其进行初始化。例如以2400波特率(12MHz时钟频率)初始化串行口的语句如下:SCON=0x52;/*SCON置初值*/TMOD=0x20;/*TMOD置初值*/TH1=0xf3;/*T1置初值*/TR1=1;/*启动T1*/KeilC51的库函数字符串处理库函数字符串处理库函数的原型声明包含在头文件STRING.H中,字符串函数通常接收指针串作为输入值。一个字符串应包括2个或多个字符,字符串的结尾以空字符表示。在函数memcmp、memcpy、memchr、memccpy、memset和memmove中,字符串的长度由调用者明确规定。类型转换及内存分配库类型转换及内存分配库函数的原型声明包含在头文件STDLIB.H中,利用该库函数可以完成数据类型转换以及存储器分配操作。第4章单片机的C51语言4.1C51的程序结构4.2C51的数据结构4.3C51与汇编语言的混合编程1.在C51中调用汇编程序2.C51中嵌入汇编代
本文标题:第4章—单片机的C51语言
链接地址:https://www.777doc.com/doc-4246979 .html