单片机的C语言程序设计.ppt
《单片机的C语言程序设计.ppt》由会员分享,可在线阅读,更多相关《单片机的C语言程序设计.ppt(88页珍藏版)》请在三一办公上搜索。
1、1/88,第五章 单片机的C语言程序设计 及仿真调试本章学习目标掌握单片机C语言程序中的常用功能掌握Keil C的程序设计掌握STC15F2K60S2单片机C语言程序调试过程,2/88,汇编语言和C语言的选择问题设计规模较小的嵌入式应用系统时,可以使用汇编语言。因为代码一般不长,且较简单。当程序比较复杂,且没有很好的注释时,使用汇编编程的可读性和可维护性会很差,代码的可重性也比较低。使用C语言编程,编写简单、直观易读、便于维护、通用性好。在控制任务比较复杂或者具有大量运算的系统中,C语言优势明显。由于模块化,用C语言编写的程序具有很好的可移植性。,3/88,5.1 单片机C语言程序中的常用功能
2、,一、逻辑运算和位运算1、逻辑运算符按逻辑运算符用于逻辑运算,包括与(&)、或(|)、非(!)三种。对于使用逻辑运算符的表达式,返回0表示“假”,返回1表示“真”。,4/88,与运算符(,5/88,或运算符(|)功能:检查两个条件中是否有一个为真的运算符,只要有一个条件为真,运算结果就为真。上例改为:如果任一语句为真,程序需执行某些操作,则条件代码如下:(a10)|(b=7);,6/88,逻辑非运算符(!)功能:表示对表达式的真值取反。例如,如果变量s小于10,程序需执行某些操作,则条件代码如下:(s=10)/s不大于等于10,7/88,2、位运算符很多系统程序常要求进行位(bit)运算或处理
3、。语言提供了六种位运算符:按位与(&)、按位或(|)、按位异或()、取反()、左移()。,8/88,(1)按位“与”运算按位与运算符“&”是双目运算符。功能是参与运算的两数各对应的二进制位相与。只有对应的两个位均为1时,结果位才为1,否则为0。例如,9&5 00001001&0000010100000001按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清0,保留低八位 可用 a&255(255的二进制数为0000000011111111)。,9/88,(2)按位“或”运算按位或运算符“|”是双目运算符。功能是参与运算的两数各对应的二进制位相或。只要对应的两个位有一个为1时,结果
4、位就为1。例如,9|5 00001001|00000101=00001101(十进制为13)或运算通常用来对某些位置1。,10/88,(3)按位“异或”运算按位异或运算符“”是双目运算符。功能是参与运算的两数各对应的二进制位相异或。当两个对应的位相异时,结果为1。例如,95 0000100100000101 00001100(十进制为12)异或运算通常用来对某些位取反。,11/88,(4)求反运算求反运算符“”为单目运算符,具有右结合性。功能是对参与运算的数的各二进制位按位求反。例如,9(0000000000001001)结果为:1111111111110110,12/88,(5)左移运算左移
5、运算符“”是双目运算符。功能是把“”左边的运算数的各二进制位全部左移若干位,由“”右边的数指定移动的位数,高位丢弃,低位补0。例如:a4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。,13/88,(6)右移运算右移运算符“”是双目运算符。功能是把“”左边的运算数的各二进制位全部右移若干位,“”右边的数指定移动的位数。例如,设 a=15,a2 000001111右移为00000011(十进制3)。对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为 1,最高位是补0或是补1 取决于编译系统的规定。
6、,14/88,二、预处理 以“#”号开头的命令是预处理命令。语言提供了多种预处理功能,如宏定义#define、文件包含#include、条件编译等。合理地使用预处理功能,可以使得编写的程序便于阅读、修改、移植和调试,也利于模块化程序设计。下面介绍常用的预处理功能。,15/88,1、宏定义(define)在语言源程序中允许用一个标识符来表示一个字符串,称为宏。被定义为宏的标识符称为宏名。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去代换,这称为宏代换或宏展开。宏代换是由预处理程序自动完成的。在语言中,宏分为有参数和无参数两种。,16/88,(1)无参宏定义无参宏的宏名后不带参数。
7、其定义的一般形式为:#define 标识符 字符串其中,标识符为所定义的宏名。字符串可以是常数、表达式、格式串等。符号常量的定义就是一种无参宏定义。此外,常对程序中反复使用的表达式进行宏定义。如要终止宏定义,可使用#undef命令。,17/88,(2)带参宏定义在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。带参宏定义的一般形式为:#define 宏名(形参表)字符串,18/88,在字符串中含有各个形参。带参宏调用的一般形式为:宏名(实参表);例如:#define MAX(a,b)(ab)?a:b/取a和b的最大数,19
8、/88,2、文件包含(include)文件包含的一般形式为:#include 文件名功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。,20/88,说明以下几点:包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来。例如:#include stdio.h#include 二者的区别:使用尖括号表示在包含文件目录中去查找(包含目录由用户在开发环境中设置),而不在源文件目录去查找;使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。,21/88,3、条件编译条件编译就是按不同的条件去编译不同的程序部分,从而产生不同的目标
9、代码文件。条件编译对于程序的移植和调试(可以分段调试)非常有用。特别是在操作系统的裁减中,经常使用条件编译。,22/88,(1)第一种形式:#ifdef 标识符 程序段1#else 程序段2#endif功能是:如果标识符已被#define命令定义过,则对程序段1进行编译;否则对程序段2进行编译。如果没有程序段2(它为空),本格式中的#else可以没有。,23/88,(2)第二种形式:#ifndef 标识符 程序段1#else 程序段2#endif功能是:如果标识符未被#define命令定义过则对程序段1进行编译,否则对程序段2进行编译。这与第一种形式的功能正相反。,24/88,(3)第三种形式
10、:#if 常量表达式 程序段1#else 程序段2#endif功能是,如果常量表达式的值为真(非0),则对程序段1进行编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完成不同的功能。,25/88,5.2 Keil C 和 ANSI C,一、Keil C51扩展关键字C51有以下扩展关键字(共19个):_at_、sbit、sfr、bit、sfr16、idata、bdata、xdata、pdata、data、code、alien、small、compact、large、using、reentrant、interrupt、_task_,26/88,1、内存区域(Memory Areas):
11、(1)程序存储器:code:程序存储区。可以使用code定义表格常数。(2)内部RAM:用以下关键字说明:data:直接寻址区,内部RAM的低128字节,地址范围为00H7FH。idata:间接寻址区,包括整个内部RAM区,256字节,地址范围为00H0FFH。bdata:可位寻址区,地址范围为20H2FH。,27/88,(3)外部数据存储器:外部RAM视使用情况可由以下关键字标识:xdata:可指定多达64KB的外部直接寻址区,地址范围0000H0FFFFH。pdata:能访问1页(256Bytes)的外部RAM(很少用)。,28/88,存储类型的指定:变量或参数的存储类型可由存储模式指定缺
12、省类型,也可由关键字code、data、idata、xdata、pdata直接声明指定。例如:unsigned char data buffer;char code array=“hello!”;unsigned char xdata arr1044;,29/88,(4)特殊功能寄存器(SFR)STC15F2K60S2单片机的特殊功能寄存器(SFR)寻址区,用来控制定时器、计数器、串口、I/O及其他部件。为了支持SFR及其可寻址位的声明,引入了sfr、sbit等关键词。,30/88,sfr:字节寻址。语法如下:sfr sfr_name=int_constant;如 sfr P0=0 x80;0
13、 x80为P0口的地址,“=”后为常数,并且这个常数必须在特殊功能寄存器的地址范围内,位于0 x80到0 xFF之间。,31/88,sfr16:字寻址如sfr16 DPTR=0 x82;指定DPTR的地址DPL=0 x82,DPH=0 x83。sbit:位寻址 用于声明可位寻址的特殊功能寄存器的位变量。,32/88,sbit可以有下面声明方法:方法1:sbit bitname=sfr_namebit_number;其中,sfr_name必须是已定义的SFR的名字,bit_number是位号(07)。如:sbit CY=PSW7;/定义CY为PSW的第7位。方法2:sbit bitname=sf
14、r_addressbit_number;其中,sfr_address是SFR所在的地址(0 x800 xff),bit_number是位号(07)。如:sbit OV=0 xD02;/定义PSW中的OV位方法3:sbit bitname=bit_address;其中,bit_address是位地址。如:sbit EA=0 xAF;/第0 xAF位为EA,33/88,对于大多数8051内核单片机,Keil提供了一个包含所有特殊功能寄存器和它们的位的定义的头文件reg51.h。通过包含头文件可以很容易的进行新的扩展。附录C提供了STC15F2K60S2单片机的头文件stc15.h的内容,其中包含了
15、标准8051单片机寄存器的定义,编程时只需包含这一个文件即可。该文件可以从中下载。,34/88,2、_at_关键字 若要实现变量的绝对定位(称为绝对变量),可以直接在数据定义后加上“_at_ 常数地址”即可。注意:(1)绝对变量不能被初始化;(2)bit型函数及变量不能用_at_指定。,35/88,例如:unsigned char idata ADCdata _at_ 0 x40;/指定ADCdata变量在40H处 unsigned char xdata buffer20 _at_ 0 x0010;/指定buffer数组从XRAM的0010H单元开始,36/88,3、存储模式存储模式决定了没有
16、明确指定存储类型的变量时,函数参数等的缺省存储区域,有Small、Compact和Large三种模式。,指定存储模式,图5-1 指定存储模式,37/88,(1)Small模式在该模式中所有变量都默认位于单片机内部数据存储器,这和使用data指定存储器类型的方式一样。此模式访问变量的效率很高,但所有的数据对象和堆栈必须适合内部RAM堆栈的大小。如果将变量都配置在内部数据存储器内,Small模式是最佳选择。该模式的优点是访问速度快,缺点是空间有限,只适用于小程序。,38/88,(2)Compact模式所有缺省变量均位于外部RAM区的一页内(256字节),这和使用pdata指定存储器类型一样,在ST
17、ARTUP.A51文件中说明,也可用pdata指定。该模式空间比Small宽裕,速度比Small慢,比Large快,是一种中间状态。,39/88,(3)Large模式所有缺省变量可放在多达64KB的外部RAM区,这和使用xdata指定存储器类型一样,使用数据指针DPTR进行寻址。通过数据指针访问外部数据存储器的效率较低,特别是当变量为2个字节或更多字节时。该模式的数据访问比Small和Compact产生更多的代码。优点是空间大,可存变量多,缺点是速度较慢。,40/88,4、变量或数据类型,表5-1 C51数据类型,41/88,C51提供以下几种扩展数据类型:bit:位变量值为0或1。sbit:
18、从字节中定义的位变量(0或1)。sfr:sfr字节地址(0 x800 xff)。sfr16:sfr字地址(0 x800 xff,其实是占用 两个连续的地址)。其余数据类型如:char、enum、short、int、long、float等与ANSI C相同。下面着重介绍位变量及其声明。,42/88,(1)bit型变量bit型变量可用于变量类型和函数声明、函数返回值等,存储于内部RAM的20H2FH单元中。注意:1)使用禁止中断(#pragma disable)或包含明确的寄存器组切换(using n)的函数不能返回位值,否则,编译器会识别出来并产生一个错误信息。2)位不能声明为一个指针。如bit
19、*bit_poiter;是错误的。3)不能有bit数组如:bit arr5;是错误的。,43/88,(2)可位寻址区说明使用sbit声明可独立访问可位寻址对象的位。sbit声明要求基址对象的存贮器类型为“bdata”,否则只有绝对的位声明方法是合法的。位的位置(操作符号后的数字)的最大值依赖于指定的基类型对于char/uchar而言是07,对于int/uint/short/ushort而言是015,对于long/ulong而言是031。,44/88,下面举例说明位寻址的声明方法。例如,int bdata bittest _at_ 0 x20;/也可以省略“_at_ 0 x20”sbit bit
20、0bittest 0;/0 x20单元的第0位 sbit bit15=bittest 15;/0 x21单元的第7位注意:可位寻址对象的位的声明只能放到main函数的外部,作为全局变量使用,否则,编译会出错。,45/88,二、扩展I/O口的使用 STC15F2K60S2单片机除了芯片上的I/O口外,还可在片外扩展I/O端口。由于使用C语言访问外部I/O时用到指针的功能,因此,首先介绍Keil C51的指针。,46/88,1、Keil C51指针Keil C51支持一般指针(Generic Pointer)和存储器指针(Memory Specific Pointer)。一般指针的声明和使用均与标
21、准C相同,同时还可以说明指针的存储类型。,47/88,例如,下面的语句都声明pt为指向保存在外部RAM中unsigned char数据的指针,但pt本身的保存位置却不同:unsigned char xdata*pt;/pt本身依存储模式存放 unsigned char xdata*data pt;/pt被保存在内部RAM中 unsigned char xdata*xdata pt;/pt被保存在外部RAM中,48/88,一般指针本身用3个字节存放,分别为存储器类型,高位偏移量和低位偏移量。基于存储器的指针,说明时即指定了存储类型,例如:char data*str;/str指向data区中cha
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 语言程序设计
链接地址:https://www.31ppt.com/p-2408818.html