您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > chap4-MCS-51单片机-C51基础-2
单片机原理与应用--单片机C语言程序设计于瑞红201308主要内容汇编语言与C语言C51的基本元素C51的运算符和表达式C51语句和控制结构函数以MCS-51及其兼容的单片机为目标处理器的C语言称为C51。为什么要使用C语言例:编程实现:4772+4071=?汇编语言:(12A4H+0FE7H=?)•MOVA,#0A4H;被加数低8位→A•ADDA,#0E7H;加数低8位E7H与之相加,A=8BH,CY=1•MOV40H,A;A→(40H),存低8位结果•MOVA,#12H;被加数高8位→AADDC•ADDCA,#0FH;加数高8位+A+CY,A=22H•MOV41H,A;存高8位运算结果C语言:unsignedintans=4772+4071;4.1汇编语言与C语言比较:C51程序结构简单,语句条数也少;产生的目标程序占用存储器大,程序执行速度较慢。汇编语言程序较复杂,指令条数也较多;产生的目标程序占用存储器少,程序执行速度快。用C51编写单片机程序时,需要根据单片机存储结构及内部资源定义相应的数据类型和变量,而标准的C语言不需要考虑这些问题。另外,C51包含的数据类型、变量存储模式、输入输出处理、函数等方面与标准的C语言也有一定的区别。其他的语法规则、程序结构及程序设计方法则与标准的C语言相同。C51与ANSIC的区别简单C51程序介绍【例4.1】如图所示,在P1.0口上接有一个LED发光二极管,要求让发光二极管发光。程序如下:#includereg51.hsbitP1_0=P1^0;voidmain(){P1_0=0;while(1);}程序的开始是一个文件包含处理。这段程序中包含的是reg51.h文件,以.h为后缀的称为头文件,该头文件的作用是把特殊功能寄存器中的符号和地址对应起来,这里主要是应用到P1这个符号,如果没有包含reg51.h文件,C51编译器不知道P1具体指什么,在编译过程中就会发生错误。给P1.0取名为P1_0,是通过编译器中增加的关键字sbit来定义\程序最后是主函数,每一个C51程序有且只有一个主函数,函数后面使用一对大括号“{}”,在“{}”中书写具体内容。【例4.2】如上图所示,要求P1.0口上接的LED发光二极管能闪烁发光。#includereg51.h#defineucharunsignedchar#defineuintunsignedintsbitP1_0=P1^0;voidMdelay(uintDelay);/*被调函数申明*/voidmain(void){for(;;){P1_0=!P1_0;//对P1_0取反Mdelay(1000);}}voidMdelay(uintDelay)//延时子程序,由Delay参数确定延时时间{uchari;for(;Delay0;Delay--){for(i=0;i124;i++){;}}}与上例相同宏定义,即用一个指定的标识符来代替一个字符串,如第二行用uchar来代替unsignedchar;函数申明,如果被调函数在主调函数后面,一般需要声明C51程序特点C51程序和C程序一样,也是由函数构成的。•一个C51程序至有且只有一个main函数,可以有零个或多个其他函数,因此函数是C51程序的基本单位。•main函数可以直接书写语句或者调用其他函数来实现功能,被调用的函数可以是编译器提供的库函数,也可以是用户根据需要编写的函数(如例4.2中的Mdelay函数)。•使用KeilC编写的任何程序都可以直接调用其提供的库函数,调用时只需要包含具有该函数的头文件即可。•KeilC提供了100多个库函数供用户直接使用。一个C51程序从main函数开始执行,不管main函数在什么位置。C51中字母区分大小写,如定义是sbitP1_0=P1^0,若后面写成P1_0,在编译时就会出现错误。C51书写自由,一行可以写几个语句,一个语句也能写在几行上。每个语句必须以分号结束。C51中的注释可以采用两种符号。第一种是“/*…*/”符号,从“/*”开始直到“*/”为止,中间的内容都是注释。第二种是“//”引导的注释语句,这种注释只对本行有效。C51的包含的头文件通常有:reg51.hreg52.hmath.hctype.hstdio.hstdlib.habsacc.h常用有:reg51.hreg52.h(定义特殊功能寄存器和位寄存器);math.h(定义常用数学运算);4.2C51基本元素4.2.1常量常量:在程序运行过程中其值保持固定不变的量。常量分为数值常量和符号常量。使用符号常量可以增加程序的可读性。但是,应该先定义,后使用。符号常量采用宏指令#define定义,格式如下:#define常量名常量值例如采用如下指令定义PI,在其后程序中,所有出现PI的地方,编译程序都会将PI编译成3.1416,相当于汇编语言伪指令“EQU”的功能。#definePI3.14164.2.2变量变量:在程序运行过程中其值可变的量。注:定义变量时,数据类型和变量名表是必须的,存储种类和存储器类型是可选的。存储种类有4种:自动(auto)、外部(extern)、静态(static)和寄存器(register),缺省存储种类为自动。数据类型分为基本数据类型和复杂数据类型,复杂数据类型由基本数据类型构造而成,如:数组、结构体等。变量由变量名和变量值组成。C51中变量定义格式如下:[存储种类]数据类型[存储器类型]变量名表;存储种类存储种类:是指变量在程序执行过程中的作用范围1.auto:使用auto定义的变量称为自动变量,其作用范围在定义它的函数体或复合语句内部,自动变量一般分配在内存的堆栈空间中。定义变量时,如果省略存储种类,则该变量默认为自动(auto)变量。2.extern:使用extern定义的变量称为外部变量。在一个函数体内,要使用一个已在该函数体外或别的程序中定义过的外部变量时,该变量在该函数体内要用extern说明。外部变量被定义后分配固定的内存空间,在程序整个执行时间内都有效,直到程序结束才释放。存储种类3.static:使用static定义的变量称为静态变量。它又分为内部静态变量和外部静态变量。在函数体内部定义的静态变量为内部静态变量,它在对应的函数体内有效,一直存在,但在函数体外不可见,这样不仅使变量在定义它的函数体外被保护,还可以实现当离开函数时值不被改变。外部静态变量是在函数外部定义的静态变量。作用于变量被定义的文件中,其它文件中即使用extern声明也没法使用它。4.register:使用register定义的变量称为寄存器变量。它定义的变量存放在CPU内部的寄存器中,处理速度快,但数目少。C51编译器编译时能自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,用户可以无需专门声明。数据类型数据类型长度值域unsignedchar单字节0~255signedchar单字节-128~127unsignedint双字节0~65535signedint双字节-32768~32767unsignedlong四字节0~4294967295signedlong四字节-2147483648~2147483647float四字节1.175494E-38~3.402823E+38*1~3字节对象地址sfr单字节0~255sfr16双字节0~65535sbit位0或1bit位0或1sfr/sfr16类型在C51中,允许用户对特殊功能寄存器进行访问,访问时须通过sfr或sfr16类型说明符进行定义,定义时须指明它们所对应的片内RAM单元的地址。格式如下:sfr或sfr16特殊功能寄存器名=地址;sfr用于对89C51单片机中单字节的特殊功能寄存器进行定义,sfr16用于对双字节特殊功能寄存器进行定义。特殊功能寄存器名一般用大写字母表示。地址一般用直接地址形式,具体特殊功能寄存器地址见前面内容。sbit类型主要用于访问可位寻址的特殊功能寄存器中的某个位,其定义格式为:sbit变量名=位地址;sbit变量名=SFR地址^位序号;sbit变量名=sfr变量^位序号;sbit变量名=sfr16变量^位序号例:定义sbit类型的变量sfrP0=0x80;sbitP0_0=0x80;sbitP0_1=P0^1;sbitP0_2=0x80^2;bit类型定义位变量,可以为变量赋值,但不能指定变量的地址。位变量总数不能超过128个。其定义格式为:bit变量名=变量值例:定义bit变量类型bitred;bitgreen=1;存储器类型code:变量存放在程序存储器中;由操作码MOVC@A+DPTR访问。data:变量只能存放在片内RAM的低128字节中(00H~7FH),可直接访问,存取速度最快。idata:变量放在整个内部RAM区(00-FFH),只能用间接寻址方式访问。bdata:变量放在可位寻址的内部RAM区(20H-2FH),bdata型变量必须定义为全局变量。pdata:变量只能放在外部RAM的当前页(256字节)区,只能间接寻址,用MOVX@Ri指令访问(高8位地址由P2输出)。xdata:变量可存放在整个64k的外部RAM区(0000H-FFFFH),存取速度最慢。用MOVX@DPTR指令访问。通常把访问的比较频繁的变量放在内部数据存储区中,把不常用的变量放在外部数据存储区中。存储类型所在存储区访问方式间接访问地址位数code程序存储区间接16data内部RAM低128字节直接或间接8idata内部RAM间接8bdata内部RAM可位寻址区直接或间接8xdata片外RAM区间接16pdata片外RAM区的当前页间接8存储模式在变量定义中,存储器类型是可选项,如果缺省存储器类型,编译系统按存储模式SMALL、COMPACT或LARGE所规定的默认存储器类型确定变量的存储区域。1.SMALL模式:小编译模式。编译时,函数参数和变量被默认在片内RAM中,存储器类型为data。2.COMPACT模式:紧凑编译模式。编译时,函数参数和变量被默认在片外RAM的当前页256字节空间,存储器类型为pdata。3.LARGE模式:大编译模式。编译时,函数参数和变量被默认在片外RAM的64K字节空间,存储器类型为xdata。存储模式的指定通过#pragma预处理命令来实现。如果没有指定,则系统都隐含为SMALL模式。例:#pragmasmall#pragmacompact#pragmalarge4.3运算符和表达式运算符是完成某种特定运算的符号。表达式是由运算符和运算对象组成的,符合语法规则,且具有特定含义的式子。在表达式后面加一个“;”构成一个表达式语句。运算符按其功能可分为:赋值运算符、算术运算符、增减量运算符、关系运算符、逻辑运算符、位运算符、复合运算符、逗号运算符。运算符按运算对象个数可分为单目运算符、双目运算符和三目运算符。4.3.1赋值运算符C51中赋值运算符是“=”,赋值语句的格式如下:变量=表达式;该语句先计算右边表达式的值,再将该值赋给左边的变量。例如:X=9*8;X的值为72。4.3.2算术运算符算术表达式的格式如下:表达式1算术运算符表达式2运算符功能举例+加或取正19+23、+7-减或取负56-41、-9*乘13*15/除5/10=0、5.0/10.0=0.5%取余9%5=44.3.3增减运算符增减运算符是单目运算符,它对运算对象加1或减1操作后回存至自身。增减运算符运算对象只能是变量,不能是常数或表达式。++i:i自增1后再参与其他运算(先加);--i:i自减1后再参与其他运算(先减);i++:i参与运算后,i的值再自增1(后加);i--:i参与运算后,i的值再自减1(后减)。4.3.4关系运算符关系运算符用于判断某个条件是否满足,条件满足结果为1,条件不满足结果为0。C51支持的关系运算符有:(大于)、(小于)、=(大于等于)、=(小于等于)、==(
本文标题:chap4-MCS-51单片机-C51基础-2
链接地址:https://www.777doc.com/doc-4449954 .html