您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第10章 单片机C51程序设计
第10章目录10.1C51程序设计基础10.1.1C51中的基本数据类型10.1.2C51中扩充的数据类型10.1.3C51中的运算符10.1.4C51中的语句及程序结构10.2C51程序设计10.2.1定时/计数器初始化程序设计举例10.2.2点亮发光二极管实现流水灯程序10.2.3单个中断系统设计举例10.2.4定时器程序设计举例10.2.5串行通信程序设计举例10.1C51程序设计基础10.1.1C51中的基本数据类型C语言中的数据有常量和变量之分,当我们在编写单片机程序时,用到的相关变量在单片机的内存中都要占据一定的存储空间,变量大小不同,所占据的空间就不同,所以,“变量”数据的大小是有限制的,我们不能随意给一个变量赋任意大小的值。为了合理利用内存空间,我们在编程时就要选择大小合适的数据,不同的数据类型也就代表了不同大小的数据,所以,我们在使用变量之前,首先要声明这个变量的类型,以便让编译器提前从内存中为其分配空间。表10-1列出了C51的基本数据类型。10.1C51程序设计基础10.1.1C51中的基本数据类型表10-1C51的基本数据类型数据类型关键字长度取值范围字符型字符型char1字节-128~+127无符号字符型usignedchar1字节0~255有符号字符型signedchar1字节-128~+127整型基本型无符号usignedint2字节0~65535有符号[signed]int2字节-32768~+32767短整型无符号usignedshort[int]2字节0~65535有符号[signed]short[int]2字节-32768~+32767长整型无符号usignedlong[int]4字节0~4294967295有符号[signed]long[int]4字节-2147483648~+2147483647浮点型单精度float4字节-3.4×10-38~3.4×1038双精度double8字节-1.7×10-308~1.7×10308长双精度longdouble16字节-1.2×10-4932~1.7×104932位类型bit1位0~110.1C51程序设计基础10.1.1C51中的基本数据类型说明:(1)在单片机中,所有的数据都是以二进制的形式存储在存储器中的,其中,1个字节=8位二进制(即1Byte=8bit)。(2)在C语言中:shortint即为int,longint即为long。(3)前面若无unsigned则一律认为是signed型。(4)一般情况下,float型数据只能提供7位有效数字,double型数据能够提供15~16位有效数字,但是这个精度还和编译器有关系,并不是所有的编译器都遵守这条原则。10.1C51程序设计基础10.1.1C51中的基本数据类型例如:floatx;x=32.45678912;由于float类型的有效数字是7位,故x=32.45679,若将x改成double类型的则能将32.45678912全部存放在x中,所以,在声明变量时应根据其使用情况来为其选择类型。例如:inti=9;在内存中占16位(即2个字节的存储单元)。10.1C51程序设计基础10.1.2C51中扩充的数据类型在C51中除以上基本数据类型外,为了适应单片机程序开发的需要又扩充了如下的数据类型。①位变量声明bit:声明一个位变量。②8位寄存器声明sfr:声明一个8位寄存器。③16位寄存器声明sfr16:声明一个16位寄存器。④特殊功能位声明sbit:声明特殊功能寄存器中的某一位。10.1C51程序设计基础10.1.2C51中扩充的数据类型bitflag;说明:声明了一个变量名为flag的位变量。sfrTCON=0x88H;说明:单片机内部有很多特殊功能寄存器(sfr),每个sfr在单片机内部都分配有唯一的一个地址,当我们在程序中使用sfr时,我们一般通过声明将相应的地址编号赋给一个名称,以后通过该名称来使用相应sfr,其中这些声明绝大多数都包含在相应的头文件(如:reg51.h)中。本例中TCON是单片机的定时器/计数器控制寄存器,它在单片机内存中的地址为0x88H,经过该语句声明以后,如在后面的程序中使用该寄存器则只需使用其名称TCON即可,当程序进行编译时,编译器也知道实际要操作的是单片机内部0x88地址处的这个寄存器,而TCON仅仅是这个地址的一个代号或名称而已,当然,我们也可以声明成其他的名称。10.1C51程序设计基础10.1.2C51中扩充的数据类型sfr16T1=0x8BH;说明:声明了一个16位SFR,起始地址为0x8BH,道理与上例相同不再重复解释。sbitTR0=TCON^4;说明:首先应该有sfrTCON=0x88H;这句的声明后,我们才知道TCON是定时器/计数器控制寄存器的名称,它是一个8位的寄存器,其中,TCON^0为最低位,TCON^7为最高位,通过本例的声明,以后当我们使用TCON^4时,直接操作TR0即可,当然,我们也可以将TCON^4声明成其他的名称。10.1C51程序设计基础10.1.3C51中的运算符绝大多数的程序都需要对数据进行加工处理,即进行运算,要进行运算就得规定可以使用的运算符,C51中的运算符与C语言基本相同,在单片机程序开发过程中最常用的主要有算术运算符、关系运算符、逻辑运算符和位运算符等。10.1C51程序设计基础10.1.3C51中的运算符说明:(1)“==”表示测试两数是否相等,如a==b,测试a和b中的值是否相等。(2)“!=”表示测试两数是否不相等,如a!=b,测试a和b中的值是否不相等。10.1C51程序设计基础10.1.3C51中的运算符说明:(1)右移,操作符为“”,每执行一次右移指令,被操作数的各位依次向右移动一位,其中,最高位补0,最低位移入PSW寄存器CY位,CY位中原来的数被覆盖。如图10-1所示。(2)左移,操作符为“”,每执行一次左移指令,被操作数的各位依次向左移动一位,其中,最高位移入PSW寄存器CY位,CY位中原来的数被覆盖,最低位补0,如图10-2所示。10.1C51程序设计基础10.1.3C51中的运算符其他运算符赋值运算符:=条件运算符:?:逗号运算符:,指针运算符:*和&求字节运算符:sizeof强制类型转换运算符:(类型)成员运算符:.—>下标运算符:[]其他10.1C51程序设计基础10.1.4C51中的语句及程序结构1、语句C51程序是由语句组成的,其中,语句可分为以下几类:(1)表达式语句:由一个表达式(赋值表达式、算术运算表达式、关系表达式、逻辑表达式等)加上一个分号构成,最典型的就是赋值表达式构成的赋值语句。例如:x=3.6;(2)函数调用语句:由一个函数调用加上一个分号构成。例如:printf(“Helloeveryone!”);说明:在屏幕上输出显示Helloeveryone!10.1C51程序设计基础10.1.4C51中的语句及程序结构(3)控制语句:条件语句:if、switch。循环语句:for、while、dowhile。控制转移语句:break、continue、return、goto。(4)复合语句:用{}把一些语句和声明括起来就构成了复合语句。{floatx=3,y=9,z;z=x+y;printf(“z=%f”,z);}(5)空语句:只有一个分号;什么也不做,可以作为程序流程的转向点,也可用作循环语句的循环体(循环体是空语句)。10.1C51程序设计基础10.1.4C51中的语句及程序结构2、程序结构由以上语句可以构成C程序的三大结构,即顺序结构、选择结构(分支结构)、循环结构。(1)顺序结构:仅仅是简单的一个语句一个语句的执行。(2)选择结构:主要由条件语句构成。(3)循环结构:主要由循环语句构成,与标准C语言一样,循环结构中可以使用break、continue、return、goto。10.1C51程序设计基础10.1.5C51中的头文件C51中已定义的常用的头文件主要有如下类别:absacc.h---包含允许直接访问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.1C51程序设计基础10.1.5C51中的头文件在单片机程序中,经常使用的头文件主要有math.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声明的内容。10.1C51程序设计基础10.1.5C51中的头文件在单片机程序中,经常使用的头文件主要有math.h、reg51.h或reg52.h、stdio.h等。⒊、头文件stdio.h包含了与标准输入输出库有关的变量定义和宏定义以及对函数的声明,标准输入输出函数主要有printf、scanf、putchar、getchar等。除以上已定义的头文件外,用户也可以根据自己的需要定义扩展名为.h的头文件,存放到指定的目录下,在编程中可以直接使用。10.2C51程序设计10.2.1定时/计数器初始化程序设计举例【例10-1】在8051单片机中,利用定时器T0产生50ms的定时时间。通过本例我们将对头文件、主函数main()、注释等三个方面的知识点做讲解。程序代码如下:#includereg51.h//包含头文件voidmain(){TMOD=0x01;//设置定时器0为方式1、定时模式TH0=(65536-45872)/256//装初值TL0=(65536-45872)%256;TR0=1;//启动定时器0while(1)//程序停止}10.2C51程序设计10.2.1定时/计数器初始化程序设计举例说明:(1)按照定时/计数器的初始化流程,首先设置TMOD=0x01,置T0工作于方式1、定时模式,给TH0和TL0装入初值,之后启动定时器开始计时,获得50ms的时间。(2)下面说一下初值的计算。晶振频率为fosc=11.0592Mhz机器周期T=12*1/fosc=12*1/11.0592Mhz=1.09μs计数值=50×10-3/(1.09×10-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装入TLO中。10.2C51程序设计10.2.1定时/计数器初始化程序设计举例1、头文件(1)头文件包含的书写方法:两种当使用#includereg51.h时(即本例中所使用的方法),编译器先进入
本文标题:第10章 单片机C51程序设计
链接地址:https://www.777doc.com/doc-3207704 .html