第五章单片机的C语言程序设计及仿真调试本章学习目标掌

上传人:Sc****h 文档编号:231242118 上传时间:2023-08-30 格式:PPT 页数:88 大小:930KB
收藏 版权申诉 举报 下载
第五章单片机的C语言程序设计及仿真调试本章学习目标掌_第1页
第1页 / 共88页
第五章单片机的C语言程序设计及仿真调试本章学习目标掌_第2页
第2页 / 共88页
第五章单片机的C语言程序设计及仿真调试本章学习目标掌_第3页
第3页 / 共88页
资源描述:

《第五章单片机的C语言程序设计及仿真调试本章学习目标掌》由会员分享,可在线阅读,更多相关《第五章单片机的C语言程序设计及仿真调试本章学习目标掌(88页珍藏版)》请在装配图网上搜索。

1、第五章第五章 单片机的单片机的C语言程序设计语言程序设计 及仿真调试及仿真调试本章学习目标本章学习目标掌握单片机掌握单片机C语言程序中的常用功能语言程序中的常用功能掌握掌握Keil C的程序设计的程序设计掌握掌握STC15F2K60S2单片机单片机C语言程序调试过程语言程序调试过程1汇编语言和汇编语言和C语言的选择问题语言的选择问题设设计计规规模模较较小小的的嵌嵌入入式式应应用用系系统统时时,可可以以使使用用汇汇编编语语言言。因因为为代代码码一一般般不不长长,且且较较简简单单。当当程程序序比比较较复复杂杂,且且没没有有很很好好的的注注释释时时,使使用用汇汇编编编编程程的的可可读读性性和和可可维

2、维护护性性会会很很差差,代代码码的的可可重性也比较低。重性也比较低。使使用用C语语言言编编程程,编编写写简简单单、直直观观易易读读、便便于于维维护护、通通用用性性好好。在在控控制制任任务务比比较较复复杂杂或或者者具具有有大大量量运运算算的的系系统统中中,C语语言言优优势势明明显显。由由于于模模块块化化,用用C语语言言编编写写的的程程序序具具有有很很好好的的可可移移植性。植性。25.1 5.1 单片机单片机C C语言程序中的常用功能语言程序中的常用功能一、逻辑运算和位运算一、逻辑运算和位运算1、逻辑运算符、逻辑运算符按按逻逻辑辑运运算算符符用用于于逻逻辑辑运运算算,包包括括与与(&)、或或(|)

3、、非()、非(!)三种。)三种。对对于于使使用用逻逻辑辑运运算算符符的的表表达达式式,返返回回0表表示示“假假”,返回,返回1表示表示“真真”。3与运算符(与运算符(&)功功能能:两两个个条条件件同同时时满满足足时时(即即两两个个条条件件都都为为真时),结果才为真。真时),结果才为真。如如一一个个程程序序在在同同时时满满足足条条件件a10和和b=7时时,必必须须执执行行某某些些操操作作,应应使使用用关关系系运运算算符符和和逻逻辑辑与运算符(与运算符(&)来写这个条件的代码。)来写这个条件的代码。可写为:可写为:(a10)&(b=7);4或运算符(或运算符(|)功功能能:检检查查两两个个条条件件

4、中中是是否否有有一一个个为为真真的的运运算算符,只要有一个条件为真,运算结果就为真。符,只要有一个条件为真,运算结果就为真。上上例例改改为为:如如果果任任一一语语句句为为真真,程程序序需需执执行行某某些操作,则条件代码如下:些操作,则条件代码如下:(a10)|(b=7);5逻辑非运算符(逻辑非运算符(!)功能功能:表示对表达式的真值取反。表示对表达式的真值取反。例例如如,如如果果变变量量s小小于于10,程程序序需需执执行行某某些些操操作,则条件代码如下:作,则条件代码如下:(s=10)/s不大于等于不大于等于1062、位运算符、位运算符很很多多系系统统程程序序常常要要求求进进行行位位(bit)

5、运运算算或或处处理理。语言提供了语言提供了六种六种位运算符:位运算符:按按位位与与(&)、按按位位或或(|)、按按位位异异或或()、取取反(反()、左移()、左移()。)。7(1)按位)按位“与与”运算运算按位与运算符按位与运算符“&”是双目运算符。是双目运算符。功功能能是是参参与与运运算算的的两两数数各各对对应应的的二二进进制制位位相相与与。只只有有对对应应的的两两个个位位均均为为1时时,结结果果位位才才为为1,否否则则为为0。例如,例如,9&5 00001001&0000010100000001按位与运算通常用来对某些位清按位与运算通常用来对某些位清0或保留某些位。或保留某些位。例如把例如

6、把a 的高八位清的高八位清0,保留低八位,保留低八位 可用可用 a&255 (255的二进制数为的二进制数为0000000011111111)。8(2)按位)按位“或或”运算运算按位或运算符按位或运算符“|”是双目运算符。是双目运算符。功功能能是是参参与与运运算算的的两两数数各各对对应应的的二二进进制制位位相相或或。只要对应的两个位有一个为只要对应的两个位有一个为1时,结果位就为时,结果位就为1。例如,例如,9|5 00001001|00000101=00001101 (十进制为十进制为13)或运算通常用来对某些位置或运算通常用来对某些位置1。9(3)按位)按位“异或异或”运算运算按位异或运算

7、符按位异或运算符“”是双目运算符。是双目运算符。功功能能是是参参与与运运算算的的两两数数各各对对应应的的二二进进制制位位相相异异或或。当两个对应的位相异时,结果为当两个对应的位相异时,结果为1。例如,例如,95 0000100100000101 00001100(十进制为十进制为12)异或运算通常用来对某些位取反。异或运算通常用来对某些位取反。10(4)求反运算)求反运算求反运算符求反运算符“”为单目运算符,具有右结合性。为单目运算符,具有右结合性。功能是功能是对参与运算的数的各二进制位按位求反。对参与运算的数的各二进制位按位求反。例如,例如,9 (0000000000001001)结果为:结

8、果为:111111111111011011(5)左移运算)左移运算左移运算符左移运算符“”是双目运算符。是双目运算符。功功能能是是把把“”左左边边的的运运算算数数的的各各二二进进制制位位全全部部左左移移若若干干位位,由由“”右右边边的的数数指指定定移移动动的的位位数数,高位丢弃,低位补高位丢弃,低位补0。例如:例如:a”是双目运算符。是双目运算符。功功能能是是把把“”左左边边的的运运算算数数的的各各二二进进制制位位全全部部右右移移若干位,若干位,“”右边的数指定移动的位数。右边的数指定移动的位数。例如,设例如,设 a=15,a2 000001111右移为右移为00000011(十进制十进制3)

9、。对于有符号数,在右移时,符号位将随同移动。对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补当为正数时,最高位补0,而为负数时,符号位为,而为负数时,符号位为 1,最高位是补,最高位是补0或是补或是补1 取决于编译系统的规定。取决于编译系统的规定。13二、预处理二、预处理 以以“#”号开头的命令是预处理命令。语言号开头的命令是预处理命令。语言提供了多种预处理功能,如宏定义提供了多种预处理功能,如宏定义#define、文件、文件包含包含#include、条件编译等。、条件编译等。合理地使用预处理功能,可以使得编写的程序合理地使用预处理功能,可以使得编写的程序便于阅读、修改、移植和调

10、试,也利于模块化程便于阅读、修改、移植和调试,也利于模块化程序设计。下面介绍常用的预处理功能。序设计。下面介绍常用的预处理功能。141、宏定义、宏定义(define)在在语语言言源源程程序序中中允允许许用用一一个个标标识识符符来来表表示示一一个个字符串,称为宏。被定义为宏的标识符称为宏名。字符串,称为宏。被定义为宏的标识符称为宏名。在在编编译译预预处处理理时时,对对程程序序中中所所有有出出现现的的宏宏名名,都都用用宏宏定定义义中中的的字字符符串串去去代代换换,这这称称为为宏宏代代换换或或宏宏展展开开。宏宏代代换换是是由由预预处处理理程程序序自自动动完完成成的的。在在语言中,宏分为语言中,宏分为

11、有参数有参数和和无参数无参数两种。两种。15(1)无参宏定义)无参宏定义无参宏的宏名后不带参数。其定义的一般形式为:无参宏的宏名后不带参数。其定义的一般形式为:#define 标识符标识符 字符串字符串其其中中,标标识识符符为为所所定定义义的的宏宏名名。字字符符串串可可以以是是常常数数、表表达达式式、格格式式串串等等。符符号号常常量量的的定定义义就就是是一一种种无无参参宏宏定定义义。此此外外,常常对对程程序序中中反反复复使使用用的的表表达达式式进进行行宏宏定定义义。如如要要终终止止宏宏定定义义,可可使使用用#undef命令。命令。16(2)带参宏定义)带参宏定义在在宏宏定定义义中中的的参参数数

12、称称为为形形式式参参数数,在在宏宏调调用用中中的的参参数数称称为为实实际际参参数数。对对带带参参数数的的宏宏,在在调调用用中中,不仅要宏展开,而且要用实参去代换形参。不仅要宏展开,而且要用实参去代换形参。带参宏定义的一般形式为:带参宏定义的一般形式为:#define 宏名宏名(形参表形参表)字符串字符串17在在字字符符串串中中含含有有各各个个形形参参。带带参参宏宏调调用用的的一一般般形式为:形式为:宏名宏名(实参表实参表);例如:例如:#define MAX(a,b)(ab)?a:b /取取a和和b的最大数的最大数182、文件包含(、文件包含(include)文件包含的一般形式为:文件包含的一

13、般形式为:#include 文件名文件名功功能能是是把把指指定定的的文文件件插插入入该该命命令令行行位位置置取取代代该该命命令令行行,从从而而把把指指定定的的文文件件和和当当前前的的源源程程序序文件连成一个源文件。文件连成一个源文件。19说明以下几点:说明以下几点:包含命令中的文件名可以用双引号括起来,也可包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来。例如:以用尖括号括起来。例如:#include stdio.h#include 二者的区别二者的区别:使用尖括号表示在包含文件目录:使用尖括号表示在包含文件目录中去查找(包含目录由用户在开发环境中设置),中去查找(包含目录由用户在开

14、发环境中设置),而不在源文件目录去查找;使用双引号则表示首先而不在源文件目录去查找;使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目在当前的源文件目录中查找,若未找到才到包含目录中去查找。录中去查找。203、条件编译、条件编译条条件件编编译译就就是是按按不不同同的的条条件件去去编编译译不不同同的的程程序序部分,从而产生不同的目标代码文件。部分,从而产生不同的目标代码文件。条条件件编编译译对对于于程程序序的的移移植植和和调调试试(可可以以分分段段调调试试)非非常常有有用用。特特别别是是在在操操作作系系统统的的裁裁减减中中,经常使用条件编译。经常使用条件编译。21(1)第一种形式:

15、)第一种形式:#ifdef 标识符标识符 程序段程序段1#else 程序段程序段2#endif功功能能是是:如如果果标标识识符符已已被被#define命命令令定定义义过过,则则对对程程序序段段1进进行行编编译译;否否则则对对程程序序段段2进进行行编编译译。如如果果没没有有程程序序段段2(它它为为空空),本本格格式式中中的的#else可以没有。可以没有。22(2)第二种形式:)第二种形式:#ifndef 标识符标识符 程序段程序段1#else 程序段程序段2#endif功功能能是是:如如果果标标识识符符未未被被#define命命令令定定义义过过则则对对程程序序段段1进进行行编编译译,否否则则对对

16、程程序序段段2进进行行编编译。这与第一种形式的功能正相反。译。这与第一种形式的功能正相反。23(3)第三种形式:)第三种形式:#if 常量表达式常量表达式 程序段程序段1#else 程序段程序段2#endif功功能能是是,如如果果常常量量表表达达式式的的值值为为真真(非非0),则则对对程程序序段段1进进行行编编译译,否否则则对对程程序序段段2进进行行编编译译。因因此此可可以以使使程程序序在在不不同同条条件件下下,完完成成不不同同的功能。的功能。245.2 Keil C 和和 ANSI C一、一、Keil C51扩展关键字扩展关键字C51有以下扩展关键字(有以下扩展关键字(共共19个个):):_

17、at_、sbit、sfr、bit、sfr16、idata、bdata、xdata、pdata、data、code、alien、small、compact、large、using、reentrant、interrupt、_task_251、内存区域(、内存区域(Memory Areas):):(1)程序存储器:)程序存储器:code:程程序序存存储储区区。可可以以使使用用code定定义义表表格格常数。常数。(2)内部)内部RAM:用以下关键字说明:用以下关键字说明:data:直直接接寻寻址址区区,内内部部RAM的的低低128字字节节,地址范围为地址范围为00H7FH。idata:间间接接寻寻址址

18、区区,包包括括整整个个内内部部RAM区区,256字节,地址范围为字节,地址范围为00H0FFH。bdata:可位寻址区,地址范围为:可位寻址区,地址范围为20H2FH。26(3)外外部部数数据据存存储储器器:外外部部RAM视视使使用用情情况况可可由以下关键字标识:由以下关键字标识:xdata:可可指指定定多多达达64KB的的外外部部直直接接寻寻址址区区,地址范围地址范围0000H0FFFFH。pdata:能能 访访 问问 1页页(256Bytes)的的 外外 部部RAM(很少用)。(很少用)。27存储类型的指定:存储类型的指定:变量或参数的存储类型可由存储模式指定变量或参数的存储类型可由存储模

19、式指定缺省类型,也可由关键字缺省类型,也可由关键字code、data、idata、xdata、pdata直接声明指定。直接声明指定。例如:例如:unsigned char data buffer;char code array=“hello!”;unsigned char xdata arr1044;28(4)特殊功能寄存器()特殊功能寄存器(SFR)STC15F2K60S2单单片片机机的的特特殊殊功功能能寄寄存存器器(SFR)寻寻址址区区,用用来来控控制制定定时时器器、计计数数器器、串口、串口、I/O及其他部件。及其他部件。为为了了支支持持SFR及及其其可可寻寻址址位位的的声声明明,引引入入

20、了了sfr、sbit等关键词。等关键词。29sfr:字节寻址。语法如下:字节寻址。语法如下:sfr sfr_name=int_constant;如如 sfr P0=0 x80;0 x80为为P0口口的的地地址址,“=”后后为为常常数数,并并且且这这个个常数必须在特殊功能寄存器的地址范围内,位于常数必须在特殊功能寄存器的地址范围内,位于0 x80到到0 xFF之间。之间。30sfr16:字寻址:字寻址如如sfr16 DPTR=0 x82;指定指定DPTR的地址的地址DPL=0 x82,DPH=0 x83。sbit:位寻址:位寻址 用于声明可位寻址的特殊功能寄存器的位变量。用于声明可位寻址的特殊功

21、能寄存器的位变量。31sbit可以有下面声明方法:可以有下面声明方法:方法方法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),bit_number是位号(是位号(07)。)。如:如:sbit

22、OV=0 xD02;/定义定义PSW中的中的OV位位方法方法3:sbit bitname=bit_address;其中,其中,bit_address是位地址。是位地址。如:如:sbit EA=0 xAF;/第第0 xAF位为位为EA32对对于于大大多多数数8051内内核核单单片片机机,Keil提提供供了了一一个个包包含含所所有有特特殊殊功功能能寄寄存存器器和和它它们们的的位位的的定定义义的的头头文文件件reg51.h。通通过过包包含含头头文文件件可可以以很很容容易易的进行新的扩展。的进行新的扩展。附附录录C提提供供了了STC15F2K60S2单单片片机机的的头头文文件件stc15.h的的内内容

23、容,其其中中包包含含了了标标准准8051单单片片机机寄寄存存器器的的定定义义,编编程程时时只只需需包包含含这这一一个个文文件件即即可。该文件可以从可。该文件可以从中下载。中下载。332、_at_关键字关键字 若要实现变量的绝对定位(称为绝对变量),若要实现变量的绝对定位(称为绝对变量),可可以以直直接接在在数数据据定定义义后后加加上上“_at_ 常常数数地地址址”即即可。可。注意:注意:(1)绝对变量不能被初始化;)绝对变量不能被初始化;(2)bit型函数及变量不能用型函数及变量不能用_at_指定。指定。34例如:例如:unsigned char idata ADCdata _at_ 0 x4

24、0;/指定指定ADCdata变量在变量在40H处处 unsigned char xdata buffer20 _at_ 0 x0010;/指指定定buffer数数组组从从XRAM的的0010H单单元元开开始始353、存储模式、存储模式存存储储模模式式决决定定了了没没有有明明确确指指定定存存储储类类型型的的变变量量时时,函函 数数 参参 数数 等等 的的 缺缺 省省 存存 储储 区区 域域,有有 Small、Compact和和Large三种模式。三种模式。指定存储模式图图5-1 指定存储模式指定存储模式 36(1)Small模式模式在在该该模模式式中中所所有有变变量量都都默默认认位位于于单单片片

25、机机内内部部数数据据存存储储器器,这这和和使使用用data指指定定存存储储器器类类型型的的方方式式一一样样。此此模模式式访访问问变变量量的的效效率率很很高高,但但所所有有的的数数据据对对象象和和堆堆栈栈必必须须适适合合内内部部RAM堆堆栈栈的的大大小小。如如果果将将变变量量都都配配置置在在内内部部数数据据存存储储器器内内,Small模式是最佳选择。模式是最佳选择。该该模模式式的的优优点点是是访访问问速速度度快快,缺缺点点是是空空间间有有限限,只适用于小程序。只适用于小程序。37(2)Compact模式模式所所有有缺缺省省变变量量均均位位于于外外部部RAM区区的的一一页页内内(256字字节节),

26、这这和和使使用用pdata指指定定存存储储器器类类型型一一样样,在在STARTUP.A51文文件件中中说说明明,也也可可用用pdata指定。指定。该该模模式式空空间间比比Small宽宽裕裕,速速度度比比Small慢慢,比比Large快,是一种中间状态。快,是一种中间状态。38(3)Large模式模式所所有有缺缺省省变变量量可可放放在在多多达达64KB的的外外部部RAM区区,这这和和使使用用xdata指指定定存存储储器器类类型型一一样样,使使用用数数据据指指针针DPTR进进行行寻寻址址。通通过过数数据据指指针针访访问问外外部部数数据据存存储储器器的的效效率率较较低低,特特别别是是当当变变量量为为

27、2个个字字节节或或更更多多字字节节时时。该该模模式式的的数数据据访访问问比比Small和和Compact产生更多的代码。产生更多的代码。优点是空间大,可存变量多,缺点是速度较慢。优点是空间大,可存变量多,缺点是速度较慢。39数据类型数据类型含含 义义位数(位数(bit)字节数(字节数(byte)取值范围取值范围bit*位型位型11/80或或1signed char带符号字符型带符号字符型81-128+127unsigned char无符号字符型无符号字符型810255enum8/161 or 2-128+127or-32768+32767signed short带符号短型带符号短型162-32

28、768+32767unsigned short无符号短型无符号短型162065535signed int带符号整型带符号整型162-32768+32767unsigned int无符号整型无符号整型162065535signed long带符号长整型带符号长整型324-2147483648+2147483647unsigned long无符号长整型无符号长整型32404294967295float浮点型浮点型324+1.175494E38+3.402823E+38sbit*11/80-1sfr*810 x80-0 xffsfr16*1620 x800 xff4、变量或数据类型、变量或数据类型表

29、表5-1 C51数据类型数据类型40C51提供以下几种扩展数据类型:提供以下几种扩展数据类型:bit:位变量值为:位变量值为0或或1。sbit:从字节中定义的位变量(:从字节中定义的位变量(0或或1)。)。sfr:sfr字节地址(字节地址(0 x800 xff)。)。sfr16:sfr字地址(字地址(0 x800 xff,其实是占用,其实是占用 两个连续的地址)。两个连续的地址)。其余数据类型如:其余数据类型如:char、enum、short、int、long、float等与等与ANSI C相同。下面着相同。下面着重介绍位变量及其声明。重介绍位变量及其声明。41(1)bit型变量型变量bit型

30、型变变量量可可用用于于变变量量类类型型和和函函数数声声明明、函函数数返返回回值等,存储于内部值等,存储于内部RAM的的20H2FH单元中。单元中。注意:注意:1)使使用用禁禁止止中中断断(#pragma disable)或或包包含含明明确确的的寄寄存存器器组组切切换换(using n)的的函函数数不不能能返返回回位位值值,否否则,编译器会识别出来并产生一个错误信息。则,编译器会识别出来并产生一个错误信息。2)位位不不能能声声明明为为一一个个指指针针。如如bit*bit_poiter;是是错错误的。误的。3)不能有)不能有bit数组如:数组如:bit arr5;是错误的。;是错误的。42(2)可

31、位寻址区说明)可位寻址区说明使使用用sbit声声明明可可独独立立访访问问可可位位寻寻址址对对象象的的位位。sbit声声 明明 要要 求求 基基 址址 对对 象象 的的 存存 贮贮 器器 类类 型型 为为“bdata”,否否则则只只有有绝绝对对的的位位声声明明方方法法是是合合法的。法的。位位的的位位置置(操操作作符符号号后后的的数数字字)的的最最大大值依赖于指定的基类型值依赖于指定的基类型对于对于char/uchar而言是而言是07,对于对于int/uint/short/ushort而言是而言是015,对于对于long/ulong而言是而言是031。43下面举例说明位寻址的声明方法。下面举例说明

32、位寻址的声明方法。例如,例如,int bdata bittest _at_ 0 x20;/也可以省略也可以省略“_at_ 0 x20”sbit bit0bittest 0;/0 x20单元的第单元的第0位位 sbit bit15=bittest 15;/0 x21单元的第单元的第7位位注注意意:可可位位寻寻址址对对象象的的位位的的声声明明只只能能放放到到main函函数数的的外外部部,作作为为全全局局变变量量使使用用,否否则则,编编译译会会出出错。错。44二、二、扩展扩展I/O口的使用口的使用 STC15F2K60S2单片机除了芯片上的单片机除了芯片上的I/O口口外,还可在片外扩展外,还可在片外

33、扩展I/O端口。端口。由于使用由于使用C语言访问外部语言访问外部I/O时用到指针的功时用到指针的功能,因此,首先介绍能,因此,首先介绍Keil C51的指针。的指针。451、Keil C51指针指针Keil C51支支持持一一般般指指针针(Generic Pointer)和存储器指针(和存储器指针(Memory Specific Pointer)。)。一一般般指指针针的的声声明明和和使使用用均均与与标标准准C相相同同,同同时时还可以说明指针的存储类型。还可以说明指针的存储类型。46例例如如,下下面面的的语语句句都都声声明明pt为为指指向向保保存存在在外外部部RAM中中unsigned char

34、数数据据的的指指针针,但但pt本本身身的保存位置却不同:的保存位置却不同:unsigned char xdata*pt;/pt本身依存储模式存放本身依存储模式存放 unsigned char xdata*data pt;/pt被保存在内部被保存在内部RAM中中 unsigned char xdata*xdata pt;/pt被保存在外部被保存在外部RAM中中47一一般般指指针针本本身身用用3个个字字节节存存放放,分分别别为为存存储储器器类类型型,高高位位偏偏移移量量和和低低位位偏偏移移量量。基基于于存存储储器器的指针,说明时即指定了存储类型,例如:的指针,说明时即指定了存储类型,例如:char

35、 data*str;/str指向指向data区中区中char型数据型数据 int xdata*pow;/pow指向外部指向外部RAM的的int型整数型整数这这种种指指针针存存放放时时,只只需需一一个个字字节节或或2个个字字节节就就够了,因为只需存放偏移量。够了,因为只需存放偏移量。48关于堆栈指针关于堆栈指针SP 的设定的设定一一般般情情况况下下,用用户户不不需需要要在在C语语言言程程序序中中修修改改堆堆栈栈指指针针SP,但但要要关关心心一一下下SP的的位位置置。C51为为变变量量分分配配好好内内部部RAM后后,将将SP放放在在第第一一个个空空闲闲的的内内部部RAM处处,可可以以在在编编译译后

36、后生生成成的的.m51文文件件中中观观察察到到栈栈顶顶的的位位置置,一一般般程程序序编编译译连连接接成成功功后后要要习习惯惯性性地地看看一一下下.m51文文件件,看看一一下是不是有足够的栈空间可用。下是不是有足够的栈空间可用。另另外外,C51是是在在startup.A51中中设设置置SP指指针针的的,用用CODE选选项项生生成成的的汇汇编编代代码码中中是是找找不不到到这这段段代代码码的的。startup.A51是是C51的的初初始始化化代代码码,单单片片机机复复位位后后先先执执行行这这段段代代码码,完完成成初初始始化化后后由由它它调调用用main()函函数数。特特殊殊需需要要时时,可可以以修修

37、改改这这段段代代码码,然然后后连连接接到到用用户户的的程程序中去。序中去。492、外部扩展、外部扩展I/O口的访问口的访问在在C51中有两种方法访问外部中有两种方法访问外部I/O端口。端口。方法方法1:使用自定义指针。:使用自定义指针。由于片外由于片外I/O端口与片外存储器统一编址,所端口与片外存储器统一编址,所以可以定义以可以定义xdata类型的指针访问外部类型的指针访问外部I/O端口。端口。50例例如如,某某单单片片机机应应用用系系统统中中,使使用用8255扩扩展展I/O端端口口,采采用用线线选选法法对对8255进进行行地地址址译译码码,单片机的单片机的P 2.7(A15)接)接8255的

38、片选引脚,的片选引脚,8255的命令字地址为的命令字地址为7FF3H,PA口地址为口地址为7FF0H,PB口地址为口地址为7FF1H,PC口地址为口地址为7FF2H,访问访问8255的的C程序如下:程序如下:51写端口程序:写端口程序:char xdata *com8255;/定义指向外部存储区的指针定义指向外部存储区的指针 com8255=0 x7ff3;/使指针指向使指针指向8255的控制口地址的控制口地址7FF3H *com8255=0 x81;/输出输出81H到端口到端口 以上以上C程序相当于下面的汇编语言程序:程序相当于下面的汇编语言程序:MOV DPTR,#7FF3H MOV A,

39、#81H MOVX DPTR,A 52读端口程序:读端口程序:char xdata *com8255;/定义指针定义指针 com8255=0 x7ff0;/使指针指向使指针指向8255的的PA口地址口地址7FF0H char i;i=*com8255;/读读PA端口到变量端口到变量i53方法方法2:使用:使用C51预定义指针。预定义指针。为了方便地访问外部存储器及为了方便地访问外部存储器及I/O端口,在端口,在C51中的中的absacc.h头文件做了如下定义,利用这头文件做了如下定义,利用这些定义可以方便地访问外部些定义可以方便地访问外部I/O端口。端口。#define CBYTE(unsig

40、ned char volatile code *)0)#define DBYTE(unsigned char volatile data *)0)#define PBYTE(unsigned char volatile pdata*)0)#define XBYTE(unsigned char volatile xdata*)0)54例如:例如:#include#define PORTA XBYTE 0 x7ff0/其中,其中,PORTA为程序定义的为程序定义的I/O端口名称,端口名称,内的内容内的内容/7ff0H为为PORTA的地址的地址void main(void)char a;PORTA=

41、0 x81;/*输出输出81H到端口到端口7ff0H a=PORTA;/读端口读端口7ff0H到变量到变量a 55三、三、Keil C51函数函数 C51的函数声明对的函数声明对ANSI C作了扩展,具体包作了扩展,具体包括:括:1、中断函数声明、中断函数声明中中断断函函数数通通过过使使用用interrupt关关键键字字和和中中断断号号(031)来来声声明明。中中断断号号告告诉诉编编译译器器中中断断服服务程序的入口地址。务程序的入口地址。56STC15F2K60S2单片机的中断号单片机的中断号及中断服务程序及中断服务程序入口地址如表所入口地址如表所示。示。中断号中断号中断源中断源入口地址入口地

42、址0外部中断外部中断INT00003H1T0溢出中断溢出中断000BH2外部中断外部中断INT10013H3T1溢出中断溢出中断001BH4串行口串行口UART1中断中断0023H5ADC中断中断002BH6LVD中断中断0033H7PCA中断中断003BH8串行口串行口UART2中断中断0043H9SPI中断中断004BH10外部中断外部中断INT20053H11外部中断外部中断INT3005BH12T2溢出中断溢出中断0063H16外部中断外部中断INT40083H表表5-2中断号及中断服务程序入口地址中断号及中断服务程序入口地址57例如,串行口例如,串行口1的中断函数可以声明如下:的中断

43、函数可以声明如下:void UART1_ISR(void)interrupt 4 using 1 /*中断服务程序的代码中断服务程序的代码*/上上述述代代码码声声明明了了串串行行口口1中中断断服服务务函函数数。其其中中,interrupt 4说说明明是是串串行行口口1的的中中断断,using 1指指明明采采用用工工作作寄寄存存器器区区1区区,using 1在在中中括括号号中中,说说明明该该段段可可以以省省略略。其其他他中中断断函函数数的的定定义义与与此此类类似似。中中断断函函数数具具体体是是哪哪个个中中断断的的函函数数,与与中中断断号号有有关关,而而与与函函数数名名无无关关。582、指定工作寄

44、存器区、指定工作寄存器区当当需需要要指指定定函函数数中中使使用用的的工工作作寄寄存存器器区区时时,使使用用关关键键字字using后后跟跟一一个个0到到3的的数数,对对应应着着工工作寄存器作寄存器0到到3区。区。例例如如,在在下下面面的的函函数数中中使使用用了了工工作作寄寄存存器器1区区(相当于(相当于PSW.4=0,PSW.3=1):):unsigned char GetKey(void)using 1 /*用户程序代码用户程序代码*/593、指定存储模式、指定存储模式用用户户可可以以使使用用small,compact 及及large说说明明存储模式。存储模式。例如:例如:void fun1(

45、void)small 提提示示:small说说明明的的函函数数内内部部变变量量全全部部使使用用内内部部RAM。关关键键的的、经经常常性性的的、耗耗时时的的地地方方可可以以这这样样声明,以提高运行速度。声明,以提高运行速度。604、函数的参数传递规则、函数的参数传递规则最最多多只只能能有有3个个参参数数通通过过寄寄存存器器传传递递,规规律律如如表表5-3所示。所示。参数数目参数数目charintlong,float一般指针一般指针1R7R6&R7R4R7R1R32R5R4&R5R4R7R1R33R3R2&R3R1R3表表5-3 函数的参数传递规则函数的参数传递规则615、函数返回值的规定、函数返

46、回值的规定函函数数返返回回值值一一律律放放于于寄寄存存器器中中,规规则则如如表表5-4所示。所示。返回值类型返回值类型寄存器寄存器说明说明bitCychar/unsigned char,1_byte指针指针R7单字节由单字节由R7返回返回int/unsigned int 2_byte指针指针R6,R7R6放高位,放高位,R7放低位放低位long&unsigned longR4R7R4放最高位,放最高位,R7放最低位放最低位floatR4R7IEEE标准标准 R7放符号位及阶码放符号位及阶码一般指针一般指针R1,R2,R3R3放存储空间码,放存储空间码,R2放高放高位,位,R1放低位放低位表表5

47、-4 函数返回值的规定函数返回值的规定626、函数的重入、函数的重入可可以以在在函函数数前前声声明明函函数数的的可可重重入入性性,只只对对一一个个函函数数有有效。效。如如果果声声明明为为不不可可重重入入的的,说说明明该该函函数数调调用用过过程程中中将将不不可被中断。可被中断。递递归归或或可可重重入入函函数数指指定定在在主主程程序序和和中中断断中中都都可可调调用用的的函函数数,容容易易产产生生问问题题。因因为为单单片片机机和和PC不不同同,PC使使用用堆堆栈栈传传递递参参数数,且且静静态态变变量量以以外外的的内内部部变变量量都都在在堆堆栈栈中中;而而单单片片机机一一般般使使用用寄寄存存器器传传递

48、递参参数数,内内部部变变量量一般在一般在RAM中,函数重入时会破坏上次调用的数据。中,函数重入时会破坏上次调用的数据。63可以用以下两种方法解决函数的重入问题:可以用以下两种方法解决函数的重入问题:第一种方法第一种方法:在相应的函数前使用在相应的函数前使用“#pragma disable”声声明,即只允许主程序或中断之一调用该函数。明,即只允许主程序或中断之一调用该函数。第二种方法第二种方法:将该函数说明为可重入的。如下:将该函数说明为可重入的。如下:void func(param.)reentrant;64Keil C51编编译译后后将将生生成成一一个个可可重重入入变变量量堆堆栈栈,然后就可

49、以模拟通过堆栈传递变量的方法。然后就可以模拟通过堆栈传递变量的方法。因因为为单单片片机机内内部部堆堆栈栈空空间间的的限限制制,C51没没有有像像大大系系统统那那样样使使用用调调用用堆堆栈栈。一一般般在在C语语言言中中调调用用过过程程时时,会会把把过过程程的的参参数数和和过过程程中中使使用用的的局局部变量入栈。部变量入栈。65为为了了提提高高效效率率,C51没没有有提提供供这这种种堆堆栈栈,而而是是提提供供一一种种压压缩缩栈栈。每每个个过过程程被被给给定定一一个个空空间间,用用于于存存放放局局部部变变量量。过过程程中中的的每每个个变变量量都都存存放放在在这这个个空空间间的的固固定定位位置置。当当

50、递递归调用这个过程时,会导致变量被覆盖。归调用这个过程时,会导致变量被覆盖。在在某某些些实实时时应应用用中中,非非重重入入函函数数是是不不可可取取的的。因因为为,函函数数调调用用时时可可能能会会被被中中断断程程序序中中断断,而而在在中中断断程程序序中中可可能能再再次次调调用用这这个个函函数数,所所以以C51允允许许将将函函数数定定义义成成重重入入函函数数。重重入入函函数数可可被被递递归归调调用用和和多多重重调调用用,而而不不用用担担心心变变量量被被覆覆盖盖,因因为为每每次次函函数数调调用用时时的的局局部部变变量量都都会会被被单单独独保保存存。因因为为这这些些堆堆栈栈是是模模拟拟的的,重重入入函

51、函数数一一般般都都比比较较大大,运行起来也比较慢。运行起来也比较慢。66由由于于一一般般可可重重入入函函数数由由主主程程序序和和中中断断调调用用,所所以以通通常常中中断断程程序序使使用用与与主主程程序序不不同同的的工工作作寄寄存存器组。器组。另另外外,对对可可重重入入函函数数,在在相相应应的的函函数数前前面面加加上上开开关关#pragma noaregs,以以禁禁止止编编译译器器使使用用绝绝对对寄寄存存器器寻寻址址,可可生生成成不不依依赖赖于于寄寄存存器器组组的的代代码。码。67四、四、STC15F2K60S2单片机单片机C51程序框架程序框架#include“stc15.h”/*stc15.

52、h为为单单片片机机寄寄存存器器定定义义头头文文件件,具具体体内内容容参参见见附附录录C*/void delay(long delaytime);/声明子函数,子函数可以有返回值声明子函数,子函数可以有返回值void main(void)/此处可存放应用系统的初始化代码此处可存放应用系统的初始化代码 while(1)/主程序循环主程序循环 /根据需要填入适当的内容根据需要填入适当的内容 delay(100);/可以调用用户自定义的子函数可以调用用户自定义的子函数 68/-各个子函数的声明各个子函数的声明-void delay(long delaytime)while(delaytime0)del

53、aytime-;/子函数的实现代码子函数的实现代码/-各个中断函数的实现各个中断函数的实现-void INT0_ISR(void)interrupt 0 /外部中断外部中断0服务子函数服务子函数 /根据需要填入程序代码根据需要填入程序代码void T0_ISR(void)interrupt 1 /定时器定时器0中断服务子函数中断服务子函数 /根据需要填入程序代码根据需要填入程序代码void INT1_ISR(void)interrupt 2/外部中断外部中断1服务子函数服务子函数 /根据需要填入程序代码根据需要填入程序代码void T1_ISR(void)interrupt 3 /定时器定时器

54、1中断服务子函数中断服务子函数 /根据需要填入程序代码根据需要填入程序代码69void UART1_ISR(void)interrupt 4 /串口串口1中断服务子函数中断服务子函数 /根据需要填入程序代码根据需要填入程序代码,注意中断请求标志的清零注意中断请求标志的清零void ADC_ISR(void)interrupt 5 /ADC中断服务子函数中断服务子函数 /根据需要填入程序代码根据需要填入程序代码,注意中断请求标志的清零注意中断请求标志的清零void LVD_ISR(void)interrupt 6 /低电压检测中断子函数低电压检测中断子函数 /根据需要填入程序代码根据需要填入程序

55、代码,注意中断请求标志的清零注意中断请求标志的清零void PCA_ISR(void)interrupt 7 /PCA中断子函数中断子函数 /根据需要填入程序代码根据需要填入程序代码,注意中断请求标志的清零注意中断请求标志的清零void UART2_ISR(void)interrupt 8 /串口串口2中断子函数中断子函数 /根据需要填入程序代码根据需要填入程序代码,注意中断请求标志的清零注意中断请求标志的清零void SPI_ISR(void)interrupt 9 /SPI中断子函数中断子函数 /根据需要填入程序代码根据需要填入程序代码,注意中断请求标志的清零注意中断请求标志的清零70vo

56、id INT2_ISR(void)interrupt 10/外部中断外部中断2服务子函数服务子函数 /根据需要填入程序代码根据需要填入程序代码void INT3_ISR(void)interrupt 11/外部中断外部中断3服务子函数服务子函数 /根据需要填入程序代码根据需要填入程序代码void T2_ISR(void)interrupt 12 /定时器定时器2中断服务子函数中断服务子函数 /根据需要填入程序代码根据需要填入程序代码void INT4_ISR(void)interrupt 16/外部中断外部中断4服务子函数服务子函数 /根据需要填入程序代码根据需要填入程序代码71【例例5-1】

57、编编程程实实现现通通过过延延时时函函数数,P1.0输输出出方方波波信信号号,并并通过示波器观察程序输出波形的周期。通过示波器观察程序输出波形的周期。#include“stc15.h”/STC15F2K60S2单片机寄存器定义头文件单片机寄存器定义头文件 sbit P10=P10;/定义定义P1.0引脚引脚 void delay(unsigned long cnt);/延时函数声明延时函数声明 void main(void)P10=1;while(1)/主程序循环主程序循环 delay(60000);P10=P10;void delay(unsigned long cnt)/延时函数延时函数 w

58、hile(cnt0)cnt-;72 可以使用可以使用集成开发环境(集成开发环境(IDE)对单片机程序对单片机程序进行进行软件模拟调试软件模拟调试。由于此时无需任何硬件与开。由于此时无需任何硬件与开发,可以降低程序开发的成本,并且程序开发可发,可以降低程序开发的成本,并且程序开发可以在系统硬件完成之前开始。以在系统硬件完成之前开始。5.3 单片机单片机C语言程序调试语言程序调试73 模拟仿真调试的方法和过程与汇编语言模拟仿模拟仿真调试的方法和过程与汇编语言模拟仿真调试的过程相同。但是,真调试的过程相同。但是,软件模拟调试无法仿软件模拟调试无法仿真精确的硬件信号,真精确的硬件信号,难以仿真过程控制

59、中的通信难以仿真过程控制中的通信网络时序及实时转换,因此当软件开发过程进入网络时序及实时转换,因此当软件开发过程进入必须有最终硬件参与共同完成的阶段时,就需要必须有最终硬件参与共同完成的阶段时,就需要进行在系统调试。传统的仿真方法是使用仿真器进行在系统调试。传统的仿真方法是使用仿真器进行仿真和调试。进行仿真和调试。下面介绍如何使用仿真器进行下面介绍如何使用仿真器进行程序的仿真和调试。程序的仿真和调试。74一、使用仿真器进行程序的仿真调试一、使用仿真器进行程序的仿真调试 使用宏晶单片机仿真器适用于使用宏晶单片机仿真器适用于STC单片机应用单片机应用技术的学习和实验程序的调试,使用过程如下:技术的

60、学习和实验程序的调试,使用过程如下:1、硬件设置、硬件设置 目前的仿真方式为双目前的仿真方式为双CPU仿真:监控仿真:监控CPU和和仿真仿真CPU。仿真。仿真CPU目标芯片必须是宏晶的目标芯片必须是宏晶的IAP系列(目前只支持系列(目前只支持IAP15F2K60S2,仿真,仿真完成后,可以直接将程序下载完成后,可以直接将程序下载STC15F2K60S2 单片机中)。单片机中)。75计算机、仿真器和学习板连接示意图如图所示:计算机、仿真器和学习板连接示意图如图所示:计算机计算机USB接口接口USB数据线数据线仿真器仿真器USB数据线数据线学习板学习板图图5-2 计算机、仿真器和学习板连接示意图计

61、算机、仿真器和学习板连接示意图762、软件设置、软件设置用户程序中需要在用户程序中需要在0 x73的地址处保留的地址处保留6个字节。个字节。C语言程序,需在代码中添加如下语句:语言程序,需在代码中添加如下语句:char code reserved6 _at_ 0 x73;/在在程程序序中中进进行行声声明明汇编语言程序,需在代码中添加如下语句:汇编语言程序,需在代码中添加如下语句:CSEG AT 73H ;在代码段在代码段33H定址定址 RESERVED:DS 6 ;保留保留6字节字节 或者或者 ORG 73H ;在代码段在代码段33H定址定址 RESERVED:DB 0FFH,0FFH,0FF

62、H,0FFH,0FFH,0FFH;保留保留6字节字节 77对对于于汇汇编编语语言言程程序序,复复位位入入口口的的程程序序必必须须为为跳跳转转指指令令(建建议使用长跳转),如:议使用长跳转),如:ORG 0 ;复位入口地址复位入口地址 LJMP RESET ;使用使用LJMP指令指令 ;其它中断向量其它中断向量 ORG 73H ;保留字节地址保留字节地址 RESERVED:DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH;保保留留6字字节节 ORG 0100H ;用户代码地址用户代码地址 RESET:;复位入口复位入口 ;用户代码用户代码 78按照上述要求,将例按照上述要求,将例

63、5-1中的程序进行改写,改写后的程序如下中的程序进行改写,改写后的程序如下:#include“stc15.h”/STC15F2K60S2单片机寄存器定义头文件单片机寄存器定义头文件 char code reserved6 _at_ 0 x73;/在程序中进行声明在程序中进行声明 sbit P10=P10;/定义定义P1.0引脚引脚 void delay(unsigned long cnt);/延时函数声明延时函数声明 void main(void)P10=1;while(1)/主程序循环主程序循环 delay(60000);P10=P10;void delay(unsigned long cn

64、t)/延时函数延时函数 while(cnt0)cnt-;793、仿真代码占用的资源、仿真代码占用的资源程序空间程序空间:5K字节字节(0 xDC000 xF3FF)RAM:0字节字节 XRAM:0字节字节 I/O:P3.0/P3.1804、Keil环境中的设置环境中的设置设置晶振频率设置晶振频率 使用使用ProjectOptions for Target Target命令打命令打开选项设置窗口,如图所示。开选项设置窗口,如图所示。在在此此编编辑辑框框中中输输入晶振频率入晶振频率图5-3 设置晶振频率81设置设置Output选项选项 在在“Output”选选 项项 中中 作作 如如 图图 所所

65、示示 的的 设设 置置。选选 中中“Create HEX File”复选框,复选框,Keil每进行一次每进行一次Build,都生成可以,都生成可以下载到单片机的下载到单片机的HEX文件。文件。选选中中“Create HEX File”复复选框选框图5-4 设置“Output”属性 82选择硬件仿真选择硬件仿真 在在“Debug”选项卡中,选中右半部分中的选项卡中,选中右半部分中的“Use”,从下拉列表框中选择从下拉列表框中选择“Keil Monitor-51 Driver”,并,并选中选中“Run to main”选项。如图所示。选项。如图所示。选选择择Keil Monitor-51 Driv

66、er选选中中“Run to main”图5-5 选择硬件仿真83设置串口设置串口 在在图图5-5中中,单单击击“Settings”按按钮钮,弹弹出出串串口口设设置置对话框,如图所示。对话框,如图所示。Setting选择串口号选择串口号图图5-6 设置串口对话框设置串口对话框图图5-5 选择硬件仿真选择硬件仿真84其其中中,RTS和和DTR是是PC机机在在和和单单片片机机通通信信时时给给单单片片机机的的握握手手信信号号主主要要的的任任务务是是设设置置串串口口号号,其其他他可以不改变。可以不改变。串口号是仿真时,仿真器所使用的串口号。串口号是仿真时,仿真器所使用的串口号。如如果果采采用用了了USB转转RS232芯芯片片,需需要要特特别别注注意意串串口号的选择。口号的选择。选选中中“Serial Interrupt”选选项项可可以以在在全全速速运运行行程序时暂停用户程序的执行。程序时暂停用户程序的执行。设置完成后,就可以进行程序的调试了。设置完成后,就可以进行程序的调试了。85使使用用仿仿真真器器进进行行程程序序的的仿仿真真时时,需需要要注注意意如如下下问问题:题:仿仿真真器器与与计计算算机

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!