您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 51单片机C语言编程
单片机C51编程一、C51与标准C的差异1、库函数不同2、头文件不同3、数据类型有一定区别4、增加了存储模式5、增加了中断函数6、输入、输出不同,C51通过串口进行。二、C语言与汇编语言单片机C语言编程与汇编语言编程的差异:1、用汇编语言编写单片机程序必须要考虑其存储器结构,资源分配是汇编语言编程中的一大负担。而且不同的存储器操作对象寻址方式不同,访问的指令也不同。3、汇编语言编程,子程序调用要考虑现场的保护与恢复,要考虑工作寄存器的分组使用,避免资源冲突。C语言编译系统自动完成这些工作。如MOV,MOVC,MOVX访问的空间不同。2、汇编语言中的指令繁多,功能单一。如单片机中大量的转移类指令在C语言中均由分支程序实现。4、汇编语言编写中的循环程序是通过转移指令重复执行来现实的,C语言则通过循环语句来实现。6、用C语言编写的单片机应用程序:(1)所有操作对象都可以看成变量或常量,没有寻址方式(数据传送由赋值语句实现,所有运算都通过表达式实现)。(2)不用像汇编语言那样须具体组织、分配存储器资源和处理端口数据.(3)子程序调用时,C语言程序的编译系统自动进行现场的保护。(5)C语言语法简单,语句紧凑,容易理解和掌握。(4)在C语言编程中,对数据类型与变量的定义,必须要与单片机的存储结构相关联,否则编译器不能正确地映射定位。5、汇编语言编程中使用大量的算术逻辑运算指令在单片机C语言编程中全部由相应的运算表达式实现。三、C51的数据类型数据类型长度大小unsignedchar1字节0~255char1字节-128~+127unsignedint2字节0~65535int2字节-32768~+32767unsignedlong4字节0~4294967295long4字节-2147483648~+2147483647float4字节±1.75494E-38~±3.402823E+38*1~3字节对象的地址bit位0或1sfr1字节0~255sfr162字节0~65535sbit位0或11、特殊功能寄存器类型:在C51中对特殊功能寄存器的访问必须先用sfr或sfr16进行声明。sfrP0=0x80;/*P0口的寄存器地址为0x80*/两种使用特殊功能寄存器的方法:1)、先定义再使用:2)、包含51单片机的头文件:#includereg51.hvoidmain(void){ucharvar1;var1=P1......while(1);}2、位类型这也是C51中扩充的数据类型,用于访问MCS-51单片机中的可寻址的位单元。在C51中,支持两种位类型:bit型和sbit型。它们在内存中都只占一个二进制位,其值可以是“1”或“0”。bitflags;/*在bdata区定义一个位变量*/sfrP0=0x80;/*因P0口的寄存器是可位寻址的*/sbitP0_0=P0^0;/*所以P0_0为P0中的P0.0引脚*/除了以上定义方式外,还可以用P0.0的地址去写,如:sbitP0_0=0x80;区别:用bit定义的位变量在C51编译器编译时,在不同的时候位地址是可以变化的,而用sbit定义的位变量必须与51单片机的一个可以寻址位单元或可位寻址的字节单元中的某一位联系在一起,在C51编译器编译时,其对应的位地址是不可变化的。四、新增存贮类型变量是在程序运行过程中其值可以改变的量。一个变量由两部分组成:变量名和变量值。在C51中,变量在使用前必须对变量进行定义,指出变量的数据类型和存储模式。以便编译系统为它分配相应的存储单元。定义的格式如下:数据类型说明符[存储器类型]变量名1[=初值],变量名2[=初值]…;存储器类型描述data直接寻址的片内RAM低128B,访问速度快bdata片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问idata间接寻址访问的片内RAM,允许访问全部片内RAMpdata用Ri间接访问的片外RAM的低256Bxdata用DPTR间接访问的片外RAM,允许访问全部64k片外RAMcode程序存储器ROM64k空间2、六种存储器类型:【例】变量定义存储种类和存储器类型相关情况。chardatavarl;/*在片内RAM低128B定义用直接寻址方式访问的字符型变量var1*/intidatavar2;/*在片内RAM256B定义用间接寻址方式访问的整型变量var2*/unsignedlongdatavar3;/*在片内RAM128B定义用直接寻址方式访问的自动无符号长整型变量var3*/floatxdatavar4;/*在片外RAM64KB空间定义用间接寻址方式访问的外部实型变量var4*/intcodevar5;/*在ROM空间定义整型变量var5*/unsigncharbdatavar6;/*在片内RAM位寻址区20H~2FH单元定义可字节处理和位处理的无符号字符型变量var6*/五、存储模式C51编译器支持三种存储模式:SMALL模式、COMPACT模式和LARGE模式。不同的存储模式对变量默认的存储器类型不一样。(1)SMALL模式。SMALL模式称为小编译模式,在SMA-LL模式下,编译时,函数参数和变量被默认在片内RAM中,存储器类型为data。(2)COMPACT模式。COMPACT模式称为紧凑编译模式,在COMPACT模式下,编译时,函数参数和变量被默认在片外RAM的低256字节空间,存储器类型为pdata。(3)LARGE模式。LARGE模式称为大编译模式,在LARGE模式下,编译时函数参数和变量被默认在片外RAM的64K字节空间,存储器类型为xdata。六、绝对地址访问1.使用指针采用指针的方法,可实现在C51程序中对任意指定的存储器地址进行操作。例如:#defineucharunsignedchar#defineuintunsignedintvoidtest_memory(void){ucharidataivar1;ucharxdata*xdp;/*定义一个指向xdata存储器空间的指针*/chardata*dp;/*定义一个指向data存储器空间的指针*/ucharidata*idp;/*定义一个指向idata存储器空间的指针*/xdp=0x1000;/*xdata指针赋值,指向xdata存储器地址1000H处*/*xdp=0x5A;/*将数据5AH送到xdata的1000H单元*/dp=0x61;/*data指针赋值,指向data存储器地址61H处*/*dp=0x23;/*将数据23H送到data的61H单元*/idp=&ivar1;/*idp指向idata区变量ivar1*/*idp=0x16;}/*等价于ivar1=0x16*/2、使用C51运行库中预定义宏C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。规定只能以无符号数方式访问,定义了8个宏定义,其函数原型如下:#defineCBYTE((unsignedcharvolatilecode*)0)#defineDBYTE((unsignedcharvolatiledata*)0)#definePBYTE((unsignedcharvolatilepdata*)0)#defineXBYTE((unsignedcharvolatilexdata*)0)#defineCWORD((unsignedintvolatilecode*)0)#defineDWORD((unsignedintvolatiledata*)0)#definePWORD((unsignedintvolatilepdata*)0)#defineXWORD((unsignedintvolatilexdata*)0)这些函数原型放在absacc.h文件中。使用时须用预处理命令把该头文件包含到文件中,形式为:#includeabsacc.h。其中:CBYTE以字节形式对code区寻址,DBYTE以字节形式对data区寻址,PBYTE以字节形式对pdata区寻址,XBYTE以字节形式对xdata区寻址,CWORD以字形式对code区寻址,DWORD以字形式对data区寻址,PWORD以字形式对pdata区寻址,XWORD以字形式对xdata区寻址。【例】绝对地址对存储单元的访问#includeabsacc.h/*将绝对地址头文件包含在文件中*/#includereg52.h/*将寄存器头文件包含在文件中*/#defineucharunsignedchar/*定义符号uchar为数据类型符unsignedchar*/#defineuintunsignedint/*定义符号uint为数据类型符unsignedint*/voidmain(void){ucharvar1;uintvar2;var1=XBYTE[0x0002];/*访问片外RAM的0002字节单元*/var2=XWORD[0x0004];/*访问片外RAM的0004~0005单元*/......while(1);}3、使用C51扩展关键字_at_使用_at_对指定的存储器空间的绝对地址进行访问,一般格式如下:[存储器类型]数据类型标识符_at_地址常数;其中,存储器类型为data、bdata、idata、pdata等如省略则按存储模式规定的默认存储器类型确定变量的存储器区域;数据类型为C51支持的数据类型。地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;使用_at_定义的变量必须为全局变量。【例】通过_at_实现绝对地址的访问。#defineucharunsignedchar/*定义符号uchar为数据类型符unsignedchar*/#defineuintunsignedint/*定义符号uint为数据类型符unsignedint*/dataucharx1_at_0x40;/*在data区中定义字节变量x1,它的地址为40H*/xdatauintx2_at_0x2000;/*在xdata区中定义字变量x2,它的地址为2000H*/voidmain(void){x1=0xff;x2=0x1234;......while(1);}由于标准C没有处理单片机中断的定义,由此C51增加了一个扩展关键字interrupt。使用interrupt将一个函数定义成中断服务函数。对于中断服务函数,编译时会自动添加了相应的现场保护、恢复现场等,因而用户在编程时可不必考虑这些问题,减小了编程的繁琐程度。中断函数一般形式为:viod函数名()interruptnusingninterrupt后的n是中断号,n取值为0~4,分别对应5个中断源:外中断0、T0中断、外中断1、T1中断、串行口中断。using后的n是中断函数中所采用的工作寄存器组号,n取值0~3,分别对应通用工作寄存器区:第0组、第1组、第2组、第3组。using是选项可省略。若没有使用using,中断函数中使用原指定的工作寄存器组,但使用前将其内容保存到堆栈中,返回时复原。4、C51的中断函数例:使用一个“+”键和一个“-”键来进行数据的的修改,若用INT0和INT1作“+”键和“-”键的输入,P1口接一个数码管,显示加、减操作数据的变化信息。系统上电后初始显示数据0,每按一次加键,加1显示,加到9后再按加键自动回0;每按一次减键,减1显示,减到0后再按减键,自动回9;画出接线电路图,编程实现。#includereg51.h#defineucharunsignedchar#defineuintunsignedint//段码ucharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x07};//按键计数charKey_Counts=0;sbitAddKey=P3^2;sbitSubKey=P3^3;//延时voidDelayMS(uintx){uchari;while(x--)for(i=0;i
本文标题:51单片机C语言编程
链接地址:https://www.777doc.com/doc-3826452 .html