单片机的C51语言单片机的C51语言51汇编语言能直接操作单片机的系统硬件,指令执行速度快。但其程序可读性差,且编写、移植困难。单片机的C51语言C51是为51系列单片机设计的一种C语言,其特点:C51语言已成为51系列单片机程序开发的主流软件方法。•结构化语言,代码紧凑——效率可与汇编语言媲美•接近真实语言,程序可读性强——易于调试、维护•库函数丰富,编程工作量小——产品开发周期短•机器级控制能力,功能很强——适合于嵌入式系统开发•与汇编指令无关,易于掌握——在单片机基础上上手快单片机的C51语言C51与标准C语言对比相同之处:语法规则、程序结构、编程方法差异之处:数据结构(数据类型、存储模式)、中断处理、端口扩展本章教学思路:①在标准C的基础上学习数据结构(数据类型、存储模式)②掌握C51软件开发方法(KeilμVision3软件)③在C51的基础上学习单片机I/O口应用(入门与进阶)单片机的C51语言1.1C51的程序结构1.2C51的数据结构1.3C51与汇编语言的混合编程1.4C51仿真开发环境1.5C51初步应用编程①程序由函数组成(一个主函数,或一个主函数和若干自定义函数);②利用预处理命令对变量或函数进行集中定义或说明;③函数和变量都需遵循先定义后使用的基本原则;④主函数中的所有语句执行完毕,则程序结束。单片机的C51语言C51与标准C程序结构完全相同单片机的C51语言举例:LED闪烁控制功能LOOP:CLRP1.0ACALLDEL50SETBP1.0SJMPLOOPDEL50:MOVR7,#200DEL1:MOVR6,#125DEL2:DJNZR6,DEL2DJNZR7,DEL1RETEND单片机的C51语言预处理命令---------函数说明------------全局变量定义------主函数------------自定义函数---------局部变量定义---------程序体程序体------单片机的C51语言1.1C51的程序结构1.2C51的数据结构1.3C51与汇编语言的混合编程1.4C51仿真开发环境1.5C51初步应用编程单片机的C51语言1.C51的变量在程序执行过程中,数值可以发生改变的量称为变量。变量名与存储单元地址相对应,变量值与存储单元的内容相对应。例如在哈佛结构的存储空间中如何建立变量概念?单片机的C51语言【存储种类】数据类型【存储类型】变量名(标准C)(标准C)*括号项——可以缺省(但需有缺省值)C51变量定义的四要素:(C51特有)(标准C+C51)单片机的C51语言【存储种类】数据类型【存储类型】变量名共有4个说明符:1、auto(自动型)——变量的作用范围在定义它的函数体或语句块内。执行结束后,变量所占内存即被释放。2、extern(外部型)——在一个源文件中被定义为外部型的变量,在其它源文件中需要通过extern说明方可使用。3、static(静态型)——利用static可使变量定义所在的函数或语句块执行结束后,其分配的内存单元继续保留。4、register(寄存器型)——将变量对应的储存单元指定为通用寄存器,以提高程序运行速度。缺省存储种类为auto(自动)型变量单片机的C51语言数据的不同格式叫做数据类型*有符号数类型可以忽略signed标识符标准C语言的数据类型【存储种类】数据类型【存储类型】变量名单片机的C51语言C51扩充数据类型:bit、sfr或sfr16、sbitbit型关键词bit用于定义一个位变量,语法规则:bitbit_name[=0或1];例如:bitdoor=0;//定义一个叫door的位变量且初值为0与标准C的变量定义相似:inta=5;//定义一个初值为5的整形变量a//语法规则:intint_name[=常数];单片机的C51语言sfr或sfr16型关键词sfr或sfr16用于定义SFR字节地址变量,语法规则:sfr或sfr16sfr_name=字节地址常数;51MCU中有21个SFR,如何定义与这些单元相关的变量?单片机的C51语言例如,sfrP0=0x80;//定义P0口地址80HsfrPCON=0x87;//定义PCON地址87Hsfr16DPTR=0x82;//定义DPTR的低端地址82H注意:C语言中十六进制整数是数值前加0x或0X前缀单片机的C51语言sbit型部分SFR具有位地址,如何定义与这些位地址相关的变量?CYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PD0^7D7HD6HD5HD4HD3HD2HD1HD0HD0HPSWD0^6D0^5D0^4D0^3D0^2D0^1D0^0绝对位地址相对位地址字节地址两种位地址表达形式:相对位地址、绝对位地址单片机的C51语言1)将SFR的绝对位地址定义为位变量名sbitbit_name=位地址常数;例如,sbitCY=0xD7;3)将SFR的相对位位置定义位变量名sbitbit_name=sfr_name^位位置;例如,sbitCY=PSW^7;2)将SFR的相对位地址定义为位变量名sbitbit_name=sfr字节地址^位位置;例如,sbitCY=0xD0^7;关键词sbit用于定义SFR位地址变量,三种定义形式:C51编译器在头文件“REG51.H”中定义了全部sfr/sfr16和sbit变量。单片机的C51语言用一条预处理命令#includeREG51.H把这个头文件包含到C51程序中,无需重新定义即可直接使用它们的名称。单片机的C51语言应用举例:单片机的C51语言【存储种类】数据类型【存储类型】变量名51单片机的3个逻辑存储空间:片内数据存储器,片外数据存储器和程序存储器。建立C51存储类型与存储空间的对应关系data区code区xdata区bdata区pdata区idata区单片机的C51语言C51的存储类型与存储空间对应关系表SMALL系统COMPACT系统LARGE系统编译模式【存储种类】数据类型【存储类型】变量名3种编译模式分别对应于3种缺省存储类型:单片机的C51语言【存储种类】数据类型【存储类型】变量名C51编译器可根据当前采取的编译模式自动认定默认的存储类型约定:若无特殊声明,一般均为“SMALL编译模式”变量名可以由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,变量名长度随编译系统而定。变量名具有字母大小写的敏感性,如SUM和sum代表不同的变量。强调:头文件中定义的变量都是大写的,若程序采取小写变量则需要重新定义。单片机的C51语言【存储种类】数据类型【存储类型】变量名单片机的C51语言C51扩展的若干关键字一览表变量名不得使用标准C语言和C51语言的关键字。unsignedchardatasystem_status=0;单片机的C51语言//定义system_status为无符号字符型自动变量,该变量位于data区中且初值为0。数据结构定义举例变量名为system_status位与片内RAM区无符号字符型自动型初值为零单片机的C51语言unsignedcharbdatastatus_byte;unsignedintcodeunit_id[2]={0x1234,0x89ab};staticcharm,n;//定义status_byte为无符号字符型自动变量,该变量位于bdata区//定义unit_id[2]为无符号整型自动变量,该变量位于code区中,是长度为2的数组,且初值为0x1234和0x89ab。//定义m和n为2个位于data区中的有符号字符型静态变量。2.C51的指针单片机的C51语言标准C语言指针的一般定义形式为:数据类型*指针变量名[=&被指向变量名];其中,指针变量指向一个由“数据类型”说明的变量。被指向变量和指针变量都位于C编译器默认的存储区中。例如:inta=’A’;int*p1=&a;这表示p1是一个指向int型变量的指针变量,此时p1的值为int型变量a的地址,而a和p1两个变量都位于C编译器默认的内存区域中。单片机的C51语言对于C51来讲,指针定义应包括以下信息:1)指针变量的存储类型(自身位于哪个存储区中)?2)被指向变量的数据类型和存储类型?C51指针的一般定义形式:数据类型[存储类型1]*[存储类型2]变量名[=&被指向变量名];数据类型——被指向变量的类型,如int型或char型存储类型1——被指向变量所在的存储区,缺省时由地址赋值关系决定存储类型2——指针变量所在的存储区,缺省时为编译器默认的存储区单片机的C51语言例1若采用SMALL编译模式,试解释下述定义的含义。charxdataa=‘A’;char*ptr=&a;解:ptr是一个指向char型变量的指针,它本身位于SMALL编译模式默认的data存储区里,此时它指向位于xdata存储区里的char型变量a的地址。单片机的C51语言例2试解释下述定义的含义charxdataa=‘A’;char*ptr=&a;charidatab=‘B’;ptr=&b;解:以char*ptr形式定义的指针变量,既可指向位于xdata存储区的char型变量a的地址,也可指向位于idata存储区的char型变量b的地址(由赋值操作关系决定)。前两句与例1相同charxdataa=‘A’;char*ptr=&a;单片机的C51语言例3:试解释以下指针定义的含义charxdataa=‘A’;charxdata*ptr=&a;【解】ptr是位于data存储区且固定指向xdata存储区的char型变量的指针变量,此时ptr的值为变量a的地址(不能像例2那样再将idata存储区的char型变量b的地址赋予ptr)。单片机的C51语言例4:试解释以下指针定义的含义charxdataa=‘A’;charxdata*idataptr=&a;【解】ptr是固定指向xdata存储区的char型变量的指针变量,它自身存放在idata存储区中,此时ptr指向位于xdata存储区中的char型变量a的地址。单片机的C51语言1.1C51的程序结构1.2C51的数据结构1.3C51与汇编语言的混合编程1.4C51仿真开发环境1.5C51初步应用编程单片机的C51语言C51语言编程可胜任单片机的基本测量与控制任务。对于某些特殊的I/O接口处理、中断处理、强调程序执行速度等场合,仍希望采用汇编程序。C51编译器提供了与汇编语言程序的接口规则,可方便地实现C51与汇0编语言程序的相互调用。本节仅讨论在C51中调用汇编函数和在C51中嵌入汇编代码两种方法。概要单片机的C51语言1.在C51中调用汇编程序1)程序的寻址,main.c中调用的max函数,如何与汇编文件中的相应代码对应起来;2)参数传递,main.c中传递给max()函数的参数a和b,存放在何处可使汇编程序能够获取到它们的值;3)返回值传递,汇编语言计算得到的结果,存放在何处可使C语言程序能够获取到。C51程序中调用汇编语言,需要解决三个问题:单片机的C51语言举例:在两个数据中选出较大的数据,并赋值给变量c。其中,要求选数任务采用汇编子程序完成。1)程序的寻址问题单片机的C51语言通过在汇编文件中定义同名的“函数”来实现。单片机的C51语言2)参数传递问题单片机的C51语言3)返回值传递问题2.C51中嵌入汇编代码在C51函数内嵌入汇编代码,可以有三种不同方法。方法一直接在函数体内的每个汇编语句前加“asm”预编译指令,例如:单片机的C51语言单片机的C51语言方法二把asm作为关键字,后续汇编用大括号括起来即可,例如:单片机的C51语言方法三在C模块内通过语句“#pragma”嵌入汇编代码,例如:单片机的C51语言1.1C51的程序结构1.2C51的数据结构1.3C51与汇编语言的混合编程1.4C51仿真开发环境1.5C51初步应用编程单片机的C51语言1.Keil的编译环境μVision3Keil是德国KeilSo