《MCS-51单片机C语言程序设计.ppt》由会员分享,可在线阅读,更多相关《MCS-51单片机C语言程序设计.ppt(48页珍藏版)》请在三一办公上搜索。
1、以MCS-51单片机为例讲解通信工程学院自动化系主讲人:张志成,单片机原理及应用,2023/11/8,吉林大学通信工程学院,Page 2,课程安排,第一章 MCS-51单片机概述第二章 MCS-51单片机的硬件结构第三章 单片机C语言程序设计第四章 MCS-51单片机的中断系统第五章 MCS-51单片机的定时器/计数器第六章 MCS-51单片机的串行通信第七章 MCS-51单片机的外围器件及扩展,2023/11/8,吉林大学通信工程学院,Page 3,第三章 单片机C语言程序设计,3.1 C语言与MCS-51单片机3.2 C51的数据类型与运算3.3 C51流程控制语句3.4 C51构造数据类
2、型3.5 C51函数3.6 模块化程序设计,2023/11/8,吉林大学通信工程学院,Page 4,3.1 C语言与MCS-51单片机,一、MCS-51的编程语言四种语言支持MCS-51单片机:BASIC、PL/M、汇编语言和C语言。汇编语言:用汇编程序设计MCS51系列单片机应用程序时,必须要考虑其存储器结构,尤其必须考虑其片内数据存储器与特殊功能寄存器正确、合理的使用以及按实际地址处理端口数据。C语言:C语言是一种源于编写UNIX操作系统的语言,是一种结构化语言,可产生紧凑代码。,2023/11/8,吉林大学通信工程学院,Page 5,与汇编语言相比,C语言有如下优点:对单片机指令系统不要
3、求了解,仅要求对8051存储器结构有初步了解;寄存器的分配,不同存储器的寻址及数据类型等细节可由编译器管理;程序有规范的结构,分为不同的函数,使程序结构化;更符合人们的思考习惯;改善了程序的可读性;编程及程序调试时间显著缩短,从而提高效率;提供的库包含许多标准子程序,具有较强数据处理能力;很好的结构性和模块化更容易阅读和维护,而且由于有更好的可移植性很多处理器支持C编译器。,2023/11/8,吉林大学通信工程学院,Page 6,二、C51编译器 用C语言编写的应用程序必须经单片机的C语言编译器(简称C51),转换生成单片机可执行的代码程序。支持MCS51系列单片机的C语言编译器有很多种。如:
4、American Automation IAR Avocet Dunfield Shareware Bso/Tasking KEIL/Franklin,2023/11/8,吉林大学通信工程学院,Page 7,三、C51程序结构C51源程序大体上是一个函数定义的集合,集合中仅有一个名为main的主函数。主函数是程序的入口,主函数中所有语句执行完毕,则程序执行完成。,2023/11/8,吉林大学通信工程学院,Page 8,函数定义由类型,函数名,参数表和函数体组成。格式如下:类型 函数名(参数表)参数说明;数据说明部分;执行语句部分;,2023/11/8,吉林大学通信工程学院,Page 9,C51
5、程序结构说明:1)C语言是由函数构成的。一个C源程序至少包含一个函数,也可以包含一个main函数和若干其他函数。函数是C程序的基本单位。2)函数分为2大类:一类是库函数,一类是用户自定义函数。库函数是C51在库文件中已定义的函数,其函数说明在其头文件中。用户函数是用户自己定义,自己调用的一类函数。,2023/11/8,吉林大学通信工程学院,Page 10,3)函数由2部分组成:函数说明部分:它包括函数名,函数类型,函数属性,函数参数名和形式参数类型。一个函数名后面必须跟一个(),函数参数可以没有。函数体部分:函数说明部分下面的大括号内的内容。函数体一般包括:变量定义和执行部分(由若干语句组成)
6、,2023/11/8,吉林大学通信工程学院,Page 11,4)一个C51程序总是从main 函数开始执行的,而不论main函数在整个程序中的位置如何。5)每个语句和数据定义的最后必须有一个分号。6)C语言本身没有输入/输出语句,输入和输出操作是有库函数scanf和printf等函数来完成的。7)可以用/*/对C程序中的任何部分作注释。,2023/11/8,吉林大学通信工程学院,Page 12,C51程序开发过程 C51源程序是一个ASCII文件,可以用任何标准的ASCII文件编辑器来编写,如:写字板,记事本等。C51程序机构与一般C语言没有什么差别,程序的书写格式自由度高,灵活性强,有较大的
7、任意性。,2023/11/8,吉林大学通信工程学院,Page 13,要点如下:1)一般情况下,每个语句占用一行。2)不同结构层次的语句,从不同的起始位置开始,即在同一结构层次中的语句,缩进同样的字数。3)表示结构层次的大括号通常写在该结构语句第一字母的下方,与机构化语句对齐,并占用一行。,2023/11/8,吉林大学通信工程学院,Page 14,2023/11/8,吉林大学通信工程学院,Page 15,C51与标准C语言的区别 C51的语法规定、程序结构及程序设计方法都与标准的C语言程序设计相同,但C51程序与标准的C程序在以下几个方面不一样:(1)C51中定义的库函数和标准C语言定义的库函数
8、不同。标准的C语言定义的库函数是按通用微型计算机来定义的,而C51中的库函数是按MCS-51单片机相应情况来定义的;(2)C51中的数据类型与标准C的数据类型也有一定的区别,在C51中还增加了几种针对MCS-51单片机特有的数据类型;,2023/11/8,吉林大学通信工程学院,Page 16,(3)C51变量的存储模式与标准C中变量的存储模式不一样,C51中变量的存储模式是与MCS-51单片机的存储器紧密相关;(4)C51与标准C的输入输出处理不一样,C51中的输入输出是通过MCS-51串行口来完成的,输入输出指令执行前必须要对串行口进行初始化;(5)C51与标准C在函数使用方面也有一定的区别
9、,C51中有专门的中断函数。,2023/11/8,吉林大学通信工程学院,Page 17,3.2 C51的数据类型与运算,一、数据与数据类型数据:具有一定各式的数字或数值叫做数据。数据时计算机操作的对象。数据类型:数据的不同各式叫做数据类型。数据结构:数据按一定的数据类型进行的排列、组合及架构称为数据结构。,2023/11/8,吉林大学通信工程学院,Page 18,C51数据类型分类,2023/11/8,吉林大学通信工程学院,Page 19,KEIL C51的数据类型,2023/11/8,吉林大学通信工程学院,Page 20,二、常量与变量常量:在程序运行的过程中,其值不能改变的量称为常量。变量
10、:在程序运行的过程中,其值可以改变的量称为变量。一个变量主要由两部分构成一个是变量名,一个是变量值。每个变量都有一个变量名,在内存中占据一定的存储单元(地址),并在该内存单元中存放该变量的值。,2023/11/8,吉林大学通信工程学院,Page 21,C51数据在MCS-51中的存储方式(1)位变量(bit):变量的类型是位,位变量的值可以是1(true)或0(false)。与MCS-51硬件特性操作有关的可以定义成位变量必须定位在MCS-51单片机片内RAM的位寻址空间中。(2)字符变量(char):字符变量的长度为1 byte即8位。这很合适MCS-51单片机,因为MCS-51单片机每次可
11、处理8位数据。对于无符号变量(unsigned char)的值域范围是0255。对于有符号字符变量(signed char),最具有重要意义的位是最高位上的符号标志位(msb)。此位为1代表“负”,为0代表“正”。有符号字符变量和无符号字符变量在表示0127的数值时,其含义是一样的,都是00 x7F。负数一般用补码表示。,2023/11/8,吉林大学通信工程学院,Page 22,(3)整型变量(int):整型变量的长度为16位。MCS-51系列单片机将int型变量的高位字节数存放在低地址字节中,低位字节数存放在高地址字节中。可直接使用几种专用的机器指令来完成多字节的加、减、乘、除运算。整型变量
12、值0 x1234以下图所示的方式存放在内存中。,地址,+0,+1,2023/11/8,吉林大学通信工程学院,Page 23,(4)长整型变量(long):长整型变量的长度是32位,占用4字节(Byte),其它方面与整型变量(int)相似。长整型变量值0 x12345678以下图所示的方式存放在内存中。,+0+1+2+3,地址,2023/11/8,吉林大学通信工程学院,Page 24,(5)浮点型变量(float):浮点型变量为32位,占4个字节,许多复杂的数学表达式都采用浮点变量数据类型。应用符号位表示数的符号,用阶码和尾数表示数的大小。在编程时,如果只强调运算速度而不进行负数运算时,最好采用
13、无符号(unsigned)格式。无符号字符类型的使用:无论何时,应尽可能使用无符号字符变量,因为它能直接被MCS-51所接受。基于同样的原因,也应尽量使用位变量。有符号字符变量虽然也只占用一个字节,但需要进行额外的操作来进行测试代码的符号位。这无疑会降低代码效率。,2023/11/8,吉林大学通信工程学院,Page 25,在编程时,为了书写方便,经常用简化的缩写形式来定义数据类型。其方法是在源程序开头使用#define语句自定义简化的类型标识符。例如:#define uchar unsigned char#define uint unsigned int 这样,在编程中,就可以用uchar代替
14、unsigned char,用uint代替unsigned int来定义变量。,2023/11/8,吉林大学通信工程学院,Page 26,三、C51数据的存储类型与MCS-51存储器结构 KEIL C51完全支持MCS-51单片机的硬件结构,可以完全访问MCS-51硬件系统的所有部分。该编译器通过将变量、常量定义成不同的存储类型(data,bdata,idata,pdata,xdata,code)的方法,将他们定义在不同的存储区中。,2023/11/8,吉林大学通信工程学院,Page 27,2023/11/8,吉林大学通信工程学院,Page 28,C51存储类型与MCS-51存储空间的对应关系
15、,2023/11/8,吉林大学通信工程学院,Page 29,C51存储类型及其数据长度和值域,2023/11/8,吉林大学通信工程学院,Page 30,带存储类型的变量的定义的一般格式为 数据类型 存储类型 变量名带存储类型的变量定义举例:char data var1;bit bdata flags;float idata x,y,z;unsigned int pdata var2;unsigned char vector34;,2023/11/8,吉林大学通信工程学院,Page 31,存储模式 存储模式决定了变量的默认存储类型、参数传递区和无明确存储类型说明变量的存储类型。如果在变量定义时略
16、去存储类型标识符,则编译器会自动选择默认的存储类型。默认的存储类型进一步由SMALL、COMPACT和LARGE存储模式指令限制。,2023/11/8,吉林大学通信工程学院,Page 32,存储模式及说明,2023/11/8,吉林大学通信工程学院,Page 33,四、MCS-51特殊功能寄存器(SFR)的C51定义 MCS-51单片机中,除了程序计数器PC和4组工作寄存器组外,其它所有的寄存器均为特殊功能寄存器(SFR),分散在片内RAM区的高128字节中,地址范围为80H0FFH。SFR中有11个寄存器具有位寻址能力,它们的字节地址都能被8整除,即字节地址是以8或0为尾数的。为了能直接访问这
17、些SFR,KEIL C51提供了一种自主形式的定义方法,这种定义方法与标准C语言不兼容,只适用于对MCS-51系列单片机进行C语言编程。特殊功能寄存器C51定义的一般语法格式如下:sfr sfr-name=int constant;,2023/11/8,吉林大学通信工程学院,Page 34,sfr是定义语句的关键字,其后必须跟一个MSC-51单片机真实存在的特殊功能寄存器名,=后面必须是一个整型常数,不允许带有运算符的表达式,是特殊功能寄存器sfr-name的字节地址,这个常数值的范围必须在SFR地址范围内,位于0 x800 xFF。例如:sfr SCON=0 x98;/*串口控制寄存器地址9
18、8H*/sfr TMOD=0 x89;/*定时器/计数器方式控制寄存器地址89H*/,2023/11/8,吉林大学通信工程学院,Page 35,在新的MCS-51系列产品中,SFR在功能上经常组合为16位值,当SFR的高字节地址直接位于低字节之后时,对16位SFR的值可以直接进行访问。例如52子系列的定时器/计数器2就是这种情况。为了有效地访问这类SFR,可使用关键字sfr16来定义,其定义语句的语法格式与8位SFR相同,只是=后面的地址必须用16位SFR的低字节地址,即低字节地址作为sfr16的定义地址。例如:sfr16 T2=0 xCC/*定时器/计数器2:T2低8位地址为0CCH,T2高
19、8位地址为0CDH*/这种定义适用于所有新的16位SFR,但不能用于定时器/计数器0和1,2023/11/8,吉林大学通信工程学院,Page 36,对于位寻址的SFR中的位,C51支持特殊位的定义。第一种格式:sbit bit-name=sfr-nameint constant sbit是定义语句的关键字,后跟一个寻址位符号名(该位符号名必须是MCS-51单片机中规定的位名称),=后的sfr-name必须是已定义过的SFR的名字,后的整常数是寻址位在特殊功能寄存器sfr-name中的位号,必须是07范围中的数。例如:sfr PSW=0 xD0;/*定义PSW寄存器地址为D0H*/sbit OV
20、=PSW2;/*定义OV位为PSW.2,地址为D2H*/sbit CY=PSW7;/*定义CY位为PSW.7,地址为D7H*/,2023/11/8,吉林大学通信工程学院,Page 37,第二种格式:sbit bit-name=constantint constant=后的char constant为寻址地址位所在的特殊功能寄存器的字节地址,符号后的int constant为寻址位在特殊功能寄存器中的位号。例如:sbit OV=0 xD02;/*定义OV位地址是D0H字节 中的第2位*/sbit CY=0 xD07;/*定义CY位地址是D0H字节中 的第7位*/,2023/11/8,吉林大学通信
21、工程学院,Page 38,第三种格式:sbit bit-name=char constant;=后的char constant为寻址位的绝对位地址。例如:sbit OV=0 xD2;/*定义OV位地址为D2H*/sbit CY=0 xD7;/*定义CY位地址为D7H*/特殊功能位代表了一个独立的定义类,不能与其它位定义和位域互换。,2023/11/8,吉林大学通信工程学院,Page 39,五、位变量(BIT)的C51定义1、位变量C51定义。使用C51编程时,定义了位变量后,就可以用定义了的变量来表示MCS-51的位寻址单元。位变量的C51定义的一般语法格式如下:位类型标识符(bit)位变量名
22、 例如:bit direction_bit;/*把direction_bit定 义为位变量*/bit look_pointer;/*把look_pointer定义 为位变量*/,2023/11/8,吉林大学通信工程学院,Page 40,2、关于为变量的说明:(1)函数可包含类型为bit的参数,也可以将其作为返回值。(2)对位变量定义的限制。位变量不能定义成一个指针,如不能定义:bit*bit_pointer。不存在位数组,如不能定义:bit b_array。(3)在位定义中,允许定义存储类型,位变量都被放入一个位段,此段总位于MCS-51片内的RAM区中。因此,存储类型限制为data和idat
23、a,如果将位变量的存储类型定义成其它存储类型都将编译出错。,2023/11/8,吉林大学通信工程学院,Page 41,六、C51运算符、表达式及其规则 1、算术运算符及其表达式 基本的5种算术运算符:+加法运算符或正值运算符-减法运算符或负值运算符*乘法运算符/除法运算符%模运算符或称求余运算符,2023/11/8,吉林大学通信工程学院,Page 42,2、关系运算符及其表达式 1)六种关系运算符 小于=大于或等于=测试等于!=测试不等于 2)优先级,=优先级相同(高)=,!=优先级相同(低),2023/11/8,吉林大学通信工程学院,Page 43,3、逻辑运算符及其表达式 1)逻辑运算符&
24、逻辑“与”(AND)|逻辑“或”(OR)!逻辑“非”(NOT)2)优先级!优先级最高算术运算关系运算再次之&和|赋值运算优先级最低,2023/11/8,吉林大学通信工程学院,Page 44,4、位运算及其表达式 1)位运算符&按位与|按位或 按位异或 按位取反 右移 2)位运算符只能是整型或字符型数,不能为实型数据。,2023/11/8,吉林大学通信工程学院,Page 45,【例】设a=0 x45=01010100B,b=0 x3B=00111011B,则a&b、a|b、ab、a、a2分别为多少?a&b=00010000b=0 x10a|b=01111111B=0 x7Fab=01101111
25、B=0 x6Fa=10101011B=0 xABa2=00001110B=0 x0E,2023/11/8,吉林大学通信工程学院,Page 46,5、复合运算符及其表达式 1)复合赋值运算符+=加法赋值+减法赋值*=乘法赋值/=除法赋值%=取模赋值&=逻辑与赋值|=逻辑或赋值=逻辑异或赋值=逻辑非赋值=右移位赋值=2相当于x=x2。,2023/11/8,吉林大学通信工程学院,Page 47,6、逗号运算符 在C51语言中,逗号“,”是一个特殊的运算符,可以用它将两个或两个以上的表达式连接起来,称为逗号表达式。逗号表达式的一般格式为:表达式1,表达式2,表达式n 程序执行时对逗号表达式的处理:按从
26、左至右的顺序依次计算出各个表达式的值,而整个逗号表达式的值是最右边的表达式(表达式n)的值。例如:x=(a=3,6*3)结果x的值为18。,2023/11/8,吉林大学通信工程学院,Page 48,7、条件运算符 条件运算符“?:”是C51语言中唯一的一个三目运算符,它要求有三个运算对象,用它可以将三个表达式连接在一起构成一个条件表达式。条件表达式的一般格式为:逻辑表达式?表达式1:表达式2 其功能是先计算逻辑表达式的值,当逻辑表达式的值为真(非0值)时,将计算的表达式1的值作为整个条件表达式的值;当逻辑表达式的值为假(0值)时,将计算的表达式2的值作为整个条件表达式的值。例如:条件表达式max=(ab)?a:b的执行结果是将a和b中较大的数赋值给变量max。,