单片机的C语言编程ppt课件.ppt

上传人:牧羊曲112 文档编号:1405546 上传时间:2022-11-20 格式:PPT 页数:38 大小:875KB
返回 下载 相关 举报
单片机的C语言编程ppt课件.ppt_第1页
第1页 / 共38页
单片机的C语言编程ppt课件.ppt_第2页
第2页 / 共38页
单片机的C语言编程ppt课件.ppt_第3页
第3页 / 共38页
单片机的C语言编程ppt课件.ppt_第4页
第4页 / 共38页
单片机的C语言编程ppt课件.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《单片机的C语言编程ppt课件.ppt》由会员分享,可在线阅读,更多相关《单片机的C语言编程ppt课件.ppt(38页珍藏版)》请在三一办公上搜索。

1、单片机的C语言编程称为C51编程,应用C51编程具有以下优点: (1)C51编译器管理内部寄存器和存贮器的分配,编程时,无需考虑不同存储器的寻址和数据类型等细节问题; (2)程序有规范的结构,可分成不同的函数,这种方式具有良好的模块化结构,使已编好程序容易移植; (3)有丰富的子程序库可直接引用,具有较强的数据处理能力,从而大大减少用户编程的工作量; (4)C语言和汇编语言可以交叉使用。 汇编语言程序代码短、运行速度快、但复杂运算编程耗时。用汇编语言编写与硬件有关的部分程序,用C语言编写与硬件无关的运算部分程序,充分发挥两种语言的长处,提高开发效率。,第4章 单片机的C语言编程,4.1 C51

2、程序结构特点,同标准C一样,C51的程序是由函数组成。C语言的函数以“”开始,以“”结束。 其中必须有一个主函数main(),程序的执行从主函数main() 开始,调用其他函数后返回主函数main(),最后在主函数中结束整个程序,而不管函数的排列顺序如何。 C语言的语句规则: 1.每个变量必须先说明后引用。 2.C语言程序一行可以书写多条语句,但每个语句必须以“;”结尾,一个语句也可以多行书写。 3.C语言的注释用/*/表示。 4.“”花括号必须成对,位置随意,多个花括号可同行书写,也可逐行书写。,C语言程序的组成结构: 全局变量说明 /*可被各函数引用*/ main( ) /*主函数*/ 局

3、部变量说明 /*只在本函数引用*/执行语句(包括函数调用语句); fun1(形式参数表) /*函数1*/ 形式参数说明 局部变量说明 执行语句(包括调用其他函数语句) funn(形式参数表) /*函数n*/ 形式参数说明 局部变量说明 执行语句 ,标识符用来标识源程序中某个对象的名字,这些对象可以是语句、数据类型、函数、变量、数组等。标识符区分大小写,第一个字符必须是字母或下划线。 C51中有些库函数的标识符是以下划线开头的,所以一般不要以下划线开头命名标识符。 C51编译器规定标识符只有32个字符在编译时有效,因此在编写源程序时标识符的长度不要超过32个字符。 关键字是编程语言保留的特殊标识

4、符,在C语言的程序编写中不允许标识符与关键字相同。 Keil C51编译器的关键字除了有ANSI C标准的32个关键字外还根据51单片机的特点扩展了相关的关键字。,4.2 C51的标识符和关键字,ANSI C标准关键字(1),ANSI C标准关键字(2),Keil C51编译器扩展的关键字(1),Keil C51编译器扩展的关键字(2),4.3 C51的数据类型,C51的数据有常量和变量之分。 常量 在程序运行中其值不变的量。 变量 在程序运行中其值可以改变的量。 定义一个变量,编译系统就会自动为它安排一个存贮区,具体的地址值 ,用户不必在意。 一个变量由变量名和变量值构成. 变量名:存贮单元

5、地址的符号表示。 变量的值:变量所在地址单元存放的内容。 数据类型:数据的长度。,C51编译器支持数据类型,02:57,11,C51增加的特殊的数据类型,1bit位标量,bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量。它的值是一个二进制位,不是0,就是1。 bit 位变量名 例: bit lock; /*将lock定义为位变量*/ lock=1;,02:57,12,2sfr特殊功能寄存器,MCS-51系列单片机片内有21个特殊功能寄存器(SFR),分散在片内RAM区的0 x800 xFF地址范围内。对SFR的操作只能用直接寻址方式。 为了能直接访问这些特殊功能寄存器,C5

6、1提供了定义sfr的方法。 sfr是一种C51扩充数据类型,占用一个内存单元,值域为0255。语法如下: sfr 特殊寄存器名 = 寄存器地址,02:57,13,例如:sfr P1 = 0 x90 P1 = 255 定义一个特殊功能寄存器变量“P1”,0 x90是指51单片机的P1端口地址90H,变量P1即指51单片机的P1端口。 在后面的语句中可以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句操作特殊功能寄存器。,02:57,14,例:sfr PSW=0 xD0;/*定义程序状态字PSW, 因MCS-51单片机的PSW 地址为D0H*/sfr TMOD=0 x89;/*定义定时

7、/计数器方式控制寄存器TMOD, 因MCS-51单片机的TMOD地址为89H*/sfr SCON=0 x98;/*定义串口控制寄存器SCON, 因MCS-51单片机的SCON地址为8H*/,02:57,15,3. sfr16 16位特殊功能寄存器,sfr16也是一种C51扩充数据类型,用于定义存在于MCS-51单片机内部RAM的16位特殊功能寄存器,如定时器T0和T1。 sfr16型数据占用2个内存单元,取值范围为065535。,02:57,16,sbit也是一种C51扩充数据类型,利用sbit访问芯片内部可寻址的特殊功能寄存器中的位。 定义方法有如下三种: (1)sbit 特殊功能寄存器位名

8、 = 位地址 将位的绝对地址赋给位变量,位地址必须位于80HFFH(特殊功能寄存器的位地址)之间。,4sbit可寻址位,02:57,17,(2)sbit 特殊功能寄存器位名= 特殊功能寄存器名位位置 当可寻址位位于特殊功能寄存器中时,可采用这种方法。位位置是一个07之间的常数。(3)sbit sbit 特殊功能寄存器位名= 字节地址位位置 这种方法是以一个常数(字节地址)作为基地址,该常数必须在80HFFH(特殊功能寄存器的字节地址)之间。位位置是一个07之间的常数。,02:57,18,例:sfr PSW=0 xD0;/*首先定义程序状态字PSW, 因MCS-51单片机的PSW地址为D0H*/

9、sbit OV=PSW2; /*在前面定义了PSW后,OV位于PSW的第2位*/sbit AC=0 xD06; /*D0H是程序状态字PSW的字节地址, 辅助进位标志位AC位于PSW的第6位*/sbit RS0=0 xD03; /*工作寄存器组控制位RS0位于PSW的第3位*/sbit CY=0 xD7; /*进位标志位Cy的绝对位地址为D7H*/,对位变量的定义,C51对位变量的定义方法有三种: 1. 定义bit类型变量 如 bit mn;mn为位变量,其值只能是“0”或“1”,其位地址C51自行安排在可位寻址区的bdata区。 2.采用字节寻址变量.位的方法 如 bdata int iba

10、se; /*ibase定义为整型变量*/ sbit mybit=ibase15; /*mybit定义为 ibase的D15位*/ 这里位是运算符 “” 相当于汇编中的 “”,其后的最大取值依赖于该位所在的变量的类型,如定义为char最大值只能为7。,3.对特殊功能寄存器的位的定义 方法1:使用头文件及sbit定义符;多用于无位名的可寻址位。 如 #include sbit P1_1=P11; /*P1_1为P1口的第1位*/ sbit ac=ACC7; /*ac定义为累加器A的第7位*/方法2:使用头文件reg51.h,再直接用位名称。 例如 #include RS1=1; RS0=0; 方法

11、3:用字节地址位表示 如 sbit OV=0 xD02;方法4:用寄存器名.位定义 如 sfr PSW=0 xd0; /*定义PSW地址为d0H*/ sbit CY=PSW7; /*CY为PSW7*/,02:57,21,例5-2 特殊功能寄存器的访问。,#include ”reg51.h”sbit P10=P10; /*定义P10为P1口第0位,即P1.0口*/sbit P12=P12; /*定义P12为P1口第2位,即P1.2口*/void main( )P10=1;/*置位P1.0口*/P12=0;/*复位P1.2口*/PSW=0 x08;/*程序状态字置0 x08*/,-应用实例,C5l

12、编译器除了能支持以上这些基本数据类型之外,还能支持一些复杂的组合型数据类型,如数组类型、指针类型、结构类型、联合类型等这些复杂的数据类型。,使用头文件 C51建有头文件 reg51.h、 reg52.h ,在该头文件中对51或52系列单片机所有的特殊功能寄存器的进行了sfr定义,对特殊功能寄存器的有位名称的可寻址位进行了sbit定义,因此,只要用包含语句#include 就可以直接引用特殊功能寄存器名,或直接引用位名称。 要特别注意:在引用时特殊功能寄存器或者位名称必须大写。,4.4 数据的存储类型和存储模式,同ANSI C一样,C51规定变量必须先定义后使用。C51对变量的进行定义的格式如下

13、:存储种类 数据类型 存储器类型 变量名表 其中,存储种类和存储器类型是可选项。存储类型是C51中增加的。一、变量的存储种类 按变量的有效作用范围可以将其划分为局部变量和全局变量;还可以按变量的的存储方式为其划分存储种类。 在C语言中变量有四种存储种类,即自动(auto)、外部(extern)、静态(static)和寄存器(register)。,二、数据的存储类型 C51是面向8XX51系列单片机及硬件控制系统的开发语言,它定义的任何变量必须以一定的存储类型的方式定位在8XX51的某一存储区中,否则便没有意义。因此在定义变量类型时,还必须定义它的存储类型,C51的变量有如下几种存储类型:,如果

14、在变量定义时省略了存储器类型标识符,C51编译器会选择默认的存储器类型。默认的存储器类型由SMALL、COMPACT和LARGE存储模式指令决定。1)data区 对data区的寻址是最快的,所以应该把使用频率高的变量放在data区,由于空间有限,必须注意使用data区,data区除了包含程序变量外,还包含了堆栈和寄存器组data区。 在SMALL存储模式下,未说明存储器类型时,变量默认被定位在data区。2)bdata区 当在DATA区的位寻址区定义变量,这个变量就可进行位寻址,并且声明位变量。这对状态寄存器来说十分有用,因为它可以单独使用变量的每一位,而不一定要用位变量名引用位变量。 3)i

15、data区 idata区也可以存放使用比较频繁的变量,使用寄存器作为指针进行寻址。在寄存器中设置8位地址进行间接寻址,与外部存储器寻址比较,它的指令执行周期和代码长度都比较短。,4)pdata和xdata区 在这两个区声明变量和在其他区的语法是一样的,pdata区只有256B,而xdata区可达65536B 5)code区 code区即80C51的程序代码区,所以代码区的数据是不可改变的,80C51的代码区不可重写。一般代码区中可存放数据表,跳转向量和状态表。 如果用户不对变量的存贮类型定义,则编译器承认默认存贮类型,默认的存贮类型由编译控制命令的存贮的模式部分决定。,例:,data char

16、 var; /*字符变量var定位在片内RAM区*/char code MSG=ENTER PARAMETER: /*字符数组定位在程序存贮区*/ unsigned long xdata array100; /* 无符号长型数组定位在片外 RAM区,每 元素占4bytes*/ float idata x,y,z; /*实型变量x,y,z,定位在片内用间址访问的内部RAM区*/ bit lock; /*位变量Lock定位在片内RAM可位寻址区*/unsigned int pdata dimension; /* 无符号整型变量 dimension定位在分页的外部RAM区 */ unsigned c

17、har xdata vector 1044; /* 无符号字符型三 维数组, 定位在片外RAM区*/,三、数据的存储模式 在固定的存贮器地址进行变量参数传递是C51的一个标准特征,定义了变量、参数传递区的存贮器模式,也就是默认了变量和参数传递区存贮器类型、无需再对变量和参数传递区的存贮器类型进行说明。 存贮器模式决定了变量的默认存贮器类型、参数传递区和无明确存贮区类型的说明。 有三种存贮器模式:SMALL、LARGE和COMPACT,1小(SMALL)模式 所有变量都默认在8051的内部数据存储器中。这和用data显式定义变量起到相同的作用。 2紧凑(COMPACT)模式 此模式中,所有变量都

18、默认在8051的外部数据存储器的一页中。 3大(LARGE)模式 在大模式下,所有的变量都默认在外部存储器中(xdata)。,例如: 设C语言源程序为PROR.C,若使程序中的变量类型和参数传递区限定在外部数据存贮区 ,有两种方法: 方法1:在程序的第一句加预处理命令 #pragma compact。 方法2:用C51对PROR.C进行编译时,使用编译控制命令: C51 PROR.C COMPACT。,如果在变量说明时略去存贮器类型标志符,编译器会自动选择默认的存贮器类型。默认的存 贮器类型进一步由控制指令SMALL、COMPACT和LARGE限制。例:如果声明char var,则默认 的存贮

19、器模式为SMALL,var放在data存贮区;如果使用COMPACT模式,var放入idata存贮区 ;使用LARGE模式,var被放入外部存贮区(xdata存贮区)。,四、对存贮器和外接I/O口的绝对地址访问 C51对存贮器和外接I/O口的绝对地址访问可以通过指针访问,也可以通过函数访问。 1. 对存贮器的绝对地址访问 利用绝对地址访问的头文件absacc.h可对不同的存贮区进行访问。该头文件的函数有: CBYTE (访问code区字符型) DBYTE (访问data区字符型) PBYTE (访问pdata或I/O) XBYTE (访问xdata或I/O) 还有CWORD、DWORD、PWO

20、RD和XWORD四个函数,它们的访问区域同上,只是访问的类型为int 型例: #include #define com XBYTE0 x07ff,那么后面程序com变量出现的地方,就是对地址为07ffH外部RAM或I/O口进行访问。 例: XWORD0=0 x9988; 即将9988H(int类型)送入外部RAM的0号和1号单元。 使用中要注意:absacc.h一定要包含进程序。 CBYTE、DBYTE、XBYTE等函数名必须大写。 2.对外部I/O口的访问 由于单片机的I/O口和外部RAM统一编址,因此对I/O口地址的访问可用XBYTE 或 PBYTE,例: P1.1产生周期方波#inclu

21、de #define uchar unsigned char sbit P1_1=P11; void delay (void); /* 声明延时函数 */ main( ) uchar i; for(;) P1_1=0; delay (); /* 调用延时函数 */ P1_1=1; delay(); /* 调用延时函数*/ ,void delay(void) uchar i, j,k ; for(i=0;i200;i+) for(j=0;j200;j+);,#include #include #define uchar unsigned char#define uint unsigned intvoid delay(void); /* 声明延时函数 */ main( ) uint i; uchar num=0 xfe; P1=0 xff; delay (); /* 调用延时函数 */,例:用C51编写流水灯程序,while(1) for(i=0;i8;i+) P1=num; delay(); num=_crol_(num,1); P1=0 x0; delay(); ,void delay(void) uchar i, j,k ; for(i=0;i200;i+) for(j=0;j200;j+) for(k=0;k200;k+); ,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号