您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 单片机C语言程序设计基础
MCS-51的C语言应用程序设计基础单片机原理及应用单片机的C语言应用程序设计基础杨宣兵湖南理工学院物电系MCS-51的C语言应用程序设计基础1、采用C语言开发单片机优势:◆对单片机的指令系统不要求了解,对存储器结构有初步了解;◆寄存器的分配、不同存储器的寻址、数据类型由编译器管理;◆程序有规范的结构、可分为不同的函数,易使程序结构化,程序在不同CPU系统移植方便;◆具有校准C特点,关键字、运算函数使用简单;◆编程及程序调试效率高;◆提供库函数丰富;一、C语言开发单片机简介MCS-51的C语言应用程序设计基础2、C51程序特点:◆C51中定义的库函数和标准C语言定义的库函数不同。标准的C语言定义的库函数是按通用微型计算机来定义的,而C51中的库函数是按MCS-51单片机来定义的;◆在C51中还增加了几种针对MCS-51单片机特有的数据类型;◆C51变量的存储模式与标准C中变量的存储模式不一样,C51中变量的存储模式是与MCS-51单片机的存储器紧密相关;◆C51与标准C的输入输出处理不一样,C51中的输入输出是通过MCS-51串行口来完成的,输入输出指令执行前必须要对串行口进行初始化;◆C51与标准C在函数使用方面也有一定的区别,C51中有专门的中断函数。MCS-51的C语言应用程序设计基础1、KEILCx51的数据类型数据类型长度取值范围bit1位0或1unsignedchar1字节0~255signedchar1字节-128~+127unsignedint2字节0~65535signedint2字节-32768~+32767unsignedlong4字节0~4294967295signedlong4字节-2147483648~+2147483647float4字节1.175494E-38~3.402823E+38(6位)double8字节1.175494E-38~3.402823E+38(10位)一般指针3字节0~65535二、KEILCx51语法基础MCS-51的C语言应用程序设计基础2、Cx51存储类型与8051存储空间关系存储器类型是用于指明变量所处的单片机的存储器区域情况。存储类型与存储空间的对应关系data直接寻址的片内RAM低128B,访问速度快bdata片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问idata间接寻址片内RAM,允许访问全部片内RAM(256字节)pdata用Ri间接访问的片外RAM的低256Bxdata用DPTR间接访问的片外RAM,允许访问全部64k片外RAMcode程序存储器ROM64k空间MCS-51的C语言应用程序设计基础Cx51存储类型及其大小和值域存储类型长度/bit长度/Byte值域data810~2558bitidata810~2558bitpdata810~2558bitxdata1620~6553616bitcode1620~6553616bit变量的存储类型定义举例:chardatavarl;intcodevar5;intidatavar2;bitbdataflags;Unsignedcharxdatavector[10][3][3];MCS-51的C语言应用程序设计基础存储模式:(1)SMALL模式。SMALL模式称为小编译模式,在SMALL模式下,编译时,函数参数和变量被默认在片内RAM中,存储器类型为data。(2)COMPACT模式。COMPACT模式称为紧凑编译模式,在COMPACT模式下,编译时,函数参数和变量被默认在片外RAM的低256字节空间,存储器类型为pdata。(3)LARGE模式。LARGE模式称为大编译模式,在LARGE模式下,编译时函数参数和变量被默认在片外RAM的64K字节空间,存储器类型为xdata。在程序中变量的存储模式的指定通过#pragma预处理命令来实现。函数的存储模式可通过在函数定义时后面带存储模式说明。如果没有指定,则系统都隐含为SMALL模式。MCS-51的C语言应用程序设计基础【例】变量的存储模式。#pragmasmall/*变量的存储模式为SMALL*/chark1;/*k1变量存储器类型为data*/intxdatam1;#pragmacompact/*变量的存储模式为SMALL*/chark2;/*k2变量存储器类型为pdata*/intxdatam2;intfunc1(intx1,inty1)large/*函数的存储模式为LARGE*/{return(x1+y1);}intfunc2(intx2,inty2)/*函数的存储模式隐含为SMALL*/{return(x2-y2);}MCS-51的C语言应用程序设计基础3、8051特殊功能寄存器及其Cx51定义在C51中,允许用户对特殊功能寄存器进行访问,访问时须先通过sfr或sfr16进行定义,定义时须指明它们所对应的片内RAM单元的地址。格式如下:sfr或sfr16特殊功能寄存器名=地址;sfr用于对MCS-51单片机中单字节的特殊功能寄存器进行定义,sfr16用于对双字节特殊功能寄存器进行定义。特殊功能寄存器名一般用大写字母表示。地址一般用直接地址形式。【例】特殊功能寄存器的定义。sfrPSW=0xD0;sfrSCON=0x98;sfrTMOD=0x89;sfrP1=0x90;sfr16DPTR=0x82;sfr16T2=0xCC;MCS-51的C语言应用程序设计基础对于SFR中可以位寻址的位定义方法:◇sfr_name`^`int_constantsfrPSW=0xD0;sbitOV=PSW^2;sbitCY=PSW^7;◇int_constant^int_constantsbitOV=0xD0^2;sbitCY=0xD0^7;◇将绝对地址赋给变量sbitOV=0xD2;sbitCY=0xD7;MCS-51的C语言应用程序设计基础位变量(BIT)及其Cx51定义◇定义语法:bitdirection◇函数可以包含bit参数,也可返回bit值bitfunc(bitb0,bitb1)◇位变量不能定义成一个指针,不存在位数组◇sbit位类型符用于定义在可位寻址字节或特殊功能寄存器中的位,定义时须指明其位地址,可以是位直接地址,可以是可位寻址变量带位号,也可以是特殊功能寄存器名带位号。格式如下:sbit位变量名=位地址;MCS-51的C语言应用程序设计基础【例】sbit型变量的定义。sbitOV=0xd2;sbitCY=oxd7;unsignedcharbdataflag;sbitflag0=flag^0;sfrP1=0x90;sbitP1_0=P1^0;sbitP1_1=P1^1;sbitP1_2=P1^2;sbitP1_3=P1^3;sbitP1_4=P1^4;……C51编译器把MCS-51单片机的常用的特殊功能寄存器和特殊位进行了定义,放在一个“reg51.h”或“reg52.h”的头文件中,当用户要使用时,用预处理命令#includereg52.h把这个头文件包含到程序中,然后就可使用殊功能寄存器名和特殊位名称。MCS-51的C语言应用程序设计基础绝对地址的访问◇使用C51运行库中预定义宏C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。规定只能以无符号数方式访问,定义了8个宏定义,其函数原型如下:#defineCBYTE((unsignedcharvolatile*)0x50000L)#defineDBYTE((unsignedcharvolatile*)0x40000L)#definePBYTE((unsignedcharvolatile*)0x30000L)#defineXBYTE((unsignedcharvolatile*)0x20000L)#defineCWORD((unsignedintvolatile*)0x50000L)#defineDWORD((unsignedintvolatile*)0x40000L)#definePWORD((unsignedintvolatile*)0x30000L)#defineXWORD((unsignedintvolatile*)0x20000L)这些函数原型放在absacc.h文件中。使用时须用预处理命令把该头文件包含到文件中,形式为:#includeabsacc.h。MCS-51的C语言应用程序设计基础【例】绝对地址对存储单元的访问#includeabsacc.h/*将绝对地址头文件包含在文件中*/#includereg52.h/*将寄存器头文件包含在文件中*/#defineucharunsignedchar/*定义uchar为数据类型符unsignedchar*/#defineuintunsignedint/*定义uint为数据类型符unsignedint*/voidmain(void){ucharvar1;uintvar2;var1=XBYTE[0x0005];/*XBYTE[0x0005]访问片外RAM的0005字节单元*/var2=XWORD[0x0002];/*XWORD[0x0002]访问片外RAM的000字单元*/......while(1);}MCS-51的C语言应用程序设计基础◇通过指针访问采用指针可以实现在C51程序中对任意指定的存储器单元进行访问。【例】通过指针实现绝对地址的访问。#defineucharunsignedchar#defineuintunsignedintvoidfunc(void){uchardatavar1;ucharpdata*dp1;/*定义一个指向pdata区的指针dp1*/uintxdata*dp2;/*定义一个指向xdata区的指针dp2*/uchardata*dp3;/*定义一个指向data区的指针dp3*/dp1=0x30;/*dp1指针赋值,指向pdata区的30H单元*/dp2=0x1000;/*dp2指针赋值,指向xdata区的1000H单元*/*dp1=0xff;/*将数据0xff送到片外RAM30H单元*/*dp2=0x1234;/*将数据0x1234送到片外RAM1000H单元*/dp3=&var1;/*dp3指针指向data区的var1变量*/*dp3=0x20;/*给变量var1赋值0x20*/}MCS-51的C语言应用程序设计基础◇使用C51扩展关键字_at_[存储器类型]数据类型说明符变量名_at_地址常数;使用_at_定义的变量必须为全局变量【例】通过_at_实现绝对地址的访问。#defineucharunsignedchar#defineuintunsignedintvoidmain(void){dataucharx1_at_0x40;/*在data区中定义字节变量x1,它的地址为40H*/xdatauintx2_at_0x2000;/*在xdata区中定义字变量x2,它的地址为2000H*/x1=0xff;x2=0x1234;......while(1);}MCS-51的C语言应用程序设计基础4、C51的运算符及表达式◆赋值运算符x=8+9;/*将8+9的值赋绐变量x*/x=y=5;/*将常数5同时赋给变量x和y*/在C51中,允许在一个语句中同时给多个变量赋值,赋值顺序自右向左。◆算术运算符C51中支持的算术运算符有:+加或取正值运算符-减或取负值运算符*乘运算符/除运算符%取余运算符◆关系运算符C51中有6种关系运算符:大于小于=大于等于=小于等于==等于!=不等MCS-51的C语言应用程序设计基础◆逻辑运算符C51有3种逻辑运算符:||逻辑或&&逻辑与!逻辑非关系运算符用于反映两个表达式之间的大小关系,逻辑运算符则用于求条件式的逻辑值,用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。逻辑与,格式:条件式1&&条件式2当条件式1与条件式2都为真时结果为真(非0值),否则为假(0值)。逻辑或,格
本文标题:单片机C语言程序设计基础
链接地址:https://www.777doc.com/doc-3370837 .html