第五章 单片机的C语言程序设计及仿真调试.ppt
《第五章 单片机的C语言程序设计及仿真调试.ppt》由会员分享,可在线阅读,更多相关《第五章 单片机的C语言程序设计及仿真调试.ppt(111页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第五章 单片机的C语言程序设计及仿真调试,任课教师:刘忠国 山东大学课程中心网站: stc15系列单片机器件手册等 Keil Software Cx51 编译器用户手册: Cx51编译器-对传统和扩展的8051微处理器的优化的C编译器和库参考,2,14:51:35,第五章 单片机的C语言程序设计及仿真调试,本章学习目标 掌握单片机C语言程序中的常用功能 掌握Keil C的程序设计 掌握IAP15W4K58S4单片机C语言程序调试过程,3,14:51:35,成绩考核方式: 期末考试(开卷80%)+平时成绩(20%),平时成绩包含: 考勤,作业,上课提问,实验,关于考核,4,第五章 单片机的C语言
2、程序设计及仿真调试,5.1 C51程序的基本语法 5.1.1 关键字 5.1.2 C51程序的一般结构 5.1.3 数据类型 5.1.4 运算符和表达式 5.2 Keil C51程序的语句 5.2.1 表达式语句 5.2.2 条件语句 5.2.3 开关语句 5.2.4 循环语句 5.2.5 goto、break、continue和return语句 5.3 函数 5.3.1 函数的定义与调用 5.3.2 Keil C51函数 5.4 Keil C51库函数 5.5 预处理命令 5.6 单片机C语言程序框架,5,14:51:35,汇编语言和C语言的选择问题,设计规模较小的嵌入式应用系统时,可以使用
3、汇编语言。因为代码一般不长,且较简单。 当程序比较复杂,且没有很好的注释时,使用汇编语言编写的程序,可读性和可维护性会很差,代码的可重用性也比较低。 使用C语言编程,编写简单、直观易读、便于维护、通用性好。 在控制任务比较复杂或者具有大量运算的系统中,C语言优势明显。由于模块化,用C语言编写的程序具有很好的可移植性。,6,14:51:35,5.1 C51程序的基本语法,1标准C语言(ANSI C)的关键字(32个) (1) 数据类型关键字 1)基本数据类型 void、char、int、float、double 2)类型修饰关键字 short、long、signed、unsigned 3)复杂类
4、型关键字 struct、union、enum、typedef、sizeof 4)存储级别关键字 auto、static、register、extern、const、volatile,5.1.1 关键字,7,14:51:35,5.1.1 关键字,(2)流程控制关键字 1)跳转结构 return 、 continue 、 break 、 goto 2)分支结构 if 、 else 、 switch 、 case、 default 3)循环结构 for 、 do 、 while 2Keil C51编译器支持的关键字(13个) bit、sbit、sfr、sfr16、data、bdata、idata、p
5、data、 xdata、 code、 interrupt、 reentrant、 using,8,14:51:35,预处理命令 /以#开头的命令,用于包含头文件、定义常数等 全局变量声明 /全局变量虽然方便传递参数,但不宜多 函数1的声明 . 函数n的声明 void main(void)/主函数 局部变量声明 /局部变量只能在所定义的函数内部引用 可执行语句 函数调用 无限循环 ,5.1.2 C51程序的一般结构,9,14:51:35,/一般函数的定义 函数1(形式参数声明) 局部变量声明 可执行语句 . 函数n(形式参数声明) 局部变量声明 可执行语句 ,5.1.2 C51程序的一般结构,1
6、0,14:51:36,/中断函数的实现 void ISRname(void) interrupt n /n为中断号 局部变量声明 可执行语句 ,C51程序注意如下几点: (1)所有函数以花括号“”开始,以花括号“”结束,包含在“ ”内的部分称为函数体。花括号必须成对出现,如果一个函数内有多对花括号,则最外层的花括号为函数体的范围。为了增加程序的可读性,应采用缩进方式书写。,5.1.2 C51程序的一般结构,11,14:51:36,注意如下几点: (2)建议一行写一条语句,每条语句最后必须以一个分号“;”结尾。 (3)每个变量必须先定义后引用。在函数内部定义的变量为局部变量,又称为内部变量,只有
7、定义它的那个函数才能使用。在函数外部定义的变量为全局变量,又称为外部变量,在定义它的那个程序文件中的函数都可以使用。 (4)程序语句的注释放在双斜杠“/”之后,或者放在“/*.*/”之内。,5.1.2 C51程序的一般结构,12,14:51:36,1常量和变量 常量包括整形常量、浮点型常量、字符型常量(如a: 单引号字符 ) 及字符串常量(双引号单个或多个字符,如 a, Happy)等。 变量是一种在程序执行过程中其值不断变化的量。使用一个变量之前,必须先进行定义。,5.1.3 数据类型 1常量和变量,2数据类型 (1)基本数据类型 基本数据类型是不可以再分解为其他类型的数据类型。如char
8、(字符型)、int(整型)、long(长整型)、float (浮点型)等。,13,14:51:36,2数据类型 (2)构造数据类型 构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。,5.1.3 数据类型 2数据类型,在C语言中,构造类型有以下几种: 数组类型 结构类型 联合类型,14,14:51:36,(3)指针类型 指针是一种特殊的,具有重要作用的数据类型。用来表示某个量在内存中的地址。,5.1.3 数据类型 2数据类型,(4)空类型 函数调用后并不需要向调用者返回函数值, 这种函数可以定义为“空类型”。其类型说明符为void。,15,14:51:36,C51编译器除了支持
9、上述数据类型外, 还支持以下几种扩充数据类型: (I)bit:位类型。bit型变量的位地址由编译器分配。 (II)sfr:特殊功能寄存器,用来控制中断、定时器、计数器、串口、I/O及其他部件。 (III)sfr16:16位特殊功能寄存器, 定义DPTR. (IV)sbit:位寻址。,5.1.3 数据类型 2数据类型,bit与sbit的用法区别:定义的bit型变量的位地址在00H7FH之间, 具体地址值不定, 由编译器随机分配。 sbit位寻址: 先指定一个可位寻址的变量作为基地址, 然后确定变量的某个位号来得到一个实际的位地址。,16,位地址不定,定义为bdata型变量或SFR的位,14:51
10、:36,(I)bit:位类型。可以定义一个位变量, 但不能定义位指针, 也不能定义位数组。 C51程序中, 函数参数和返回值也可以是位变量。例: bit finish_flag=0; 位地址具体值由编译器分配 bit testfunc(bit var1, bit var2) . return(0); ;,5.1.3 数据类型 2数据类型,所有bit型的变量都被定位在8051片内RAM的可位寻址区20H2FH(00H7FH), 共16个字节, 所以最多只能声明128个bit型位变量。,17,14:51:36,(II)sfr:字节寻址。语法如下: sfr sfr_name = int_consta
11、nt(地址值); 如 sfr P0=0 x80; 0 x80为P0口的地址, “=”后为常数, 且这个常数必须在特殊功能寄存器的地址范围内, 即0 x80到0 xFF之间。,5.1.3 数据类型 2数据类型,(III) sfr16:字寻址 如sfr16 DPTR=0 x82; 指定DPTR的地址DPL=0 x82,DPH=0 x83。 (IV) sbit: 位寻址。用于定义可位寻址变量: 可定义为片内RAM的 bdata存储类型(字节地址20H 2FH)变量的可寻址位, 或特殊功能寄存器的可寻址位。,18,14:51:36,5.1.3 数据类型 2数据类型,(IV) sbit:位寻址。定义为片
12、内bdata型变量(或特殊功能寄存器)的可寻址位。 bdata存储类型变量位于片内RAM的可位寻址区(20H 2FH), 可字节寻址, 或位寻址。 注意:使用bdata和sbit定义的变量必须是全局变量。,sbit声明方法: sbit bitname=bdata型变量(或sfr_name ) bit_number; 其中, sfr_name 是SFR的名字, bit_number是位号, 位号数值取决于基址对象的数据类型, 对char和SFR 而言是(07) ,对int型而言是(015) ,对long型而言是(031) 。,19,14:51:36,5.1.3 数据类型 2数据类型,sbit使用
13、举例: unsigned char bdata flag ; /flag为bdata型无符号字符变量 int bdata ibase ; /定义ibase为bdata整型变量 使用sbit定义可位寻址变量: sbit flag7=flag7 ; /定义flag7为flag的第7位 sbit mybit15=ibase15 ; /mybit15为ibase的第15位 sbit CY=PSW7 ;/定义CY为PSW的第7位 sbit P00=P00 ;/定义P0.0口线的名称是P00,20,14:51:36,sbit声明方法: sbit bitname=bdata型变量(或sfr_name ) b
14、it_number;,对特殊功能寄存器SFR, sbit可以有下面声明方法: 方法1:sbit bitname=sfr_namebit_number; 其中, sfr_name是SFR名字, bit_number是位号(07) 如:sbit CY=PSW7;/定义CY为PSW的第7位。 方法2:sbit bitname=sfr_addressbit_number; 其中, sfr_address是SFR的地址(0 x800 xff) 如:sbit OV=0 xD02;/定义PSW中的OV位 方法3:sbit bitname=bit_address; 其中, bit_address是位地址。 如
15、:sbit EA=0 xAF;/第0 xAF位为EA,5.1.3 数据类型 2数据类型,21,14:51:36,Keil C51编译器支持的数据类型如表5-1所示。,表5-1 Keil C51编译器支持的数据类型,5.1.3 数据类型 2数据类型,22,14:51:36,3存储器类型,表5-2 Keil C51编译器支持的存储器类型,对变量定义格式:数据类型 存储器类型 变量名表;,5.1.3 数据类型 3存储器类型,例如: unsigned char data buffer;,23,当AUXR.2(位EXTRAM)=0时,“MOVX Ri” 指令只能访问片内扩展的EXT_RAM的(00H0F
16、FH), 与P2口无关。 当AUXR.2(位EXTRAM)=1时,“MOVX Ri” 可访问片外扩展的EXT_RAM的一页, 页数由P2口输出决定(参见4.5.1.1 数据传送指令中MOVX指令的介绍 ),14:51:36,存储类型的指定: 变量或参数的存储类型可由存储模式指定缺省类型, 也可由关键字code、data、idata、xdata、pdata直接声明指定。 例如: unsigned char data buffer; data buffer; /没有指定数据类型, 默认为int型 unsigned char code numtab16=0 xC0, 0 xF9, 0 xA4, 0
17、xB0, 0 x99, 0 x92, 0 x82, 0 xFB, 0 x80, 0 x90, 0 x88, 0 x83, 0 xC6, 0 xA1, 0 x86, 0 x8E ; /定义LED显示字模(参见137页) unsigned char xdata arr1044;,5.1.3 数据类型 3存储器类型,对变量定义格式:数据类型 存储器类型 变量名表;,24,14:51:36,5.1.3 数据类型 3.存储器类型,数据存储类型的指定: 变量或函数参数存储类型可由存储模式 (Small, large, Compact) (Options for Target Target 1.选项)指定缺
18、省存储类型; 在small模式下, 函数参数和局部变量位于由data定义的单片机片内数据RAM(007FH)中; 在compact模式下, 函数参数和局部变量位于pdata定义的扩展数据RAM中(访问用MOVX Ri)。 在large模式下, 函数参数和局部变量位于xdata定义的扩展数据RAM中(访问用MOVX DPTR),数据,存储模式 (Small, large, Compact),25,当AUXR.2(位EXTRAM)=0时,“MOVX Ri” 指令只能访问片内扩展的EXT_RAM的(00H0FFH), 与P2口无关。 当AUXR.2(位EXTRAM)=1时,“MOVX Ri” 可访问
19、片外扩展的EXT_RAM的一页, 页数由P2口输出决定(参见4.5.1.1 数据传送指令中MOVX指令的介绍 ),14:51:36,在Xtal(MHz)右侧框输入6, 其余按默认设置。,4-3 汇编语言程序调试,Project窗口,选中Target 1, 并单击右键, 出现浮动菜单。浮动菜单中选中 Options for Target Target 1.选项。,出现Options for Target Target 1 对话框界面。在该界面中,点击Target标签。在该标签界面中,按下面设置参数:,在此设置使用晶振的频率,针对目标硬件设置工具选项,Memory Model右侧下拉选择: Sma
20、ll, Compact, large 的存储模式。,26,14:51:36,4关于指针数据类型 指针变量的值是一个地址, 这个地址不仅可以是变量的地址, 也可以是其他数据结构的地址。 Keil C51编译器支持两种指针类型:一般指针(Generic Pointer)和存储器指针(Memory Specific Pointer,在*前用data,xdata等指定存储区的指针)。 一般指针的声明和使用均与标准C相同, 同时还可以说明指针的存储类型(见下页)。 char *s ; /* string ptr */ int *numptr; /* int ptr */,5.1.3 数据类型 4关于指针
21、数据类型,27,14:51:36,char data * str; /存储器指针,str指向data区中char型数据,一般指针的声明和使用均与标准C相同, 同时还可以说明指针的存储类型。 char *s ; /* string ptr */ int *numptr; /* int ptr */ 可用存储类型标识符指定一个一般指针的存储区如: char * xdata strptr; /* generic ptr stored in xdata */ int * data numptr; /* generic ptr stored in data */ long * idata varptr;
22、 /* generic ptr stored in idata */ 这些例子指向可能保存在任何存储区中的变量 但是 指针分别保存在xdata、data和idata中。,5.1.3 数据类型 4关于指针数据类型,28,14:51:36,一般指针用3个字节存放: 存储器类型, 存储器地址高8位偏移量和低8位偏移量。 char data * str; /存储器指针 /str指向data区中char型数据 int xdata * pow; /存储器指针 /pow指向外部RAM的int型整数 这种指针存放时, 只需1(或2)个字节就够了, 因只需存放偏移量。,存储器指针(指定存储区的指针), 说明时即
23、指定了存储类型, 例如:,4.关于指针数据类型,存储器类型是在编译时需要的, 既已指出,所以指针只需存偏移量即可,参考:Keil Help: Cx51 Compiler Users GuideLanguage Extensions Pointers,29,存放指针所指向数据的存储器类型,14:51:36,5.1.3 数据类型 4.关于指针数据类型,象一般指针一样 可指定一个存储器指针的保存存储区, 即在指针声明前加存储类型标识符, 例如: unsigned char xdata *pt; /存储器指针 /pt本身依存储模式存放 unsigned char xdata * data pt; /存
24、储器指针 /pt被保存在内部RAM中 unsigned char xdata * xdata pt; /存储器指针 /pt被保存在外部RAM中 上面的语句都声明pt为指向保存在外部RAM中unsigned char数据的指针, 但pt本身的保存位置却不同。,存储器指针,30,14:51:36,运算符是告诉编译程序执行特定算术或逻辑操作的符号,表达式则是由运算符及运算对象所组成的具有特定含义的一个式子。 在任意一个表达式的后面加一个分号“;”就构成了一个表达式语句。C51程序就是由多个表达式语句构成的语句集合。 运算符可以分为赋值运算符、算术运算符、关系运算符、逻辑运算符、位运算符、复合赋值运算
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五章 单片机的C语言程序设计及仿真调试 第五 单片机 语言程序设计 仿真 调试
限制150内