第4章单片机的C51程序设计课件.ppt
《第4章单片机的C51程序设计课件.ppt》由会员分享,可在线阅读,更多相关《第4章单片机的C51程序设计课件.ppt(120页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第4章章 单片机的单片机的C51程序设计程序设计 吴政江制作吴政江制作 4.1 C51程序的结构特点程序的结构特点4.2 C51语法基础语法基础 4.3 C51的数据类型、存储类型及常量与变量的数据类型、存储类型及常量与变量 4.4 C51对单片机主要资源的定义对单片机主要资源的定义4.5 C51的基本运算的基本运算4.6 C51的构造数据类型的构造数据类型4.7 C51的流程构造语句的流程构造语句4.8 C51的函数的函数4.9 指针指针4.10 C51程序设计举例程序设计举例实训四:单片机控制流水灯实训四:单片机控制流水灯(C51程序程序)实训五:计数器的实训五:计数器的C51程序设计与
2、制作程序设计与制作小结小结习题与思考题习题与思考题4.1 C51程序的结构特点程序的结构特点 4.1.1 C语言与汇编语言的比较语言与汇编语言的比较 单片机的C51编程与汇编语言编程相比,具有以下优点。(1)对单片机的指令系统不要求有任何的了解,就可以用C语言直接编程操作单片机。(2)寄存器分配、不同存储器的寻址以及数据类型等细节完全由编译器自动管理。(3)程序有规范的结构,可分成不同的函数,可使程序结构化。(4)库中包含许多标准函数,具有较强的数据处理能力,使用十分方便。(5)具有方便的模块化编程技术,使已编好的程序很容易移植。4.1.2 C51程序的结构特点程序的结构特点 举例:举例: 设
3、单片机AT89C51的P1.0口接有一个发光二极管,如图4-1所示。试用C51编程使该发光二极管间隔1s亮灭闪动。LEDVccAT89C51 P1.0R1图4-1 驱动发光二极管#include /包含51系列单片机头文件#define uint unsigned int /宏定义sbit led1 = P10; /声明单片机P1口的第一位void delayms(uint); /声明延时子函数void main () /主函数 While(1) /大循环 led1= 0; /*点亮接在P1.0引脚上的LED*/ delayms(1000); /延时1秒 led1= 1; /*关闭接在P1.0
4、引脚上的LED*/ delayms(1000); /延时1秒 void delayms(uint xms)/延时x毫秒子函数 uint i,j; for(i=xms;i0;i-)/*i=xms即延时约xms毫秒*/ for(j110;j;j-); 由以上例子可看出C51程序结构具有以下特点:(1)C 语言程序是由函数构成的。(2)一个函数由两部份组成。函数首部,即函数的第一行。函数体,即函数首部下面的大括号“”内的部分。函数体一般包括:a声明部分:在这部分中定义所用到的变量,如“sbit led1 = P10;”。b执行部分:由若干个语句组成。(3)一个C语言程序,总是从main ()函数开始
5、执行的,而不管物理位置上这个main ()放在什么地方。(4)C语言源程序的前面几行通常是以“#”开头的预处理命令。预处理命令包括文件包含(include)命令、宏(define)命令以及条件编译命令等。(5)C 语言区分大小写。如将“include”写成“INCLUDE”就会编译出错。(6)C 语言书写的格式自由,可以在一行写多个语句,也可以把一个语句写在多行。(7)每个语句和资料定义的最后必须有一个分号“;”,分号“;”是C语句的必要组成部分,即语句结束标志。但预处理命令、函数头和花括号“”之后不能加分号“;”。(8)可以用/*/的形式为C程序的任何一部分作注释。 C51也支持C+风格的注
6、释,即用“/”引导的后面的语句是注释。例如: P1_0 = !P1_0; /取反P1.0 这种风格的注释,只对本行有效,所以不会出现上面的问题,而且书写也比较方便。因此,程序在只需要一行注释的时候,建议采用这种格式。(9)一个C语言源程序可以由一个或多个源文件组成。4.2 C51语法基础语法基础 4. 2. 1 C语言词汇语言词汇(1)标识符 在程序中使用的变量名、函数名、标号等统称为标识符。C语言规定,标识符只能是字母(AZ,az)、数字(09)、下划线(_)组成的字符串,并且第一个字符必须是字母或下划线。标准C语言不限制标识符的长度,但它受各种版本的C语言编译系统限制,同时也受到具体机器的
7、限制。在标识符中,大小写是有区别的。标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。标识符不能使用系统保留的关键字。(2)关键字(也叫保留字)数据类型关键字。用于定义或说明变量、函数或其他数据结构的类型。主要有char,double,float,int,long,short,signed,struct,union,unsigned,void,enum等12个。控制语句关键字。用于表示一个语句的功能。主要有break,case,continue,default,do,else,for,goto,if,return,switch,while等12个。存储类型关键字。用于说明变量或函数
8、的存储类型。主要有auto,extern,register,static等4个。预处理命令关键字。用于表示一个处理命令。主要有include、define等2个。其他关键字。主要有const,sizeof,typedef,volatile等4个。(3)运算符 C语言中含有相当丰富的运算符。如强制类型转换运算符、算术运算符、关系运算符、逻辑运算符以及位运算符等。运算符与变量、函数一起组成表达式,表示各种运算功能。运算符由一个或多个字符组成。(4)分隔符 逗号分隔符。 空格分隔符。4. 2. 2 编译预处理编译预处理 编译预处理命令概念:计算机将C语言编译为机器语言时进行的预处理。这些命令只在编译
9、时有效,不是计算机运行的可执行语句。编译预处理命令以“#”开头,末尾不加分号,包括头宏命令、文件包含命令、条件编译命令等。 (1)宏命令 作用:用标识符来代表一个字符串,系统在编译之前自动将标识符替换为字符串。主要用于定义常量。宏定义的标识符(常量)一般用大写字母,以便与变量相区别。 定义形式:#define 标识符 字符串 例如:#define PI 3.14 /*后续程序中所有的PI都用3.14代替。即凡是出现PI的地方即表示3.14,这样做有利于阅读程序和修改程序。*/(2)文件包含 文件包含:指在一个文件中将另一个文件的全部内容包含进来,通常用来将程序中用到的系统函数、宏标识符、自定义
10、函数等的文件包含进来。被包含的文件也叫头文件(以“.h”为扩展名的文件)。 格式:#include或#include“文件名”在Keil C51中常用的包含文件(头文件)有以下三种: reg51.h头文件。reg51.h是对51子系列单片机的特殊功能寄存器进行定义的头文件,使用汇编语言中的特殊功能寄存器名称,将各个特殊功能寄存器定义为该寄存器的直接地址,在C语言中可以通过寄存器名称直接对这些寄存器进行操作,特殊功能寄存器名称全部使用大写。reg51.h没有对单片机的四个输入输出端口进行位定义,如果程序中需要对并行端口进行位操作,可以使用regx51.h。对于52系列单片机,相应的头文件为reg
11、52.h或regx52.h。stdio.h头文件。stdio.h是标准输入输出库函数头文件。该库函数文件是定义计算机键盘输入与计算机屏幕显示的库函数,单片机本身无需这些库函数,但为了方便利用计算机调试程序,需要包含该头文件。常用的标准输入、输出库函数有以下两种:aprintf(格式控制,输出列表);。该函数按指定格式在屏幕上显示对应输出项的值。bscanf(格式控制,地址列表);。该函数接收计算机键盘输入的数据并赋值给对应的变量。例如: int x=3;char y3=“abc”; printf(“x=%d,y=%3sn”,x,y); scanf(“%d,%cn”,&x,&y); printf
12、(“x=%d,y=%3sn”,x,y);其中,格式控制必须包含在一对双引号内,包括格式说明符(%d)、普通字符(x=,y=)和转义控制符(n)三种类型。格式说明符前必须用百分号“%”。常用的格式说明符的含义如表4-1所示。表4-1 常用格式字符的含义格式字符说明附加格式字符说明d带符号的十六进制数m数据长度s字符串n截取字符的个数c一个字符f小数形式的实数nn位小数 常用的转义控制符有两个:n:换行。r:回车。他的前必须用反斜杠“”。 再如,在计算机屏幕上打印99乘法口诀表。参考程序如下所示:/*cfb.c*/#include /包含51系列单片机头文件#include /包含基本输入、输出头
13、文件void cominit() /设置定时器、串行通信函数 SCON=0 x50; /设置串行口控制寄存器 TMOD|=0 x20; /设置定时器方式寄存器 TH1=0 xf3; /设置定时器1(T1)高8位的初值 TR1=1; /启动定时器1 TI=1; /置位发送标志位void main(void) /主函数 unsigned int i,j; /定义无符号整型变量i与j cominit(); /调用设置定时器、串行通信函数 for(i=1;i=9;i+) /外循环 for(j=1;j=i;j+) /内循环printf(%dX%d=%d ,j,i,i*j); /计算机屏幕上打印一行乘法口
14、诀表printf(n); /换行打印 在keil C51中,为了借助计算机键盘与屏幕调试程序,需要模拟单片机串行口与计算机键盘与计算机屏幕进行通信。因而需要设置定时器/计数器与串行通信,“void cominit()”函数就是为此目的而写的。程序调试运行结果如下所示: 1X1=1 1X2=2 2X2=4 1X3=3 2X3=6 3X3=9 1X4=4 2X4=8 3X4=12 4X4=16 1X5=5 2X5=10 3X5=15 4X5=20 5X5=25 1X6=6 2X6=12 3X6=18 4X6=24 5X6=30 6X6=36 1X7=7 2X7=14 3X7=21 4X7=28 5
15、X7=35 6X7=42 7X7=49 1X8=8 2X8=16 3X8=24 4X8=32 5X8=40 6X8=48 7X8=56 8X8=64 1X9=9 2X9=18 3X9=27 4X9=36 5X9=45 6X9=54 7X9=63 8X9=72 9X9=81 用户自定义标题文件。用户将自己常用的宏定义、条件编译、图片代码、数据表格等组成一个文件,然后在各个源程序中用“#include”命令包含进来,无需重复定义。4.3 C51的数据类型、存储类型及常量与变量的数据类型、存储类型及常量与变量 4.3.1 C51的数据类型的数据类型 C51的数据类型大体上可以分为基本数据类型、构造数
16、据类型和空类型等三种。其中基本数据类型又可分为位型、无符号字符型、有符号字符型、无符号整型、有符号整型、无符号长整型、有符号长整型、浮点型及双精度实型等九种类型。它们的符号、长度、值域等如表4-2所示。表4-2 C51的数据类型数据类型数据类型名称长度/bit长度/Byte表示数的范围bit或sbit位型10,1unsigned char无符号字符型810255signed char有符号字符型81-128+127unsigned int无符号整型162065535signed int有符号整型162-32768+32767unsigned long无符号长整型32404294967295(0
17、232-1)signed long有符号长整型324-2147483648+2147483647(-231231-1)float单精度实型(浮点型)3243.4e -383.4e+38(相当于6位有效数字)double双精度实型6481.7e-381.7e+38(相当于10位有效数字)4.3.2 C51的数据存储类型的数据存储类型(1)数据存储类型 C51允许将变量或常量定义成不同的存储类型,以使单片机访问不同的存储空间。主要包括片内直接寻址型、片内位寻址型、片内间接寻址型、片外分页寻址型、片外间接寻址型以及代码型等六种类型,它们和单片机的不同存储区相对应。如表4-3所示。表4-3 C51存储
18、类型与MCS-51单片机存储空间的对应关系存储类型存储类型名称长度/bit长度/Byte值域范围与MCS-51单片机存储空间的对应关系data片内直接寻址型810255直接寻址片内低128字节数据存储器RAMbdata片内位寻址型813247按位或字节寻址片内RAM的20H2FH地址空间idata片内间接寻址型810255间接寻址片内RAM的00HFFH地址空间pdata片外分页寻址型810255分页寻址256字节片外RAM,对应MOVX Rixdata片外间接寻址型162065535寻址64K字节片外RAM,对应MOVX DPTRcode代码型162065535寻址64K字节ROM,对应MO
19、VC DPTR (2)变量存储类型定义举例变量的存储类型通常与数据类型一起使用。先说明数据类型,再说明存储类型。现举例如下:char data var1; /字符型变量var1被定义为data型,被分配在片内RAM中的低128字节中。bit bdata flags; /位变量flags被定义为bdata型,定位在片内RAM中的位寻址区。float idata x,y,z; /*浮点型变量x、y和z被定义为idata存储类型,定位在片内RAM中,并只能用间接寻址方式进行访问。*/unsigned int pdata dimension; /*无符号整型变量dimension被定义为pdata型,
20、定位在片外数据存储区,相当于用MOVX Ri访问。*/unsigned char xdata vector1044; /*无符号字符型三维数组变量vector1044 被定义为xdata存储类型,定位在片外RAM中,占据1044=160个字节,相当于用MOVX DPTR访问。*/ (3)存储模式如果在变量定义时略去存储类型标志符,则由编译器(如Keil C51)自动默认存储类型。默认的存储类型进一步由SMALL、COMPACT和LARGE存储模式指令限制。存储模式的有关说明如表4-4所示。表4-4 存储模式及说明存储模式模式名称说 明SMALL小模式参数及局部变量放入可直接寻址的片内存储器(最
21、大128字节,默认存储类型是data),因此访问十分方便。另外所有对象,包括栈,都必须嵌入片内RAM。栈长很关键,因为实际栈长依赖于不同函数的嵌套层数。COMPACT一般模式(中模式)参数及局部变量放入分页片外存储区(最大256字节,默认存储类型是pdata),通过寄存器R0和R1间接寻址,栈空间位于内部数据存储器中。LARGE大模式参数及局部变量直接放入片外数据存储区(最大64KB字节,默认存储类型是xdata),使用数据指针DPTR来进行寻址。用此数据指针访问的效率低,尤其是对二个或多个字节的变量,这种数据类型的访问机制直接影响代码的长度,另一个不便之处在于这种数据指针不能对称操作。4.3
22、.3 常量与变量常量与变量(1)常量在程序运行过程中,其值不能被改变的量称为常量,如数字、字符等。每种数据类型的数值都有常量。字符型常量用单引号括起来,字符串常量用双引号括起来,十六进制数常量用“0 x+数值”表示。直接常量(也叫字面常量)。如12、0、0 xCE、A、“GUI ZHOU”等。符号常量。符号常量即是用一个标识符来代替一个常量。符号常量通常用前面介绍的宏命令define来定义。如:#define tscr_init 0 x40#define tmodh_init 0#define tmodl_init 250也可通过const关键字来定义的符号常量。 定义形式:数据类型 cons
23、t 标识符=数字 如:int const PI=3; 区别:用define定义的常量不占任何存储空间,在编译时直接用对应的数据代替其常量名称参与运算。而用const定义的常量则会占去单片机ROM区的内存,占去的空间大小为其定义数据类型所占空间的大小,如上面定义的PI常量占2个字节的空间。(2)变量 在程序运行过程中,其值可以被改变的量称为变量。每个变量都必须有变量名,变量名是标识符,必须满足用户标识符的要求。变量必须先定义后使用,定义变量的目的是说明变量的数据类型,以便为变量分配相应的存储单元。在程序使用变量前最好给变量赋初值,不赋初值的数值型变量其初值为0。变量在定义的同时可以赋初值。如:
24、static int x,y=2,j=5; float sum; 以上两条语句定义了x、y、j三个静态整型变量和一个浮点型变量sum,并且给变量y赋初值2,j赋初值5,没有给变量x赋初值,其初值默认为0。其中的存储类型在需要特别声明的时候才需要,否则可以省略。同类变量可以共用一个数据类型说明符,各个变量之间用逗号隔开,最后以分号结束。这三个整型变量x、y、j在后面的程序中可以存放整型数据。浮点型变量sum可以存放一个浮点型数据的值。4.4 C51对单片机主要资源的定义对单片机主要资源的定义 4.4.1 使用关键字定义特殊功能寄存器(使用关键字定义特殊功能寄存器(SFR) SFR及其可位寻址的位
25、是通过关键字sfr和sbit来定义的,这种方法与标准C不兼容,只适用于C51。(1)用sfr定义特殊功能寄存器(SFR)的字节地址格式:sfr 寄存器变量名称=地址值;功能:将右边的地址赋值给左边的寄存器变量名称。举例:asfr PSW = 0 xD0; /定义程序状态字寄存器PSW的地址为D0H bsfr SCON = 0 x98; /定义串行口控制寄存器SCON的地址为98H csfr P0 = 0 x80; /定义P0口的地址为80H dsfr TMOD = 0 x89; /定义定时器/计数器方式控制寄存器TMOD的地址为89H (2)用sbit定义特殊功能寄存器(SFR)的位地址格式:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 单片机的C51程序设计课件 单片机 C51 程序设计 课件
限制150内