第10章-单片机C51程序设计课件.ppt
《第10章-单片机C51程序设计课件.ppt》由会员分享,可在线阅读,更多相关《第10章-单片机C51程序设计课件.ppt(71页珍藏版)》请在三一办公上搜索。
1、第10章 目录,10.1 C51程序设计基础10.1.1 C51中的基本数据类型10.1.2 C51中扩充的数据类型 10.1.3 C51中的运算符 10.1.4 C51中的语句及程序结构10.2 C51程序设计 10.2.1定时/计数器初始化程序设计举例10.2.2点亮发光二极管实现流水灯程序 10.2.3单个中断系统设计举例 10.2.4定时器程序设计举例 10.2.5串行通信程序设计举例,10.1 C51程序设计基础,10.1.1 C51中的基本数据类型C语言中的数据有常量和变量之分,当我们在编写单片机程序时,用到的相关变量在单片机的内存中都要占据一定的存储空间,变量大小不同,所占据的空
2、间就不同,所以,“变量”数据的大小是有限制的,我们不能随意给一个变量赋任意大小的值。为了合理利用内存空间,我们在编程时就要选择大小合适的数据,不同的数据类型也就代表了不同大小的数据,所以,我们在使用变量之前,首先要声明这个变量的类型,以便让编译器提前从内存中为其分配空间。表10-1列出了C51的基本数据类型。,10.1 C51程序设计基础,10.1.1 C51中的基本数据类型,表10-1 C51的基本数据类型,10.1 C51程序设计基础,10.1.1 C51中的基本数据类型说明:(1)在单片机中,所有的数据都是以二进制的形式存储在存储器中的,其中,1个字节=8位二进制(即1Byte=8bit
3、)。(2)在C语言中:short int即为int,long int即为long。(3)前面若无unsigned则一律认为是signed型。(4)一般情况下,float型数据只能提供7位有效数字,double型数据能够提供1516位有效数字,但是这个精度还和编译器有关系,并不是所有的编译器都遵守这条原则。,10.1 C51程序设计基础,10.1.1 C51中的基本数据类型例如:float x;x=32.45678912;由于float类型的有效数字是7位,故x=32.45679,若将x改成double类型的则能将32.45678912全部存放在x中,所以,在声明变量时应根据其使用情况来为其选择
4、类型。例如:int i=9;在内存中占16位(即2个字节的存储单元)。,10.1 C51程序设计基础,10.1.2 C51中扩充的数据类型在C51中除以上基本数据类型外,为了适应单片机程序开发的需要又扩充了如下的数据类型。位变量声明bit:声明一个位变量。8位寄存器声明sfr:声明一个8位寄存器。16位寄存器声明sfr16:声明一个16位寄存器。特殊功能位声明sbit:声明特殊功能寄存器中的某一位。,10.1 C51程序设计基础,10.1.2 C51中扩充的数据类型bit flag;说明:声明了一个变量名为flag的位变量。sfr TCON=0 x88H;说明:单片机内部有很多特殊功能寄存器(
5、sfr),每个sfr在单片机内部都分配有唯一的一个地址,当我们在程序中使用sfr时,我们一般通过声明将相应的地址编号赋给一个名称,以后通过该名称来使用相应sfr,其中这些声明绝大多数都包含在相应的头文件(如:reg51.h)中。本例中TCON是单片机的定时器/计数器控制寄存器,它在单片机内存中的地址为0 x88H,经过该语句声明以后,如在后面的程序中使用该寄存器则只需使用其名称TCON即可,当程序进行编译时,编译器也知道实际要操作的是单片机内部0 x88地址处的这个寄存器,而TCON仅仅是这个地址的一个代号或名称而已,当然,我们也可以声明成其他的名称。,10.1 C51程序设计基础,10.1.
6、2 C51中扩充的数据类型sfr16 T1=0 x8BH;说明:声明了一个16位SFR,起始地址为0 x8BH,道理与上例相同不再重复解释。sbit TR0=TCON4;说明:首先应该有sfr TCON=0 x88H;这句的声明后,我们才知道TCON是定时器/计数器控制寄存器的名称,它是一个8位的寄存器,其中,TCON0为最低位,TCON7为最高位,通过本例的声明,以后当我们使用TCON4时,直接操作TR0即可,当然,我们也可以将TCON4声明成其他的名称。,10.1 C51程序设计基础,10.1.3 C51中的运算符绝大多数的程序都需要对数据进行加工处理,即进行运算,要进行运算就得规定可以使
7、用的运算符,C51中的运算符与C语言基本相同,在单片机程序开发过程中最常用的主要有算术运算符、关系运算符、逻辑运算符和位运算符等。,10.1 C51程序设计基础,10.1.3 C51中的运算符说明:(1)“”表示测试两数是否相等,如a=b,测试a和b中的值是否相等。(2)“!”表示测试两数是否不相等,如a!=b,测试a和b中的值是否不相等。,10.1 C51程序设计基础,10.1.3 C51中的运算符说明:(1)右移,操作符为“”,每执行一次右移指令,被操作数的各位依次向右移动一位,其中,最高位补0,最低位移入PSW寄存器CY位,CY位中原来的数被覆盖。如图10-1所示。(2)左移,操作符为“
8、”,每执行一次左移指令,被操作数的各位依次向左移动一位,其中,最高位移入PSW寄存器CY位,CY位中原来的数被覆盖,最低位补0,如图10-2所示。,10.1 C51程序设计基础,10.1.3 C51中的运算符其他运算符赋值运算符:条件运算符:?:逗号运算符:,指针运算符:*和&求字节运算符:sizeof强制类型转换运算符:(类型)成员运算符:.下标运算符:其他,10.1 C51程序设计基础,10.1.4 C51中的语句及程序结构1、语句C51程序是由语句组成的,其中,语句可分为以下几类:(1)表达式语句:由一个表达式(赋值表达式、算术运算表达式、关系表达式、逻辑表达式等)加上一个分号构成,最典
9、型的就是赋值表达式构成的赋值语句。例如:x=3.6;(2)函数调用语句:由一个函数调用加上一个分号构成。例如:printf(“Hello everyone!”);说明:在屏幕上输出显示Hello everyone!,10.1 C51程序设计基础,10.1.4 C51中的语句及程序结构(3)控制语句:条件语句:if、switch。循环语句:for、while、do while。控制转移语句:break、continue、return、goto。(4)复合语句:用 把一些语句和声明括起来就构成了复合语句。float x=3,y=9,z;z=x+y;printf(“z=%f”,z);(5)空语句:只
10、有一个分号;什么也不做,可以作为程序流程的转向点,也可用作循环语句的循环体(循环体是空语句)。,10.1 C51程序设计基础,10.1.4 C51中的语句及程序结构2、程序结构由以上语句可以构成C程序的三大结构,即顺序结构、选择结构(分支结构)、循环结构。(1)顺序结构:仅仅是简单的一个语句一个语句的执行。(2)选择结构:主要由条件语句构成。(3)循环结构:主要由循环语句构成,与标准C语言一样,循环结构中可以使用break、continue、return、goto。,10.1 C51程序设计基础,10.1.5 C51中的头文件C51中已定义的常用的头文件主要有如下类别:absacc.h-包含允
11、许直接访问8051不同存储区的宏定义。assert.h-文件定义assert宏,可以用来建立程序的测试条件。ctype.h-字符转换和分类程序。math.h-数学函数程序。reg51.h-51的特殊寄存器声明。reg52.h-52的特殊寄存器声明。setjmp.h-定义jmp_buf类型和setjmp和longjmp程序的原型。stdarg.h-可变长度参数列表程序。stdlib.h-存储器分配程序。stdio.h-流输入和输出程序。string.h-字符转操作程序,缓冲区操作程序。,10.1 C51程序设计基础,10.1.5 C51中的头文件 在单片机程序中,经常使用的头文件主要有math.
12、h、reg51.h或reg52.h、stdio.h等。1、头文件math.h 头文件math.h是数学函数库,各种数学计算函数的具体实现就放在文件math.h里,比如,平方根函数 sqrt、绝对值函数fabs、指数函数 exp、正弦函数 sin、余弦函数 cos 等,当我们需要使用时可以直接调用这些函数。2、头文件reg51.h和reg52.h 头文件reg51.h或reg52.h是声明51单片机或52单片机特殊功能寄存器和位寄存器的,这两个头文件中大部分内容是一样的,51单片机比52单片机少一个定时/计数器T2,因此,reg51.h中也就比reg52.h中少了几行对寄存器T2声明的内容。,1
13、0.1 C51程序设计基础,10.1.5 C51中的头文件 在单片机程序中,经常使用的头文件主要有math.h、reg51.h或reg52.h、stdio.h等。、头文件stdio.h包含了与标准输入输出库有关的变量定义和宏定义以及对函数的声明,标准输入输出函数主要有printf、scanf、putchar、getchar等。除以上已定义的头文件外,用户也可以根据自己的需要定义扩展名为.h的头文件,存放到指定的目录下,在编程中可以直接使用。,10.2 C51程序设计,10.2.1定时/计数器初始化程序设计举例【例10-1】在8051单片机中,利用定时器T0产生50ms的定时时间。通过本例我们将
14、对头文件、主函数main()、注释等三个方面的知识点做讲解。程序代码如下:#include/包含头文件void main()TMOD=0 x01;/设置定时器0为方式1、定时模式 TH0=(65536-45872)/256/装初值 TL0=(65536-45872)%256;TR0=1;/启动定时器0 while(1)/程序停止,10.2 C51程序设计,10.2.1定时/计数器初始化程序设计举例说明:(1)按照定时/计数器的初始化流程,首先设置TMOD=0 x01,置T0工作于方式1、定时模式,给TH0和TL0装入初值,之后启动定时器开始计时,获得50ms的时间。(2)下面说一下初值的计算。
15、晶振频率为fosc=11.0592Mhz 机器周期 T=12*1/fosc=12*1/11.0592Mhz=1.09s 计数值=5010-3/(1.0910-6)=45872因单片机的定时器是加法计数器,如果想获得50ms的定时时间,我们就要给TH0和TL0装入计数初值X,在这个初值的基础上计45872个数至65536(方式1的溢出值216),定时器溢出,此时刚好50ms。因此,计数初值X=65536-45872=19664。在编写程序时要将计数值转换成16进制的,我们采用下面的方法转换,把19664对256求模,即19664/256装入THO中,把19664对256求余,即19664%256
16、装入TLO中。,10.2 C51程序设计,10.2.1定时/计数器初始化程序设计举例1、头文件(1)头文件包含的书写方法:两种当使用#include时(即本例中所使用的方法),编译器先进入到软件安装文件夹(KeilC51INC)处开始搜索这个头文件,如果这个文件夹下没有引用的头文件,编译器将会报错。当使用#include“reg51.h”时,编译器先进入到当前工程所在文件夹处开始搜索该头文件,如果当前工程所在文件夹下没有该头文件,编译器将继续回到软件安装文件夹处搜索这个头文件,若仍然找不到该头文件,编译器将报错。,10.2 C51程序设计,10.2.1定时/计数器初始化程序设计举例1、头文件(
17、2)头文件中的内容:在安装好Keil uvision3编译软件后,我们可以到KeilC51INC这个文件夹下找到头文件reg51.h或者在Keil中编辑程序时鼠标移动到reg51.h上,单击右键选择 Open document也可以打开,打开之后其具体内容参考教材。,10.2 C51程序设计,10.2.1定时/计数器初始化程序设计举例1、头文件说明:在该头文件中声明了51系列单片机内部的21个特殊功能寄存器的名称和可以进行位操作的特殊功能寄存器中的各个位的名称。在这里主要用到了前面讲到的sfr和sbit这两个关键字。例如:sfr TMOD=0 x89;把单片机内部地址0 x89处的这个寄存器重
18、新命名为TMOD,以后在程序中使用该寄存器时直接使用TMOD即可,如上例所示。其实,对单片机而言它只知道它的内部地址0 x89是什么,而并不知道TMOD是什么,现在通过sfr TMOD=0 x89;这条语句,单片机就清楚了程序中的TMOD具体指什么了。因此,以后凡是编写5l内核单片机程序时,我们在源代码的前面都应写上#include或#include“reg51.h”。,10.2 C51程序设计,10.2.1定时/计数器初始化程序设计举例1、头文件例如:sbit EA=IE7;或sbit EA=0 xAF;(有一些头文件也这样书写,0 xAF是IE寄存器中的最高位的地址,与IE7的写法作用相同
19、)把IE这个寄存器中的最高位重新命名为EA,以后单独操作EA即可。本例中的TMOD、TH0、TL0、TR0四个名称之所以能在程序中代表相关寄存器来使用,就是因为它们已经在头文件中进行了声明。注意:在应用时,如果将大写的TMOD或EA写成小写的tmod或ea,编译程序时将会出错,找不到tmod或ea,因为在头文件中定义的是“sfr TMOD=0 x89;”“sbit EA=IE7;”都是大写的,这也是大多数初学者开始编写程序时容易犯的错误。,10.2 C51程序设计,10.2.1定时/计数器初始化程序设计举例2、主函数main()一个没有返回值,没有参数的函数。格式:void main()或vo
20、id main(void)说明:(1)任何一个C程序中可以包含一个或多个函数,其中必须包含main函数(且只能有一个),本例中只有一个函数main(),它是整个程序开始执行的入口,所有的单片机在运行程序时,总是从主函数开始运行的。(2)无返回值的函数:main()是一个无返回值的函数,其前面的void表示无返回值的意思(void可省略不写),该函数执行完后不返回任何值。(3)无参数的函数:main()是一个无参数的函数,表示该函数不带任何参数,即main后面的括号中没有任何参数,括号中是空的或void。(4)在main()之后有两个大括号,程序中所有的代码都写在两个大括号内,代码中的每条语句后
21、都要加上分号,语句与语句之间可以用空格或回车隔开。,10.2 C51程序设计,10.2.1定时/计数器初始化程序设计举例3、注释注释有两种写法:(1)只能注释一行,当换行时,需要在新行上重新写两个斜扛进行注释。(2)/*/可以注释任意行,即斜扛星号与星号斜扛之间的所有文字都作为注释。所有注释都不参与程序编译,编译器在编译过程中会自动删除注释,一般在编写较大的程序时都应加上注释,这样,以后当我们再次读程序时,因为有了注释,其代码的意义便一目了然了。若无注释,我们不得不将程序重新阅读一遍方可知道代码含义。,10.2 C51程序设计,10.2.2点亮发光二极管实现流水灯程序实现流水灯,可以用移位操作
22、来实现,也可以用C51自带的函数来实现。1、循环移位操作在10.1节中我们介绍了移位运算符,这里我们来学习循环移位操作。(1)循环右移被操作数的各位依次向右移动一位,其中,最低位移入最高位。C语言中没有专门的循环右移位运算符,我们可以利用右移位运算符编写程序实现循环右移位,或直接利用C51中自带的库函数_cror_来实现。循环右移位操作,如图10-3所示。,10.2 C51程序设计,10.2.2点亮发光二极管实现流水灯程序【例10-2】编写程序实现如下功能,使变量t中的值循环右移位。#include/包含头文件unsigned char t;/定义无符号字符类型变量tvoid main()/主
23、函数t=0 x66;/给t赋初始值while(1)/循环程序,每次循环使t中的当前值左移1位t=t1;,10.2 C51程序设计,10.2.2点亮发光二极管实现流水灯程序(2)循环左移 被操作数的各位依次向左移动一位,其中,最高位移入最低位。C语言中没有专门的循环左移位运算符,我们可以利用左移位运算符编写程序实现循环左移,或直接利用C51库中自带的函数_crol_来实现。循环左移位操作,如图10-4所示。,10.2 C51程序设计,10.2.2点亮发光二极管实现流水灯程序【例10-3】编写程序实现如下功能,使变量t中的值循环左移位。#include/包含头文件unsigned char t;/
24、定义无符号字符类型变量tvoid main()/主函数t=0 x55;/给t赋初始值while(1)/循环程序,每次循环使t中的当前值左移1位t=t1;,10.2 C51程序设计,10.2.2点亮发光二极管实现流水灯程序2、移位函数_crol_介绍大家打开Keil软件安装文件夹,定位到KeilC51HLP文件夹,打开此文件夹下的C51lib文件,这是C51自带库函数帮助文件。在索引栏我们找到_crol_函数,双击打开它的介绍,内容如下:#include unsigned char _crol_(unsigned char c,/*character to rotate left*/unsign
25、ed char b);/*bit positions to rotate*/,10.2 C51程序设计,10.2.2点亮发光二极管实现流水灯程序2、移位函数_crol_介绍大家打开Keil软件安装文件夹,定位到KeilC51HLP文件夹,打开此文件夹下的C51lib文件,这是C51自带库函数帮助文件。在索引栏我们找到_crol_函数,双击打开它的介绍,内容如下:#include unsigned char _crol_(unsigned char c,/*character to rotate left*/unsigned char b);/*bit positions to rotate*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 单片机 C51 程序设计 课件
链接地址:https://www.31ppt.com/p-4095656.html