《第3章-单片机C51语言基础与开发平台.ppt》由会员分享,可在线阅读,更多相关《第3章-单片机C51语言基础与开发平台.ppt(70页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第3 3章章 单片机单片机C51C51语言基础与开发平台语言基础与开发平台 3.1 3.1 单片机单片机C51C51语言基础语言基础 3.2 Keil 3.2 Keil Vision5Vision5集成开发环境集成开发环境 3.3 STC89C52RC3.3 STC89C52RC系列单片机的系列单片机的ISPISP编程编程 所谓所谓寻址方式寻址方式,就是,就是CPUCPU执行一条指令时如何找执行一条指令时如何找到该指令操作数的方式。操作数总是存放在某一存储到该指令操作数的方式。操作数总是存放在某一存储单元中,寻找操作数最重要的就是找操作数所在的单单元中,寻找操作数最重要的就是找操作数所在的单
2、元地址,所以称之为寻址方式。元地址,所以称之为寻址方式。指令通常由操作码和操作数组成,操作数部分给指令通常由操作码和操作数组成,操作数部分给出的只是操作数的寻址方式。所以寻址方式是指令组出的只是操作数的寻址方式。所以寻址方式是指令组成的重要内容,理解寻址方式对于指令系统的学习及成的重要内容,理解寻址方式对于指令系统的学习及程序编制非常重要。程序编制非常重要。计算机寻址方式的种类是由它的硬件结构决定的,计算机寻址方式的种类是由它的硬件结构决定的,寻址方式越多、越灵活,指令系统将越有效,用户编寻址方式越多、越灵活,指令系统将越有效,用户编程越方便,计算机可处理的功能就越强。程越方便,计算机可处理的
3、功能就越强。补充内容:寻址方式补充内容:寻址方式 立即寻址立即寻址 操作数直接出现在指令中,紧跟在操作码的后面,操作数直接出现在指令中,紧跟在操作码的后面,作为指令的一部分与操作码一起存放在程序存储器中,作为指令的一部分与操作码一起存放在程序存储器中,可以立即得到操作数并执行,故称为立即寻址。汇编可以立即得到操作数并执行,故称为立即寻址。汇编指令中,在一个数的前面冠以指令中,在一个数的前面冠以“#”符号作前缀,就符号作前缀,就表示该数为立即寻址。也称为表示该数为立即寻址。也称为立即数寻址立即数寻址。例如:例如:MOV AMOV A,#30H#30H指令中指令中“30H30H”就是立即数。就是立
4、即数。这一条指令的功能是执行将立即数这一条指令的功能是执行将立即数“30H30H”传送到累传送到累加器加器A A中的操作。该指令操作码的机器代码为中的操作。该指令操作码的机器代码为74H74H,占,占用一个字节存储单元,立即数用一个字节存储单元,立即数30H30H存放在紧跟在其后存放在紧跟在其后的一个字节存储单元,成为指令代码的一部分。整条的一个字节存储单元,成为指令代码的一部分。整条指令的机器码为指令的机器码为74H 30H74H 30H。补充内容:寻址方式补充内容:寻址方式 寄存器寻址寄存器寻址 在指令选定的某寄存器中存放或读取操作数,以在指令选定的某寄存器中存放或读取操作数,以完成指令规
5、定的操作,称为寄存器寻址。完成指令规定的操作,称为寄存器寻址。例如:例如:MOV AMOV A,R0R0指令中源操作数和目的操作数指令中源操作数和目的操作数都是寄存器寻址。该指令的功能是把工作寄存器都是寄存器寻址。该指令的功能是把工作寄存器R0R0中中的内容传送到累加器的内容传送到累加器A A中,如中,如R0R0中的内容为中的内容为20H20H,则执,则执行该指令后行该指令后A A的内容也为的内容也为20H20H。寄存器寻址按所选定的工作寄存器寄存器寻址按所选定的工作寄存器R0R0R7R7进行操进行操作,指令机器码的低作,指令机器码的低3 3位用于指示所用的工作寄存器位用于指示所用的工作寄存器
6、R0R0R7R7。如:。如:MOV AMOV A,Rn(n=0Rn(n=07)7),这,这8 8条指令对应的条指令对应的机器码分别为机器码分别为E8HE8HEFHEFH。补充内容:寻址方式补充内容:寻址方式寄存器间接寻址寄存器间接寻址由某寄存器内容作为操作数地址的寻址方法称为由某寄存器内容作为操作数地址的寻址方法称为寄存器间接寻址。需要强调的是:寄存器中的内容不寄存器间接寻址。需要强调的是:寄存器中的内容不是操作数本身,而是操作数的地址,到该地址中才能是操作数本身,而是操作数的地址,到该地址中才能得到操作数。寄存器在此起得到操作数。寄存器在此起地址指针地址指针的作用。的作用。例如:例如:MOV
7、A,R0指令的源操作数是寄存器指令的源操作数是寄存器间接寻址。该指令的功能是将以工作寄存器间接寻址。该指令的功能是将以工作寄存器R0中的内中的内容为地址的片内容为地址的片内RAM单元的数据传送到累加器单元的数据传送到累加器A中去。中去。例如:若例如:若R0中的内容为中的内容为78H,片内,片内RAM地址为地址为78H的的单元中的内容为单元中的内容为2FH,则执行该指令后,片内,则执行该指令后,片内RAM78H单元的内容单元的内容2FH将被送到累加器将被送到累加器A中。符号中。符号“”可理解为可理解为取地址取地址。补充内容:寻址方式补充内容:寻址方式 寄存器间接寻址寄存器间接寻址 寄存器间接寻址
8、示例如下:寄存器间接寻址示例如下:可用作寄存器间接寻址的寄存器只有可用作寄存器间接寻址的寄存器只有R0R0、R1R1和和DPTRDPTR。用。用R0R0、R1R1作地址指针时,可寻址片内或片外作地址指针时,可寻址片内或片外RAMRAM的的256256个单元,但不能访问个单元,但不能访问SFRSFR;DPTRDPTR作地址指针作地址指针时,可访问片外时,可访问片外RAMRAM的的64KB64KB地址范围。地址范围。补充内容:寻址方式补充内容:寻址方式 直接寻址直接寻址 在指令中直接给出操作数所在存储器地址的寻址在指令中直接给出操作数所在存储器地址的寻址方式称为直接寻址方式。方式称为直接寻址方式。
9、例如:例如:MOV AMOV A,40H40H指令中的源操作数就是直接寻指令中的源操作数就是直接寻址,址,40H40H为操作数的地址。该指令的功能是把片内为操作数的地址。该指令的功能是把片内RAMRAM地址为地址为40H40H单元的内容送到单元的内容送到A A中。该指令的机器码为中。该指令的机器码为E5H 40HE5H 40H,8 8位直接地址在指令操作码中占一个字节。位直接地址在指令操作码中占一个字节。MCS-51MCS-51系列单片机的直接寻址可用于访问片内、系列单片机的直接寻址可用于访问片内、片外数据存储器,也可用于访问程序存储器。片外数据存储器,也可用于访问程序存储器。补充内容:寻址方
10、式补充内容:寻址方式 直接寻址直接寻址 直接寻址可访问片内直接寻址可访问片内RAMRAM的低的低128128个单元,同时也个单元,同时也是访问片内是访问片内RAMRAM高高128128个单元特殊功能寄存器个单元特殊功能寄存器SFRSFR的唯的唯一方法。由于一方法。由于5252子系列的片内子系列的片内RAMRAM有有256256个单元,其高个单元,其高128128个单元与个单元与SFRSFR的地址是重叠的。为了避免混乱,的地址是重叠的。为了避免混乱,5151单片机规定:单片机规定:直接寻址的指令不能访问片内直接寻址的指令不能访问片内RAMRAM的高的高128128个单元个单元(80H(80HFF
11、H)FFH),若要访问这些单元只能用寄,若要访问这些单元只能用寄存器间接寻址指令,而要访问存器间接寻址指令,而要访问SFRSFR只能用直接寻址指只能用直接寻址指令。另外,访问令。另外,访问SFRSFR可在指令中直接使用该寄存器的可在指令中直接使用该寄存器的名字来代替地址,如名字来代替地址,如MOV AMOV A,80H80H,可以写成,可以写成MOV AMOV A,P0P0,因为,因为P0P0口的地址为口的地址为80H80H。补充内容:寻址方式补充内容:寻址方式 直接寻址直接寻址 直接寻址方式在直接寻址方式在访问程序存储器访问程序存储器时的转移、调用时的转移、调用指令中将直接给出程序存储器的地
12、址,执行这些指令指令中将直接给出程序存储器的地址,执行这些指令后,程序计数器后,程序计数器PCPC的内容将更换为指令直接给出的地的内容将更换为指令直接给出的地址,机器将改为访问以所给地址为起始地址的存储区址,机器将改为访问以所给地址为起始地址的存储区间,取指令间,取指令(或取数或取数),并依次执行。,并依次执行。补充内容:寻址方式补充内容:寻址方式 变址寻址变址寻址 由基址寄存器加上变址寄存器的间接寻址方式称由基址寄存器加上变址寄存器的间接寻址方式称为基址变址寻址,简称变址寻址。它是以数据指针寄为基址变址寻址,简称变址寻址。它是以数据指针寄存器存器DPTRDPTR或者或者PCPC作为基址寄存器
13、,累加器作为基址寄存器,累加器A A作为变址作为变址寄存器,两者内容相加后的和作为程序存储器的地址,寄存器,两者内容相加后的和作为程序存储器的地址,再寻址该单元,读取数据。这种寻址方式常用于访问再寻址该单元,读取数据。这种寻址方式常用于访问程序存储器中的常数表。程序存储器中的常数表。例如:例如:MOVCA,A+DPTRMOVCA,A+PC补充内容:寻址方式补充内容:寻址方式 变址寻址变址寻址 变址寻址方式的示例如下:变址寻址方式的示例如下:补充内容:寻址方式补充内容:寻址方式 相对寻址相对寻址 相对寻址是以相对寻址是以当前程序计数器当前程序计数器PCPC值值加上指令中给加上指令中给出的偏移量出
14、的偏移量relrel,构成实际操作数地址的寻址方法。,构成实际操作数地址的寻址方法。它用于访问程序存储器,常出现在相对转移指令中。它用于访问程序存储器,常出现在相对转移指令中。在使用相对寻址时要注意以下两点:在使用相对寻址时要注意以下两点:(1)(1)当前当前PCPC值是指相对转移指令的存储地址加上该值是指相对转移指令的存储地址加上该指令的字节数。例如:指令的字节数。例如:JZ relJZ rel是一条累加器是一条累加器A A为零就为零就转移的双字节指令。若该指令的存储地址为转移的双字节指令。若该指令的存储地址为2050H2050H,则执行该指令时的当前则执行该指令时的当前PCPC值即为值即为
15、2052H2052H。即当前。即当前PCPC值值是对相对转移指令取指结束时的值。是对相对转移指令取指结束时的值。补充内容:寻址方式补充内容:寻址方式 相对寻址相对寻址 (2)(2)偏移量偏移量relrel是有符号的单字节数,以补码形式是有符号的单字节数,以补码形式表示,取值的范围是表示,取值的范围是-128-128127(00H127(00HFFH)FFH),负数表,负数表示从当前地址向前转移,正数表示从当前地址向后转示从当前地址向前转移,正数表示从当前地址向后转移。所以,相对转移指令满足条件后,转移的目的地移。所以,相对转移指令满足条件后,转移的目的地址为:址为:目的地址目的地址 =当前当前
16、PCPC值值 +rel+rel =当前指令存储地址当前指令存储地址 +指令字节数指令字节数 +rel+rel补充内容:寻址方式补充内容:寻址方式 位寻址位寻址 位寻址是在位操作指令中直接给出位操作数的地位寻址是在位操作指令中直接给出位操作数的地址,可以对片内址,可以对片内RAMRAM中的中的128128位和特殊功能寄存器位和特殊功能寄存器SFRSFR中的中的9393位进行寻址。位进行寻址。位寻址可认为是位寻址可认为是位类型数据的直接寻址位类型数据的直接寻址。例如:例如:MOV CMOV C,30H30H补充内容:寻址方式补充内容:寻址方式 数据类型数据类型 该类指令的功能是实现数据在片内该类指
17、令的功能是实现数据在片内RAMRAM单元之间、单元之间、寄存器之间、寄存器与寄存器之间、寄存器与RAMRAM单元之间的传送。所有指单元之间的传送。所有指令具有统一的格式,其格式如下:令具有统一的格式,其格式如下:MOV目的操作数,源操作数目的操作数,源操作数指令功能:将源操作数指令功能:将源操作数(或单元或单元)的内容存入目的操作的内容存入目的操作数地址单元中。数地址单元中。操作码助记符都是操作码助记符都是“MOVMOV”,目的操作数和源操,目的操作数和源操作数不同寻址方式的组合就派生出该类的全部指令。作数不同寻址方式的组合就派生出该类的全部指令。因此,记忆这类指令的关键在于掌握两个操作数的各
18、因此,记忆这类指令的关键在于掌握两个操作数的各种寻址方式的组合关系。种寻址方式的组合关系。3.1 单片机的单片机的C51语言基础语言基础 特殊功能寄存器特殊功能寄存器 为便于记忆,一般传送指令的关系图如下:为便于记忆,一般传送指令的关系图如下:3.1 单片机的单片机的C51语言基础语言基础 存储类型存储类型 datadata区:区:3.1 单片机的单片机的C51语言基础语言基础 存储类型存储类型 bdatabdata区:区:3.1 单片机的单片机的C51语言基础语言基础 存储类型存储类型 idataidata区:区:3.1 单片机的单片机的C51语言基础语言基础 存储类型存储类型 pdatap
19、data区和区和xdataxdata区:区:3.1 单片机的单片机的C51语言基础语言基础 存储类型存储类型 CodeCode区:区:3.1 单片机的单片机的C51语言基础语言基础 存储模式存储模式 3.1 单片机的单片机的C51语言基础语言基础存储模式存储模式说说 明明SMALL默默认认的的存存储储类类型型是是data,参参数数及及局局部部变变量量放放入入可可直直接接寻寻址址片片内内RAM的的用用户户区区中中(最最大大128字字节节)。另另外外所所有有对对象象(包包括括堆堆栈栈),都都必必须须嵌嵌入入片片内内RAM。栈栈长长很很关关键键,因因为为实际栈长依赖于函数嵌套调用层数实际栈长依赖于函
20、数嵌套调用层数COMPACT默认的存储类型是默认的存储类型是pdata,参数及局部变量放入分页的外,参数及局部变量放入分页的外部数据存储区,通过部数据存储区,通过R0或或R1间接访问,栈空间位于间接访问,栈空间位于片内数据存储区中片内数据存储区中LARGE默默认认的的存存储储类类型型是是xdata,参参数数及及局局部部变变量量直直接接放放入入片片外外数数据据存存储储区区,使使用用数数据据指指针针DPTR来来进进行行寻寻址址。用用此此数数据据指指针针进进行行访访问问效效率率较较低低,尤尤其其对对两两个个或或多多个个字字节节的的变变量,这种数据类型的访问机制直接影响代码的长度量,这种数据类型的访问
21、机制直接影响代码的长度 指针指针 通用指针:通用指针:C51提供了一个提供了一个3个字节个字节的通用存储器指针,其第一个字节的通用存储器指针,其第一个字节表明指针所指的存储区空间,另外两个字节用于存储表明指针所指的存储区空间,另外两个字节用于存储16位位地址地址偏移量。对于偏移量。对于data、idata和和pdata区,只需要区,只需要8位位的偏移量。的偏移量。例如:例如:long*state;是一个指向是一个指向long型整数的指针,而型整数的指针,而state本身本身则根据则根据存储模式存储模式存放在不同的存放在不同的RAM区。区。char*xdataptr;是一个指向是一个指向char
22、型型数据的指针,而数据的指针,而ptr本身存放在外部本身存放在外部RAM区。区。3.1 单片机的单片机的C51语言基础语言基础 指针指针 通用指针:通用指针:通用存储器指针格式:通用存储器指针格式:其中,第一字节代表了指针的其中,第一字节代表了指针的存储器类型存储器类型,其编码如下:,其编码如下:3.1 单片机的单片机的C51语言基础语言基础地址地址+0+1+2内容内容存储器类型存储器类型偏移地址高位字节偏移地址高位字节偏移地址低位字节偏移地址低位字节存储器存储器类型类型idataxdatapdatadatacode值值12345 指针指针 通用指针:通用指针:通用指针指向的数据可存放于通用指
23、针指向的数据可存放于任何类型任何类型的存储器中,其产的存储器中,其产生的代码比具体指针代码的执行速度要慢,因为存储区在运行生的代码比具体指针代码的执行速度要慢,因为存储区在运行前是未知的,编译器不能优化存储区访问,必须产生可以访问前是未知的,编译器不能优化存储区访问,必须产生可以访问任何存储区的通用代码。任何存储区的通用代码。如果需要考虑执行速度,则应该尽可能使用如果需要考虑执行速度,则应该尽可能使用具体指针具体指针,而,而不是通用指针。不是通用指针。3.1 单片机的单片机的C51语言基础语言基础 指针指针 具体指针:具体指针:Keil允许使用者规定指针指向的存储段,这种指针称为具允许使用者规
24、定指针指向的存储段,这种指针称为具体指针。例如:体指针。例如:chardata*str;/str指向指向data区的区的char型数据型数据intxdata*ptr;/ptr指向指向xdata区的区的int型数据型数据 使用具体指针的好处是节省了存储空间。编译器不用为存使用具体指针的好处是节省了存储空间。编译器不用为存储器选择和决定正确的存储器操作指令产生代码,这样就使得储器选择和决定正确的存储器操作指令产生代码,这样就使得代码更加简短。但必须保证指针不指向所声明的存储区以外的代码更加简短。但必须保证指针不指向所声明的存储区以外的地方,否则会产生错误。地方,否则会产生错误。3.1 单片机的单片
25、机的C51语言基础语言基础 指针指针 具体指针:具体指针:具体指针与通用指针对照关系如下:具体指针与通用指针对照关系如下:例:例:charxdata*datapdx;指针;指针pdx位于位于data区,指向区,指向xdata区的区的char类型数据。类型数据。3.1 单片机的单片机的C51语言基础语言基础指针类型通用指针xdata指针code指针idata指针data指针pdata指针存储大小3字节2字节2字节1字节1字节1字节 指针指针例例:#includechar*generic_ptr;chardata*xd_ptr;charmystring=Testoutput;main()gener
26、ic_ptr=mystring;while(*generic_ptr)XBYTE0 x0000=*generic_ptr;generic_ptr+;xd_ptr=mystring;while(*xd_ptr)XBYTE0 x0000=*xd_ptr;xd_ptr+;3.1 单片机的单片机的C51语言基础语言基础 绝对地址访问绝对地址访问 绝对宏:绝对宏:在程序中在程序中,用,用“#include”即可使用其中声即可使用其中声明的明的宏宏来访问绝对地址。包括:来访问绝对地址。包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE和和DWORD等,如:等,如:xv
27、al=XBYTE0 x0002;XWORD0 x0002=0 x2000;#defineDAC0832XBYTE0 xffff;DAC0832=0 x80;3.1 单片机的单片机的C51语言基础语言基础 绝对地址访问绝对地址访问 _at_at_关键字:关键字:该关键字用法较简单该关键字用法较简单,直接在数据声明后加上,直接在数据声明后加上_at_地址常地址常数即可。但需要注意以下问题:数即可。但需要注意以下问题:(1)绝对变量不能被初始化。)绝对变量不能被初始化。(2)bit型数据及变量不能用型数据及变量不能用_at_指定。例如:指定。例如:structdatstructdatidata*ne
28、xt;charcode*test;idatastructdatnum_at_0 x42;xdataintval_at_0 x8000;3.1 单片机的单片机的C51语言基础语言基础 运算符运算符 算术运算符:算术运算符:3.1 单片机的单片机的C51语言基础语言基础 运算符运算符 关系运算符:关系运算符:3.1 单片机的单片机的C51语言基础语言基础 运算符运算符 逻辑运算符:逻辑运算符:逻辑运算符的操作数为逻辑运算符的操作数为“位位”类型。类型。3.1 单片机的单片机的C51语言基础语言基础 运算符运算符 位运算符:位运算符:位运算符为位运算符为“按位按位”进行逻辑运算,其操作数可为进行逻辑
29、运算,其操作数可为“位位”类型,也可为其他类型,如类型,也可为其他类型,如“字节字节”、“字字”等。等。3.1 单片机的单片机的C51语言基础语言基础 运算符运算符 复合运算符:复合运算符:3.1 单片机的单片机的C51语言基础语言基础 C51函数函数 C51函数分为函数分为主函数、标准库函数、自定义函数主函数、标准库函数、自定义函数。主函数:主函数:Cx51语言程序中语言程序中有且只能有一个主函数有且只能有一个主函数main()。一个一个Cx51语言程序的执行总是从主函数语言程序的执行总是从主函数main()开始,主函开始,主函数可以调用其它函数,包括库函数和用户自定义函数,其它函数可以调用
30、其它函数,包括库函数和用户自定义函数,其它函数不能调用主函数。数不能调用主函数。3.1 单片机的单片机的C51语言基础语言基础 C51函数函数 C51函数分为函数分为主函数、标准库函数、自定义函数主函数、标准库函数、自定义函数。主函数:主函数:主函数的标准写法是主函数的标准写法是intmain(void)前前面面的的int是是main函函数数的的返返回回值值类类型型,用用于于向向操操作作系系统统说说明明程程序序的的退退出出状状态态。返返回回值值为为“0”代代表表正正常常退退出出,“1”代代表表异异常常。形形式式参参数数“void”用用于于说说明明主主函函数数main()没没有有输输入入参参数。
31、数。3.1 单片机的单片机的C51语言基础语言基础 C51函数函数 库函数:库函数:Cx51编译器提供了丰富的库函数,库函数是已经编写好的编译器提供了丰富的库函数,库函数是已经编写好的功能函数,可完成数学计算、输入输出等常用功能,供开发人功能函数,可完成数学计算、输入输出等常用功能,供开发人员调用,以提高编程效率。员调用,以提高编程效率。如如果果程程序序中中使使用用了了库库函函数数,则则应应该该在在程程序序的的开开头头处处使使用用#include包含语句包含语句,将所用的,将所用的库函数头文件库函数头文件包含到程序中来。包含到程序中来。如:如:#include专用寄存器专用寄存器SFR定义定义
32、#include绝对地址定义绝对地址定义3.1 单片机的单片机的C51语言基础语言基础 C51函数函数 库函数:库函数:如:如:#include动态内存分配动态内存分配#include缓冲区处理函数缓冲区处理函数#include输入输出流函数输入输出流函数#include内部函数内部函数#include字符分类函数字符分类函数3.1 单片机的单片机的C51语言基础语言基础 C51函数函数 自定义函数:自定义函数:可根据需要编写自定义功能函数,结构如下:可根据需要编写自定义功能函数,结构如下:返回值类型返回值类型函数名函数名(类型类型形参形参)数据定义;数据定义;执行语句;执行语句;返回值;返回
33、值;3.1 单片机的单片机的C51语言基础语言基础 C51函数函数 自定义函数:自定义函数:形参(形式参数)形参(形式参数)和和返回值返回值是函数与外界联系的桥梁。形是函数与外界联系的桥梁。形参是在函数调用时由外界传入函数体内的参数,形参可以没有,参是在函数调用时由外界传入函数体内的参数,形参可以没有,也可以有多个。也可以有多个。返回值返回值是函数运行完毕时返回给调用该函数语句的值。如是函数运行完毕时返回给调用该函数语句的值。如果函数没有返回值,那么应声明为果函数没有返回值,那么应声明为void类型,凡不加返回值类类型,凡不加返回值类型限定的函数,就会被编译器视为返回整型值处理。型限定的函数,
34、就会被编译器视为返回整型值处理。3.1 单片机的单片机的C51语言基础语言基础 C51函数函数 自定义函数:自定义函数:根据作用范围的不同,根据作用范围的不同,变量变量可分为可分为局部变量局部变量和和全局变量全局变量。局部变量是定义在函数局部变量是定义在函数内部内部的变量,只在该函数内部有效;的变量,只在该函数内部有效;全局变量是定义在函数全局变量是定义在函数外部外部的变量,从其定义位置开始到源文的变量,从其定义位置开始到源文件结束都有效。件结束都有效。如果全局变量和某一函数的局部变量如果全局变量和某一函数的局部变量同名同名,则在该函数内,则在该函数内部只有部只有局部变量有效局部变量有效。3.
35、1 单片机的单片机的C51语言基础语言基础 C51函数函数 自定义函数:自定义函数:例例1:右图是:右图是8051单片机的单片机的P1.0口上连接了一个口上连接了一个LED,请编程,请编程实现实现LED的周期闪烁。的周期闪烁。3.1 单片机的单片机的C51语言基础语言基础 C51函数函数#include/包含单片机定义寄存器的头文件包含单片机定义寄存器的头文件sbitled=P10;/将将led定义为定义为P1.0位位voiddelay(void)/延时函数延时函数unsignedinti;/定义无符号整数,最大取值范围定义无符号整数,最大取值范围65535for(i=0;i20000;i+)
36、;/做做20000次空循环,以进行延时。次空循环,以进行延时。intmain(void)/主函数主函数while(1)/无限循环,以使无限循环,以使LED持续闪烁。持续闪烁。led=0;/P1.0输出低电平,灯亮输出低电平,灯亮delay();/延时一段时间延时一段时间led=1;/P1.0输出高电平,灯灭输出高电平,灯灭delay();/延时一段时间延时一段时间3.1 单片机的单片机的C51语言基础语言基础 C51函数函数 自定义函数:自定义函数:例例2:下图是下图是80518051单片机的单片机的P0P0口上连接了口上连接了8 8个个LEDLED,请采用移位,请采用移位操作编写程序实现操作
37、编写程序实现LEDLED流水灯。流水灯。3.1 单片机的单片机的C51语言基础语言基础 C51函数函数#include/包含单片机定义寄存器的头文件包含单片机定义寄存器的头文件voiddelay(void)/延时函数延时函数unsignedinti;for(i=0;i7;/将将led最高位先放到最高位先放到a中的最低位中,中的最低位中,a中其它位全为中其它位全为0b=led1;/将将led左移一位,最低位补零左移一位,最低位补零led=b|a;/按位按位“或或”运算运算delay();3.1 单片机的单片机的C51语言基础语言基础 流程控制语句流程控制语句 顺序结构:顺序结构:顺序顺序结构是最
38、基本、最简单的编程结构,程序按结构是最基本、最简单的编程结构,程序按先后顺序先后顺序执行指令代码。执行指令代码。例例3:下页图中:下页图中8051单片机的单片机的P0口和口和P1口上分别连接了口上分别连接了8个不同个不同的的LED指示灯,请分别用指示灯,请分别用P0和和P1口显示加法口显示加法“125+34”和减法和减法“176-98”的运算结果。的运算结果。3.1 单片机的单片机的C51语言基础语言基础 流程控制语句流程控制语句 顺序结构:顺序结构:3.1 单片机的单片机的C51语言基础语言基础 流程控制语句流程控制语句 顺序结构:顺序结构:#includeintmain(void)unsi
39、gnedchara=125,b=34,c=176,d=98;P1=a+b;/加法运算结果送加法运算结果送P1端口,端口,P1=159=10011111BP0=c-d;/减法运算结果送减法运算结果送P0端口,端口,P0=78=01001110Bwhile(1);/循环等待,防止主程序退出后单片机跑飞循环等待,防止主程序退出后单片机跑飞3.1 单片机的单片机的C51语言基础语言基础 流程控制语句流程控制语句 选择结构:选择结构:(1)if语句。语句。if语句可根据条件判定结果决定语句是否被语句可根据条件判定结果决定语句是否被执行。执行。if语句有三种基本形式:语句有三种基本形式:if(表达式表达式
40、)语句组语句组说明:如果说明:如果“表达式表达式”为真,则执行花括号中的语句组,否则为真,则执行花括号中的语句组,否则跳过花括号执行下面的语句。跳过花括号执行下面的语句。3.1 单片机的单片机的C51语言基础语言基础 流程控制语句流程控制语句 选择结构:选择结构:(1)if语句。语句。if语句可根据条件判定结果决定语句是否被语句可根据条件判定结果决定语句是否被执行。执行。if语句有三种基本形式:语句有三种基本形式:if(表达式表达式)语句组语句组1else语句组语句组2说明:如果说明:如果“表达式表达式”真,则执行语句组真,则执行语句组1,否则执行语句组,否则执行语句组2。3.1 单片机的单片
41、机的C51语言基础语言基础 流程控制语句流程控制语句 选择结构:选择结构:(1)if语句。语句。if(表达式表达式1)语句组语句组1elseif(表达式表达式2)语句组语句组2elseif(表达式表达式3)语句组语句组3elseif(表达式表达式m)语句组语句组m else语句组语句组n3.1 单片机的单片机的C51语言基础语言基础 流程控制语句流程控制语句 选择结构:选择结构:if语句语句例例4:用:用if语句根据语句根据a/b的计算结果选择的计算结果选择P0口口8位位LED的状态。的状态。3.1 单片机的单片机的C51语言基础语言基础 流程控制语句流程控制语句 选择结构:选择结构:if语句
42、语句例例4:用:用if语句根据语句根据a/b的计算结果选择的计算结果选择P0口口8位位LED的状态。的状态。#include/包含单片机寄存器的头文件包含单片机寄存器的头文件intmain(void)unsignedchara=54,b=18;if(a/b=1)P0=0 xfe;/第一个第一个LED亮亮elseif(a/b=2)P0=0 xfd;/第二个第二个LED亮亮elseif(a/b=3)P0=0 xfb;/第三个第三个LED亮亮elseif(a/b=4)P0=0 xf7;/第四个第四个LED亮亮elseif(a/b=5)P0=0 xef;/第五个第五个LED亮亮elseif(a/b=6
43、)P0=0 xdf;/第八个第八个LED亮亮elseif(a/b=7)P0=0 xbf;/第七个第七个LED亮亮elseif(a/b=8)P0=0 x7f;/第八个第八个LED亮亮elseP0=0 xff;/缺省值,关闭所有缺省值,关闭所有LEDwhile(1);3.1 单片机的单片机的C51语言基础语言基础 流程控制语句流程控制语句 选择结构:选择结构:(2)switch/case语句。根据语句。根据表达式表达式的值决定要执行的语句的值决定要执行的语句组,常用于实现多选一功能。组,常用于实现多选一功能。switch(表达式表达式)case常量表达式常量表达式1:语句组语句组1;break;c
44、ase常量表达式常量表达式2:语句组语句组2;break;case常量表达式常量表达式m:语句组语句组m;break;default:语句组语句组n;3.1 单片机的单片机的C51语言基础语言基础 流程控制语句流程控制语句 选择结构:选择结构:switch/case语句。语句。例例5:用:用swtich语句根据语句根据a/b的计算结果实现例的计算结果实现例4的要求。的要求。#include/包含单片机寄存器的头文件包含单片机寄存器的头文件intmain(void)unsignedchara=56,b=18;switch(a/b)/使用多分支选择语句使用多分支选择语句case1:P0=0 xfe
45、;break;/第一个第一个LED亮亮case2:P0=0 xfd;break;/第二个第二个LED亮亮case3:P0=0 xfb;break;/第三个第三个LED亮亮case4:P0=0 xf7;break;/第四个第四个LED亮亮case5:P0=0 xef;break;/第五个第五个LED亮亮case6:P0=0 xdf;break;/第六个第六个LED亮亮case7:P0=0 xbf;break;/第七个第七个LED亮亮case8:P0=0 x7f;break;/第八个第八个LED亮亮default:P0=0 xff;/缺省值,关闭所有缺省值,关闭所有LED while(1);3.1
46、 单片机的单片机的C51语言基础语言基础 流程控制语句流程控制语句 循环结构:循环结构:for循环循环for循环结构用于按指定的次数循环执行一组语句,格式循环结构用于按指定的次数循环执行一组语句,格式如下:如下:for(表达式表达式1;表达式;表达式2;表达式;表达式3)语句组;语句组;说明:先执行表达式说明:先执行表达式1(常为对循环变量赋初值);然后(常为对循环变量赋初值);然后执行表达式执行表达式2,若表达式,若表达式2结果为真,则执行循环体语句,并结果为真,则执行循环体语句,并求解表达式求解表达式3循环变量更新);若表达式循环变量更新);若表达式2结果为假,则退出结果为假,则退出for
47、循环。循环。3.1 单片机的单片机的C51语言基础语言基础 流程控制语句流程控制语句 循环循环结构:结构:for循环循环例:用例:用for循环计算循环计算7的阶乘。的阶乘。#includeintmain(void)unsignedchari;unsignedints=1;for(i=1;i=7;i+)s=s*i;/计算阶乘计算阶乘while(1);3.1 单片机的单片机的C51语言基础语言基础 流程控制语句流程控制语句 循环结构:循环结构:while循环循环while循环语句根据条件表达式值的真假决定是否执行循环循环语句根据条件表达式值的真假决定是否执行循环体语句,或者终止循环。格式如下:体语
48、句,或者终止循环。格式如下:while(表达式表达式)语句组;语句组;说明:先判断表达式的值是否为真;若表达式值为真,则说明:先判断表达式的值是否为真;若表达式值为真,则执行循环体语句,然后再次对表达式的值进行判断;若表达式执行循环体语句,然后再次对表达式的值进行判断;若表达式值为假,则退出值为假,则退出while循环。循环。3.1 单片机的单片机的C51语言基础语言基础 流程控制语句流程控制语句 循环循环结构:结构:while循环循环例:用例:用while循环计算循环计算7的阶乘。的阶乘。#includeintmain(void)unsignedchari=1;unsignedints=1;
49、while(i=7)s=s*i;/计算阶乘计算阶乘i+;while(1);3.1 单片机的单片机的C51语言基础语言基础 流程控制语句流程控制语句 循环结构:循环结构:dowhile循环循环dowhile循环与循环与while循环的区别在于循环的区别在于dowhile循环先执行循环先执行花括号内的循环语句,然后判断表达式的值。若结果为真,则花括号内的循环语句,然后判断表达式的值。若结果为真,则重复执行循环体语句组,否则终止循环。格式如下:重复执行循环体语句组,否则终止循环。格式如下:do语句组;语句组;while(表达式表达式)3.1 单片机的单片机的C51语言基础语言基础 流程控制语句流程控
50、制语句 循环循环结构:结构:dowhile循环循环例:用例:用dowhile循环计算循环计算7的阶乘。的阶乘。#includeintmain(void)unsignedchari=1;unsignedints=1;dos=s*i;i+;while(i=7)while(1);3.1 单片机的单片机的C51语言基础语言基础 KeilC代码的优化技巧代码的优化技巧 采用采用短变量短变量提高代码效率的最基本的方式就是减小变量的提高代码效率的最基本的方式就是减小变量的长度长度。当使。当使用用C编程时,常习惯于对循环变量使用编程时,常习惯于对循环变量使用int类型,这对类型,这对8位的单位的单片机来说是一