资源预览内容
第1页 / 共148页
第2页 / 共148页
第3页 / 共148页
第4页 / 共148页
第5页 / 共148页
第6页 / 共148页
第7页 / 共148页
第8页 / 共148页
第9页 / 共148页
第10页 / 共148页
亲,该文档总共148页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
张兴忠制作:返回目录单片机原理与接口技术单片机原理与接口技术太原理工大学电子工业出版社第第5章章 MCS-51单片机单片机 C51程序设计程序设计制作 张兴忠 修审 牛昱光8/30/20241张兴忠制作:返回目录n n熟悉熟悉C51C51语法基础和程序结构;语法基础和程序结构;n n掌握掌握C51C51结构化程序设计;结构化程序设计;n n掌握掌握C51C51对单片机硬件的访问方法;对单片机硬件的访问方法;n n掌握掌握C51C51函数定义与调用;函数定义与调用;n n了解汇编语言和了解汇编语言和C51C51的混和编程。的混和编程。本章教学要求本章教学要求本章教学要求本章教学要求 第第5章章 MCS-51单片机单片机C51程序设计程序设计8/30/20242张兴忠制作:返回目录5.1 C515.1 C51概述概述概述概述5.2 C515.2 C51语法基础语法基础语法基础语法基础5.2.1 5.2.1 标识符和关键标识符和关键标识符和关键标识符和关键字字字字5.2.2 5.2.2 数据类型数据类型数据类型数据类型5.2.3 5.2.3 运算符和表达运算符和表达运算符和表达运算符和表达式式式式5.2.4 5.2.4 程序结构程序结构程序结构程序结构第第5章章 MCS-51单片机单片机C51程序设计程序设计本章目录本章目录本章目录本章目录5.3 C515.3 C51对对对对MCS-51MCS-51单片机的访单片机的访单片机的访单片机的访问问问问5.3.1 5.3.1 存储类型存储类型存储类型存储类型5.3.2 5.3.2 存储模式存储模式存储模式存储模式5.3.3 5.3.3 对特殊功能寄存器的访对特殊功能寄存器的访对特殊功能寄存器的访对特殊功能寄存器的访问问问问5.3.4 5.3.4 对存储器和并行口的访对存储器和并行口的访对存储器和并行口的访对存储器和并行口的访问问问问5.3.5 5.3.5 位地址访问位地址访问位地址访问位地址访问8/30/20243张兴忠制作:返回目录5.4 C515.4 C51函数函数函数函数5.4.1 5.4.1 函数的分类函数的分类函数的分类函数的分类5.4.2 5.4.2 函数的定义函数的定义函数的定义函数的定义5.4.3 5.4.3 函数的调用函数的调用函数的调用函数的调用5.4.4 5.4.4 对被调函数的说明对被调函数的说明对被调函数的说明对被调函数的说明5.4.5 5.4.5 中断函数中断函数中断函数中断函数5.5 C515.5 C51结构化程序设计结构化程序设计结构化程序设计结构化程序设计5.5.1 5.5.1 顺序结构程序顺序结构程序顺序结构程序顺序结构程序5.5.2 5.5.2 选择结构程序选择结构程序选择结构程序选择结构程序第第5章章 MCS-51单片机单片机C51程序设计程序设计本章目录本章目录本章目录本章目录5.5.3 5.5.3 循环结构程序循环结构程序循环结构程序循环结构程序5.5.4 5.5.4 查表程序查表程序查表程序查表程序5.6 C515.6 C51程序设计实例程序设计实例程序设计实例程序设计实例5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用外部资源应用外部资源应用外部资源应用程序设计程序设计程序设计程序设计5.6.2 C515.6.2 C51语言和语言和语言和语言和MCS-51MCS-51汇编汇编汇编汇编语言混合编程语言混合编程语言混合编程语言混合编程5.6.3 5.6.3 编程优化的概念编程优化的概念编程优化的概念编程优化的概念习题与思考题习题与思考题习题与思考题习题与思考题8/30/20244张兴忠制作:返回目录5.1 C515.1 C51概述概述概述概述C C C C语语语语言言言言是是是是一一一一种种种种通通通通用用用用的的的的程程程程序序序序设设设设计计计计语语语语言言言言,其其其其代代代代码码码码率率率率高高高高,数数数数据据据据类类类类型型型型及及及及运运运运算算算算符符符符丰丰丰丰富富富富,位位位位操操操操作作作作能能能能力力力力强强强强,适适适适用用用用于于于于各各各各种种种种应应应应用用用用的的的的程程程程序序序序设设设设计计计计。使使使使用用用用C C C C语语语语言言言言进进进进行行行行单单单单片片片片机机机机应应应应用用用用系系系系统统统统开开开开发发发发,具具具具有有有有编编编编程程程程灵灵灵灵活活活活、调调调调试试试试方方方方便便便便、目目目目标标标标代代代代码码码码编编编编译译译译效效效效率率率率高高高高的的的的特特特特点点点点。C C C C语语语语言言言言也也也也是是是是目目目目前前前前使使使使用用用用最最最最广广广广的的的的单单单单片片片片机机机机应应应应用用用用系系系系统统统统编编编编程程程程语语语语言。言。言。言。由由由由C C C C语语语语言言言言编编编编程程程程的的的的单单单单片片片片机机机机应应应应用用用用程程程程序序序序,称称称称为为为为单单单单片片片片机机机机C C C C语语语语言言言言程程程程序序序序。MCS-51MCS-51MCS-51MCS-51系系系系列列列列单单单单片片片片机机机机开开开开发发发发系系系系统统统统的的的的编编编编译译译译软软软软件件件件可可可可以以以以对对对对51515151单单单单片片片片机机机机C C C C语语语语言言言言源源源源程程程程序序序序进进进进行行行行编编编编译译译译,称称称称为为为为C51C51C51C51编编编编译译译译器器器器。在在在在C51C51C51C51编译软件中可进行编译软件中可进行编译软件中可进行编译软件中可进行51515151单片机单片机单片机单片机C C C C语言程序的调试。语言程序的调试。语言程序的调试。语言程序的调试。- C51编译器编译器8/30/20245张兴忠制作:返回目录1) 1) 1) 1) 扩展了专门访问扩展了专门访问扩展了专门访问扩展了专门访问MCS-51MCS-51MCS-51MCS-51单片机硬件的数据类型;单片机硬件的数据类型;单片机硬件的数据类型;单片机硬件的数据类型;2) 2) 2) 2) 存储类型按存储类型按存储类型按存储类型按MCS-51MCS-51MCS-51MCS-51单片机存储空间分类;单片机存储空间分类;单片机存储空间分类;单片机存储空间分类;3) 3) 3) 3) 存储模式遵循存储空间选定编译器模式;存储模式遵循存储空间选定编译器模式;存储模式遵循存储空间选定编译器模式;存储模式遵循存储空间选定编译器模式;4) 4) 4) 4) 指针分为通用指针和存储器指针;指针分为通用指针和存储器指针;指针分为通用指针和存储器指针;指针分为通用指针和存储器指针;5) 5) 5) 5) 函数增加了中断函数和再入函数。函数增加了中断函数和再入函数。函数增加了中断函数和再入函数。函数增加了中断函数和再入函数。5.1 C515.1 C51概述概述概述概述- C51特点特点C51C51编译器针对编译器针对编译器针对编译器针对MCS-51MCS-51单片机硬件在下列几方单片机硬件在下列几方单片机硬件在下列几方单片机硬件在下列几方面对面对面对面对ANSI CANSI C进行了扩展。进行了扩展。进行了扩展。进行了扩展。8/30/20246张兴忠制作:返回目录使使使使用用用用具具具具有有有有C51C51C51C51编编编编译译译译扩扩扩扩展展展展功功功功能能能能的的的的C C C C语语语语言言言言进进进进行行行行MCS-51MCS-51MCS-51MCS-51单单单单片片片片机机机机应应应应用用用用系系系系统的开发编程,简称统的开发编程,简称统的开发编程,简称统的开发编程,简称C51C51C51C51编程。编程。编程。编程。C51C51C51C51编程具有以下特点。编程具有以下特点。编程具有以下特点。编程具有以下特点。1) 1) 1) 1) 可可可可管管管管理理理理内内内内部部部部寄寄寄寄存存存存器器器器和和和和存存存存储储储储器器器器的的的的分分分分配配配配,编编编编程程程程时时时时,无无无无需需需需考考考考虑虑虑虑不同存储器的寻址和数据类型等细节问题;不同存储器的寻址和数据类型等细节问题;不同存储器的寻址和数据类型等细节问题;不同存储器的寻址和数据类型等细节问题;2) 2) 2) 2) 程程程程序序序序由由由由若若若若干干干干函函函函数数数数组组组组成成成成,具具具具有有有有良良良良好好好好的的的的模模模模块块块块化化化化结结结结构构构构、可可可可移移移移植植植植性好、便于项目维护管理;性好、便于项目维护管理;性好、便于项目维护管理;性好、便于项目维护管理;3) 3) 3) 3) 有有有有丰丰丰丰富富富富的的的的子子子子程程程程序序序序库库库库可可可可直直直直接接接接引引引引用用用用,从从从从而而而而大大大大大大大大减减减减少少少少用用用用户户户户编编编编程程程程工作量,提高编程效率;工作量,提高编程效率;工作量,提高编程效率;工作量,提高编程效率;4) 4) 4) 4) 与汇编语言交叉编程。用汇编语言编写与硬件有关的程与汇编语言交叉编程。用汇编语言编写与硬件有关的程与汇编语言交叉编程。用汇编语言编写与硬件有关的程与汇编语言交叉编程。用汇编语言编写与硬件有关的程序,用序,用序,用序,用C51C51C51C51编写与硬件无关的运算程序,充分发挥两种语言的长编写与硬件无关的运算程序,充分发挥两种语言的长编写与硬件无关的运算程序,充分发挥两种语言的长编写与硬件无关的运算程序,充分发挥两种语言的长处,提高开发效率。处,提高开发效率。处,提高开发效率。处,提高开发效率。5.1 C515.1 C51概述概述概述概述- C51特点特点8/30/20247张兴忠制作:返回目录C51C51C51C51编编编编程程程程和和和和汇汇汇汇编编编编语语语语言言言言编编编编程程程程过过过过程程程程一一一一样样样样。单单单单片片片片机机机机C C C C语语语语言言言言源源源源程程程程序序序序经经经经过过过过编编编编辑辑辑辑、编编编编译译译译、连连连连接接接接后后后后生生生生成成成成目目目目标标标标程程程程序序序序(.BIN.BIN.BIN.BIN和和和和.HEX.HEX.HEX.HEX)文文文文件件件件,然然然然后后后后运运运运行行行行即即即即可可可可。调调调调试试试试51515151单单单单片片片片机机机机C C C C语语语语言言言言程程程程序序序序可可可可用用用用Keil Keil Keil Keil C51C51C51C51编译器。编译器。编译器。编译器。注注注注意意意意,使使使使用用用用C51C51C51C51编编编编程程程程可可可可以以以以取取取取代代代代繁繁繁繁琐琐琐琐的的的的汇汇汇汇编编编编语语语语言言言言编编编编程程程程,但但但但仍仍仍仍需需需需要要要要了了了了解解解解MCS-51MCS-51MCS-51MCS-51单单单单片片片片机机机机的的的的硬硬硬硬件件件件结结结结构构构构。所所所所以以以以对对对对于于于于单单单单片片片片机机机机系系系系统的开发应采用汇编语言与统的开发应采用汇编语言与统的开发应采用汇编语言与统的开发应采用汇编语言与C51C51C51C51混合编程的方法更为有效。混合编程的方法更为有效。混合编程的方法更为有效。混合编程的方法更为有效。5.1 C515.1 C51概述概述概述概述- C51特点特点8/30/20248张兴忠制作:返回目录5.2 C51 5.2 C51 语法基础语法基础语法基础语法基础标标标标识识识识符符符符用用用用来来来来标标标标识识识识源源源源程程程程序序序序中中中中某某某某个个个个对对对对象象象象的的的的名名名名字字字字,这这这这些些些些对对对对象可以是语句、数据类型、函数、变量、数组等。象可以是语句、数据类型、函数、变量、数组等。象可以是语句、数据类型、函数、变量、数组等。象可以是语句、数据类型、函数、变量、数组等。标标标标识识识识符符符符由由由由字字字字符符符符串串串串、数数数数字字字字和和和和下下下下划划划划线线线线等等等等组组组组成成成成,应应应应该该该该注注注注意意意意的的的的是是是是第第第第一一一一个个个个字字字字符符符符必必必必须须须须是是是是字字字字母母母母或或或或下下下下划划划划线线线线,不不不不能能能能用用用用数数数数字字字字开开开开头头头头,如如如如“1_a”“1_a”“1_a”“1_a”是是是是错错错错误误误误的的的的,编编编编译译译译时时时时会会会会有有有有错错错错误误误误提提提提示示示示。在在在在C51C51C51C51编编编编译译译译器中,只支持标识符的前器中,只支持标识符的前器中,只支持标识符的前器中,只支持标识符的前32323232位为有效标识。位为有效标识。位为有效标识。位为有效标识。C51C51C51C51语语语语言言言言是是是是区区区区分分分分大大大大小小小小写写写写的的的的一一一一种种种种高高高高级级级级语语语语言言言言,如如如如“a_1”“a_1”“a_1”“a_1”和和和和“A_1”“A_1”“A_1”“A_1”是两个完全不同的标识符。是两个完全不同的标识符。是两个完全不同的标识符。是两个完全不同的标识符。5.2.1 5.2.1 5.2.1 5.2.1 标识符和关键字标识符和关键字标识符和关键字标识符和关键字-标识符标识符8/30/20249张兴忠制作:返回目录C51C51C51C51中中中中有有有有些些些些库库库库函函函函数数数数的的的的标标标标识识识识符符符符是是是是以以以以下下下下划划划划线线线线开开开开头头头头的的的的,所所所所以以以以一一一一般般般般不不不不要要要要以以以以下下下下划划划划线线线线开开开开头头头头命命命命名名名名用用用用户户户户自自自自定定定定义义义义标标标标识识识识符符符符。标标标标识识识识符符符符在在在在命命命命名名名名时时时时应应应应当当当当简单,含义清晰,这样有助于阅读理解程序。简单,含义清晰,这样有助于阅读理解程序。简单,含义清晰,这样有助于阅读理解程序。简单,含义清晰,这样有助于阅读理解程序。关关关关键键键键字字字字则则则则是是是是编编编编程程程程语语语语言言言言保保保保留留留留的的的的特特特特殊殊殊殊标标标标识识识识符符符符,它它它它们们们们具具具具有有有有固固固固定定定定的的的的名名名名称称称称和和和和含含含含义义义义,在在在在程程程程序序序序编编编编写写写写中中中中不不不不允允允允许许许许将将将将关关关关键键键键字字字字另另另另做做做做他他他他用用用用。C51C51C51C51中中中中的的的的关关关关键键键键字字字字除除除除了了了了有有有有ANSI ANSI ANSI ANSI C C C C标标标标准准准准的的的的32323232个个个个关关关关键键键键字字字字外外外外,还还还还根根根根据据据据MCS-51MCS-51MCS-51MCS-51单单单单片片片片机的特点扩展了相关的关键字。机的特点扩展了相关的关键字。机的特点扩展了相关的关键字。机的特点扩展了相关的关键字。C51C51C51C51关键字如表关键字如表关键字如表关键字如表5-15-15-15-1所示。所示。所示。所示。在在在在C51C51C51C51的的的的文文文文本本本本编编编编辑辑辑辑器器器器中中中中编编编编写写写写C C C C程程程程序序序序,系系系系统统统统可可可可以以以以把把把把保保保保留留留留关关关关键键键键字字字字以不同颜色显示,如以不同颜色显示,如以不同颜色显示,如以不同颜色显示,如intintintint关键字的默认颜色为天蓝色。关键字的默认颜色为天蓝色。关键字的默认颜色为天蓝色。关键字的默认颜色为天蓝色。5.2.1 5.2.1 标识符和关键字标识符和关键字标识符和关键字标识符和关键字-关键字关键字8/30/202410张兴忠制作:返回目录5.2.1 5.2.1 标识符和关键字标识符和关键字标识符和关键字标识符和关键字-关键字列表关键字列表8/30/202411张兴忠制作:返回目录5.2.1 5.2.1 标识符和关键字标识符和关键字标识符和关键字标识符和关键字-关键字列表关键字列表8/30/202412张兴忠制作:返回目录5.2.1 5.2.1 标识符和关键字标识符和关键字标识符和关键字标识符和关键字-关键字列表关键字列表8/30/202413张兴忠制作:返回目录5.2.2 5.2.2 数据类型数据类型数据类型数据类型n nC51C51C51C51具有具有具有具有ANSI CANSI CANSI CANSI C的所有标准数据类型。的所有标准数据类型。的所有标准数据类型。的所有标准数据类型。n n其基本数据类型包括:其基本数据类型包括:其基本数据类型包括:其基本数据类型包括:charcharcharchar、intintintint、shortshortshortshort、longlonglonglong、floatfloatfloatfloat和和和和doubledoubledoubledouble。 n n对对对对C51C51C51C51编译器来说,编译器来说,编译器来说,编译器来说,shortshortshortshort类型和类型和类型和类型和intintintint类型相类型相类型相类型相同,同,同,同,doubledoubledoubledouble类型和类型和类型和类型和floatfloatfloatfloat类型相同。类型相同。类型相同。类型相同。-C51的数据类型的数据类型8/30/202414张兴忠制作:返回目录 除除除除此此此此之之之之外外外外,为为为为了了了了更更更更加加加加有有有有利利利利地地地地利利利利用用用用MCS-51MCS-51MCS-51MCS-51的的的的结结结结构构构构,C51C51C51C51还还还还增增增增加加加加了了了了一一一一些些些些特特特特殊殊殊殊的的的的数数数数据据据据类类类类型型型型,包包包包括括括括bitbitbitbit、sbitsbitsbitsbit、sfrsfrsfrsfr、sfr16sfr16sfr16sfr16。数据类型如表数据类型如表数据类型如表数据类型如表5-25-25-25-2所示。所示。所示。所示。5.2.2 5.2.2 数据类型数据类型数据类型数据类型-C51的数据类型的数据类型8/30/202415张兴忠制作:返回目录 charcharcharchar类类类类型型型型的的的的长长长长度度度度是是是是1B1B1B1B,通通通通常常常常用用用用于于于于定定定定义义义义处处处处理理理理字字字字符符符符数数数数据的变量或常量。据的变量或常量。据的变量或常量。据的变量或常量。 unsigned unsigned unsigned unsigned charcharcharchar类类类类型型型型用用用用字字字字节节节节中中中中所所所所有有有有的的的的位位位位表表表表示示示示数数数数值值值值,可以表达的数值范围是可以表达的数值范围是可以表达的数值范围是可以表达的数值范围是0255025502550255。 signed signed signed signed charcharcharchar类类类类型型型型用用用用字字字字节节节节中中中中最最最最高高高高位位位位表表表表示示示示数数数数据据据据的的的的符符符符号号号号,0 0 0 0表表表表示示示示正正正正数数数数,1 1 1 1表表表表示示示示负负负负数数数数,负负负负数数数数用用用用补补补补码码码码表表表表示示示示,能能能能表表表表示示示示的的的的数数数数值值值值范范范范围围围围是是是是-128+127-128+127-128+127-128+127。unsigned unsigned unsigned unsigned charcharcharchar常常常常用用用用于于于于处处处处理理理理ASCIIASCIIASCIIASCII字符或用于处理小于或等于字符或用于处理小于或等于字符或用于处理小于或等于字符或用于处理小于或等于255255255255的整型数。的整型数。的整型数。的整型数。1 1 1 1charcharcharchar字符类型字符类型字符类型字符类型5.2.2 5.2.2 数据类型数据类型数据类型数据类型-char字符类型字符类型8/30/202416张兴忠制作:返回目录2 2 2 2intintintint整型整型整型整型 intintintint整型长度为整型长度为整型长度为整型长度为2B2B2B2B,用于存放一个双字节数据。,用于存放一个双字节数据。,用于存放一个双字节数据。,用于存放一个双字节数据。 signed signed signed signed intintintint表表表表示示示示的的的的数数数数值值值值范范范范围围围围是是是是-32768-32768-32768-32768+32767+32767+32767+32767,字字字字节节节节中中中中最最最最高高高高位位位位表表表表示示示示数数数数据据据据的的的的符符符符号号号号,0 0 0 0表表表表示示示示正正正正数数数数,1 1 1 1表表表表示示示示负负负负数。数。数。数。 unsigned int unsigned int unsigned int unsigned int表示的数值范围是表示的数值范围是表示的数值范围是表示的数值范围是0 0 0 065535655356553565535。5.2.2 5.2.2 数据类型数据类型数据类型数据类型-int整型整型8/30/202417张兴忠制作:返回目录 longlonglonglong长整型长度为长整型长度为长整型长度为长整型长度为4B4B4B4B,用于存放一个四字节数据。,用于存放一个四字节数据。,用于存放一个四字节数据。,用于存放一个四字节数据。 分分分分有有有有符符符符号号号号longlonglonglong长长长长整整整整型型型型signed signed signed signed longlonglonglong和和和和无无无无符符符符号号号号longlonglonglong长长长长整整整整型型型型unsigned longunsigned longunsigned longunsigned long,默认值为,默认值为,默认值为,默认值为signed longsigned longsigned longsigned long类型。类型。类型。类型。 signed signed signed signed intintintint表表表表示示示示的的的的数数数数值值值值范范范范围围围围是是是是-2147483648-2147483648-2147483648-2147483648+2147483647+2147483647+2147483647+2147483647,字节中最高位表示数据的符号,字节中最高位表示数据的符号,字节中最高位表示数据的符号,字节中最高位表示数据的符号,0 0 0 0表示正数,表示正数,表示正数,表示正数,1 1 1 1表示负数。表示负数。表示负数。表示负数。 unsigned long unsigned long unsigned long unsigned long表示的数值范围是表示的数值范围是表示的数值范围是表示的数值范围是0 0 0 04294967295429496729542949672954294967295。3 3 3 3longlonglonglong长整型长整型长整型长整型5.2.2 5.2.2 数据类型数据类型数据类型数据类型-long长整型长整型8/30/202418张兴忠制作:返回目录4 4 4 4floatfloatfloatfloat浮点型浮点型浮点型浮点型 floatfloat浮点型在十进制中具有浮点型在十进制中具有7 7位有效数位有效数字,是符合字,是符合IEEE-754IEEE-754标准(标准(3232)的单精度浮)的单精度浮点型数据,占用点型数据,占用4B4B。具有。具有2424位精度。位精度。5.2.2 5.2.2 数据类型数据类型数据类型数据类型-float浮点型浮点型8/30/202419张兴忠制作:返回目录5 5 5 5* * * *指针型指针型指针型指针型 指指指指针针针针型型型型本本本本身身身身就就就就是是是是一一一一个个个个变变变变量量量量,在在在在这这这这个个个个变变变变量量量量中中中中存存存存放放放放着着着着指指指指向向向向另另另另一一一一个个个个数数数数据据据据的的的的地地地地址址址址。这这这这个个个个指指指指针针针针变变变变量量量量要要要要占占占占据据据据一一一一定定定定的的的的内内内内存存存存单单单单元元元元,对对对对不不不不同同同同的的的的处处处处理理理理器器器器长长长长度度度度也也也也不不不不尽尽尽尽相同,在相同,在相同,在相同,在C51C51C51C51中它的长度一般为中它的长度一般为中它的长度一般为中它的长度一般为1 1 1 13 3 3 3个字节。个字节。个字节。个字节。5.2.2 5.2.2 数据类型数据类型数据类型数据类型-*指针型指针型8/30/202420张兴忠制作:返回目录 bitbitbitbit位位位位标标标标量量量量是是是是C51C51C51C51编编编编译译译译器器器器的的的的一一一一种种种种扩扩扩扩充充充充数数数数据据据据类类类类型型型型,利利利利用用用用它它它它可可可可定定定定义义义义一一一一个个个个位位位位标标标标量量量量。它它它它的的的的值值值值是是是是一一一一个个个个二二二二进进进进制制制制位位位位,不不不不是是是是0 0 0 0,就就就就是是是是1 1 1 1,类类类类似似似似一一一一些些些些高高高高级级级级语语语语言言言言中的中的中的中的booleanbooleanbooleanboolean型数据的型数据的型数据的型数据的TrueTrueTrueTrue和和和和FalseFalseFalseFalse。6 6 6 6bitbitbitbit位标量位标量位标量位标量5.2.2 5.2.2 数据类型数据类型数据类型数据类型-bit位标量位标量8/30/202421张兴忠制作:返回目录7 7 7 7sfrsfrsfrsfr特殊功能寄存器特殊功能寄存器特殊功能寄存器特殊功能寄存器 sfrsfrsfrsfr是是是是一一一一种种种种C51C51C51C51扩扩扩扩充充充充数数数数据据据据类类类类型型型型,占占占占用用用用一一一一个个个个内内内内存存存存单单单单元元元元,值域为值域为值域为值域为0 0 0 0255255255255。 利利利利用用用用它它它它可可可可以以以以访访访访问问问问MCS-51MCS-51MCS-51MCS-51单单单单片片片片机机机机内内内内部部部部的的的的所所所所有有有有特特特特殊殊殊殊功功功功能寄存器。能寄存器。能寄存器。能寄存器。 如如如如用用用用sfr sfr sfr sfr P1 P1 P1 P1 = = = = 0x900x900x900x90定定定定义义义义一一一一个个个个特特特特殊殊殊殊功功功功能能能能寄寄寄寄存存存存器器器器变变变变量量量量“P1”“P1”“P1”“P1”,0x900x900x900x90是是是是指指指指51515151单单单单片片片片机机机机的的的的P1P1P1P1端端端端口口口口地地地地址址址址90H90H90H90H,变变变变量量量量P1P1P1P1即指即指即指即指51515151单片机的单片机的单片机的单片机的P1P1P1P1端口。端口。端口。端口。 在在在在后后后后面面面面的的的的语语语语句句句句中中中中可可可可以以以以用用用用P1 P1 P1 P1 = = = = 255255255255(对对对对P1P1P1P1端端端端口口口口的的的的所所所所有引脚置高电平)之类的语句操作特殊功能寄存器。有引脚置高电平)之类的语句操作特殊功能寄存器。有引脚置高电平)之类的语句操作特殊功能寄存器。有引脚置高电平)之类的语句操作特殊功能寄存器。5.2.2 5.2.2 数据类型数据类型数据类型数据类型-sfr特殊功能寄存器特殊功能寄存器8/30/202422张兴忠制作:返回目录8.sfr16 168.sfr16 168.sfr16 168.sfr16 16位特殊功能寄存器位特殊功能寄存器位特殊功能寄存器位特殊功能寄存器 sfr16sfr16也也是是一一种种C51C51扩扩充充数数据据类类型型,用用于于定定义义存存在在于于MCS-51MCS-51单单片片机机内内部部RAMRAM的的1616位位特殊功能寄存器,如定时器特殊功能寄存器,如定时器T0T0和和T1T1。 sfr16sfr16型型数数据据占占用用2 2个个内内存存单单元元,取取值值范范围为围为0 06553565535。5.2.2 5.2.2 数据类型数据类型数据类型数据类型-16位特殊功能寄存器位特殊功能寄存器8/30/202423张兴忠制作:返回目录 sbitsbitsbitsbit也也也也是是是是一一一一种种种种C51C51C51C51扩扩扩扩充充充充数数数数据据据据类类类类型型型型,利利利利用用用用它它它它可可可可以以以以访访访访问问问问芯芯芯芯片片片片内内内内部部部部RAMRAMRAMRAM中中中中的的的的可可可可寻寻寻寻址址址址位位位位或或或或特特特特殊殊殊殊功功功功能能能能寄寄寄寄存存存存器器器器中的可寻址位。中的可寻址位。中的可寻址位。中的可寻址位。 定义方法有如下三种:定义方法有如下三种:定义方法有如下三种:定义方法有如下三种: (1 1 1 1)sbit sbit sbit sbit 位变量名位变量名位变量名位变量名 = = = = 位地址位地址位地址位地址 将将将将位位位位的的的的绝绝绝绝对对对对地地地地址址址址赋赋赋赋给给给给位位位位变变变变量量量量,位位位位地地地地址址址址必必必必须须须须位位位位于于于于80HFFH80HFFH80HFFH80HFFH(特殊功能寄存器的位地址)之间。(特殊功能寄存器的位地址)之间。(特殊功能寄存器的位地址)之间。(特殊功能寄存器的位地址)之间。9 9 9 9sbitsbitsbitsbit可寻址位可寻址位可寻址位可寻址位5.2.2 5.2.2 数据类型数据类型数据类型数据类型-sbit可寻址位可寻址位8/30/202424张兴忠制作:返回目录(2 2 2 2)sbit sbit sbit sbit 位变量名位变量名位变量名位变量名 = = = = 特殊功能寄存器名特殊功能寄存器名特殊功能寄存器名特殊功能寄存器名 位位置位位置位位置位位置 当当当当可可可可寻寻寻寻址址址址位位位位位位位位于于于于特特特特殊殊殊殊功功功功能能能能寄寄寄寄存存存存器器器器中中中中时时时时,可可可可采采采采用用用用这这这这种种种种方法。位位置是一个方法。位位置是一个方法。位位置是一个方法。位位置是一个0 0 0 07 7 7 7之间的常数。之间的常数。之间的常数。之间的常数。(3 3 3 3)sbit sbit sbit sbit 位变量名位变量名位变量名位变量名 = = = = 字节地址字节地址字节地址字节地址 位位置位位置位位置位位置 这这这这种种种种方方方方法法法法是是是是以以以以一一一一个个个个常常常常数数数数(字字字字节节节节地地地地址址址址)作作作作为为为为基基基基地地地地址址址址,该该该该常常常常数数数数必必必必须须须须在在在在80H80H80H80HFFHFFHFFHFFH(特特特特殊殊殊殊功功功功能能能能寄寄寄寄存存存存器器器器的的的的字字字字节节节节地地地地址址址址)之间。位位置是一个之间。位位置是一个之间。位位置是一个之间。位位置是一个0 0 0 07 7 7 7之间的常数。之间的常数。之间的常数。之间的常数。9 9 9 9sbitsbitsbitsbit可寻址位可寻址位可寻址位可寻址位5.2.2 5.2.2 数据类型数据类型数据类型数据类型-sbit可寻址位可寻址位8/30/202425张兴忠制作:返回目录 MCS-51MCS-51MCS-51MCS-51单单单单片片片片机机机机中中中中的的的的特特特特殊殊殊殊功功功功能能能能寄寄寄寄存存存存器器器器及及及及其其其其可可可可寻寻寻寻址址址址位位位位,已已已已被被被被预预预预先先先先定定定定义义义义放放放放在在在在文文文文件件件件中中中中,在在在在程程程程序序序序的的的的开开开开头头头头只只只只需需需需加加加加上上上上#include#include#include#include或或或或#include#include#include#include即可。即可。即可。即可。 另另另另外外外外,bitbitbitbit还还还还可可可可访访访访问问问问MCS-51MCS-51MCS-51MCS-51单单单单片片片片机机机机片片片片内内内内20H20H20H20H2FH2FH2FH2FH范范范范围围围围内内内内的的的的位位位位对对对对象象象象。C51C51C51C51编编编编译译译译器器器器提提提提供供供供了了了了一一一一个个个个bdatabdatabdatabdata存存存存储储储储器器器器类类类类型型型型,允允允允许许许许将将将将具具具具有有有有bdatabdatabdatabdata类类类类型型型型的的的的对对对对象象象象放放放放入入入入MCS-51MCS-51MCS-51MCS-51单片机片内可位寻址区。单片机片内可位寻址区。单片机片内可位寻址区。单片机片内可位寻址区。5.2.2 5.2.2 数据类型数据类型数据类型数据类型8/30/202426张兴忠制作:返回目录 sbitsbitsbitsbit和和和和bitbitbitbit的的的的区区区区别别别别:sbitsbitsbitsbit定定定定义义义义特特特特殊殊殊殊功功功功能能能能寄寄寄寄存存存存器器器器中中中中的的的的可可可可寻寻寻寻址址址址位位位位;而而而而bitbitbitbit则则则则定定定定义义义义了了了了一一一一个个个个普普普普通通通通的的的的位位位位变变变变量量量量,一一一一个个个个函函函函数数数数中中中中可可可可包包包包含含含含bitbitbitbit类类类类型型型型的参数,函数返回值也可为的参数,函数返回值也可为的参数,函数返回值也可为的参数,函数返回值也可为bitbitbitbit类型。类型。类型。类型。5.2.2 5.2.2 数据类型数据类型数据类型数据类型-sbit和和bit8/30/202427张兴忠制作:返回目录5.2.3 5.2.3 运算符和表达式运算符和表达式运算符和表达式运算符和表达式C51C51C51C51算术运算符有五种。算术运算符有五种。算术运算符有五种。算术运算符有五种。+ + + + 加法运算符或正号加法运算符或正号加法运算符或正号加法运算符或正号- - - - 减法运算符或负号减法运算符或负号减法运算符或负号减法运算符或负号* * * * 乘法运算符乘法运算符乘法运算符乘法运算符/ / / / 除法运算符除法运算符除法运算符除法运算符% % % % 模(求余)运算符模(求余)运算符模(求余)运算符模(求余)运算符优先级:先乘除,后加减,先括号内,再括号外。优先级:先乘除,后加减,先括号内,再括号外。优先级:先乘除,后加减,先括号内,再括号外。优先级:先乘除,后加减,先括号内,再括号外。结合性:自左至右方向。结合性:自左至右方向。结合性:自左至右方向。结合性:自左至右方向。模运算即求余数,如模运算即求余数,如模运算即求余数,如模运算即求余数,如7%37%37%37%3,结果是,结果是,结果是,结果是7 7 7 7除以除以除以除以3 3 3 3所得余数所得余数所得余数所得余数1 1 1 1。 1 1 1 1C51C51C51C51的算术运算符的算术运算符的算术运算符的算术运算符-算术运算符算术运算符8/30/202428张兴忠制作:返回目录 C51C51C51C51关系运算符有六种。关系运算符有六种。关系运算符有六种。关系运算符有六种。 大于大于大于大于 = = = = = = =大于等于大于等于大于等于大于等于= = = = =相等相等相等相等! =! =! =! =不相等不相等不相等不相等优先级:前四个高,后两个优先级:前四个高,后两个优先级:前四个高,后两个优先级:前四个高,后两个“= =”“= =”“= =”“= =”和和和和“! =”“! =”“! =”“! =”级别低。级别低。级别低。级别低。结合性:自左至右方向。结合性:自左至右方向。结合性:自左至右方向。结合性:自左至右方向。关系表达式的结果是逻辑值关系表达式的结果是逻辑值关系表达式的结果是逻辑值关系表达式的结果是逻辑值“真真真真”或或或或“假假假假”,C51C51C51C51中以中以中以中以“1”“1”“1”“1”代表真,代表真,代表真,代表真,“0”“0”“0”“0”代表假。代表假。代表假。代表假。2 2 2 2C51C51C51C51关系运算符关系运算符关系运算符关系运算符5.2.3 5.2.3 运算符和表达式运算符和表达式运算符和表达式运算符和表达式-关系运算符关系运算符8/30/202429张兴忠制作:返回目录C51C51C51C51逻辑运算符有三种。逻辑运算符有三种。逻辑运算符有三种。逻辑运算符有三种。 & & & &逻辑与逻辑与逻辑与逻辑与 | | | |逻辑或逻辑或逻辑或逻辑或 ! ! ! ! 逻辑非逻辑非逻辑非逻辑非优先级:逻辑非优先级:逻辑非优先级:逻辑非优先级:逻辑非“!”“!”“!”“!”最高。最高。最高。最高。结合性:结合性:结合性:结合性:“&”“&”“&”“&”和和和和“|”“|”“|”“|”自左至右方向。自左至右方向。自左至右方向。自左至右方向。“!”“!”“!”“!”自右至左方向。自右至左方向。自右至左方向。自右至左方向。运运运运算算算算符符符符的的的的两两两两边边边边为为为为关关关关系系系系表表表表达达达达式式式式。逻逻逻逻辑辑辑辑表表表表达达达达式式式式和和和和关关关关系系系系表表表表达达达达式式式式的的的的值值值值相相相相同同同同,以以以以“0”“0”“0”“0”代表假,以代表假,以代表假,以代表假,以“1”“1”“1”“1”代表真。代表真。代表真。代表真。3 3 3 3C51C51C51C51逻辑运算符逻辑运算符逻辑运算符逻辑运算符5.2.3 5.2.3 运算符和表达式运算符和表达式运算符和表达式运算符和表达式-逻辑运算符逻辑运算符8/30/202430张兴忠制作:返回目录C51C51C51C51按位操作运算符有六种。按位操作运算符有六种。按位操作运算符有六种。按位操作运算符有六种。& & & &按位与按位与按位与按位与| | | |按位或按位或按位或按位或 按位异或按位异或按位异或按位异或 位取反位取反位取反位取反位右移位右移位右移位右移 注:移位操作为补零移位。位运算符只能对整形和字符型运算,注:移位操作为补零移位。位运算符只能对整形和字符型运算,注:移位操作为补零移位。位运算符只能对整形和字符型运算,注:移位操作为补零移位。位运算符只能对整形和字符型运算,不能对实型数据运算。不能对实型数据运算。不能对实型数据运算。不能对实型数据运算。 如:如:如:如:char a = 0x0fchar a = 0x0fchar a = 0x0fchar a = 0x0f;表达式;表达式;表达式;表达式a = aa = aa = aa = a值为值为值为值为0xf00xf00xf00xf0。 如:如:如:如:char a = 0x22char a = 0x22char a = 0x22char a = 0x22;表达式;表达式;表达式;表达式a2a2a2a2值为值为值为值为0x880x880x880x88,即,即,即,即a a a a值左移两位,值左移两位,值左移两位,值左移两位,移位后空白位补移位后空白位补移位后空白位补移位后空白位补0 0 0 0。-4位操作运算符位操作运算符5.2.3 5.2.3 运算符和表达式运算符和表达式运算符和表达式运算符和表达式8/30/202431张兴忠制作:返回目录+自增自增自增自增1 1 1 1-自减自减自减自减1 1 1 1 自增、自减运算符可以在变量的前面或后面使用。自增、自减运算符可以在变量的前面或后面使用。自增、自减运算符可以在变量的前面或后面使用。自增、自减运算符可以在变量的前面或后面使用。 如,如,如,如,+i+i+i+i或或或或-I-I-I-I,意为在使用,意为在使用,意为在使用,意为在使用i i i i之前,先使之前,先使之前,先使之前,先使i i i i值加值加值加值加1 1 1 1或减或减或减或减1 1 1 1。 如如如如,i+i+i+i+或或或或i-i-i-i-,意意意意为为为为在在在在使使使使用用用用变变变变量量量量i i i i之之之之后后后后,再再再再使使使使i i i i值值值值加加加加1 1 1 1或或或或减减减减1 1 1 1。 例例例例如如如如,定定定定义义义义整整整整型型型型变变变变量量量量:int int int int i=6i=6i=6i=6,并并并并有有有有j=+ij=+ij=+ij=+i,则则则则j j j j值值值值为为为为7 7 7 7,i i i i值也为值也为值也为值也为7 7 7 7。而如有。而如有。而如有。而如有j=i+j=i+j=i+j=i+,则,则,则,则j j j j值为值为值为值为6 6 6 6,i i i i值为值为值为值为7 7 7 7。5 5 5 5自增、自减运算符自增、自减运算符自增、自减运算符自增、自减运算符5.2.3 5.2.3 运算符和表达式运算符和表达式运算符和表达式运算符和表达式-+ -运算符运算符8/30/202432张兴忠制作:返回目录6 6 6 6赋值运算符赋值运算符赋值运算符赋值运算符赋值赋值 将将“”右边的值赋给右边的值赋给“”左边的变左边的变量(注:不是相等运算符)。量(注:不是相等运算符)。5.2.3 5.2.3 运算符和表达式运算符和表达式运算符和表达式运算符和表达式-赋值运算符赋值运算符8/30/202433张兴忠制作:返回目录C51C51C51C51提供了十种复合赋值运算符。提供了十种复合赋值运算符。提供了十种复合赋值运算符。提供了十种复合赋值运算符。+=+=+=+= -= -= -= -= *= *= *= *=/=/=/=/=%=%=%=%= = = = &= &= &= &=|=|=|=|= 采用符合赋值运算的目的是为了简化程序,提高采用符合赋值运算的目的是为了简化程序,提高采用符合赋值运算的目的是为了简化程序,提高采用符合赋值运算的目的是为了简化程序,提高C51C51C51C51程序的编译效率。程序的编译效率。程序的编译效率。程序的编译效率。 例:例:例:例:a+=ba+=ba+=ba+=b相当于相当于相当于相当于a=a+ba=a+ba=a+ba=a+b。a=ba=ba=ba=b相当于相当于相当于相当于a=aba=aba=aba=ab。7 7 7 7复合赋值运算符复合赋值运算符复合赋值运算符复合赋值运算符5.2.3 5.2.3 运算符和表达式运算符和表达式运算符和表达式运算符和表达式-复合赋值运算符复合赋值运算符8/30/202434张兴忠制作:返回目录8 8 8 8对指针操作的运算符对指针操作的运算符对指针操作的运算符对指针操作的运算符& & & & 取地址运算符取地址运算符取地址运算符取地址运算符* * * * 指针运算符指针运算符指针运算符指针运算符 注意注意注意注意& & & &与与与与* * * *的用法意义如下:的用法意义如下:的用法意义如下:的用法意义如下: 1) 1) 1) 1) “&”“&”“&”“&”与与与与按按按按位位位位与与与与运运运运算算算算符符符符的的的的差差差差别别别别。如如如如果果果果“&”“&”“&”“&”为为为为“与与与与”运运运运算算算算,& & & &运运运运算算算算符符符符的的的的两两两两边边边边必必必必须须须须为为为为变变变变量量量量或或或或常常常常量量量量,如如如如a=c&ba=c&ba=c&ba=c&b。“&”“&”“&”“&”是取地址运算时,如是取地址运算时,如是取地址运算时,如是取地址运算时,如a=&ba=&ba=&ba=&b。5.2.3 5.2.3 运算符和表达式运算符和表达式运算符和表达式运算符和表达式-指针操作的运算符指针操作的运算符8/30/202435张兴忠制作:返回目录 2) 2) 2) 2) “*”“*”“*”“*”与与与与指指指指针针针针定定定定义义义义时时时时指指指指针针针针前前前前的的的的“*”“*”“*”“*”的的的的差差差差别别别别。如如如如char char char char *pt*pt*pt*pt,这这这这里里里里的的的的“*”“*”“*”“*”只只只只表表表表示示示示ptptptpt为为为为指指指指针针针针变变变变量量量量,不不不不代代代代表表表表间间间间址址址址取取取取内内内内容容容容的的的的运运运运算算算算。而而而而c=*bc=*bc=*bc=*b,是是是是将将将将以以以以b b b b的的的的内内内内容容容容为为为为地地地地址址址址的的的的单单单单元元元元内内内内容送容送容送容送c c c c变量。变量。变量。变量。 C51 C51 C51 C51运算的优先级如下所示。运算的优先级如下所示。运算的优先级如下所示。运算的优先级如下所示。 !(非)!(非)!(非)!(非)算术运算算术运算算术运算算术运算关系运算关系运算关系运算关系运算&和和和和|赋值运算赋值运算赋值运算赋值运算8 8 8 8对指针操作的运算符对指针操作的运算符对指针操作的运算符对指针操作的运算符5.2.3 5.2.3 运算符和表达式运算符和表达式运算符和表达式运算符和表达式-指针操作的运算符指针操作的运算符8/30/202436张兴忠制作:返回目录5.2.4 5.2.4 程序结构程序结构程序结构程序结构 和和和和ANSI ANSI ANSI ANSI C C C C一一一一样样样样,C51C51C51C51的的的的程程程程序序序序是是是是一一一一个个个个函函函函数数数数定定定定义义义义的的的的集集集集合合合合,可可可可以以以以由由由由任任任任意意意意个个个个函函函函数数数数构构构构成成成成,其其其其中中中中必必必必须须须须有有有有一个主函数一个主函数一个主函数一个主函数main( )main( )main( )main( )。 程程程程序序序序的的的的执执执执行行行行是是是是从从从从主主主主函函函函数数数数main( main( main( main( ) ) ) )开开开开始始始始的的的的,调调调调用用用用其其其其他他他他函函函函数数数数后后后后返返返返回回回回主主主主函函函函数数数数main( main( main( main( ) ) ) ),最最最最后后后后在在在在主主主主函函函函数数数数中中中中结结结结束束束束整整整整个个个个程程程程序序序序,而而而而不不不不管管管管函函函函数数数数的的的的排排排排列列列列顺顺顺顺序序序序如何。如何。如何。如何。-函数定义的集合函数定义的集合8/30/202437张兴忠制作:返回目录全局变量说明全局变量说明全局变量说明全局变量说明/* /*可被各函数引用可被各函数引用可被各函数引用可被各函数引用*/ */类型说明类型说明类型说明类型说明main( )main( )/* /*主函数主函数主函数主函数*/ */ 声明部分声明部分声明部分声明部分语句部分语句部分语句部分语句部分 类型说明类型说明类型说明类型说明 函数名函数名函数名函数名1(1(形式参数表形式参数表形式参数表形式参数表) )/* /*函数函数函数函数1*/1*/ 声明部分声明部分声明部分声明部分语句部分语句部分语句部分语句部分 类型说明类型说明类型说明类型说明 函数名函数名函数名函数名n(n(形式参数表形式参数表形式参数表形式参数表) )/* /*函数函数函数函数n*/n*/ 声明部分声明部分声明部分声明部分语句部分语句部分语句部分语句部分 5.2.4 5.2.4 程序结构程序结构程序结构程序结构-程序的组成程序的组成8/30/202438张兴忠制作:返回目录5.3 C515.3 C51对对对对MCS-51MCS-51单片机的访问单片机的访问单片机的访问单片机的访问 MCS-51 MCS-51单片机的存储器分为片内数据存储器、特殊功单片机的存储器分为片内数据存储器、特殊功单片机的存储器分为片内数据存储器、特殊功单片机的存储器分为片内数据存储器、特殊功能寄存器、片外数据存储器、片内程序存储器和片外程序存能寄存器、片外数据存储器、片内程序存储器和片外程序存能寄存器、片外数据存储器、片内程序存储器和片外程序存能寄存器、片外数据存储器、片内程序存储器和片外程序存储器。储器。储器。储器。 在在在在C51C51中访问这些存储器时,是通过定义不同存储类型中访问这些存储器时,是通过定义不同存储类型中访问这些存储器时,是通过定义不同存储类型中访问这些存储器时,是通过定义不同存储类型的变量,以说明该变量所访问的存储器位置。的变量,以说明该变量所访问的存储器位置。的变量,以说明该变量所访问的存储器位置。的变量,以说明该变量所访问的存储器位置。5.3.1 5.3.1 5.3.1 5.3.1 存储类型存储类型存储类型存储类型-C51访问存储器访问存储器8/30/202439张兴忠制作:返回目录1 1datadata直接寻址片内直接寻址片内直接寻址片内直接寻址片内RAMRAM 直直直直接接接接寻寻寻寻址址址址片片片片内内内内数数数数据据据据存存存存储储储储区区区区RAMRAM(128128字字字字节节节节),访访访访问问问问速速速速度快。度快。度快。度快。2 2bdatabdata位寻址片内位寻址片内位寻址片内位寻址片内RAMRAM 可可可可位位位位寻寻寻寻址址址址片片片片内内内内数数数数据据据据存存存存储储储储区区区区RAMRAM(1616个个个个字字字字节节节节),允允允允许许许许位位位位与字节混合访问。与字节混合访问。与字节混合访问。与字节混合访问。3 3idataidata间接寻址片内间接寻址片内间接寻址片内间接寻址片内RAMRAM 间间间间接接接接寻寻寻寻址址址址内内内内部部部部数数数数据据据据存存存存储储储储区区区区,可可可可访访访访问问问问全全全全部部部部内内内内部部部部地地地地址址址址空空空空间间间间(0000FFH,256FFH,256字节)。字节)。字节)。字节)。5.3 C515.3 C51对对对对MCS-51MCS-51单片机的访问单片机的访问单片机的访问单片机的访问-定义存储类型定义存储类型8/30/202440张兴忠制作:返回目录4 4pdatapdata分页寻址片外分页寻址片外分页寻址片外分页寻址片外RAMRAM 分页(分页(分页(分页(256Byte256Byte)外部数据存储区)外部数据存储区)外部数据存储区)外部数据存储区RAMRAM(256256字节),字节),字节),字节),由操作码由操作码由操作码由操作码MOVX Ri MOVX Ri 访问。访问。访问。访问。5 5xdataxdata寻址片外寻址片外寻址片外寻址片外RAMRAM 寻址片外数据存储区寻址片外数据存储区寻址片外数据存储区寻址片外数据存储区RAMRAM(64K64K字节),由操作码字节),由操作码字节),由操作码字节),由操作码MOVX DPTR MOVX DPTR 访问。访问。访问。访问。6 6codecode寻址寻址寻址寻址ROMROM 寻址片内外程序存储区寻址片内外程序存储区寻址片内外程序存储区寻址片内外程序存储区ROMROM(64K64K字节),由操作码字节),由操作码字节),由操作码字节),由操作码MOVX A+DPTR MOVX A+DPTR 访问。访问。访问。访问。5.3 C515.3 C51对对对对MCS-51MCS-51单片机的访问单片机的访问单片机的访问单片机的访问-定义存储类型定义存储类型8/30/202441张兴忠制作:返回目录5.3.2 5.3.2 存储器模式存储器模式存储器模式存储器模式 存存存存储储储储器器器器模模模模式式式式决决决决定定定定了了了了变变变变量量量量的的的的默默默默认认认认存存存存储储储储类类类类型型型型和和和和参参参参数数数数传递区,变量定义不明确存储区类型时使用默认值。传递区,变量定义不明确存储区类型时使用默认值。传递区,变量定义不明确存储区类型时使用默认值。传递区,变量定义不明确存储区类型时使用默认值。 C51 C51有三种存储器模式:有三种存储器模式:有三种存储器模式:有三种存储器模式: SMALL SMALL、LARGELARGE和和COMPACTCOMPACT。-变量的存储类型变量的存储类型8/30/202442张兴忠制作:返回目录5.3.2 5.3.2 存储器模式存储器模式存储器模式存储器模式存存存存 储储 模模模模 式式式式说说 明明明明小小小小编译编译模式模式模式模式SMALLSMALL参参参参数数数数及及及及局局局局部部部部变变量量量量放放放放入入入入可可可可直直直直接接接接寻寻址址址址的的的的片片片片内内内内数数数数据据据据存存存存储储区区区区(最最最最大大大大128 128 B B,默默默默认认存存存存储储类类型型型型是是是是datadata),因因因因此此此此访访问问十十十十分分分分方方方方便便便便。另另另另外外外外所所所所有有有有对对象象象象,包包包包括括括括栈栈,都都都都必必必必须须嵌嵌嵌嵌入入入入片片片片内内内内RAMRAM。栈栈长长很很很很关关关关键键,因因因因为为实实际际栈栈长长依依依依赖赖于于于于不不不不同同同同函函函函数数数数的的的的嵌嵌嵌嵌套套套套层层数。数。数。数。紧紧凑凑凑凑编译编译模式模式模式模式COMPACTCOMPACT参参参参数数数数及及及及局局局局部部部部变变量量量量放放放放入入入入分分分分页页片片片片外外外外数数数数据据据据存存存存储储区区区区(最最最最大大大大256 256 B B,默默默默认认的的的的存存存存储储类类型型型型是是是是pdatapdata),通通通通过过寄寄寄寄存存存存器器器器R0R0和和和和R1R1间间接接接接寻寻址,址,址,址,栈栈空空空空间间位于内部数据存位于内部数据存位于内部数据存位于内部数据存储储区中。区中。区中。区中。大大大大编译编译模式模式模式模式LARGELARGE参参参参数数数数及及及及局局局局部部部部变变量量量量直直直直接接接接放放放放入入入入片片片片外外外外数数数数据据据据存存存存储储区区区区(最最最最大大大大64 64 KBKB,默默默默认认存存存存储储类类型型型型为为xdataxdata),使使使使用用用用数数数数据据据据指指指指针针DPTRDPTR来来来来进进行行行行寻寻址址址址。用用用用此此此此数数数数据据据据指指指指针针访访问问的的的的效效效效率率率率较较低低低低,尤尤尤尤其其其其是是是是对对两两两两个个个个或或或或多多多多个个个个字字字字节节的的的的变变量量量量,这这种种种种数数数数据据据据存存存存储储类类型型型型的的的的访访问问机机机机制制制制直直直直接接接接影影影影响响响响代代代代码码的的的的长长度度度度,不不不不方方方方便便便便之之之之处处在在在在于于于于这这种种种种数数数数据据据据指指指指针针不能不能不能不能对对称操作。称操作。称操作。称操作。-变量的存储类型变量的存储类型8/30/202443张兴忠制作:返回目录有两种方式:预处理命令和编译控制命令。有两种方式:预处理命令和编译控制命令。有两种方式:预处理命令和编译控制命令。有两种方式:预处理命令和编译控制命令。(1 1)使用预处理命令设定数据存储模式)使用预处理命令设定数据存储模式)使用预处理命令设定数据存储模式)使用预处理命令设定数据存储模式需在程序的第一句加预处理命令。如:需在程序的第一句加预处理命令。如:需在程序的第一句加预处理命令。如:需在程序的第一句加预处理命令。如:#pragma small/*#pragma small/*设定数据存储模式为小编译模式设定数据存储模式为小编译模式设定数据存储模式为小编译模式设定数据存储模式为小编译模式*/ */#pragma compact /*#pragma compact /*设定数据存储模式为紧凑编译模式设定数据存储模式为紧凑编译模式设定数据存储模式为紧凑编译模式设定数据存储模式为紧凑编译模式*/ */#pragma large/*#pragma large/*设定数据存储模式为大编译模式设定数据存储模式为大编译模式设定数据存储模式为大编译模式设定数据存储模式为大编译模式*/ */数据存储模式的设定数据存储模式的设定数据存储模式的设定数据存储模式的设定5.3.2 5.3.2 存储器模式存储器模式存储器模式存储器模式-存储模式的设定存储模式的设定8/30/202444张兴忠制作:返回目录(2 2)使用编译控制命令设定数据存储模式)使用编译控制命令设定数据存储模式用用C51C51编编译译程程序序对对C51C51源源程程序序进进行行编编译译时时,使使用编译控制命令,格式如下:用编译控制命令,格式如下:C51 C51 源程序名源程序名 SMALL SMALL C51 C51 源程序名源程序名 COMPACT COMPACT C51 C51 源程序名源程序名 LARGE LARGE5.3.2 5.3.2 存储器模式存储器模式存储器模式存储器模式-存储模式的设定存储模式的设定8/30/202445张兴忠制作:返回目录例例例例如如如如:C51C51C51C51源源源源程程程程序序序序为为为为,若若若若使使使使程程程程序序序序中中中中的的的的变变变变量量量量存存存存储储储储类类类类型型型型和和和和参参参参数数数数传传传传递递递递区区区区限限限限定定定定在在在在外外外外部部部部数数数数据据据据存存存存储储储储区区区区,即即即即设设设设定定定定数数数数据据据据存存存存储储储储模式为模式为模式为模式为COMPACTCOMPACTCOMPACTCOMPACT(紧凑编译模式)。(紧凑编译模式)。(紧凑编译模式)。(紧凑编译模式)。方方方方法法法法1 1 1 1:在在在在程程程程序序序序的的的的第第第第一一一一句句句句加加加加预预预预处处处处理理理理命命命命令令令令:#pragma #pragma #pragma #pragma compactcompactcompactcompact。方方方方法法法法2 2 2 2:用用用用C51C51C51C51对对对对进进进进行行行行编编编编译译译译时时时时,使使使使用用用用编编编编译译译译控控控控制制制制命命命命令令令令: C51 file1.C COMPACTC51 file1.C COMPACTC51 file1.C COMPACTC51 file1.C COMPACT。5.3.2 5.3.2 存储器模式存储器模式存储器模式存储器模式-存储模式的设定存储模式的设定8/30/202446张兴忠制作:返回目录5.3.2 5.3.2 存储器模式存储器模式存储器模式存储器模式#pragma small/*#pragma small/*默认存储类型为默认存储类型为默认存储类型为默认存储类型为MCS-51MCS-51直接寻址片内直接寻址片内直接寻址片内直接寻址片内RAM*/RAM*/char data i, j, k;/*char data i, j, k;/*在在在在MCS-51MCS-51片内直接寻址片内直接寻址片内直接寻址片内直接寻址RAMRAM中定义了中定义了中定义了中定义了3 3个变个变个变个变量量量量, ,默认为自动变量默认为自动变量默认为自动变量默认为自动变量*/ */char i, j, k;/*char i, j, k;/*未指明存储类型未指明存储类型未指明存储类型未指明存储类型, ,由由由由#pragma small#pragma small决定决定决定决定, ,与前一句与前一句与前一句与前一句完全等价完全等价完全等价完全等价*/ */int xdata m, n;/*int xdata m, n;/*在在在在MCS-51MCS-51片外片外片外片外RAMRAM中定义了两个自动变量中定义了两个自动变量中定义了两个自动变量中定义了两个自动变量*/ */static char m, n;/*static char m, n;/*在在在在MCS-51MCS-51片内直接寻址片内直接寻址片内直接寻址片内直接寻址RAMRAM中定义了两个中定义了两个中定义了两个中定义了两个静态变量静态变量静态变量静态变量*/ */unsigned char xdata ram10;/*unsigned char xdata ram10;/*在在在在MCS-51MCS-51片外片外片外片外RAMRAM中定义了中定义了中定义了中定义了大小为大小为大小为大小为10 B10 B的数组变量的数组变量的数组变量的数组变量*/ */-【例【例5-1】 变量和函数的存储模式设置变量和函数的存储模式设置8/30/202447张兴忠制作:返回目录5.3.2 5.3.2 存储器模式存储器模式存储器模式存储器模式int func1(int i, int j) largeint func1(int i, int j) large/* /*指定函数中变量是指定函数中变量是指定函数中变量是指定函数中变量是LARGELARGE模式模式模式模式*/ */ return(i+j);return(i+j); int func2(int i, int j)int func2(int i, int j)/* /*未指明存储模式未指明存储模式未指明存储模式未指明存储模式, ,按默认的按默认的按默认的按默认的SMALLSMALL模式模式模式模式*/ */ return(i-j);return(i-j); -【例【例5-1】 变量和函数的存储模式设置变量和函数的存储模式设置8/30/202448张兴忠制作:返回目录5.3.3 5.3.3 特殊功能寄存器的访问特殊功能寄存器的访问特殊功能寄存器的访问特殊功能寄存器的访问 MCS-51MCS-51系系系系列列列列单单单单片片片片机机机机片片片片内内内内有有有有2121个个个个特特特特殊殊殊殊功功功功能能能能寄寄寄寄存存存存器器器器(SFRSFR), ,分分分分散散散散在在在在片片片片内内内内RAMRAM区区区区的的的的0x800xFF0x800xFF地址范围内。对地址范围内。对地址范围内。对地址范围内。对SFRSFR的操作只能用直接寻址方式。的操作只能用直接寻址方式。的操作只能用直接寻址方式。的操作只能用直接寻址方式。 为为为为了了了了能能能能直直直直接接接接访访访访问问问问这这这这些些些些特特特特殊殊殊殊功功功功能能能能寄寄寄寄存存存存器器器器,C51C51提提提提供供供供了了了了定定定定义义义义sfrsfr的的的的方方方方法法法法。这这这这与与与与ANSI ANSI C C不不不不兼兼兼兼容容容容,只只只只适用于适用于适用于适用于MCS-51MCS-51系列单片机。系列单片机。系列单片机。系列单片机。-定义定义sfr的方法的方法8/30/202449张兴忠制作:返回目录-1-1sfrsfr数据类型数据类型数据类型数据类型 特殊功能寄存器数据类型来实现。定义特殊功能寄存器数据类型来实现。定义特殊功能寄存器名的语法如下:特殊功能寄存器名的语法如下: sfr 特殊功能寄存器名特殊功能寄存器名=整型常量整型常量; 5.3.3 5.3.3 特殊功能寄存器的访问特殊功能寄存器的访问特殊功能寄存器的访问特殊功能寄存器的访问1 1sfrsfr数据类型数据类型数据类型数据类型8/30/202450张兴忠制作:返回目录-1-1sfrsfr数据类型数据类型数据类型数据类型5.3.3 5.3.3 特殊功能寄存器的访问特殊功能寄存器的访问特殊功能寄存器的访问特殊功能寄存器的访问sfr PSW=0xD0;sfr PSW=0xD0;/* /*定定定定义义义义程程程程序序序序状状状状态态态态字字字字PSW, PSW, 因因因因MCS-51MCS-51单单单单片机的片机的片机的片机的PSW PSW 地址为地址为地址为地址为D0H*/D0H*/sfr sfr TMOD=0x89;/*TMOD=0x89;/*定定定定义义义义定定定定时时时时/ /计计计计数数数数器器器器方方方方式式式式控控控控制制制制寄寄寄寄存存存存器器器器TMOD, TMOD, 因因因因MCS-51MCS-51单片机的单片机的单片机的单片机的TMODTMOD地址为地址为地址为地址为89H*/89H*/sfr P1=0x90;sfr P1=0x90;/* /*定定定定义义义义P1P1口口口口, , 因因因因MCS-51MCS-51单单单单片片片片机机机机的的的的P1P1口口口口地址为地址为地址为地址为 90H*/ 90H*/sfr SCON=0x98;sfr SCON=0x98; /* /*定定定定义义义义串串串串口口口口控控控控制制制制寄寄寄寄存存存存器器器器SCON, SCON, 因因因因MCS-MCS-5151单片机的单片机的单片机的单片机的SCONSCON地址为地址为地址为地址为8H*/8H*/8/30/202451张兴忠制作:返回目录2 2用用用用sbitsbit数据类型访问可位寻址的特殊功能寄存器中的位数据类型访问可位寻址的特殊功能寄存器中的位数据类型访问可位寻址的特殊功能寄存器中的位数据类型访问可位寻址的特殊功能寄存器中的位 MCS-51MCS-51系系系系列列列列单单单单片片片片机机机机片片片片内内内内2121个个个个特特特特殊殊殊殊功功功功能能能能寄寄寄寄存存存存器器器器(SFRSFR)中中中中有有有有1111个个个个特特特特殊殊殊殊功功功功能能能能寄寄寄寄存存存存器器器器是是是是可可可可位位位位寻寻寻寻址址址址的的的的。访访访访问问问问这这这这些些些些可可可可位位位位寻寻寻寻址址址址的的的的特特特特殊殊殊殊功功功功能能能能寄寄寄寄存存存存器器器器中中中中的的的的位位位位的的的的方方方方法法法法可可可可由由由由关关关关键键键键字字字字sbitsbit定定定定义义义义特特特特殊殊殊殊功功功功能能能能寄寄寄寄存存存存器器器器位位位位寻寻寻寻址址址址数数数数据据据据类类类类型型型型来来来来实实实实现现现现。定定定定义义义义特特特特殊殊殊殊功功功功能能能能寄寄寄寄存存存存器器器器位位位位名名名名的的的的语语语语法法法法有有有有下列三种:下列三种:下列三种:下列三种: sbit sbit 特殊功能寄存器位名特殊功能寄存器位名特殊功能寄存器位名特殊功能寄存器位名= =特殊功能寄存器名特殊功能寄存器名特殊功能寄存器名特殊功能寄存器名 整型常量整型常量整型常量整型常量 其其其其中中中中,特特特特殊殊殊殊功功功功能能能能寄寄寄寄存存存存器器器器名名名名是是是是已已已已由由由由sfrsfr定定定定义义义义了了了了的的的的特特特特殊殊殊殊功功功功能能能能寄寄寄寄存存存存器器器器名名名名,整整整整型型型型常常常常量量量量是是是是位位位位可可可可寻寻寻寻址址址址特特特特殊殊殊殊功功功功能能能能寄寄寄寄存存存存器器器器中中中中的的的的位位位位(是是是是一一一一个个个个0707之间的常数)。之间的常数)。之间的常数)。之间的常数)。5.3.3 5.3.3 特殊功能寄存器的访问特殊功能寄存器的访问特殊功能寄存器的访问特殊功能寄存器的访问-2sbit数据类型数据类型8/30/202452张兴忠制作:返回目录 sbit sbit 特殊功能寄存器位名特殊功能寄存器位名特殊功能寄存器位名特殊功能寄存器位名= =整型常量整型常量整型常量整型常量11整型常量整型常量整型常量整型常量2 2 其中,整型常量其中,整型常量其中,整型常量其中,整型常量1 1是指可位寻址特殊功能寄存器的是指可位寻址特殊功能寄存器的是指可位寻址特殊功能寄存器的是指可位寻址特殊功能寄存器的字节地址(在字节地址(在字节地址(在字节地址(在80HFFH80HFFH之间),整型常量之间),整型常量之间),整型常量之间),整型常量2 2是指该寄是指该寄是指该寄是指该寄存器中的位(是一个存器中的位(是一个存器中的位(是一个存器中的位(是一个0707之间的常数)。之间的常数)。之间的常数)。之间的常数)。 sbit sbit 特殊功能寄存器位名特殊功能寄存器位名特殊功能寄存器位名特殊功能寄存器位名= =整型常量整型常量整型常量整型常量 其中,整型常量是可位寻址特殊功能寄存器的绝其中,整型常量是可位寻址特殊功能寄存器的绝其中,整型常量是可位寻址特殊功能寄存器的绝其中,整型常量是可位寻址特殊功能寄存器的绝对位地址(位于对位地址(位于对位地址(位于对位地址(位于80HFFH80HFFH之间)。之间)。之间)。之间)。5.3.3 5.3.3 特殊功能寄存器的访问特殊功能寄存器的访问特殊功能寄存器的访问特殊功能寄存器的访问-定义方法定义方法8/30/202453张兴忠制作:返回目录标准标准标准标准SFRSFR在、等头文件中已经被定义,只要在、等头文件中已经被定义,只要在、等头文件中已经被定义,只要在、等头文件中已经被定义,只要用文件包含做出申明即可使用。用文件包含做出申明即可使用。用文件包含做出申明即可使用。用文件包含做出申明即可使用。5.3.3 5.3.3 特殊功能寄存器的访问特殊功能寄存器的访问特殊功能寄存器的访问特殊功能寄存器的访问sfr PSW=0xD0;sfr PSW=0xD0;/* /*首先定义程序状态字首先定义程序状态字首先定义程序状态字首先定义程序状态字PSW,PSW, 因因因因MCS-51MCS-51单片机的单片机的单片机的单片机的PSWPSW地址为地址为地址为地址为D0H*/D0H*/sbit OV=PSW2; /*sbit OV=PSW2; /*在前面定义了在前面定义了在前面定义了在前面定义了PSWPSW后后后后,OV,OV位于位于位于位于PSWPSW的第的第的第的第2 2位位位位*/ */sbit AC=0xD06; /*D0Hsbit AC=0xD06; /*D0H是程序状态字是程序状态字是程序状态字是程序状态字PSWPSW的字节地址的字节地址的字节地址的字节地址, , 辅助进位标志位辅助进位标志位辅助进位标志位辅助进位标志位ACAC位于位于位于位于PSWPSW的第的第的第的第6 6位位位位*/ */sbit RS0=0xD03; /*sbit RS0=0xD03; /*工作寄存器组控制位工作寄存器组控制位工作寄存器组控制位工作寄存器组控制位RS0RS0位于位于位于位于PSWPSW的第的第的第的第3 3位位位位*/ */sbit CY=0xD7; /*sbit CY=0xD7; /*进位标志位进位标志位进位标志位进位标志位CyCy的绝对位地址为的绝对位地址为的绝对位地址为的绝对位地址为D7H*/D7H*/-实例实例8/30/202454张兴忠制作:返回目录例例5-2 特殊功能寄存器的访问。#include ”reg51.h”#include ”reg51.h”sbit P10=P10;sbit P10=P10;/* /*定义定义定义定义P10P10为为为为P1P1口第口第口第口第0 0位,即口位,即口位,即口位,即口*/ */sbit P12=P12;sbit P12=P12;/* /*定义定义定义定义P12P12为为为为P1P1口第口第口第口第2 2位,即口位,即口位,即口位,即口*/ */ void main( )void main( ) P10=1;P10=1;/* /*置位口置位口置位口置位口*/ */P12=0;P12=0;/* /*复位口复位口复位口复位口*/ */PSW=0x08;PSW=0x08;/* /*程序状态字置程序状态字置程序状态字置程序状态字置0x08*/0x08*/ 5.3.3 5.3.3 特殊功能寄存器的访问特殊功能寄存器的访问特殊功能寄存器的访问特殊功能寄存器的访问-应用实例应用实例8/30/202455张兴忠制作:返回目录5.3.4 5.3.4 存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问 MCS-51MCS-51单单单单 片片片片 机机机机 片片片片 内内内内 有有有有 128128个个个个 字字字字 节节节节 的的的的 RAMRAM区区区区(00H7FH00H7FH),可可可可扩扩扩扩展展展展片片片片外外外外64KB64KB的的的的ROMROM和和和和RAMRAM,有有有有P0P0、P1P1、P2P2、P3P3四四四四个个个个8 8位位位位双双双双向向向向并并并并行行行行I/OI/O口口口口,每每每每个个个个端端端端口口口口可可可可以以以以按按按按字字字字节节节节输输输输入入入入或或或或输输输输出出出出,也也也也可可可可以以以以按按按按位位位位进进进进行行行行输输输输入入入入或或或或输输输输出出出出,四个口共四个口共四个口共四个口共3232根口线。根口线。根口线。根口线。 使使使使用用用用C51C51编编编编程程程程时时时时,片片片片内内内内/ /外外外外存存存存储储储储器器器器、片片片片内内内内I/OI/O口口口口与与与与片片片片外外外外扩扩扩扩展展展展I/OI/O口口口口可可可可以以以以统统统统一一一一在在在在头头头头文文文文件件件件中中中中定定定定义义义义,也也也也可可可可以以以以在在在在程程程程序序序序中中中中进进进进行行行行定定定定义义义义(一一一一般般般般在在在在程程程程序序序序开开开开始始始始的的的的位位位位置置置置)。C51C51定定定定义义义义存存存存储器、并行口方法如下。储器、并行口方法如下。储器、并行口方法如下。储器、并行口方法如下。-在头文件中定义在头文件中定义8/30/202456张兴忠制作:返回目录1 1 1 1对存储器使用绝对地址访问对存储器使用绝对地址访问对存储器使用绝对地址访问对存储器使用绝对地址访问C51C51编译器提供了一组宏定义用来对编译器提供了一组宏定义用来对编译器提供了一组宏定义用来对编译器提供了一组宏定义用来对MCS-51MCS-51系列单片机的系列单片机的系列单片机的系列单片机的CODECODE、DATADATA、PDATAPDATA和和和和XDATAXDATA空间进行绝对地址访问。空间进行绝对地址访问。空间进行绝对地址访问。空间进行绝对地址访问。函数原型如下:函数原型如下:函数原型如下:函数原型如下:#define CBYTE(unsigned char volatile *)0x50000L)#define CBYTE(unsigned char volatile *)0x50000L)#define DBYTE(unsigned char volatile *)0x40000L)#define DBYTE(unsigned char volatile *)0x40000L)#define PBYTE(unsigned char volatile *)0x30000L)#define PBYTE(unsigned char volatile *)0x30000L)#define XBYTE(unsigned char volatile *)0x20000L)#define XBYTE(unsigned char volatile *)0x20000L)#define CWORD(unsigned int volatile *)0x50000L)#define CWORD(unsigned int volatile *)0x50000L)#define DWORD(unsigned int volatile *)0x40000L)#define DWORD(unsigned int volatile *)0x40000L)#define PWORD(unsigned int volatile *)0x30000L)#define PWORD(unsigned int volatile *)0x30000L)#define XWORD(unsigned int volatile *)0x20000L)#define XWORD(unsigned int volatile *)0x20000L)这些函数原型放在文件中。这些函数原型放在文件中。这些函数原型放在文件中。这些函数原型放在文件中。5.3.4 5.3.4 存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问-绝对地址访问绝对地址访问8/30/202457张兴忠制作:返回目录CBYTECBYTE以以以以字字字字节节节节形形形形式式式式对对对对CODECODE区区区区寻寻寻寻址址址址,DBYTEDBYTE以以以以字字字字节节节节形形形形式式式式对对对对DATADATA区区区区寻寻寻寻址址址址,PBYTEPBYTE以以以以字字字字节节节节形形形形式式式式对对对对PDATAPDATA区区区区寻寻寻寻址址址址,XBYTEXBYTE以以以以字字字字节节节节形形形形式式式式对对对对XDATAXDATA区区区区寻寻寻寻址址址址,CWORDCWORD以以以以字字字字形形形形式式式式对对对对CODECODE区区区区寻寻寻寻址址址址,DWORDDWORD以以以以字字字字形形形形式式式式对对对对DATADATA区区区区寻寻寻寻址址址址,PWORDPWORD以以以以字字字字形形形形式式式式对对对对PDATAPDATA区区区区寻寻寻寻址址址址,XWORDXWORD以以以以字字字字形形形形式式式式对对对对XDATAXDATA区区区区寻寻寻寻址。址。址。址。5.3.4 5.3.4 存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问-绝对地址访问绝对地址访问8/30/202458张兴忠制作:返回目录例例例例5-3 5-3 5-3 5-3 使用绝对地址访问存储器使用绝对地址访问存储器使用绝对地址访问存储器使用绝对地址访问存储器#include#include#define uint unsigned int#define uchar unsigned charvoid main(void)uint ui_var1;uchar uc_var1; 5.3.4 5.3.4 存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问-绝对地址访问绝对地址访问8/30/202459张兴忠制作:返回目录例例例例5-3 5-3 5-3 5-3 使用绝对地址访问存储器使用绝对地址访问存储器使用绝对地址访问存储器使用绝对地址访问存储器ui_var1 = XWORD 0x0000;/*ui_var1 = XWORD 0x0000;/*访问外部访问外部访问外部访问外部RAMRAM的的的的0000H0001H0000H0001H地址的内容地址的内容地址的内容地址的内容*/ */uc_var1 = XBYTE 0x0002;/*uc_var1 = XBYTE 0x0002;/*访问外部访问外部访问外部访问外部RAMRAM的的的的0002H0002H地址的地址的地址的地址的内容内容内容内容*/ */XWORD 0x0000=0xAABB;/*XWORD 0x0000=0xAABB;/*将将将将0xAABB0xAABB送入外部送入外部送入外部送入外部RAMRAM的的的的 0000H0001H0000H0001H地址中地址中地址中地址中*/ */XBYTE 0x0002=0xAA;/*XBYTE 0x0002=0xAA;/*将将将将0xAA0xAA送入外部送入外部送入外部送入外部RAMRAM的的的的0002H0002H地地地地址中址中址中址中*/ */for(;);for(;); 5.3.4 5.3.4 存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问-绝对地址访问绝对地址访问8/30/202460张兴忠制作:返回目录2 2 2 2对存储器使用指针访问对存储器使用指针访问对存储器使用指针访问对存储器使用指针访问例例例例5-45-4 使用指针访问存储器。使用指针访问存储器。使用指针访问存储器。使用指针访问存储器。#define uchar unsigned char#define uchar unsigned char#define uint unsigned int#define uint unsigned int void test_memory(void)void test_memory(void) uchar idata ivar1; /*uchar idata ivar1; /*定义一个指向定义一个指向定义一个指向定义一个指向idataidata存储空间的变量存储空间的变量存储空间的变量存储空间的变量*/ */uchar xdata *xdp; /*uchar xdata *xdp; /*定义一个指向定义一个指向定义一个指向定义一个指向XDATAXDATA存储器空间的指针存储器空间的指针存储器空间的指针存储器空间的指针*/ */char data *dp; /*char data *dp; /*定义一个指向定义一个指向定义一个指向定义一个指向DATADATA存储器空间的指针存储器空间的指针存储器空间的指针存储器空间的指针*/ */ 采用指针的方法,可实现在采用指针的方法,可实现在采用指针的方法,可实现在采用指针的方法,可实现在C51C51程序中对任意指定的存储程序中对任意指定的存储程序中对任意指定的存储程序中对任意指定的存储器地址进行操作。器地址进行操作。器地址进行操作。器地址进行操作。5.3.4 5.3.4 存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问-指针访问指针访问8/30/202461张兴忠制作:返回目录uchar idata *idp; /*uchar idata *idp; /*定义一个指向定义一个指向定义一个指向定义一个指向IDATAIDATA存储器空间的指针存储器空间的指针存储器空间的指针存储器空间的指针*/ */xdp=0x1000; /*XDATAxdp=0x1000; /*XDATA指针赋值,指向指针赋值,指向指针赋值,指向指针赋值,指向XDATAXDATA存储器地存储器地存储器地存储器地 址址址址1000H1000H处处处处*/ */*xdp=0x5A;*xdp=0x5A; /* /*将数据将数据将数据将数据5AH5AH送到送到送到送到XDATAXDATA区的区的区的区的1000H1000H单元单元单元单元*/ */dp=0x61;dp=0x61; /*DATA /*DATA指针赋值,指向指针赋值,指向指针赋值,指向指针赋值,指向DATADATA存储器地址存储器地址存储器地址存储器地址 61H 61H处处处处*/ */*dp=0x23;*dp=0x23; /* /*将数据将数据将数据将数据23H23H送到送到送到送到DATADATA区的区的区的区的61H61H单元单元单元单元*/ */idp=&ivar1;idp=&ivar1; /*idp /*idp指向指向指向指向IDATAIDATA区的变量区的变量区的变量区的变量ivar1*/ivar1*/*idp=0x16;*idp=0x16; /* /*数据数据数据数据16H16H送到送到送到送到IDATAIDATA区的变量区的变量区的变量区的变量ivar1ivar1所在的所在的所在的所在的 地址单元中,地址单元中,地址单元中,地址单元中, 等价于等价于等价于等价于ivar1=0x16*/ivar1=0x16*/ 5.3.4 5.3.4 存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问-指针访问指针访问8/30/202462张兴忠制作:返回目录3 3 3 3C51C51C51C51定义片内定义片内定义片内定义片内I/OI/OI/OI/O口口口口单片机内部并行口可用关键字单片机内部并行口可用关键字单片机内部并行口可用关键字单片机内部并行口可用关键字sfrsfr定义,定义,定义,定义,I/OI/O口定义格式举例:口定义格式举例:口定义格式举例:口定义格式举例:sfr P0=0x80;sfr P0=0x80;/* /*定义定义定义定义P0P0口,地址口,地址口,地址口,地址80H*/80H*/sfr P1=0x90;sfr P1=0x90;/* /*定义定义定义定义P1P1口,地址口,地址口,地址口,地址90H*/90H*/5.3.4 5.3.4 存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问-sfr定义片内定义片内I/O8/30/202463张兴忠制作:返回目录-例例例例5-5 5-5 操作片内操作片内操作片内操作片内I/OI/O口口口口sfr P1=0x90;sfr P1=0x90; /* /*定义定义定义定义P1P1口,地址口,地址口,地址口,地址90H*/90H*/sfr P3=0xB0;sfr P3=0xB0; /* /*定义定义定义定义P3P3口,地址口,地址口,地址口,地址B0H*/B0H*/sbit DIPswitch=P14;sbit DIPswitch=P14;/*P1/*P1口第口第口第口第4 4位(口)为位(口)为位(口)为位(口)为DIPDIP开关的输入开关的输入开关的输入开关的输入*/ */sbit LEDgreen=P35;sbit LEDgreen=P35;/*P3/*P3口第口第口第口第5 5位(口)为位(口)为位(口)为位(口)为LEDLED的输出的输出的输出的输出*/ */void main( )void main( )unsigned char inval=0;unsigned char inval=0; for(;)if(DIPswitch=1)/* for(;)if(DIPswitch=1)/*检查口输入是否为高检查口输入是否为高检查口输入是否为高检查口输入是否为高*/ */inval=P1&0x0F;/*inval=P1&0x0F;/*读读读读P1P1口口口口0303位位位位*/ */ LEDgreen =0; LEDgreen =0; /* /*置口输出为低置口输出为低置口输出为低置口输出为低*/ */ ElseLEDgreen =1; ElseLEDgreen =1;/* /*置口输出为高置口输出为高置口输出为高置口输出为高*/ */ P3=(P3&0x0F)|inval;/*P1 P3=(P3&0x0F)|inval;/*P1口口口口0303位输出与位输出与位输出与位输出与P3P3口的口的口的口的0303位相或输出位相或输出位相或输出位相或输出*/ */ 5.3.4 5.3.4 存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问8/30/202464张兴忠制作:返回目录4 4 4 4C51C51C51C51定义外部并行口定义外部并行口定义外部并行口定义外部并行口 对对对对片片片片外外外外扩扩扩扩展展展展的的的的I/OI/O口口口口,则则则则根根根根据据据据其其其其硬硬硬硬件件件件译译译译码码码码地地地地址址址址,将将将将其其其其看看看看作作作作片片片片外外外外数数数数据据据据存存存存储储储储器器器器的的的的一一一一个个个个单单单单元元元元,使使使使用用用用#define#define语语语语句句句句进进进进行行行行定定定定义义义义。用用用用指指指指针针针针定定定定义义义义,指指指指针针针针的的的的定定定定义在头文件中。义在头文件中。义在头文件中。义在头文件中。5.3.4 5.3.4 存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问-#define语句定义片外语句定义片外I/O8/30/202465张兴忠制作:返回目录-例例例例5-6 5-6 操作片外操作片外操作片外操作片外I/OI/O口口口口#include “”#define PA XBYTE0xffec/*将将PA定义为定义为外部外部I/O口,地址为口,地址为0xffec*/void main( )PA=0x5A;/*将数据将数据5AH写入地址为写入地址为0xffec的存的存储单元或储单元或I/O端口端口*/5.3.4 5.3.4 存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问8/30/202466张兴忠制作:返回目录-例例例例5-6 5-6 操作片外操作片外操作片外操作片外I/OI/O口口口口 在在在在头头头头文文文文件件件件或或或或程程程程序序序序中中中中对对对对片片片片内内内内/ /外外外外I/OI/O口口口口进进进进行行行行定定定定义义义义以以以以后后后后,在在在在程程程程序序序序中中中中就就就就可可可可以以以以使使使使用用用用这这这这些些些些口口口口了了了了。定定定定义义义义口口口口地地地地址址址址的的的的目目目目的的的的是是是是为为为为了了了了便便便便于于于于C51C51编编编编译译译译器器器器按按按按MCS-51MCS-51单单单单片片片片机机机机系系系系统统统统的的的的实实实实际际际际硬硬硬硬件件件件结结结结构构构构建建建建立立立立I/OI/O口口口口变变变变量量量量名名名名与与与与其其其其实实实实际际际际地地地地址址址址的的的的联联联联系系系系,以以以以便便便便程程程程序序序序员员员员能能能能用用用用软软软软件件件件模模模模拟拟拟拟MCS-51MCS-51单单单单片片片片机机机机系统的硬件操作。系统的硬件操作。系统的硬件操作。系统的硬件操作。5.3.4 5.3.4 存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问存储器和并行口的访问8/30/202467张兴忠制作:返回目录5.3.5 5.3.5 位地址访问位地址访问位地址访问位地址访问C51C51对位变量的定义有对位变量的定义有对位变量的定义有对位变量的定义有3 3种方法:种方法:种方法:种方法:1 1用用用用bitbit关键字定义关键字定义关键字定义关键字定义C51C51位变量位变量位变量位变量例如:例如:例如:例如:bit lockbit lock; /* /*将将将将locklock定义为位变量定义为位变量定义为位变量定义为位变量*/ */bit direntionbit dirention;/* /*将将将将directiondirection定义为位变量定义为位变量定义为位变量定义为位变量*/ */bit displaybit display; /* /*将将将将displaydisplay定义为位变量定义为位变量定义为位变量定义为位变量*/ */注意:不能定义位变量指针;注意:不能定义位变量指针;注意:不能定义位变量指针;注意:不能定义位变量指针; 也不能定义位变量数组。也不能定义位变量数组。也不能定义位变量数组。也不能定义位变量数组。-对位变量的定义对位变量的定义8/30/202468张兴忠制作:返回目录例如:例如:bit fun(bit a1,bit a2)return(a1);5.3.5 5.3.5 位地址访问位地址访问位地址访问位地址访问2 2 2 2函数可包含函数可包含函数可包含函数可包含bitbitbitbit的参数和返回值的参数和返回值的参数和返回值的参数和返回值-函数的定义函数的定义8/30/202469张兴忠制作:返回目录3 3可位寻址存储区的位变量定义可位寻址存储区的位变量定义可位寻址存储区的位变量定义可位寻址存储区的位变量定义 C51C51编编编编译译译译器器器器允允允允许许许许数数数数据据据据类类类类型型型型为为为为bdatabdata的的的的变变变变量量量量放放放放入入入入片片片片内内内内RAMRAM可位寻址区中。可位寻址区中。可位寻址区中。可位寻址区中。 例例例例如如如如:先先先先定定定定义义义义变变变变量量量量的的的的数数数数据据据据类类类类型型型型和和和和存存存存储储储储类类类类型型型型,然然然然后后后后使使使使用用用用sbitsbit定义位变量。定义位变量。定义位变量。定义位变量。bdata bdata int int ibdata; ibdata; /* /* ibdataibdata定定定定义义义义为为为为bdatabdata整整整整型型型型变变变变量量量量*/ */bdata bdata char char carry5; carry5; /* /* carrycarry定定定定义义义义为为为为bdatabdata字字字字符符符符数数数数组组组组*/ */sbit sbit mybit0= mybit0= ibdata0; ibdata0; /* /* mybit0mybit0定定定定义义义义为为为为ibdataibdata的的的的第第第第0 0位位位位*/ */sbit sbit mybit15= mybit15= ibdata15; ibdata15; /* /* mybit15mybit15定定定定义义义义为为为为ibdataibdata的的的的第第第第1515位位位位*/ */5.3.5 5.3.5 位地址访问位地址访问位地址访问位地址访问8/30/202470张兴忠制作:返回目录3 3可位寻址存储区的位变量定义可位寻址存储区的位变量定义可位寻址存储区的位变量定义可位寻址存储区的位变量定义sbit arrybit07= carry07;sbit arrybit07= carry07;/* arrybit07/* arrybit07定义为定义为定义为定义为carry0carry0的第的第的第的第7 7位位位位*/ */sbit arrybit37= carry37;sbit arrybit37= carry37;/* arrybit37/* arrybit37定义为定义为定义为定义为carry3carry3的第的第的第的第7 7位位位位*/ */arrybit37=0;arrybit37=0;/*carry3/*carry3的的的的第第第第7 7位位位位赋赋赋赋值值值值为为为为0 0(位位位位寻寻寻寻址)址)址)址)*/ */carry0=A;carry0=A; /*carry0/*carry0赋赋赋赋值值值值为为为为AA(字字字字节寻址)节寻址)节寻址)节寻址)*/ */ 位位位位置置置置( 操操操操作作作作符符符符)后后后后的的的的最最最最大大大大值值值值取取取取决决决决于于于于指指指指定定定定的的的的基基基基本本本本数数数数据据据据类类类类型型型型。对对对对于于于于charchar而而而而言言言言是是是是0707;对对对对于于于于intint而而而而言言言言是是是是015015;对对对对于于于于longlong而言是而言是而言是而言是031031。5.3.5 5.3.5 位地址访问位地址访问位地址访问位地址访问8/30/202471张兴忠制作:返回目录5.4 C515.4 C51函数函数函数函数 C51程序是由一个个函数构成的,在构成C51程序的若干个函数中,必须有一个主函数main( ),主函数可根据需要来调用其它函数。同一个函数可以在不同的地方被调用。8/30/202472张兴忠制作:返回目录5.4.1 5.4.1 函数的分类函数的分类函数的分类函数的分类 从从从从用用用用户户户户使使使使用用用用角角角角度度度度划划划划分分分分,函函函函数数数数分分分分为为为为库库库库函函函函数数数数和和和和用用用用户户户户自定义函数。自定义函数。自定义函数。自定义函数。 库库库库函函函函数数数数是是是是编编编编译译译译系系系系统统统统为为为为用用用用户户户户设设设设计计计计的的的的一一一一系系系系列列列列标标标标准准准准函函函函数数数数,用用用用户户户户只只只只需需需需调调调调用用用用,而而而而无无无无需需需需自自自自己己己己去去去去编编编编写写写写这这这这些些些些复复复复杂杂杂杂的的的的函函函函数数数数。在在在在调调调调用用用用前前前前要要要要先先先先使使使使用用用用#include#include包包包包含含含含命命命命令令令令包包包包含含含含和和和和该该该该函函函函数数数数有有有有关关关关的的的的头头头头文文文文件件件件,然然然然后后后后才才才才能能能能调调调调用用用用。如如如如前前前前面面面面所所所所用用用用到到到到的的的的头头头头文文文文件件件件等等等等,每每每每一一一一种种种种头头头头文文文文件件件件中中中中包包包包括一系列函数。括一系列函数。括一系列函数。括一系列函数。8/30/202473张兴忠制作:返回目录 用用用用户户户户自自自自定定定定义义义义函函函函数数数数是是是是用用用用户户户户根根根根据据据据任任任任务务务务编编编编写写写写的的的的函函函函数数数数。从从从从函函函函数数数数定定定定义义义义形形形形式式式式上上上上可可可可划划划划分分分分为为为为三三三三种种种种:无无无无参参参参函函函函数数数数、有有有有参参参参函函函函数数数数和和和和空空空空函函函函数。数。数。数。 无无无无参参参参函函函函数数数数:函函函函数数数数中中中中无无无无参参参参数数数数定定定定义义义义,该该该该函函函函数数数数调调调调用用用用时时时时无无无无参参参参数数数数传递。传递。传递。传递。 有有有有参参参参函函函函数数数数:函函函函数数数数中中中中定定定定义义义义形形形形式式式式参参参参数数数数。在在在在调调调调用用用用函函函函数数数数时时时时,实实实实际际际际参参参参数数数数值值值值传传传传递递递递给给给给形形形形式式式式参参参参数数数数,调调调调用用用用后后后后返返返返回回回回结结结结果果果果给给给给调调调调用用用用它它它它的的的的函函函函数使用。数使用。数使用。数使用。 空空空空函函函函数数数数:函函函函数数数数中中中中无无无无参参参参数数数数,也也也也无无无无语语语语句句句句。该该该该函函函函数数数数可可可可以以以以调调调调用用用用但但但但没没没没有有有有任任任任何何何何功功功功能能能能,该该该该函函函函数数数数是是是是为为为为了了了了开开开开发发发发程程程程序序序序时时时时将将将将一一一一些些些些非非非非基基基基本本本本模模模模块块块块的的的的功功功功能能能能函函函函数数数数定定定定义义义义成成成成空空空空函函函函数数数数,先先先先占占占占好好好好位位位位置置置置,以以以以后后后后再再再再用用用用编好的函数替换它。编好的函数替换它。编好的函数替换它。编好的函数替换它。5.4.1 5.4.1 函数的分类函数的分类函数的分类函数的分类-无参函数、有参函数和空函数无参函数、有参函数和空函数8/30/202474张兴忠制作:返回目录5.4.2 5.4.2 函数的定义函数的定义函数的定义函数的定义函数类型函数类型函数类型函数类型 函数名函数名函数名函数名 ( ) ( ) 函数体语句函数体语句函数体语句函数体语句 如果函数没有返回值,可以将返回值类如果函数没有返回值,可以将返回值类如果函数没有返回值,可以将返回值类如果函数没有返回值,可以将返回值类型设为型设为型设为型设为voidvoid,函数以,函数以,函数以,函数以“”“”开始,以开始,以开始,以开始,以“”“”结结结结束。束。束。束。1 1 1 1无参函数的定义无参函数的定义无参函数的定义无参函数的定义-函数的定义函数的定义8/30/202475张兴忠制作:返回目录例例例例5-7 5-7 无参函数的定义与调用。无参函数的定义与调用。无参函数的定义与调用。无参函数的定义与调用。#include #include void fun1( )void fun1( ) printf(“This is a C51 Programn”);printf(“This is a C51 Programn”); void main( )void main( ) fun1( );fun1( ); 5.4.2 5.4.2 函数的定义函数的定义函数的定义函数的定义-函数的定义函数的定义8/30/202476张兴忠制作:返回目录2 2 2 2有参函数的定义有参函数的定义有参函数的定义有参函数的定义函数类型函数类型函数类型函数类型 函数名函数名函数名函数名 ( (形式参数表列形式参数表列形式参数表列形式参数表列) ) 函数体语句函数体语句函数体语句函数体语句return (return (返回形参名返回形参名返回形参名返回形参名) ) 其中形式参数表列的各项要用其中形式参数表列的各项要用其中形式参数表列的各项要用其中形式参数表列的各项要用 , 隔开,通隔开,通隔开,通隔开,通过过过过returnreturn语句将需返回的值返回给调用函数。语句将需返回的值返回给调用函数。语句将需返回的值返回给调用函数。语句将需返回的值返回给调用函数。5.4.2 5.4.2 函数的定义函数的定义函数的定义函数的定义-函数的定义函数的定义8/30/202477张兴忠制作:返回目录void fun2(int a,int b ) int sum; sum=a+b; return sum;void main()int x=123,y=456,sum; sum=fun2(x,y); 5.4.2 5.4.2 函数的定义函数的定义函数的定义函数的定义例例5-8 有参函数的定义与调用。有参函数的定义与调用。8/30/202478张兴忠制作:返回目录3 3空函数的定义空函数的定义空函数的定义空函数的定义函数类型函数类型函数类型函数类型 函数名函数名函数名函数名 ( ) ( ) 函数可以将返回值类型设为函数可以将返回值类型设为函数可以将返回值类型设为函数可以将返回值类型设为voidvoid。 例例例例5-9 5-9 空函数的定义与调用。空函数的定义与调用。空函数的定义与调用。空函数的定义与调用。void fun3( )void fun3( ) void main( )void main( ) fun3( ); fun3( ); 5.4.2 5.4.2 函数的定义函数的定义函数的定义函数的定义8/30/202479张兴忠制作:返回目录5.4.3 5.4.3 函数的调用函数的调用函数的调用函数的调用函数名函数名函数名函数名 ( (实际参数表列实际参数表列实际参数表列实际参数表列); );函数的调用方式有三种:函数的调用方式有三种:函数的调用方式有三种:函数的调用方式有三种:1) 1) 把被调函数作为主调函数中的一个语句。把被调函数作为主调函数中的一个语句。把被调函数作为主调函数中的一个语句。把被调函数作为主调函数中的一个语句。例如例如例如例如 fun1( ); fun1( );2) 2) 把被调函数作为表达式的一个运算对象。把被调函数作为表达式的一个运算对象。把被调函数作为表达式的一个运算对象。把被调函数作为表达式的一个运算对象。例如例如例如例如 sum=2* fun2(x, y); sum=2* fun2(x, y);3) 3) 把被调函数作为另一个函数的参数。把被调函数作为另一个函数的参数。把被调函数作为另一个函数的参数。把被调函数作为另一个函数的参数。例如例如例如例如 printf(“sum is %dn”, fun2(x, y); printf(“sum is %dn”, fun2(x, y);-函数调用的形式函数调用的形式8/30/202480张兴忠制作:返回目录5.4.4 5.4.4 对被调函数的说明对被调函数的说明对被调函数的说明对被调函数的说明1) 1) 被调用函数必须是已经存在的函数(库函数和用户自被调用函数必须是已经存在的函数(库函数和用户自被调用函数必须是已经存在的函数(库函数和用户自被调用函数必须是已经存在的函数(库函数和用户自定义函数)。定义函数)。定义函数)。定义函数)。2) 2) 调用库函数需要调用库函数需要调用库函数需要调用库函数需要#include#include包含和该函数有关的头文件,包含和该函数有关的头文件,包含和该函数有关的头文件,包含和该函数有关的头文件,然后才能调用。然后才能调用。然后才能调用。然后才能调用。3) 3) 调用用户自定义函数,如果被调函数出现在主调函数调用用户自定义函数,如果被调函数出现在主调函数调用用户自定义函数,如果被调函数出现在主调函数调用用户自定义函数,如果被调函数出现在主调函数之后,在主调函数前应对被调函数作声明。形式为:之后,在主调函数前应对被调函数作声明。形式为:之后,在主调函数前应对被调函数作声明。形式为:之后,在主调函数前应对被调函数作声明。形式为: 函数类型函数类型函数类型函数类型 函数名函数名函数名函数名 ( (形参表列形参表列形参表列形参表列); );-函数调用条件函数调用条件8/30/202481张兴忠制作:返回目录void main()void main()/* /*主函数主函数主函数主函数*/ */ int fun1(int a, int b);int fun1(int a, int b);/* /*函数声明函数声明函数声明函数声明*/ */int d, u=3, v=2;int d, u=3, v=2;d=2*fun1(u, v);d=2*fun1(u, v); int fun1(int a, int b)int fun1(int a, int b) int c;int c;c=a+b;c=a+b;return(c);return(c); 5.4.4 5.4.4 对被调函数的说明对被调函数的说明对被调函数的说明对被调函数的说明-例例5-10 函数的定义与声明函数的定义与声明8/30/202482张兴忠制作:返回目录int fun1(int a, int b)int fun1(int a, int b) int c;int c;c=a+b;c=a+b;return(c);return(c); void main()void main() int d, u=3, v=2;int d, u=3, v=2;d=2* fun1(u, v);d=2* fun1(u, v); 5.4.4 5.4.4 对被调函数的说明对被调函数的说明对被调函数的说明对被调函数的说明-函数的调用函数的调用上例中被调函数在主上例中被调函数在主上例中被调函数在主上例中被调函数在主调函数之后,在主调调函数之后,在主调调函数之后,在主调调函数之后,在主调函数一开始对被调函函数一开始对被调函函数一开始对被调函函数一开始对被调函数进行了声明。若被数进行了声明。若被数进行了声明。若被数进行了声明。若被调函数出现在主调函调函数出现在主调函调函数出现在主调函调函数出现在主调函数之前时,可以不对数之前时,可以不对数之前时,可以不对数之前时,可以不对被调函数进行声明。被调函数进行声明。被调函数进行声明。被调函数进行声明。上例可修改如下。上例可修改如下。上例可修改如下。上例可修改如下。8/30/202483张兴忠制作:返回目录5.4.5 5.4.5 中断函数中断函数中断函数中断函数 中断服务程序在中断服务程序在中断服务程序在中断服务程序在C51C51程序中是以中断函数的形式出程序中是以中断函数的形式出程序中是以中断函数的形式出程序中是以中断函数的形式出现的,中断函数的格式为:现的,中断函数的格式为:现的,中断函数的格式为:现的,中断函数的格式为: void void 函数名函数名函数名函数名( ) interrupt n using m( ) interrupt n using m 函数体语句函数体语句函数体语句函数体语句 interruptinterrupt是中断函数的关键字,是中断函数的关键字,是中断函数的关键字,是中断函数的关键字,n n是中断号是中断号是中断号是中断号,MCS-51MCS-51的中断号与中断源的对应关系如表的中断号与中断源的对应关系如表的中断号与中断源的对应关系如表的中断号与中断源的对应关系如表5-55-5所示。所示。所示。所示。 using using是指定中断函数中选用工作寄存器组的关键是指定中断函数中选用工作寄存器组的关键是指定中断函数中选用工作寄存器组的关键是指定中断函数中选用工作寄存器组的关键字,字,字,字,mm是是是是0303范围的常数,若不用该选项,编译器会自动范围的常数,若不用该选项,编译器会自动范围的常数,若不用该选项,编译器会自动范围的常数,若不用该选项,编译器会自动选择默认工作寄存器组选择默认工作寄存器组选择默认工作寄存器组选择默认工作寄存器组(0 0组寄存器)。组寄存器)。组寄存器)。组寄存器)。-中断函数的格式中断函数的格式8/30/202484张兴忠制作:返回目录表表表表5-5 MCS-515-5 MCS-51中断源和中断的关系中断源和中断的关系中断源和中断的关系中断源和中断的关系中断号中断号中断号中断号中断源中断源中断源中断源入口地址入口地址入口地址入口地址0 0外中断外中断0 00003H0003H1 1定定时时/ /计计数器数器0 0000BH000BH2 2外中断外中断1 10013H0013H3 3定定时时/ /计计数器数器1 1001BH001BH4 4串行口中断串行口中断0023H0023Hvoid 函数名函数名( ) interrupt n using m5.4.5 5.4.5 中断函数中断函数中断函数中断函数-中断函数的中断号中断函数的中断号8/30/202485张兴忠制作:返回目录void void 函数名函数名函数名函数名( ) interrupt n using m( ) interrupt n using m例如:例如:例如:例如:void T0_srv(void) interrupt 1 using 1void T0_srv(void) interrupt 1 using 1 /* /*定时定时定时定时/ /计数器计数器计数器计数器0 0中断函数中断函数中断函数中断函数*/ */ /* /*定时定时定时定时/ /计数器计数器计数器计数器0 0中断服务程序中断服务程序中断服务程序中断服务程序*/ */ 中断号中断号中断号中断号中断源中断源中断源中断源入口地址入口地址入口地址入口地址0 0外中断外中断0 00003H0003H1 1定定时时/ /计计数器数器0 0000BH000BH2 2外中断外中断1 10013H0013H3 3定定时时/ /计计数器数器1 1001BH001BH4 4串行口中断串行口中断0023H0023H5.4.5 5.4.5 中断函数中断函数中断函数中断函数-中断函数的格式中断函数的格式8/30/202486张兴忠制作:返回目录1) 1) 中断函数不能进行参数传递。中断函数不能进行参数传递。中断函数不能进行参数传递。中断函数不能进行参数传递。2) 2) 中断函数没有返回值,应定义为中断函数没有返回值,应定义为中断函数没有返回值,应定义为中断函数没有返回值,应定义为voidvoid型。型。型。型。3) 3) 禁止对中断函数的直接调用。禁止对中断函数的直接调用。禁止对中断函数的直接调用。禁止对中断函数的直接调用。4) 4) 如果中断函数调用了其他函数,被调函数与中断如果中断函数调用了其他函数,被调函数与中断如果中断函数调用了其他函数,被调函数与中断如果中断函数调用了其他函数,被调函数与中断函数使用相同的寄存器组。函数使用相同的寄存器组。函数使用相同的寄存器组。函数使用相同的寄存器组。5) 5) 中断函数最好写在程序尾部。中断函数最好写在程序尾部。中断函数最好写在程序尾部。中断函数最好写在程序尾部。void void 函数名函数名函数名函数名( ) interrupt n using m( ) interrupt n using m5.4.5 5.4.5 中断函数中断函数中断函数中断函数-编写中断函数要点编写中断函数要点8/30/202487张兴忠制作:返回目录5.5 C515.5 C51结构化程序设计结构化程序设计结构化程序设计结构化程序设计 C51 C51程序是一种结构化程序,由若干模块组成,程序是一种结构化程序,由若干模块组成,程序是一种结构化程序,由若干模块组成,程序是一种结构化程序,由若干模块组成,每个模块中包含若干个基本结构,而每个基本每个模块中包含若干个基本结构,而每个基本每个模块中包含若干个基本结构,而每个基本每个模块中包含若干个基本结构,而每个基本结构中可以有若干条语句。基本结构有三种,结构中可以有若干条语句。基本结构有三种,结构中可以有若干条语句。基本结构有三种,结构中可以有若干条语句。基本结构有三种,顺序结构、选择结构和循环结构。顺序结构、选择结构和循环结构。顺序结构、选择结构和循环结构。顺序结构、选择结构和循环结构。5.5.1 5.5.1 顺序结构程序顺序结构程序顺序结构程序顺序结构程序 顺序结构是一种最基本、最简单的程序结构。顺序结构是一种最基本、最简单的程序结构。顺序结构是一种最基本、最简单的程序结构。顺序结构是一种最基本、最简单的程序结构。在这种结构中,语句被依次逐条地顺序执行。在这种结构中,语句被依次逐条地顺序执行。在这种结构中,语句被依次逐条地顺序执行。在这种结构中,语句被依次逐条地顺序执行。- 顺序结构程顺序结构程序序8/30/202488张兴忠制作:返回目录例例例例5-115-115-115-11 设计一乘法程序,乘积放在外部设计一乘法程序,乘积放在外部设计一乘法程序,乘积放在外部设计一乘法程序,乘积放在外部RAMRAM中的中的中的中的0000H0000H单元。单元。单元。单元。void main( )void main( ) unsigned long xdata *p;unsigned long xdata *p;/* /*设定设定设定设定p p是指向外部是指向外部是指向外部是指向外部RAMRAM区的区的区的区的unsigned longunsigned long指针指针指针指针*/ */unsigned long x=12345, y=67890, mum;unsigned long x=12345, y=67890, mum;mum=x*y;mum=x*y;p=0;p=0;/*p/*p指向外部指向外部指向外部指向外部RAMRAM区区区区0000H0000H单元单元单元单元*/ */*p=mum;*p=mum;/* /*乘积存入外部乘积存入外部乘积存入外部乘积存入外部RAMRAM区区区区0000H0000H单元单元单元单元*/ */ 5.5 C515.5 C51结构化程序设计结构化程序设计结构化程序设计结构化程序设计- 顺序程序设顺序程序设计计8/30/202489张兴忠制作:返回目录5.5.2 5.5.2 选择结构程序选择结构程序选择结构程序选择结构程序 用用用用if if语语语语句句句句可可可可以以以以构构构构成成成成选选选选择择择择结结结结构构构构。它它它它根根根根据据据据给给给给定定定定的的的的条条条条件件件件进进进进行行行行判判判判断断断断,以以以以决决决决定定定定执执执执行行行行某某某某个个个个分分分分支支支支程程程程序序序序段段段段。语言的语言的语言的语言的if if语句有三种基本形式。语句有三种基本形式。语句有三种基本形式。语句有三种基本形式。1 1 1 1单分支语句单分支语句单分支语句单分支语句if (if (条件表达式条件表达式条件表达式条件表达式) ) 语句组语句组语句组语句组; ; 其语义是:如果条件表其语义是:如果条件表其语义是:如果条件表其语义是:如果条件表达式的值为真,则执行其后达式的值为真,则执行其后达式的值为真,则执行其后达式的值为真,则执行其后的语句组,否则不执行其后的语句组,否则不执行其后的语句组,否则不执行其后的语句组,否则不执行其后的语句组。单分支语句执行的语句组。单分支语句执行的语句组。单分支语句执行的语句组。单分支语句执行过程可表示为图过程可表示为图过程可表示为图过程可表示为图5-15-1所示。所示。所示。所示。-单分支程序单分支程序8/30/202490张兴忠制作:返回目录例例例例5-12 5-12 寻找两个数中的大数输出寻找两个数中的大数输出寻找两个数中的大数输出寻找两个数中的大数输出void main()void main() unsigned xdata *p; unsigned xdata *p;unsigned a=35, b=78, max;unsigned a=35, b=78, max;max=a;max=a;if (maxb) max=b;if (maxb)if(ab)max=a;max=a;elseelsemax=b;max=b;p=0;p=0;/*p/*p指向外部指向外部指向外部指向外部RAMRAM区区区区0000H0000H单元单元单元单元*/ */*p=max; /*p=max; /*最大值存入外部最大值存入外部最大值存入外部最大值存入外部RAMRAM区区区区0000H0000H单元单元单元单元*/ */ 5.5.2 5.5.2 选择结构程序选择结构程序选择结构程序选择结构程序-双分支程序设计双分支程序设计8/30/202493张兴忠制作:返回目录3 3多分多分支语句支语句当有多个分支选择时,可采用当有多个分支选择时,可采用当有多个分支选择时,可采用当有多个分支选择时,可采用if-else-ifif-else-if语句结构,其一般语句结构,其一般语句结构,其一般语句结构,其一般形式为:形式为:形式为:形式为:if (if (条件表达式条件表达式条件表达式条件表达式1)1)语句组语句组语句组语句组1;1;else if (else if (条件表达式条件表达式条件表达式条件表达式2)2)语句组语句组语句组语句组2;2;else if (else if (条件表达式条件表达式条件表达式条件表达式3)3)语句组语句组语句组语句组3;3;else if (else if (条件表达式条件表达式条件表达式条件表达式n)n)语句组语句组语句组语句组n;n;elseelse语句语句语句语句m;m;5.5.2 5.5.2 选择结构程序选择结构程序选择结构程序选择结构程序-多分支程序多分支程序8/30/202494张兴忠制作:返回目录例例例例5-145-14 如如如如图图图图5-35-3所所所所示示示示,单单单单片片片片机机机机P1P1口口口口的的的的和和和和各各各各接接接接一一一一个个个个开开开开关关关关K1K1、K2K2,、和和和和各各各各接接接接一一一一只只只只发发发发光光光光二二二二极极极极管管管管。由由由由K1K1和和和和K2K2的的的的不不不不同同同同状状状状态态态态来来来来确确确确定定定定哪哪哪哪个个个个发发发发光光光光二二二二极极极极管管管管被点亮。被点亮。被点亮。被点亮。5.5.2 5.5.2 选择结构程序选择结构程序选择结构程序选择结构程序-多分支程序设计多分支程序设计8/30/202495张兴忠制作:返回目录例例5-145-14#include “reg51.h”#include “reg51.h”void main( )void main( ) char a;char a;a=P1;a=P1;a=a&0x03;/*a=a&0x03;/*屏蔽高屏蔽高屏蔽高屏蔽高6 6位位位位*/ */if (a= =0) P1=0x7F;if (a= =0) P1=0x7F;else if (a= =1) P1=0xBF;else if (a= =1) P1=0xBF;else if (a= =2) P1=0xDF;else if (a= =2) P1=0xDF;else P1=0xEF;else P1=0xEF; 5.5.2 5.5.2 选择结构程序选择结构程序选择结构程序选择结构程序-多分支程序设计多分支程序设计8/30/202496张兴忠制作:返回目录4 4 4 4开关选择开关选择开关选择开关选择switchswitchswitchswitch语句语句语句语句switchswitch语句结构的一般形式为:语句结构的一般形式为:语句结构的一般形式为:语句结构的一般形式为:switch (switch (表达式表达式表达式表达式) ) case case 常量表达式常量表达式常量表达式常量表达式1: 1: 语句组语句组语句组语句组1;1;case case 常量表达式常量表达式常量表达式常量表达式2: 2: 语句组语句组语句组语句组2;2;case case 常量表达式常量表达式常量表达式常量表达式n: n: 语句组语句组语句组语句组n;n;default: default: 语句组语句组语句组语句组n+1;n+1; 5.5.2 5.5.2 选择结构程序选择结构程序选择结构程序选择结构程序-多分支程序多分支程序8/30/202497张兴忠制作:返回目录【例【例【例【例5-155-15】 用用用用switchswitch语句完成例语句完成例语句完成例语句完成例5-145-14任务。任务。任务。任务。程序如下。程序如下。程序如下。程序如下。#include#includevoid main()void main() char a;char a;a=P1;a=P1;a=a&0x03;a=a&0x03;/* /*屏蔽高屏蔽高屏蔽高屏蔽高6 6位位位位*/ */switch (a)switch (a) case 0: P1=0x7F; break; case 0: P1=0x7F; break; case 1: P1=0xBF; break; case 1: P1=0xBF; break; case 2: P1=0xDF; break; case 2: P1=0xDF; break; default: P1=0xEF; default: P1=0xEF; 5.5.2 5.5.2 选择结构程序选择结构程序选择结构程序选择结构程序-多分支程序设计多分支程序设计8/30/202498张兴忠制作:返回目录在使用在使用在使用在使用switchswitch语句时还应注意以下几点。语句时还应注意以下几点。语句时还应注意以下几点。语句时还应注意以下几点。(1) (1) 在在在在casecase后后后后的的的的各各各各常常常常量量量量表表表表达达达达式式式式的的的的值值值值不不不不能能能能相相相相同同同同,否否否否则则则则会会会会出出出出现现现现错误。错误。错误。错误。(2) (2) 在在在在casecase后,允许有多条语句,可以不用后,允许有多条语句,可以不用后,允许有多条语句,可以不用后,允许有多条语句,可以不用 括起来。括起来。括起来。括起来。(3) (3) 各各各各casecase和和和和defaultdefault子子子子句句句句的的的的先先先先后后后后顺顺顺顺序序序序可可可可以以以以变变变变动动动动,而而而而不不不不会会会会影响程序执行结果。影响程序执行结果。影响程序执行结果。影响程序执行结果。(4) default(4) default子句可以省略不用。子句可以省略不用。子句可以省略不用。子句可以省略不用。(5) (5) 在在在在每每每每一一一一casecase语语语语句句句句之之之之后后后后增增增增加加加加breakbreak语语语语句句句句,使使使使每每每每一一一一次次次次执执执执行行行行之后均可跳出之后均可跳出之后均可跳出之后均可跳出switchswitch语句,这样才能实现多分支结构。语句,这样才能实现多分支结构。语句,这样才能实现多分支结构。语句,这样才能实现多分支结构。5.5.2 5.5.2 选择结构程序选择结构程序选择结构程序选择结构程序-注意注意8/30/202499张兴忠制作:返回目录5.5.3 5.5.3 循环结构程序循环结构程序循环结构程序循环结构程序 其特点是,在给定条件成立时,反复执行其特点是,在给定条件成立时,反复执行其特点是,在给定条件成立时,反复执行其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件某程序段,直到条件不成立为止。给定的条件某程序段,直到条件不成立为止。给定的条件某程序段,直到条件不成立为止。给定的条件称为称为称为称为循环条件循环条件循环条件循环条件,反复执行的程序段称为,反复执行的程序段称为,反复执行的程序段称为,反复执行的程序段称为循环体循环体循环体循环体。语言提供了多种循环语句,可以组成各种不语言提供了多种循环语句,可以组成各种不语言提供了多种循环语句,可以组成各种不语言提供了多种循环语句,可以组成各种不同形式的循环结构。语言提供的循环语句有:同形式的循环结构。语言提供的循环语句有:同形式的循环结构。语言提供的循环语句有:同形式的循环结构。语言提供的循环语句有:1) 1) 用用用用whilewhile语句;语句;语句;语句;2) 2) 用用用用do-whiledo-while语句;语句;语句;语句;3) 3) 用用用用forfor语句。语句。语句。语句。-语言提供的循环语句语言提供的循环语句8/30/2024100张兴忠制作:返回目录1 1 1 1whilewhilewhilewhile循环语句循环语句循环语句循环语句whilewhile循环语句的一般形式为:循环语句的一般形式为:循环语句的一般形式为:循环语句的一般形式为: while (while (表达式表达式表达式表达式) ) 语句组语句组语句组语句组其中表达式是循环条件,语句组为循环体。其中表达式是循环条件,语句组为循环体。其中表达式是循环条件,语句组为循环体。其中表达式是循环条件,语句组为循环体。 while语语句句的的语语义义是是:计计算算表表达达式式的的值值,当当值值为为真真(非非0)时时,执执行行循循环环体语句组。体语句组。5.5.3 5.5.3 循环结构程序循环结构程序循环结构程序循环结构程序-while循环语句循环语句8/30/2024101张兴忠制作:返回目录【例【例5-16】 前面的例前面的例5-15程序只能执行一遍,用程序只能执行一遍,用while语句使其语句使其无穷循环执行。程序如下。无穷循环执行。程序如下。#includevoid main() char a; while (1)/*循环条件表达式的值始终为循环条件表达式的值始终为1,无穷循环无穷循环*/a=P1; a=a&0x03;/*屏蔽高屏蔽高6位位*/ switch (a)case 0: P1=0x7F; break; case 1: P1=0xBF; break; case 2: P1=0xDF; break; case 3: P1=0xEF;5.5.3 5.5.3 循环结构程序循环结构程序循环结构程序循环结构程序-while循环语句循环语句8/30/2024102张兴忠制作:返回目录【例【例【例【例5-175-17】 用用用用do-whiledo-while语句实现例语句实现例语句实现例语句实现例5-165-16。程序如下。程序如下。程序如下。程序如下。#include#includevoid main()void main() char a;char a;do do a=P1;a=P1;a=a&0x03;a=a&0x03;/* /*屏蔽高屏蔽高屏蔽高屏蔽高6 6位位位位*/ */switch (a)switch (a) case 0: P1=0x7F; break; case 0: P1=0x7F; break; case 1: P1=0xBF; break; case 1: P1=0xBF; break; case 2: P1=0xDF; break; case 2: P1=0xDF; break; case 3: P1=0xEF; case 3: P1=0xEF; while (1);/* while (1);/*循环条件表达式的值始终为循环条件表达式的值始终为循环条件表达式的值始终为循环条件表达式的值始终为1,1,无穷循环无穷循环无穷循环无穷循环*/ */ 5.5.3 5.5.3 循环结构程序循环结构程序循环结构程序循环结构程序-do-while循环语句应用循环语句应用8/30/2024103张兴忠制作:返回目录-3-3forfor循环语句循环语句循环语句循环语句for (for (表达式表达式表达式表达式1;1;表达式表达式表达式表达式2;2;表达式表达式表达式表达式3) 3) 语句组语句组语句组语句组forfor循环语句的执行过程如下:循环语句的执行过程如下:循环语句的执行过程如下:循环语句的执行过程如下:1) 1) 先求解表达式先求解表达式先求解表达式先求解表达式1 1。2) 2) 求求求求解解解解表表表表达达达达式式式式2 2,若若若若其其其其值值值值为为为为真真真真(非非非非0 0),则则则则执执执执行行行行forfor语语语语句句句句中中中中指指指指定定定定的的的的内内内内嵌嵌嵌嵌语语语语句句句句,然然然然后后后后执执执执行行行行下下下下面面面面第第第第3 3步步步步;若若若若其其其其值值值值为为为为假假假假(0 0),则转到第),则转到第),则转到第),则转到第5 5步,结束循环。步,结束循环。步,结束循环。步,结束循环。5.5.3 5.5.3 循环结构程序循环结构程序循环结构程序循环结构程序8/30/2024104张兴忠制作:返回目录-3-3forfor循环语句循环语句循环语句循环语句3) 3) 求解表达式求解表达式求解表达式求解表达式3 3。4) 4) 转回上面第转回上面第转回上面第转回上面第2 2步继续执行。步继续执行。步继续执行。步继续执行。5) 5) 循环结束,执行循环结束,执行循环结束,执行循环结束,执行forfor语句体后语句体后语句体后语句体后面的一个语句。面的一个语句。面的一个语句。面的一个语句。forfor循环语句的执行过程如图循环语句的执行过程如图循环语句的执行过程如图循环语句的执行过程如图5-65-6所示。所示。所示。所示。5.5.3 5.5.3 循环结构程序循环结构程序循环结构程序循环结构程序8/30/2024105张兴忠制作:返回目录1) 1) forfor循循循循环环环环中中中中的的的的“ “表表表表达达达达式式式式1 1(循循循循环环环环变变变变量量量量赋赋赋赋初初初初值值值值)” ”、“ “表表表表达达达达式式式式2 2(循循循循环环环环条条条条件件件件)” ”和和和和“ “表表表表达达达达式式式式3 3(循循循循环环环环变变变变量量量量增增增增量量量量)” ”都都都都是是是是选选选选择择择择项项项项,即即即即可可可可以以以以缺缺缺缺省省省省,但但但但“;”“;”不能缺省。不能缺省。不能缺省。不能缺省。2) 2) 省省省省略略略略了了了了“ “表表表表达达达达式式式式1 1(循循循循环环环环变变变变量量量量赋赋赋赋初初初初值值值值)” ”,表表表表示不对循环控制变量赋初值。示不对循环控制变量赋初值。示不对循环控制变量赋初值。示不对循环控制变量赋初值。5.5.3 5.5.3 循环结构程序循环结构程序循环结构程序循环结构程序-for-for循环语句使用说明循环语句使用说明循环语句使用说明循环语句使用说明8/30/2024106张兴忠制作:返回目录3) 3) 省省省省略略略略了了了了“ “表表表表达达达达式式式式2 2(循循循循环环环环条条条条件件件件)” ”,则则则则不不不不做做做做其其其其它处理时便成为死循环。它处理时便成为死循环。它处理时便成为死循环。它处理时便成为死循环。4) 4) 省省省省略略略略了了了了“ “表表表表达达达达式式式式3 3(循循循循环环环环变变变变量量量量增增增增量量量量)” ”,则则则则不不不不对对对对循循循循环环环环控控控控制制制制变变变变量量量量进进进进行行行行操操操操作作作作,这这这这时时时时可可可可在在在在语语语语句句句句体体体体中中中中加入修改循环控制变量的语句。加入修改循环控制变量的语句。加入修改循环控制变量的语句。加入修改循环控制变量的语句。5.5.3 5.5.3 循环结构程序循环结构程序循环结构程序循环结构程序-for-for循环语句使用说明循环语句使用说明循环语句使用说明循环语句使用说明8/30/2024107张兴忠制作:返回目录5) 5) “ “表表表表达达达达式式式式1 1(循循循循环环环环变变变变量量量量赋赋赋赋初初初初值值值值)” ”和和和和“ “表表表表达达达达式式式式3 3(循循循循环环环环变变变变量量量量增增增增量量量量)” ”可可可可同同同同时时时时省省省省略略略略,结结结结果果果果如如如如同同同同前前前前面第面第面第面第2 2、4 4两种情况。两种情况。两种情况。两种情况。6) 6) 3 3个个个个表表表表达达达达式式式式都都都都可可可可同同同同时时时时省省省省略略略略,结结结结果果果果如如如如同同同同前前前前面面面面第第第第2 2、3 3、4 4三种情况的综合效果。三种情况的综合效果。三种情况的综合效果。三种情况的综合效果。7) 7) 表表表表达达达达式式式式2 2一一一一般般般般是是是是关关关关系系系系表表表表达达达达式式式式或或或或逻逻逻逻辑辑辑辑表表表表达达达达式式式式,但但但但也也也也可可可可是是是是数数数数值值值值表表表表达达达达式式式式或或或或字字字字符符符符表表表表达达达达式式式式,只只只只要要要要其其其其值值值值非非非非零零零零,就执行循环体。就执行循环体。就执行循环体。就执行循环体。5.5.3 5.5.3 循环结构程序循环结构程序循环结构程序循环结构程序-for-for循环语句使用说明循环语句使用说明循环语句使用说明循环语句使用说明8/30/2024108张兴忠制作:返回目录例例例例5-185-18 用用用用forfor语句实现例语句实现例语句实现例语句实现例5-165-16。#include “reg51.h”#include “reg51.h”void main( )void main( ) char a;char a;for ( ; ; )/*for ( ; ; )/*无循环条件,无穷循环无循环条件,无穷循环无循环条件,无穷循环无循环条件,无穷循环*/ */ a=P1; /*a=P1; /*读读读读P1P1口的值口的值口的值口的值*/ */a=a&0x03;a=a&0x03;/* /*屏蔽高屏蔽高屏蔽高屏蔽高6 6位位位位*/ */switch (a)switch (a) case 0: P1=0x7F; break; case 0: P1=0x7F; break; case 1: P1=0xBF; break; case 1: P1=0xBF; break; case 2: P1=0xDF; break; case 2: P1=0xDF; break; case 3: P1=0xEF; case 3: P1=0xEF; 5.5.3 5.5.3 循环结构程序循环结构程序循环结构程序循环结构程序-for-for循环程序设计循环程序设计循环程序设计循环程序设计8/30/2024109张兴忠制作:返回目录4 4 4 4breakbreakbreakbreak语句语句语句语句 breakbreak语语语语句句句句通通通通常常常常用用用用在在在在循循循循环环环环语语语语句句句句和和和和开开开开关关关关语语语语句句句句中中中中。当当当当breakbreak用用用用于于于于开开开开关关关关语语语语句句句句switchswitch中中中中时时时时,可可可可使使使使程程程程序序序序跳跳跳跳出出出出switchswitch而执行而执行而执行而执行switchswitch以后的语句。以后的语句。以后的语句。以后的语句。 当当当当breakbreak语语语语句句句句用用用用于于于于do-whiledo-while、forfor、whilewhile循循循循环环环环语语语语句句句句中中中中时时时时,可可可可使使使使程程程程序序序序终终终终止止止止循循循循环环环环而而而而执执执执行行行行循循循循环环环环结结结结构构构构后后后后面面面面的的的的语语语语句句句句,通通通通常常常常breakbreak语语语语句句句句总总总总是是是是与与与与if if语语语语句句句句联联联联在在在在一起。即满足条件时便跳出循环。一起。即满足条件时便跳出循环。一起。即满足条件时便跳出循环。一起。即满足条件时便跳出循环。5.5.3 5.5.3 循环结构程序循环结构程序循环结构程序循环结构程序-break语句语句8/30/2024110张兴忠制作:返回目录-5-5continuecontinue语句语句语句语句 continue语语句句的的作作用用是是跳跳过过循循环环体体中中剩剩余余的的语语句句而而强强行行开开始始执执行行下下一一次次循循环环。continue语语句句只只用用在在for、while、do-while等等循循环环体体中中,常常与与if条条件件语语句句一一起起使使用用,用用来来加速循环。加速循环。 5.5.3 5.5.3 循环结构程序循环结构程序循环结构程序循环结构程序8/30/2024111张兴忠制作:返回目录5.5.4 5.5.4 查表程序查表程序查表程序查表程序 在在在在许许许许多多多多单单单单片片片片机机机机嵌嵌嵌嵌入入入入式式式式应应应应用用用用系系系系统统统统中中中中,经经经经常常常常采采采采用用用用查查查查表表表表法法法法代代代代替替替替数数数数学学学学公公公公式式式式的的的的计计计计算算算算。特特特特别别别别是是是是对对对对传传传传感感感感器器器器的的的的非非非非线线线线性性性性补补补补偿偿偿偿的的的的场场场场合合合合,使使使使用用用用查查查查表表表表法法法法比比比比采采采采用用用用复复复复杂杂杂杂的的的的曲曲曲曲线线线线拟拟拟拟合合合合效效效效果果果果更更更更好好好好。可可可可以以以以将将将将预预预预先先先先计计计计算算算算好好好好的的的的数数数数据据据据随随随随程程程程序序序序装装装装入入入入到到到到EPROMEPROM的的的的一一一一块块块块指指指指定定定定区区区区间间间间,形成数据表。查表程序可以用数组实现。形成数据表。查表程序可以用数组实现。形成数据表。查表程序可以用数组实现。形成数据表。查表程序可以用数组实现。8/30/2024112张兴忠制作:返回目录例例例例5-195-195-195-19#define UCH unsigened char#define UCH unsigened charUCH code tem =32,34,36,37,39,41;UCH code tem =32,34,36,37,39,41;UCH f_to_c(UCH deg)UCH f_to_c(UCH deg) return temdeg;return temdeg; void main( )void main( ) UCH x;UCH x;x= f_to_c(3);x= f_to_c(3); 5.5.4 5.5.4 查表程序查表程序查表程序查表程序编编编编写写写写一一一一个个个个将将将将摄摄摄摄氏氏氏氏温温温温度度度度转转转转换换换换为为为为华华华华氏氏氏氏温温温温度度度度的的的的查查查查表表表表程程程程序序序序,已已已已知知知知摄摄摄摄氏氏氏氏温温温温度度度度0 0、1 1、2 2、3 3、4 4、5 5对对对对应应应应的的的的华华华华氏氏氏氏温温温温度度度度为为为为3232,3434,3636,3737,3939,4141。-查表程序应用查表程序应用8/30/2024113张兴忠制作:返回目录例例例例5-205-205-205-20 片内片内片内片内RAMRAM的的的的20H20H单元存放着一个单元存放着一个单元存放着一个单元存放着一个005H005H的数,的数,的数,的数,用查表法求出该数的平方值放入内部用查表法求出该数的平方值放入内部用查表法求出该数的平方值放入内部用查表法求出该数的平方值放入内部RAMRAM的的的的21H21H单元中。单元中。单元中。单元中。main( )main( ) char x,*p;char x,*p;char code tab6=0,1,4,9,16,25;char code tab6=0,1,4,9,16,25;p=0x20;p=0x20;x=tab*p;x=tab*p;p+;p+;*p=x;*p=x; 5.5.4 5.5.4 查表程序查表程序查表程序查表程序-查表程序应用查表程序应用8/30/2024114张兴忠制作:返回目录5.6 C515.6 C51程序设计实例程序设计实例程序设计实例程序设计实例 本本节节介介绍绍一一些些使使用用8051单单片片机机内内部部资资源源(中中断断、定定时时器器、I/O)和和扩扩展展资资源源(并并口口、A/D、D/A、键键盘盘、显显示示器器)的的C51实实用用程程序序。程程序序中中用用到到了了一一些些后后续续章章节节的的内内容容(如如中中断断、定定时时/计计数数器器等)。等)。8/30/2024115张兴忠制作:返回目录5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计#include “reg51.h”#include “reg51.h”#include “”#include “”sbit P1_0=P10;sbit P1_0=P10;void delayvoid delay(voidvoid)/* /*延时函数延时函数延时函数延时函数*/ */ int a=5000;int a=5000;While(a-) _nop_( );While(a-) _nop_( ); 例例例例5-215-21 外部中断外部中断外部中断外部中断0 0引脚(口)接一个开关,口接一个引脚(口)接一个开关,口接一个引脚(口)接一个开关,口接一个引脚(口)接一个开关,口接一个发光二极管。开关闭合一次,发光二极管改变一次状发光二极管。开关闭合一次,发光二极管改变一次状发光二极管。开关闭合一次,发光二极管改变一次状发光二极管。开关闭合一次,发光二极管改变一次状态。态。态。态。8/30/2024116张兴忠制作:返回目录void int_srv(void) interrupt 0 using 1void int_srv(void) interrupt 0 using 1/* /*外中断函数外中断函数外中断函数外中断函数*/ */ delay( );delay( );If(INT0= =0)If(INT0= =0)/* /*测试测试测试测试INT0= =0INT0= =0后取反后取反后取反后取反*/ */ P1_0=!P1_0; while(INT0= =0); P1_0=!P1_0; while(INT0= =0); void main( )void main( ) P1_0=0;P1_0=0;EA=1;EA=1;/* /*开中断开中断开中断开中断*/ */EX0=1;EX0=1;While(1);While(1); 5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计8/30/2024117张兴忠制作:返回目录例例例例5-225-22 用用用用定定定定时时时时器器器器T0T0实实实实现现现现从从从从口口口口输输输输出出出出方方方方波波波波信信信信号号号号,周周周周期期期期为为为为50ms50ms。 设设设设 单单单单 片片片片 机机机机 的的的的f focs=6MHzocs=6MHz。#include “reg51.h”#include “reg51.h”sbit P1_0=P10;sbit P1_0=P10;void main( )void main( ) /* /*主函数主函数主函数主函数*/ */TMOD=0x01; /*TMOD=0x01; /*写定时器方式控制字写定时器方式控制字写定时器方式控制字写定时器方式控制字, ,定时器定时器定时器定时器1616位方式位方式位方式位方式*/ */TH0=-12500/256; /*TH0=-12500/256; /*写定时器初始值写定时器初始值写定时器初始值写定时器初始值*/ */TL0=-12500%256TL0=-12500%256;ET0=1; /*ET0=1; /*开中断开中断开中断开中断*/ */EA=1;EA=1;TR0=1;TR0=1; /* /*启动定时器工作启动定时器工作启动定时器工作启动定时器工作*/ */While(1);While(1); /* /*等待中断等待中断等待中断等待中断*/ */ 5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计8/30/2024118张兴忠制作:返回目录void T0_srv(void) interrupt 1 using 1/*中断函数中断函数*/TH0=-12500/256;/*重写定时器初始值重写定时器初始值*/TL0=-12500%256;取反取反*/5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计8/30/2024119张兴忠制作:返回目录5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计 例例例例5-235-23 如如如如图图图图5-75-7所所所所示示示示,单单单单片片片片机机机机扩扩扩扩展展展展可可可可编编编编程程程程接接接接口口口口芯芯芯芯片片片片81558155,8155PA8155PA口口口口控控控控制制制制8 8只只只只发发发发光光光光二二二二极极极极管管管管,形形形形成成成成走走走走马马马马灯灯灯灯,每位点亮的时间为秒。每位点亮的时间为秒。每位点亮的时间为秒。每位点亮的时间为秒。81558155的端口地址如下:的端口地址如下:的端口地址如下:的端口地址如下:命令口地址(命令口地址(命令口地址(命令口地址(COM8155COM8155):):):):FEF8HFEF8HPAPA口地址(口地址(口地址(口地址(PA8155PA8155):):):):FEF9HFEF9HPBPB口地址(口地址(口地址(口地址(PB8155PB8155):):):):FEFAHFEFAHPCPC口地址(口地址(口地址(口地址(PC8155PC8155):):):):FEFBHFEFBH8/30/2024120张兴忠制作:返回目录#include “reg51.h”#include “reg51.h”#include “”#include “”#define COM8155 XBYTE0xfef8#define COM8155 XBYTE0xfef8#define PA8155 XBYTE0xfef9#define PA8155 XBYTE0xfef9void delay(void)void delay(void)/* /*延时延时延时延时1ms1ms函数函数函数函数*/ */ TH0=-500/256;TH0=-500/256;TL0=-500%256;TL0=-500%256;TR0=1;TR0=1;While(!TF0); While(!TF0); /* /*循环等待定时器循环等待定时器循环等待定时器循环等待定时器0 0定时时间到定时时间到定时时间到定时时间到*/ */TF0=0;TF0=0;TR0=0;TR0=0; 5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计8/30/2024121张兴忠制作:返回目录void main( )void main( )char i;char i; char disp_word=0x01;/* char disp_word=0x01;/*从第从第从第从第1 1位开始点亮位开始点亮位开始点亮位开始点亮*/ */ COM8155=0x01; COM8155=0x01;/* /*初始化初始化初始化初始化8155*/8155*/ do do PA8155= disp_word;/*PA8155= disp_word;/*输出点亮一位输出点亮一位输出点亮一位输出点亮一位*/ */for(i=0; i100; i+) delay( );for(i=0; i100; i+) delay( );/* /*点亮秒点亮秒点亮秒点亮秒*/ */disp_word=disp_word1;disp_word=disp_word1;/* /*左移控制字,准备点亮下一位左移控制字,准备点亮下一位左移控制字,准备点亮下一位左移控制字,准备点亮下一位*/ */if(disp_word= =0) disp_word=0x01;if(disp_word= =0) disp_word=0x01; while(1);while(1); 5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计8/30/2024122张兴忠制作:返回目录例例例例 5-245-24 如如如如 图图图图5-85-8所所所所 示示示示 为为为为 扩扩扩扩展展展展独独独独立立立立键键键键盘盘盘盘电电电电路路路路。编编编编写写写写程程程程序序序序实现键盘管理。实现键盘管理。实现键盘管理。实现键盘管理。5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计8/30/2024123张兴忠制作:返回目录#include “reg51.h”#include “reg51.h”#include “”#include “”void delayvoid delay(voidvoid)/* /*延时延时延时延时1ms*/1ms*/ TH0=-500/256;TH0=-500/256;TL0=-500%256;TL0=-500%256;TR0=1;TR0=1;while(!TF0);while(!TF0);/* /*循环等待定时器循环等待定时器循环等待定时器循环等待定时器0 0定时时间到定时时间到定时时间到定时时间到*/ */TF0=0;TF0=0;TR0=0;TR0=0; 5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计8/30/2024124张兴忠制作:返回目录void main( )void main( )char x, i;char x, i; loop: x=P1; loop: x=P1; x=x&0x0f; /* x=x&0x0f; /*屏蔽屏蔽屏蔽屏蔽P1P1口高口高口高口高4 4位位位位*/ */ if(x= = if(x= =0 0) goto loop;) goto loop; for(i=0; i10; i+) for(i=0; i10; i+) delay( ); delay( );/* /*延时延时延时延时10ms10ms去抖动去抖动去抖动去抖动*/ */ x=P1; x=P1; x=x&0x0f; x=x&0x0f; if(x= = if(x= =0 0) goto loop;) goto loop;5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计8/30/2024125张兴忠制作:返回目录 switch(x)switch(x)case 0x01: PBYTE0x20=PBYTE0x20+1; break; /*20case 0x01: PBYTE0x20=PBYTE0x20+1; break; /*20单元加单元加单元加单元加1*/1*/case 0x02: PBYTE0x20=PBYTE0x20-1; break; /*20case 0x02: PBYTE0x20=PBYTE0x20-1; break; /*20单元减单元减单元减单元减1*/1*/case 0x04: PBYTE0x20=0x00; break; /*20case 0x04: PBYTE0x20=0x00; break; /*20单元清单元清单元清单元清0*/0*/case 0x08: PBYTE0x20=0xff; /*20case 0x08: PBYTE0x20=0xff; /*20单元置全单元置全单元置全单元置全1*/1*/ goto loop;goto loop; 5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计8/30/2024126张兴忠制作:返回目录例例例例5-255-25 如图如图如图如图5-95-9所示为扩展所示为扩展所示为扩展所示为扩展4 4位动态显示电路。编位动态显示电路。编位动态显示电路。编位动态显示电路。编写控制写控制写控制写控制4 4位显示器动态显示的程序。位显示器动态显示的程序。位显示器动态显示的程序。位显示器动态显示的程序。位选码输出位选码输出段选码输出段选码输出5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计28288/30/2024127张兴忠制作:返回目录#include “reg51.h”#include “reg51.h”#include “”#include “”char code dispdata char code dispdata =0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F; /*0x6F; /*数字数字数字数字0-90-9对应的段选码对应的段选码对应的段选码对应的段选码*/ */char dis_data4;char dis_data4;void delay(void)void delay(void)/* /*延时延时延时延时1ms*/1ms*/ TH0=-500/256;TH0=-500/256;TL0=-500%256;TL0=-500%256;TR0=1;TR0=1;while(!TF0);while(!TF0);TF0=0;TF0=0;TR0=0;TR0=0; 5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计8/30/2024128张兴忠制作:返回目录void disp(char ch1)void disp(char ch1)/* /*显示函数显示函数显示函数显示函数*/ */static char ch=0x01;static char ch=0x01; P2=ch; P2=ch; P1=dis_datach1; P1=dis_datach1; ch=ch1; ch=ch1; if(ch= =0x10) ch=0x01; if(ch= =0x10) ch=0x01; main( )main( )char ch1;char ch1; TMOD=0x01; /*T0 TMOD=0x01; /*T0为为为为1616位定时工作方式位定时工作方式位定时工作方式位定时工作方式*/ */ while(1) while(1) for(ch1=0; ch14; ch1+) /* for(ch1=0; ch14; ch1+) /*对四位对四位对四位对四位LEDLED扫描一遍扫描一遍扫描一遍扫描一遍*/ */disp(ch1);disp(ch1); delay( ); delay( ); delay( ); delay( ); delay( ); delay( ); 5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计8/30/2024129张兴忠制作:返回目录例例5-265-26 如图如图5-105-10所示为扩展所示为扩展A/DA/D转换电路。对转换电路。对8 8个通道个通道轮流采集一次,采集的结果放在数组轮流采集一次,采集的结果放在数组adad中。中。5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计8/30/2024130张兴忠制作:返回目录#include “reg51.h”#include “reg51.h”#include “”#include “”sbit ad_busy=P32;sbit ad_busy=P32;main( )main( )static char idata ad8;static char idata ad8; char i; char i; char pdata *ad_ch; char pdata *ad_ch;5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计8/30/2024131张兴忠制作:返回目录 ad_ch=0x78;ad_ch=0x78; /* /*设置初始通道地址设置初始通道地址设置初始通道地址设置初始通道地址*/ */ for(i=0; i8; i+) for(i=0; i8; i+)*ad_ch=0; /*ad_ch=0; /*启动启动启动启动A/DA/D转换转换转换转换*/ */ i=i; /* i=i; /*延时等待延时等待延时等待延时等待EOCEOC信号变低信号变低信号变低信号变低*/ */ while(ad_busy= =1); while(ad_busy= =1);/* /*查询查询查询查询*/ */ adi=*ad_ch; adi=*ad_ch;/* /*存放结果存放结果存放结果存放结果*/ */ ad_ch+; ad_ch+; 5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计8/30/2024132张兴忠制作:返回目录例例例例5-5-27275.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计 如图所示为扩展如图所示为扩展如图所示为扩展如图所示为扩展D/AD/A转换电路。要求转换电路。要求转换电路。要求转换电路。要求DAC0832DAC0832输输输输出锯齿波电压信号,信号周期自由。程序如下:出锯齿波电压信号,信号周期自由。程序如下:出锯齿波电压信号,信号周期自由。程序如下:出锯齿波电压信号,信号周期自由。程序如下:8/30/2024133张兴忠制作:返回目录例例例例5-5-2727 #include “reg51.h”#include “reg51.h”#include “”#include “”#define DA0832 PBYTE0x7f#define DA0832 PBYTE0x7fmain( )main( )char ichar i; do do for(i=0; i255; i+) for(i=0; i255; i+) DAC0832=i; DAC0832=i; while(1); while(1); 5.6.1 5.6.1 单片机内单片机内单片机内单片机内/ /外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计外部资源应用程序设计8/30/2024134张兴忠制作:返回目录5.6.2 C515.6.2 C51语言和语言和语言和语言和MCS-51MCS-51汇编语言混合编程汇编语言混合编程汇编语言混合编程汇编语言混合编程 下下面面简简单单介介绍绍汇汇编编语语言言与与高高级级语语言言的的混混合合编编程程。C51高高级级语语言言一一般般用用来来编编写写主主程程序序和和运运算算程程序序比比较较方方便便,用用汇汇编编语语言言编编写与硬件有关的子程序更直接而速度快。写与硬件有关的子程序更直接而速度快。 在在混混合合编编程程中中,关关键键是是传传递递参参数数和和函函数的返回值。它们必须有完整的约定。数的返回值。它们必须有完整的约定。8/30/2024135张兴忠制作:返回目录C51C51C51C51程序调用汇编语言程序要注意以下几点程序调用汇编语言程序要注意以下几点程序调用汇编语言程序要注意以下几点程序调用汇编语言程序要注意以下几点1) 1) 被调函数要在主函数中说明,在汇编程序中,要使用伪指被调函数要在主函数中说明,在汇编程序中,要使用伪指被调函数要在主函数中说明,在汇编程序中,要使用伪指被调函数要在主函数中说明,在汇编程序中,要使用伪指令使令使令使令使CODECODE选项有效并声明为可再定位段类型,并且根据选项有效并声明为可再定位段类型,并且根据选项有效并声明为可再定位段类型,并且根据选项有效并声明为可再定位段类型,并且根据不同情况对函数名作转换,见表不同情况对函数名作转换,见表不同情况对函数名作转换,见表不同情况对函数名作转换,见表5-65-6所示。所示。所示。所示。5.6.2 C515.6.2 C51语言和语言和语言和语言和MCS-51MCS-51汇编语言混合编程汇编语言混合编程汇编语言混合编程汇编语言混合编程8/30/2024136张兴忠制作:返回目录2) 2) 对为其他模块使用的符号进行对为其他模块使用的符号进行对为其他模块使用的符号进行对为其他模块使用的符号进行PUBLICPUBLIC声明,对外来符声明,对外来符声明,对外来符声明,对外来符号进行号进行号进行号进行EXTRNEXTRN声明。声明。声明。声明。3) 3) 参数的传递。在混合语言编程中,关键是入口参数和出参数的传递。在混合语言编程中,关键是入口参数和出参数的传递。在混合语言编程中,关键是入口参数和出参数的传递。在混合语言编程中,关键是入口参数和出口参数的传递,口参数的传递,口参数的传递,口参数的传递,C51C51编译器可使用寄存器传递参数,也编译器可使用寄存器传递参数,也编译器可使用寄存器传递参数,也编译器可使用寄存器传递参数,也可以使用固定存储器或使用堆栈,由于可以使用固定存储器或使用堆栈,由于可以使用固定存储器或使用堆栈,由于可以使用固定存储器或使用堆栈,由于MCS-51MCS-51的堆栈的堆栈的堆栈的堆栈深度有限,因此多用寄存器或存储器传递。用寄存器传深度有限,因此多用寄存器或存储器传递。用寄存器传深度有限,因此多用寄存器或存储器传递。用寄存器传深度有限,因此多用寄存器或存储器传递。用寄存器传递最多只能传递三个参数,需选择固定的寄存器,见表递最多只能传递三个参数,需选择固定的寄存器,见表递最多只能传递三个参数,需选择固定的寄存器,见表递最多只能传递三个参数,需选择固定的寄存器,见表5-75-7所示。所示。所示。所示。 5.6.2 C515.6.2 C51语言和语言和语言和语言和MCS-51MCS-51汇编语言混合编程汇编语言混合编程汇编语言混合编程汇编语言混合编程8/30/2024137张兴忠制作:返回目录例例例例如如如如:func1(int func1(int a)a),“a”“a”是是是是第第第第一一一一个个个个参参参参数数数数,在在在在R6R6、R7R7传传传传递递递递,func2(int func2(int b, b, int int c, c, int int *d)*d),“b”“b”在在在在R6R6,R7R7中中中中传传传传递递递递,“c”“c”在在在在R4R4,R5R5中中中中传传传传递递递递,“d”“d”在在在在R1R1,R2R2,R3R3中中中中传传传传递递递递。如如如如果果果果传传传传递递递递参参参参数数数数寄存器不够用,可以使用存储器传送,通过指针取得参数。寄存器不够用,可以使用存储器传送,通过指针取得参数。寄存器不够用,可以使用存储器传送,通过指针取得参数。寄存器不够用,可以使用存储器传送,通过指针取得参数。汇汇汇汇编编编编语语语语言言言言通通通通过过过过寄寄寄寄存存存存器器器器或或或或存存存存储储储储器器器器传传传传递递递递参参参参数数数数给给给给C51C51程程程程序序序序。通通通通过过过过寄存器传递返回值给寄存器传递返回值给寄存器传递返回值给寄存器传递返回值给C51C51程序,返回值使用寄存器见表程序,返回值使用寄存器见表程序,返回值使用寄存器见表程序,返回值使用寄存器见表5-85-8所示。所示。所示。所示。5.6.2 C515.6.2 C51语言和语言和语言和语言和MCS-51MCS-51汇编语言混合编程汇编语言混合编程汇编语言混合编程汇编语言混合编程8/30/2024138张兴忠制作:返回目录例例例例5-28 5-28 用用用用口口口口产产产产生生生生周周周周期期期期为为为为4ms4ms的的的的方方方方波波波波信信信信号号号号,同同同同时时时时用用用用口口口口产产产产生生生生周周周周期期期期为为为为8ms8ms的的的的方方方方波波波波信信信信号号号号。分分分分别别别别用用用用汇汇汇汇编编编编语语语语言言言言和和和和C C语语语语言言言言设设设设计计计计三三三三个模块程序如下:个模块程序如下:个模块程序如下:个模块程序如下:模模模模块块块块一一一一:用用用用C C语语语语言言言言编编编编写写写写主主主主程程程程序序序序,使使使使产产产产生生生生周周周周期期期期为为为为8ms8ms的的的的方方方方波;波;波;波;模块二:用模块二:用模块二:用模块二:用C C语言编程,使产生周期为语言编程,使产生周期为语言编程,使产生周期为语言编程,使产生周期为4ms4ms的方波;的方波;的方波;的方波;模块三:用汇编语言编写延时模块三:用汇编语言编写延时模块三:用汇编语言编写延时模块三:用汇编语言编写延时1ms1ms程序。程序。程序。程序。 程程程程序序序序的的的的执执执执行行行行过过过过程程程程是是是是:模模模模块块块块一一一一调调调调用用用用模模模模块块块块二二二二获获获获得得得得8ms8ms方方方方波波波波,模模模模块块块块二二二二调调调调模模模模块块块块三三三三,向向向向汇汇汇汇编编编编程程程程序序序序传传传传递递递递字字字字符符符符型型型型参参参参数数数数(x=2x=2),实现实现实现实现2ms2ms延时。延时。延时。延时。5.6.2 C515.6.2 C51语言和语言和语言和语言和MCS-51MCS-51汇编语言混合编程汇编语言混合编程汇编语言混合编程汇编语言混合编程8/30/2024139张兴忠制作:返回目录#include#include#define uchar unsigned char#define uchar unsigned charsbit P1_1=P11;sbit P1_1=P11;void void delay_4ms(void); delay_4ms(void); /* /*声声声声明明明明延延延延时时时时4ms4ms函函函函数数数数(模模模模块块块块二二二二)*/ */main( )main( )uchar i;uchar i; for(; ; ) for(; ; ) P1_1=0; P1_1=0; delay_4ms( ); delay_4ms( ); /* /*调模块二延时调模块二延时调模块二延时调模块二延时4ms*/4ms*/ P1_1=1; /* P1_1=1; /*产生产生产生产生8ms8ms方波方波方波方波*/ */ delay_4ms( ); /* delay_4ms( ); /*调模块二延时调模块二延时调模块二延时调模块二延时4ms*/4ms*/ 5.6.2 C515.6.2 C51语言和语言和语言和语言和MCS-51MCS-51汇编语言混合编程汇编语言混合编程汇编语言混合编程汇编语言混合编程(1 1 1 1)模块一程序设计(产生周期为)模块一程序设计(产生周期为)模块一程序设计(产生周期为)模块一程序设计(产生周期为8ms8ms8ms8ms的方波)的方波)的方波)的方波)8/30/2024140张兴忠制作:返回目录(2 2 2 2)模块二程序设计()模块二程序设计()模块二程序设计()模块二程序设计(delay_4msdelay_4msdelay_4msdelay_4ms:使产生周期为:使产生周期为:使产生周期为:使产生周期为4ms4ms4ms4ms的方波)的方波)的方波)的方波)#include#include#define uchar unsigned char#define uchar unsigned charsbit P1_0=P10;sbit P1_0=P10;delay_1ms(uchar x);delay_1ms(uchar x);/* /*声明延时声明延时声明延时声明延时1ms1ms函数(模块三)函数(模块三)函数(模块三)函数(模块三)*/ */void delay_4ms(void)void delay_4ms(void)P1_0=0;P1_0=0; delay_1ms(2); /* delay_1ms(2); /*调汇编函数(模块三)调汇编函数(模块三)调汇编函数(模块三)调汇编函数(模块三)*/ */ P1_0=1; P1_0=1; delay_1ms(2); /* delay_1ms(2); /*调汇编函数(模块三)调汇编函数(模块三)调汇编函数(模块三)调汇编函数(模块三)*/ */ 5.6.2 C515.6.2 C51语言和语言和语言和语言和MCS-51MCS-51汇编语言混合编程汇编语言混合编程汇编语言混合编程汇编语言混合编程8/30/2024141张兴忠制作:返回目录(3 3 3 3)模块三程序设计(汇编语言编写延时)模块三程序设计(汇编语言编写延时)模块三程序设计(汇编语言编写延时)模块三程序设计(汇编语言编写延时1ms1ms1ms1ms程序程序程序程序delay_1msdelay_1msdelay_1msdelay_1ms) PUBLIC PUBLIC _DELAY_1MS _DELAY_1MS ; ; DELAY_1MSDELAY_1MS为为为为其其其其他他他他模模模模块块块块调调调调用用用用 DE SEGMENT CODE ; DE SEGMENT CODE ;定义定义定义定义DEDE段为再定位程序段段为再定位程序段段为再定位程序段段为再定位程序段 RSEG DE RSEG DE ; ;选择选择选择选择DEDE为当前段为当前段为当前段为当前段_DELAY_1MS: NOP_DELAY_1MS: NOP DELA: MOV R1, #0F8H DELA: MOV R1, #0F8H ; ;延时延时延时延时 LOP1: NOP LOP1: NOP NOP NOP DJNZ R1, LOP1 DJNZ R1, LOP1 DJNZ DJNZ R7, R7, DELA DELA ;R7;R7为为为为C C程程程程序序序序传传传传递递递递过过过过来来来来的的的的参参参参数数数数 (x=2x=2) EXIT: RET EXIT: RET END END5.6.2 C515.6.2 C51语言和语言和语言和语言和MCS-51MCS-51汇编语言混合编程汇编语言混合编程汇编语言混合编程汇编语言混合编程8/30/2024142张兴忠制作:返回目录程序调试步骤:程序调试步骤:程序调试步骤:程序调试步骤: 以以以以上上上上各各各各模模模模块块块块可可可可以以以以先先先先分分分分别别别别汇汇汇汇编编编编和和和和编编编编译译译译,生生生生成成成成的的的的.OBJ.OBJ文文文文件件件件,然然然然后后后后运运运运行行行行连连连连接接接接将将将将各各各各OBJOBJ文文文文件件件件连连连连接接接接,生生生生成成成成一一一一个个个个新新新新的的的的文文文文件件件件。在在在在集集集集成成成成环环环环境境境境下下下下的的的的连连连连接接接接调调调调试试试试可可可可以以以以连连连连续续续续进进进进行行行行。使使使使用用用用KEIL KEIL C51C51仿仿仿仿真软件进行编译连接的步骤如下:真软件进行编译连接的步骤如下:真软件进行编译连接的步骤如下:真软件进行编译连接的步骤如下:1) 1) 编辑各个模块程序后保存。编辑各个模块程序后保存。编辑各个模块程序后保存。编辑各个模块程序后保存。2) 2) 点击文件点击文件点击文件点击文件/ /新建项目,弹出项目窗口。新建项目,弹出项目窗口。新建项目,弹出项目窗口。新建项目,弹出项目窗口。3) 3) 点点点点击击击击项项项项目目目目菜菜菜菜单单单单,选选选选加加加加入入入入模模模模块块块块,此此此此时时时时弹弹弹弹出出出出有有有有文文文文件件件件目目目目录录录录的的的的对对对对话话话话框框框框,选选选选中中中中要要要要加加加加入入入入刚刚刚刚才才才才编编编编辑辑辑辑好好好好的的的的文文文文件件件件(模模模模块块块块)并并并并打打打打开开开开。此此此此时时时时在项目窗口中可以看到加入的模块文件。在项目窗口中可以看到加入的模块文件。在项目窗口中可以看到加入的模块文件。在项目窗口中可以看到加入的模块文件。5.6.2 C515.6.2 C51语言和语言和语言和语言和MCS-51MCS-51汇编语言混合编程汇编语言混合编程汇编语言混合编程汇编语言混合编程8/30/2024143张兴忠制作:返回目录4) 4) 点点点点击击击击项项项项目目目目菜菜菜菜单单单单中中中中的的的的全全全全部部部部编编编编译译译译,并并并并取取取取名名名名保保保保存存存存项项项项目目目目。于于于于是是是是系统对加入的各模块进行编译,并进行连接。系统对加入的各模块进行编译,并进行连接。系统对加入的各模块进行编译,并进行连接。系统对加入的各模块进行编译,并进行连接。5) 5) 编编编编译译译译连连连连接接接接完完完完成成成成后后后后会会会会弹弹弹弹出出出出信信信信息息息息窗窗窗窗口口口口,如如如如编编编编译译译译连连连连接接接接有有有有错错错错,信息窗口将出现错误信息。信息窗口将出现错误信息。信息窗口将出现错误信息。信息窗口将出现错误信息。6) 6) 模模模模块块块块连连连连接接接接成成成成功功功功后后后后生生生生成成成成二二二二进进进进制制制制文文文文件件件件(.BIN.BIN)和和和和十十十十六六六六进进进进制制制制文件(文件(文件(文件(.HEX.HEX)。)。)。)。7) 7) 点点点点击击击击跟跟跟跟踪踪踪踪或或或或单单单单步步步步按按按按钮钮钮钮,就就就就可可可可对对对对程程程程序序序序进进进进行行行行跟跟跟跟踪踪踪踪调调调调试试试试,程程程程序序序序运运运运行行行行到到到到不不不不同同同同模模模模块块块块时时时时,wavewave就就就就会会会会弹弹弹弹出出出出相相相相应应应应的的的的模模模模块块块块源源源源程程程程序窗口,显示程序运行情况。序窗口,显示程序运行情况。序窗口,显示程序运行情况。序窗口,显示程序运行情况。5.6.2 C515.6.2 C51语言和语言和语言和语言和MCS-51MCS-51汇编语言混合编程汇编语言混合编程汇编语言混合编程汇编语言混合编程8/30/2024144张兴忠制作:返回目录5.6.3 5.6.3 编程优化的概念编程优化的概念编程优化的概念编程优化的概念 本本本本章章章章介介介介绍绍绍绍了了了了C51C51的的的的基基基基本本本本数数数数据据据据类类类类型型型型、存存存存储储储储类类类类型型型型及及及及C51C51对对对对单单单单片片片片机机机机内内内内部部部部部部部部件件件件的的的的定定定定义义义义,并并并并简简简简介介介介了了了了C C语语语语言言言言基基基基础础础础知知知知识识识识和和和和各各各各种种种种结结结结构构构构的的的的程程程程序序序序设设设设计计计计,介介介介绍绍绍绍了了了了利利利利用用用用C C语语语语言言言言编编编编制制制制单单单单片片片片机机机机应应应应用用用用程程程程序序序序的的的的方方方方法法法法。高高高高效效效效率率率率的的的的程程程程序序序序应应应应该该该该是是是是占占占占用用用用存存存存储储储储空空空空间间间间少少少少、运运运运行行行行时时时时间间间间短短短短、编编编编程程程程省省省省力力力力省省省省时时时时。如如如如何何何何编编编编写写写写高高高高效效效效的的的的单单单单片片片片机机机机C51C51程程程程序序序序,通通通通常常常常应注意以下问题。应注意以下问题。应注意以下问题。应注意以下问题。8/30/2024145张兴忠制作:返回目录5.6.3 5.6.3 编程优化的概念编程优化的概念编程优化的概念编程优化的概念1选择小存储模式选择小存储模式2尽可能使用最小数据类型尽可能使用最小数据类型3尽尽量量使使用用“unsigned”数数据据类类型型4尽量使用局部变量尽量使用局部变量5选择效率高的编译器选择效率高的编译器8/30/2024146张兴忠制作:返回目录习题与思考题习题与思考题习题与思考题习题与思考题5-15-1 写出一个写出一个写出一个写出一个C51C51程序的结构。程序的结构。程序的结构。程序的结构。5-2 5-2 哪些变量类型是哪些变量类型是哪些变量类型是哪些变量类型是MCS-51MCS-51单片机直接支持的?单片机直接支持的?单片机直接支持的?单片机直接支持的?5-35-3 如何定义内部如何定义内部如何定义内部如何定义内部RAMRAM的可位寻址区的字符变量?的可位寻址区的字符变量?的可位寻址区的字符变量?的可位寻址区的字符变量?5-4 5-4 试编写一段程序,将内部数据存储器试编写一段程序,将内部数据存储器试编写一段程序,将内部数据存储器试编写一段程序,将内部数据存储器30H30H、3lH3lH单单单单元内容传送到外部数据存储器元内容传送到外部数据存储器元内容传送到外部数据存储器元内容传送到外部数据存储器1000H1000H、1001H1001H单元单元单元单元中去。中去。中去。中去。5-5 5-5 试编写一段程序,将外部数据存储器试编写一段程序,将外部数据存储器试编写一段程序,将外部数据存储器试编写一段程序,将外部数据存储器40H40H单元中单元中单元中单元中的内容传送到的内容传送到的内容传送到的内容传送到50H50H单元。单元。单元。单元。5-65-6 试编写试编写试编写试编写段程序,将段程序,将段程序,将段程序,将R3R3中的数乘以中的数乘以中的数乘以中的数乘以4 4。-第第5章章 MCS-51单片机单片机C51程序设计程序设计8/30/2024147张兴忠制作:返回目录5-75-7 试编写试编写试编写试编写段程序,将段程序,将段程序,将段程序,将R2R2中的各位倒序排列后送入中的各位倒序排列后送入中的各位倒序排列后送入中的各位倒序排列后送入R3R3中。中。中。中。5-85-8 试编写试编写试编写试编写段程序,将段程序,将段程序,将段程序,将P1P1口的高口的高口的高口的高5 5位置位,低位置位,低位置位,低位置位,低3 3位不变。位不变。位不变。位不变。5-9 5-9 设设设设8 8次次次次采采采采样样样样值值值值依依依依次次次次存存存存放放放放在在在在20H27H20H27H的的的的连连连连续续续续单单单单元元元元中中中中,采采采采用用用用算算算算术术术术平平平平均均均均值值值值滤滤滤滤波波波波法法法法求求求求采采采采样样样样平平平平均均均均值值值值,结结结结果果果果保保保保留留留留在在在在30H30H单单单单元元元元中。试编写程序。中。试编写程序。中。试编写程序。中。试编写程序。5-10 5-10 从从从从20H20H单单单单元元元元开开开开始始始始有有有有一一一一无无无无符符符符号号号号数数数数据据据据块块块块,其其其其长长长长度度度度在在在在20H20H单单单单元元元元中。编写程序找出数据块中最小值,并存入中。编写程序找出数据块中最小值,并存入中。编写程序找出数据块中最小值,并存入中。编写程序找出数据块中最小值,并存入21H21H单元。单元。单元。单元。5-11 5-11 混合编程应注意的问题是什么?混合编程应注意的问题是什么?混合编程应注意的问题是什么?混合编程应注意的问题是什么?5-125-12 如何编写高效的单片机如何编写高效的单片机如何编写高效的单片机如何编写高效的单片机C51C51程序?程序?程序?程序?习题与思考题习题与思考题习题与思考题习题与思考题-第第5章章 MCS-51单片机单片机C51程序设计程序设计8/30/2024148
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号