第4章C51程序设计基础

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

C51程序结构C51的数据类型数据的存贮类型和存贮模式C51对SFR、可寻址位、存储器和I/O口的定义C51的运算符函数C语言编程实例第4章C51程序设计基础主要内容重点掌握C51单片机的程序结构,各种数据类型及变量的定义、存储及运算。C51单片机程序的流程控制,C51单片机函数的定义及调用。4.1C51程序结构同标准C一样,C51的程序由若干函数组成。必须有一个主函数main()程序的执行从main()函数开始,调用其他函数后返回主函数main(),最后在主函数中结束整个程序而不管函数的排列顺序如何。C51语言程序的组成结构如下所示:#includereg51.h预处理命令全局变量说明/*可被各函数引用*/main()/*主函数*/{局部变量说明/*只在本函数引用*/执行语句(包括函数调用语句)}fun1(形式参数表)/*函数1*/形式参数说明{局部变量说明执行语句(包括调用其他函数语句)}…funn(形式参数表)/*函数n*/形式参数说明{局部变量说明执行语句}4.1C51符号类型4.1.1标识符标识符用来标识源程序中函数、变量、常量、数组、数据类型、存储方式和语句等对象的名字的符号。标识符由字符串、数字和下划线等组成,首字符必须是字母或下划线。区分大小写,大小写字母代表不同的标识符;标识符最大长度因机器而异,一般默认为32个字符;标识符不能用C51的关键字。关键字是C51语言和C51编译器专用的字符序列,在选用标识符的时候不可与关键字重名,否则程序无法编译运行。4.1.2关键字关键字用途说明auto存储类型说明用以说明局部变量break程序语句退出最内层循环体case程序语句switch语句中的选择项char数据类型说明单字节整型数或字符型数据const存储类型说明程序执行过程中不可修改的变量值continue程序语句转向下一次循环default程序语句switch语句中的失败选择项do程序语句构成do…while循环结构double数据类型说明双精度浮点数else程序语句构成if…else选择结构enum数据类型说明枚举extern存储类型说明在其他程序模块中说明的全局变量float数据类型说明单精度浮点数for程序语句构成for循环结构C51中的关键字goto程序语句构成goto转移结构if程序语句构成if…else转移结构int数据类型说明基本整型数long数据类型说明长整型数register存储类型说明使用CPU内部寄存器的变量return程序语句函数返回short数据类型说明短整型数signed数据类型说明有符号数,二进制数据的最高位为符号位sizeof运算符计算表达式或数据类型的字节数static存储类型说明静态变量struct数据类型说明结构类型数据switch程序语句构成switch选择结构typedef数据类型说明数据类型定义union数据类型说明联合类型数据unsigned数据类型说明无符号数据void数据类型说明无类型数据volatile数据类型说明该变量在程序执行中可被隐含地改变while程序语句构成while和do…while循环结构C51中的关键字关键字用途说明bit位变量说明声明一个位变量或位类型的函数sbit位变量说明声明一个可位寻址的变量sfr8位特殊功能寄存器声明声明一个特殊功能寄存器(8位)sfr1616位特殊功能寄存器声明声明一个特殊功能寄存器(16位)data存储器类型说明直接寻址的8051内部数据存储器bdata存储器类型说明可位寻址的8051内部数据存储器idata存储器类型说明间接寻址的8051内部数据存储器pdata存储器类型说明“分页”寻址的8051外部数据存储器xdata存储器类型说明8051外部数据存储器code存储器类型说明8051程序存储器interrupt中断函数声明定义一个中断函数reentrant再入函数声明定义一个再入函数using寄存器组定义定义一个8051的工作寄存器组C51中的关键字C51语言中,运算符主要分为三大类:算术运算符关系运算符与逻辑运算符按位运算符此外,还有一些用于完成特殊任务的运算符。4.1.3运算符2.C51的算术运算符:+、-、*、/、%(求余)优先级为:先乘除后加减,先括号内再括号外3.C51的关系运算符有六种:<、>、<=、>=、==、!=优先级:<、>、<=、>=高,后两个“==”和“!=”级别低。4.C51的逻辑运算符有三种:&&(与);||(或);!(非)。4.1.3运算符1.赋值运算符:=优先级见图!非↓算术运算↓关系运算↓&&和||↓=赋值运算5.位运算符和位运算(1)按位与运算符(&)(2)按位或运算符(|)(3)异或运算符(∧)(4)取反运算符(~)(5)左移运算符()(6)右移运算符()51单片机内部数据存贮器的可寻址位(20H~2FH)定义为bit型,而特殊功能寄存器的可寻址位只能定义为sbit类型。6.自增、自减运算符:++i,--i(在使用i之前,先使i值加1,减1)i++,i--(在使用i之后,再使i值加1.,减1)7.复合赋值运算符:+=;-=;*=;/=;%=;=;=;&=;^=;|=。例:a+=b相当于a=a+b。a=7.相当于a=a7.8.对指针操作的运算符:&—*—间址运算符4.1.3运算符C51语言中使用的分隔符有:[](){},;:…*=^#4.1.4分隔符4.2C51常量与变量数据类型长度值域字符型unsignedchar单字节0~255(signed)char单字节-128~+127整型unsignedint双字节0~65535(signed)int双字节-32768~+32767unsignedlong四字节0~4294967295(signed)long四字节-2147483648~+2147483647实型float四字节±1.175494E-38~±3.402823E+38指针型*1~3字节对象的地址位型bit位0或1访问SFR数据类型sfr单字节0~255sfr16双字节0~65535sbit位0或14.2.1基本数据类型转义字符表转义字符含义ASCII码(16/10进制)\o空字符(NULL)00H/0\n换行符(LF)0AH/10\r回车符(CR)0DH/13\t水平制表符(HT)09H/9\b退格符(BS)08H/8\f换页符(FF)0CH/12\'单引号27H/39\双引号22H/34\\反斜杠5CH/924.2.2存储类型说明符存储类型说明code一般程序存储器(可达64k)使用操作码“MOVC@A+DPTR”访问data最快可用直接寻址方式访问的内部数据存储器。对变量的访问速度最快(内部数据存储器128字节)idata快使用间接寻址方式访问的内部数据存储器。整个内部数据存储空间都可以做访问(256字节)bdata快可位寻址的内部数据存储器。支持位和字节混合寻址xdata较慢外部数据存储器(可达64k)使用操作码“MOVX@DPTR”访问far最慢扩展的RAM和ROM空间(可达16MB)。可通过用于自定义程序或特殊芯片的扩展功能访问pdata慢指定外部数据存储器(256字节)使用操作码“MOVX@Rn”访问1、变量的定义格式:[存储种类]数据类型[存储器类型]变量名表4.2.3变量例:datacharvar;/*字符变量var定位在片内数据存贮区*/charcodeMSG[]=″PARAMETER:″;/*字符数组MSG[]定位在程序存贮区*/unsignedlongxdataarray[100];/*无符号长型数组定位在片外RAM区,64KB*/floatidatax,y,z;/*实型变量x,y,z,定位在片内用间址访问的内部RAM区*/unsignedintpdatasion;/*无符号整型变量sion定位在外部RAM,256B*/unsignedcharxdatavector[10][4][4];/*无符号字符型三维数组,定位在片外RAM区*/charbdataflags;/*字符变量flags定位在可位寻址内部RAM区*/4.2.3变量sfrSCON=0x98;/*串行通信控制寄存器地址98H*/sfrTMOD=0x89;/*定时器模式控制寄存器地址89H*/sfrACC=0xe0;/*A累加器地址E0H*/sfrP1=0x90;/*P1端口地址90H*/定义了以后,程序中就可以直接引用寄存器名。C51也建立了一个头文件reg51.h(增强型为reg52.h),在该文件中对所有的特殊功能寄存器的进行了sfr定义,对特殊功能寄存器的有位名称的可寻址位进行了sbit定义,因此,只要用包含语句#includereg51.h,就可以直接引用特殊功能寄存器名,或直接引用位名称。特别注意:在引用时特殊功能寄存器或者位名称必须大写。2、特殊功能寄存器SFR定义3.对位变量的定义C51对位变量的定义有三种方法:1)将变量用bit类型的定义符定义为bit类型如bitmn;/*其位地址C51自行安排在可位寻址区的bdata区*/2)采用字节寻址变量.位的方法:如bdataintibase;/*ibase定义为整型变量*/sbitmybit=ibase^15;/*mybit定义为ibase的D15位*/位运算符“^”相当于汇编中的“·”。方法1:使用头文件及sbit定义符;多用于无位名的可寻址位。例如#includereg51.hsbitP1-1=P1^1;/*P1-1为P1口的第1位*/sbitac=ACC^7;/*ac定义为累加器A的第7位*/方法2:使用头文件reg51.h,再直接用位名称。例如#includereg51.hRS1=1;RS0=0;方法3:用字节地址位表示例如sbitOV=0xD0^2;方法4:用寄存器名.位定义例如sfrPSW=0xd0;/*定义PSW地址为d0H*/sbitCY=PSW^7;/*CY为PSW·7*/3)对特殊功能寄存器的位的定义4.3C51语句与标准C语言基本相同:if选择语言while循环语言for循环语言switch/case多分支选择语言do-while循环语言例while(P1&0x01)==0){};即如果P1.0=0,循环执行空语句,直到P1.0变为1,此语句用于对P1.0进行检测。例片内RAM的20H单元存放一个有符号数x,函数y与x有如下关系式:xx>0y=20Hx=0x+5x<0设y存放于内RAM21H单元,程序如下main(){charx,*p,*q;p=0x20;q=0x21;x=*p;if(x>0)*q=x;elseif(x<0)*q=x+5;else*q=0x20;}例片内RAM20H单元存放着一个0~05H的数,用查表法,求出该数的平方值放入内部RAM21H单元。main(){charx,*p;charcodetab[6]={0,1,4,9,16,25};p=0x20;x=tab[*p];p++;*p=x;}例#includereg51.h//包含51单片机寄存器定义的头文件voidmain(void){P1=0xfe;//P1=11111110B,即P1.0输出低电平}例:P3口控制8位led流水点亮。#includereg51.h//包含单片机寄存器的头文件delay(){unsignedchari,j;for(i=0;i250;i++)for(j=0;j250;j++);}main(){while(1){P3=0xfe;//第一个灯亮delay();//调用延时函数P3=0xfd;//第二个灯亮delay();//调用延时函数P3=0xfb;//第三个灯亮delay();//调用延时函数P3=0xf7;//第四个灯亮delay();//调用延时函数P3=0xef;//第五个灯亮delay();//调用延时函数P3=0xdf;//第六个灯亮delay();//调用延时函数P3=0xbf;//第七个灯亮de

1 / 26
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功