1、4.1 C51特点及程序结构特点及程序结构 4.2 C51的数据类型及运算符的数据类型及运算符4.3 C51程序设计基础程序设计基础教学目的和要求教学目的和要求掌握掌握C51C51程序设计基础,能够利用程序设计基础,能够利用C51C51编写编写基本基本MCS-51MCS-51单片机应用系统程序单片机应用系统程序*C51特特点点及及程程序序结结构构v C51特点特点 语言简洁,使用方便灵活:关键字少语言简洁,使用方便灵活:关键字少 可移植性好:不依赖于机器硬件可移植性好:不依赖于机器硬件 方便操作计算机硬件:可访问机器物理地方便操作计算机硬件:可访问机器物理地址和进行位操作址和进行位操作 生成的
2、目标代码质量高:仅比用汇编语言生成的目标代码质量高:仅比用汇编语言编写的低编写的低101020%20%不能自动检查数组的边界不能自动检查数组的边界 各种运算符的优先级别多:各种运算符的优先级别多:1515个个C51特特点点及及程程序序结结构构v C51程序结构程序结构 includeinclude /预处理命令预处理命令long fun1()long fun1();/函数说明函数说明 main()main()/主函数主函数 /*每个函数都由每个函数都由“函数定义函数定义”和和“函数函数体体”组成,组成,main()main()函数是程序的入口函数是程序的入口 */fun1()fun1()/功能
3、函数功能函数 C51特特点点及及程程序序结结构构v C51程序结构程序结构 includeinclude /预处理命令预处理命令long fun1()long fun1();/函数说明函数说明 main()main()/主函数主函数 /*每个函数都由每个函数都由“函数定义函数定义”和和“函数函数体体”组成,组成,main()main()函数是程序的入口函数是程序的入口 */fun1()fun1()/功能函数功能函数 C51特特点点及及程程序序结结构构v C51关键字关键字 bitbit声明一个位标量或位类型的函数声明一个位标量或位类型的函数sbitsbit声明一个可位寻址变量声明一个可位寻址变
4、量sfrsfr声明一个特殊功能寄存器声明一个特殊功能寄存器sfr16sfr16声明一个声明一个1616位的特殊功能寄存器位的特殊功能寄存器datadata直接寻址的内部数据存储器直接寻址的内部数据存储器bdatabdata可位寻址的内部数据存储器可位寻址的内部数据存储器idataidata间接寻址的内部数据存储器间接寻址的内部数据存储器pdatapdata分页寻址的外部数据存储器分页寻址的外部数据存储器xdataxdata外部数据存储器外部数据存储器codecode程序存储器程序存储器interruptinterrupt定义一个中断函数定义一个中断函数reentrantreentrant定义一
5、个再入函数定义一个再入函数usingusing定义芯片的工作寄存器定义芯片的工作寄存器C51特特点点及及程程序序结结构构v C51关键字关键字*ACCACC累加器累加器内部内部RAMRAM:E0HE0H*B B乘法寄存器乘法寄存器内部内部RAMRAM:F0HF0H*PSWPSW程序状态字程序状态字内部内部RAMRAM:D0HD0HSPSP堆栈指针堆栈指针内部内部RAMRAM:81H81HDPLDPL数据存储器指针低数据存储器指针低8位位内部内部RAMRAM:82H82HDPHDPH数据存储器指针高数据存储器指针高8位位内部内部RAMRAM:83H83H*IEIE中断允许控制器中断允许控制器内部
6、内部RAMRAM:A8HA8H*IPIP中断优先控制器中断优先控制器内部内部RAMRAM:D8HD8H*P0P0端口端口0 0内部内部RAMRAM:80H80H*P1P1端口端口1 1内部内部RAMRAM:90H90H*P2P2端口端口2 2内部内部RAMRAM:A0HA0H*P3P3端口端口3 3内部内部RAMRAM:B0HB0HC51特特点点及及程程序序结结构构v C51关键字关键字 PCONPCON电源控制及波特率选择电源控制及波特率选择内部内部RAMRAM:87H87H*SCONSCON串行口控制器串行口控制器内部内部RAMRAM:98H98HSBUFSBUF串行数据缓冲器串行数据缓冲
7、器内部内部RAMRAM:99H99H*TCONTCON定时器控制定时器控制内部内部RAMRAM:88H88HTMODTMOD定时器方式选择定时器方式选择内部内部RAMRAM:89H89HTL0TL0定时器定时器0 0低低8 8位位内部内部RAMRAM:8AH8AHTL1TL1定时器定时器1 1低低8 8位位内部内部RAMRAM:8BH8BHTH0TH0定时器定时器0 0低低8 8位位内部内部RAMRAM:8CH8CHTH1TH1定时器定时器1 1高高8 8位位内部内部RAMRAM:8DH8DH带带*号的特殊功能寄存器都是可以位寻址的号的特殊功能寄存器都是可以位寻址的寄存器寄存器 C51特特点点
8、及及程程序序结结构构v C51变量定义变量定义 若在程序中使用变量,必须先定义后使用,若在程序中使用变量,必须先定义后使用,需要用标识符作为变量名,并指出所用的数需要用标识符作为变量名,并指出所用的数据类型和存储模式:据类型和存储模式:【存储种类存储种类】数据类型数据类型 【存储器类型存储器类型】变量名表变量名表自动自动(auto(auto,缺省,缺省)、外部、外部(extern)(extern)、静态静态(static)(static)和寄存器和寄存器(register)(register)data(00-7FH,data(00-7FH,直接访问直接访问)bdada(20-2FH,bdada
9、(20-2FH,位位)idata(00-FFHidata(00-FFH,间接访问),间接访问)pdata(00-FFHpdata(00-FFH,外,外RAM)RAM)xdata(0000 xdata(0000FFFFH,FFFFH,外外RAMRAM)codecode(00000000FFFFHFFFFH,外,外ROMROM)sfr P1=0 x90;/sfr P1=0 x90;/声明声明P1P1口,其地址口,其地址90H90Hsfr16 T2=0 xCC;/sfr16 T2=0 xCC;/*声明声明5252定时器定时器2 2,1616位的位的T2T2*/sbit P1.0=P10;/sbit
10、P1.0=P10;/声明声明P1P1口第口第0 0位为位为P1.0P1.0sbit TI=0 x980;/sbit TI=0 x980;/*声明声明98H(SCON)98H(SCON)的第的第0 0位位为为TITI*/注意:注意:sfrsfr、sfr16sfr16、sbitsbit其声明语句只能放函数外。其声明语句只能放函数外。不能定义不能定义bitbit、sbitsbit、sfrsfr、sfr16sfr16型指针和数型指针和数组。组。sbitsbit、sfrsfr、sfr16sfr16通常用在通常用在5151单片机系统自带单片机系统自带的头文件中,具体参见的头文件中,具体参见reg51.hr
11、eg51.h或或reg52.hreg52.h。C51特特点点及及程程序序结结构构v C51绝对地址访问绝对地址访问 1.1.绝对宏绝对宏 使用使用“#include”#include”即可利用其中即可利用其中定义的宏来访问绝对地址,包括:定义的宏来访问绝对地址,包括:CBYTECBYTE、XBYTEXBYTE、PWORDPWORD、DBYTEDBYTE、CWORDCWORD、XWORDXWORD、PBYTEPBYTE、DWORDDWORD,具,具体用法参见体用法参见absacc.habsacc.h。例如:。例如:val=XWORD 0 x4000;/指向片外指向片外RAM的的4000H地址地址
12、val1=CBYTE 0 x0002;/指向指向ROM的的0002h地址地址C51特特点点及及程程序序结结构构v C51绝对地址访问绝对地址访问 2._at_ 2._at_ 关键字关键字 可以使用可以使用 _at_ _at_ 关键字来访问绝对地址。格式关键字来访问绝对地址。格式如下:如下:【存储器类型存储器类型】数据类型数据类型 标识符标识符 _at_ _at_ 地址常数地址常数 例如:例如:xdata char m10 _at_ 0 x1000;/*指定指定m数组从片外数组从片外RAM的的1000H开始开始*/注意:注意:(1)(1)绝对变量不能被初使化;绝对变量不能被初使化;(2)bit(
13、2)bit型函数及变量不能用型函数及变量不能用_at_at_指定。指定。*C51的的数数据据类类型型及及运运算算符符 v C51的数据类型的数据类型 C51C51的数据类型有的数据类型有基本类型基本类型、构造类型构造类型、指针指针类型类型与与空类型空类型。在在C51C51编译器中编译器中int int 和和 short short 相同,相同,float float 和和 double double 相同。相同。C51特特点点及及程程序序结结构构v C51的数据类型的数据类型 1.char 1.char 字符类型字符类型 长度长度1 1个字节,用于定义字符数据变量或常量。个字节,用于定义字符数
14、据变量或常量。分为分为signed charsigned char (默认默认)和和unsigned charunsigned char。signed char signed char 类型用字节中最高位字节表示数据类型用字节中最高位字节表示数据的符号,的符号,“0”0”表示正数,表示正数,“1”1”表示负数,负数表示负数,负数用补码表示,表示的数值范围是用补码表示,表示的数值范围是-128-128+127+127。unsigned char unsigned char 类型用字节中所有的位来表示数类型用字节中所有的位来表示数值,表示的数值范围是值,表示的数值范围是0 0255255。C51特
15、特点点及及程程序序结结构构v C51的数据类型的数据类型 2.int 2.int 整型整型 长度长度2 2个字节,用于存放一个双字节数据。个字节,用于存放一个双字节数据。分为分为signed intsigned int (默认默认)和和unsigned intunsigned int。signed int signed int 类型用字节中最高位字节表示数据类型用字节中最高位字节表示数据的符号,的符号,“0”0”表示正数,表示正数,“1”1”表示负数,负数表示负数,负数用补码表示,表示的数值范围是用补码表示,表示的数值范围是-32768-32768+32767+32767 。unsigned
16、int unsigned int 类型用字节中所有的位来表示数类型用字节中所有的位来表示数值,表示的数值范围是值,表示的数值范围是0 06553565535 。C51特特点点及及程程序序结结构构v C51的数据类型的数据类型 3.long 3.long 长整型长整型 长度长度4 4个字节,用于存放一个四字节数据。个字节,用于存放一个四字节数据。分为分为signed longsigned long (默认默认)和和unsigned longunsigned long。signed long signed long 类型用字节中最高位字节表示数据类型用字节中最高位字节表示数据的符号,的符号,“0”
17、0”表示正数,表示正数,“1”1”表示负数,负数表示负数,负数用补码表示,表示的数值范围是用补码表示,表示的数值范围是-2147483648-2147483648 +2147483647+2147483647 。unsigned int unsigned int 类型用字节中所有的位来表示数类型用字节中所有的位来表示数值,表示的数值范围是值,表示的数值范围是 0 042949672954294967295。C51特特点点及及程程序序结结构构v C51的数据类型的数据类型 4.float 4.float 浮点型浮点型 长度长度4 4个字节,在十进制中具有个字节,在十进制中具有 7 7 位有效数字
18、,位有效数字,是符合是符合 IEEEIEEE754 754 标准的单精度浮点型数据用标准的单精度浮点型数据用于存放一个四字节数据。于存放一个四字节数据。5.bit 5.bit 位标量位标量 利用它可定义一个位标量,但不能定义位指针,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,只也不能定义位数组。它的值是一个二进制位,只能是能是 0 0 或者或者 1 1。C51特特点点及及程程序序结结构构v C51的数据类型的数据类型 6.6.数组类型数组类型 数组是相同数据类型的元素按一定顺序排列的集数组是相同数据类型的元素按一定顺序排列的集合。合。将有限个类型相同的变量
19、用一个名字命名,然后将有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,名字称为数组名,用编号区分他们的变量的集合,名字称为数组名,编号称为下标。编号称为下标。例如:例如:int a5=1,2,3,4,5;int a5=1,2,3,4,5;char s=“Jilin University”;char s=“Jilin University”;C51特特点点及及程程序序结结构构v C51的数据类型的数据类型 7.7.结构体结构体 是一种组合数据类型,将若干个不同类型的变量是一种组合数据类型,将若干个不同类型的变量结合在一起而形成的一种数据集合体。结合在一起而形成的一种数据集合体
20、。组成该集合体的各个变量称为结构元素或成员,组成该集合体的各个变量称为结构元素或成员,整个集合体使用一个单独的结构变量名。整个集合体使用一个单独的结构变量名。8.8.共用体共用体 可以把不同类型的数据组合在一起使用,但它与可以把不同类型的数据组合在一起使用,但它与结构体在内存中存储变量的方式不同,结构体定结构体在内存中存储变量的方式不同,结构体定义的各个变量在内存中占用不同的内存单元,而义的各个变量在内存中占用不同的内存单元,而共用体可使不同的变量分时使用同一内存单元。共用体可使不同的变量分时使用同一内存单元。C51特特点点及及程程序序结结构构v C51的数据类型的数据类型 9.9.枚举枚举
21、声明一组命名常数的集合,当一个变量有几种可声明一组命名常数的集合,当一个变量有几种可能的取值时,可以将它定义为枚举类型。能的取值时,可以将它定义为枚举类型。10.10.指针指针 指针变量中存放的是指向另一个数据的地址。指针变量中存放的是指向另一个数据的地址。指针变量要占据一定的内存单元,在指针变量要占据一定的内存单元,在 C51 C51 中它中它的长度一般为的长度一般为 1 13 3个字节。个字节。指针变量定义的一般形式为:指针变量定义的一般形式为:数据类型说明符数据类型说明符 【存储器类型存储器类型】*指针变量指针变量名名C51特特点点及及程程序序结结构构v C51的运算符的运算符 运算符就
22、是完成某种特定运算的符号。运算符就是完成某种特定运算的符号。由运算符及运算对象所组成的具有特定含由运算符及运算对象所组成的具有特定含义的式子被称为表达式。义的式子被称为表达式。运算符按其在表达式中所起的作用,可分运算符按其在表达式中所起的作用,可分为:为:赋值赋值、算术算术、增量与减量增量与减量、关系关系、逻逻辑辑、位位、复合赋值复合赋值、逗号逗号、条件条件、指指针和地址运算符针和地址运算符、强制类型转换运算强制类型转换运算符和符和sizeofsizeof运算符运算符等。等。C51特特点点及及程程序序结结构构v C51的运算符的运算符 运算符按其在表达式中与运算对象的关系又可分运算符按其在表达
23、式中与运算对象的关系又可分为:为:单目、双目和三目运算符。单目、双目和三目运算符。单目运算符只需要有一个运算对象,双目单目运算符只需要有一个运算对象,双目运算符要求有两个运算对象,三目运算符运算符要求有两个运算对象,三目运算符要求有三个运算对象。要求有三个运算对象。&A=&bA=&b将将b b变量的地址存入变量的地址存入A A寄存器中寄存器中*A A用来取寄存器所指地址内的值用来取寄存器所指地址内的值Max=(ab)?a:b;/Max=(ab)?a:b;/三目运算符,条件运算符三目运算符,条件运算符具体参见表具体参见表4-24-2C51特特点点及及程程序序结结构构v C51的函数的函数 函数定
24、义时要同时声明其类型。函数定义时要同时声明其类型。调用函数前要先声明该函数。调用函数前要先声明该函数。传给函数的参数值,其类型要与函数原定传给函数的参数值,其类型要与函数原定义一致。义一致。接收函数返回值的变量,其类型也要与函接收函数返回值的变量,其类型也要与函数一致。数一致。C51C51语言的编译器中含有丰富的库函数,语言的编译器中含有丰富的库函数,使用时,必须在源程序的开始处使用预处使用时,必须在源程序的开始处使用预处理命令理命令#include#include将有关的头文件包含进来。将有关的头文件包含进来。C51特特点点及及程程序序结结构构v C51的函数的函数1.1.内部函数内部函数
25、C51C51内部函数只有内部函数只有9 9个,包含在头文件个,包含在头文件intrins.hintrins.h中。中。2.2.输入输出函数输入输出函数 输入输出函数用于处理包括文件、控制台输入输出函数用于处理包括文件、控制台等各种输入输出设备,各种函数以等各种输入输出设备,各种函数以“流流”的方式实现,包含在在头文件的方式实现,包含在在头文件stdio.hstdio.h中。中。C51特特点点及及程程序序结结构构v C51的函数的函数3.3.实用工具函数实用工具函数 实用工具函数中汇集了常用的工具类函数,实用工具函数中汇集了常用的工具类函数,如数制转换函数,随机序列产生函数等,如数制转换函数,随
26、机序列产生函数等,包含在在头文件包含在在头文件stdlib.hstdlib.h中中 。4.4.数学函数数学函数 数学函数包含了常规的数学计算函数,在数学函数包含了常规的数学计算函数,在头文件头文件 math.hmath.h 中。中。C51特特点点及及程程序序结结构构v C51的函数的函数5.5.字符函数字符函数 用于对单个字符进行处理,包含在头文件用于对单个字符进行处理,包含在头文件 ctype.hctype.h中。中。6.6.字符串处理函数字符串处理函数 字符串处理函数用于对字符串进行合并、字符串处理函数用于对字符串进行合并、比较等操作,包含在在头文件比较等操作,包含在在头文件string.
27、hstring.h中。中。C51特特点点及及程程序序结结构构v C51的函数的函数7.7.中断服务函数中断服务函数 定义中断服务函数的一般形式为:定义中断服务函数的一般形式为:函数类型函数类型 函数名()函数名()interrupt n using rinterrupt n using r interrupt interrupt 为关键字,其后为关键字,其后n n是中断号,是中断号,n n的的取值范围为取值范围为031031。具体的中断号。具体的中断号n n和中断向和中断向量取决于不同的量取决于不同的80518051系列单片机芯片。系列单片机芯片。using using 为关键字,后面的为关键
28、字,后面的r r是一个是一个0303的常整的常整数,分别选择数,分别选择4 4个不同的工作寄存器组。个不同的工作寄存器组。C51特特点点及及程程序序结结构构v C51的函数的函数编写编写80518051单片机中断函数时应遵循以下规则:单片机中断函数时应遵循以下规则:l 中断函数不能进行参数传递,会导致编译出错。中断函数不能进行参数传递,会导致编译出错。l 中断函数没有返回值,建议在定义中断函数时将中断函数没有返回值,建议在定义中断函数时将其定义为其定义为voidvoid类型,以明确说明无返回值。类型,以明确说明无返回值。l 在任何情况下都不能直接调用中断函数,否则会在任何情况下都不能直接调用中
29、断函数,否则会产生编译错误。产生编译错误。l 如果中断函数中用到浮点运算,必须保存浮点寄如果中断函数中用到浮点运算,必须保存浮点寄存器的状态。存器的状态。l 如果在中断函数中调用了其它函数,则被调用函如果在中断函数中调用了其它函数,则被调用函数所使用的寄存器组必须与中断函数相同。数所使用的寄存器组必须与中断函数相同。l C51C51编译器从绝对地址编译器从绝对地址8n8n3 3处产生一个中断向量,处产生一个中断向量,其中其中n n为中断号。该向量包含一个到中断函数入口为中断号。该向量包含一个到中断函数入口地址的绝对跳转。地址的绝对跳转。*C51程程序序设设计计基基础础 v基本结构基本结构 C5
30、1C51语言属于结构化设计语言,程序由若干语言属于结构化设计语言,程序由若干模块组成,每个模块包含若干基本结构模块组成,每个模块包含若干基本结构(顺序、分支、循环顺序、分支、循环),每个基本结构中),每个基本结构中包含若干语句。包含若干语句。C51程程序序设设计计基基础础 v基本结构基本结构1.1.分支(选择)结构分支(选择)结构 if(if(表达式表达式)语句;语句;if(if(表达式表达式)语句语句1 1;else else语句语句2 2;if(if(表达式表达式1)1)语句语句1 1;else if(else if(表达式表达式2)2)语句语句2 2;else if(else if(表达
31、式表达式n-1)n-1)语句语句n-1n-1;else else语句语句n n;C51程程序序设设计计基基础础 v基本结构基本结构1.1.分支(选择)结构分支(选择)结构 switch(switch(表达式表达式)case case 常量表达式常量表达式1 1:语句语句1 1;break;break;case case 常量表达式常量表达式2 2:语句语句2 2;break;break;case case 常量表达式常量表达式n-1n-1:语句语句n-1n-1;break;break;default:default:语句语句n n;C51程程序序设设计计基基础础 v基本结构基本结构2.2.循环
32、结构循环结构 (1)while(1)while语句语句C51C51使用使用whilewhile语句实现当型循环,格式如下:语句实现当型循环,格式如下:while(while(表达式表达式)/)/条件条件 语句;语句;/循环体循环体C51程程序序设设计计基基础础 v基本结构基本结构2.2.循环结构循环结构 (2)do-while(2)do-while语句语句C51C51使用使用do-whiledo-while语句实现直到型循环,格语句实现直到型循环,格式如下:式如下:do do 语句;语句;/循环体循环体while(while(表达式表达式);/);/条件条件C51程程序序设设计计基基础础 v基
33、本结构基本结构2.2.循环结构循环结构 (3)for(3)for语句语句在在C51C51程序设计中,程序设计中,forfor语句的功能强大,使语句的功能强大,使用最为灵活,格式如下:用最为灵活,格式如下:for(for(表达式表达式1;1;表达式表达式2;2;表达式表达式3)3)语句;语句;/循环体循环体注意:在注意:在C51C51中允许三种循环结构相互嵌套。中允许三种循环结构相互嵌套。C51程程序序设设计计基基础础 vC51与汇编语言混合编程与汇编语言混合编程混合编程混合编程:在一个应用程序中,用不同的编在一个应用程序中,用不同的编程语言编写源程序,最后通过编译程语言编写源程序,最后通过编译
34、/连接器连接器生成一个可执行的完整程序。生成一个可执行的完整程序。汇编语言汇编语言:执行速度快、效率高、实时性强。执行速度快、效率高、实时性强。但编程繁琐,可读性和可移植性都较差。但编程繁琐,可读性和可移植性都较差。C51C51语言语言:功能丰富、表达能力强、使用灵功能丰富、表达能力强、使用灵活方便、开发周期短、可读性强、可移植活方便、开发周期短、可读性强、可移植性好。但硬件操作没有汇编方便、效率没性好。但硬件操作没有汇编方便、效率没有汇编高、编写延时程序精确度不高等,有汇编高、编写延时程序精确度不高等,因而目前单片机系统开发中经常用到因而目前单片机系统开发中经常用到C51C51与与汇编混合编
35、程技术。汇编混合编程技术。C51程程序序设设计计基基础础 vC51与汇编语言混合编程与汇编语言混合编程C51C51语言和汇编语言的混合编程语言和汇编语言的混合编程通常是程序通常是程序的框架或主体部分用的框架或主体部分用C51C51编写编写,对那些使用,对那些使用频率高、要求执行效率高、延时精确的部频率高、要求执行效率高、延时精确的部分用汇编语言编写,这样既保证了整个程分用汇编语言编写,这样既保证了整个程序的可读性,又保证了单片机应用系统的序的可读性,又保证了单片机应用系统的性能。性能。在单片机在单片机C C 语言与汇编语言混合编程中,语言与汇编语言混合编程中,应注意相应的使用方法和参数传递。应
36、注意相应的使用方法和参数传递。C51程程序序设设计计基基础础 vC51与汇编语言混合编程与汇编语言混合编程1.1.混合编程的基本方式混合编程的基本方式 (1)(1)在在C51 C51 中嵌入汇编程序中嵌入汇编程序#pragma ASM#pragma ASM ;汇编程序汇编程序#pragma ENDASM#pragma ENDASM 需要更改文件选项。将需要更改文件选项。将“Properties”Properties”选项选项卡中的卡中的“Generate Assembler SRC File”Generate Assembler SRC File”和和“Assemble SRC File”As
37、semble SRC File”两项设置为有效。两项设置为有效。“Link Public Only”Link Public Only”项设置为无效。项设置为无效。C51程程序序设设计计基基础础 vC51与汇编语言混合编程与汇编语言混合编程1.1.混合编程的基本方式混合编程的基本方式 (2)(2)在在C51 C51 中调用汇编程序中调用汇编程序l 分别用分别用C51 C51 与与A51 A51 对源程序进行编译对源程序进行编译l 然后用然后用L51 L51 将将objobj 文件连接即可文件连接即可l 关键问题在于关键问题在于C C 函数与汇编函数之间的函数与汇编函数之间的参数传递和得到正确返回
38、值,以保证模参数传递和得到正确返回值,以保证模块间的数据交换。块间的数据交换。C51程程序序设设计计基基础础 vC51与汇编语言混合编程与汇编语言混合编程2 2C51 C51 与汇编程序的参数传递与汇编程序的参数传递 (1 1)在在C51 C51 中嵌入汇编程序的参数传递中嵌入汇编程序的参数传递l 如果要在如果要在C C 程序中和汇编程序中实现数程序中和汇编程序中实现数据传递,可以通过变量或特殊功能寄存据传递,可以通过变量或特殊功能寄存器来实现。器来实现。C51程程序序设设计计基基础础 vC51与汇编语言混合编程与汇编语言混合编程2 2C51 C51 与汇编程序的参数传递与汇编程序的参数传递
39、(2 2)在在C51 C51 中调用汇编程序的参数传递中调用汇编程序的参数传递l 通过函数调用的形式来实现。在通过函数调用的形式来实现。在C51 C51 中调中调用汇编程序进行参数传递时都必须严格遵用汇编程序进行参数传递时都必须严格遵守守C51 C51 函数的参数和返回值相关约定。函数的参数和返回值相关约定。l 在在C51 C51 中调用汇编程序实现参数传递的方中调用汇编程序实现参数传递的方式主要有两种:一种是通过寄存器传递参式主要有两种:一种是通过寄存器传递参数;另一种是通过固定存储区传递。数;另一种是通过固定存储区传递。C51程程序序设设计计基基础础 vC51程序设计实例程序设计实例【例例
40、4-14-1】将内部将内部RAM 2000H20FFHRAM 2000H20FFH单元清零。单元清零。ORG 0000H ORG 0000H MOV R0,#00H MOV R0,#00H MOV DPTR,#2000H MOV DPTR,#2000H CLR A CLR AL1:MOVX DPTR,AL1:MOVX DPTR,A INC DPTR INC DPTR INC R0 INC R0 CJNE R0,#00H,L1 CJNE R0,#00H,L1 SJMP$SJMP$END END#include#include main()main()int i;int i;unsigned ch
41、ar xdata unsigned char xdata *p=0 x2000;p=0 x2000;for(i=0;i256;i+)for(i=0;i256;i+)*p=0;p=0;p+;p+;C51程程序序设设计计基基础础 vC51程序设计实例程序设计实例【例例4-24-2】利用循环编写延时函数,延迟时间为利用循环编写延时函数,延迟时间为n(ms)n(ms)(假设(假设8051CPU8051CPU的时钟频率为的时钟频率为12MHz12MHz)。)。#include#includevoid delay(unsigned int n)/void delay(unsigned int n)/延时延
42、时n n(msms)函数函数 unsigned int i,j;unsigned int i,j;for(i=0;in;i+)for(i=0;in;i+)for(j=0;j120;j+);for(j=0;j120;j+);注:时钟频率为注:时钟频率为1212MHzMHz时,时,n n为为1 1,循环,循环120120次约为次约为1 1msms。C51程程序序设设计计基基础础 vC51程序设计实例程序设计实例【例例4-34-3】如图所示,如图所示,80518051的的P1.0P1.0、P1.1P1.1、P1.2P1.2、P1.3P1.3分别接入分别接入4 4支发光二极管支发光二极管L0L0、L1
43、L1、L2L2、L3L3,P3.0P3.0、P3.1P3.1、P3.2P3.2、P3.4P3.4分别接分别接4 4支开关支开关K0K0、K1K1、K2K2、K3K3,开关断开对应的发光二极管亮,开关闭合对应的发开关断开对应的发光二极管亮,开关闭合对应的发光二极管灭。光二极管灭。#include /预处理命令预处理命令#includevoid main(void)/主函数主函数unsigned char buf;/变量说明变量说明P1=0 xff;/P1口全置口全置1while(1)buf=P3;/读读P3口状态口状态if(buf&0 x01)=0 x01)P1=(P1&0 x00)|0 x01
44、;else if(buf&0 x02)=0 x02)P1=(P1&0 x00)|0 x02;else if(buf&0 x04)=0 x04)P1=(P1&0 x00)|0 x04;else if(buf&0 x08)=0 x08)P1=(P1&0 x00)|0 x08;void main(void)/void main(void)/主函数主函数unsigned char buf;unsigned char buf;P1=0 xff;P1=0 xff;while(1)while(1)buf=P3;buf=P3;buf=buf&0 x0f;buf=buf&0 x0f;switch (buf)sw
45、itch (buf)case 0 x01:case 0 x01:P1=P1=(P1&0 x00P1&0 x00)|0 x01;break;|0 x01;break;case 0 x02:case 0 x02:P1=P1=(P1&0 x00P1&0 x00)|0 x02;break;|0 x02;break;case 0 x04:case 0 x04:P1=P1=(P1&0 x00P1&0 x00)|0 x04;break;|0 x04;break;case 0 x08:case 0 x08:P1=P1=(P1&0 x00P1&0 x00)|0 x08;break;|0 x08;break;de
46、fault:break;default:break;C51程程序序设设计计基基础础 vC51程序设计实例程序设计实例【例例4-44-4】P1 P1口接口接8 8个发光二极管,试编写程序个发光二极管,试编写程序令发光二极管循环点亮。令发光二极管循环点亮。解:解:P1.0P1.7P1.0P1.7接接8 8个发光二极管,设晶振频率个发光二极管,设晶振频率12MHz12MHz,每,每250ms250ms点亮一个发光二极管的程序如点亮一个发光二极管的程序如下下:#include /#include /预处理预处理#include#includevoid delay(unsigned int n)/void delay(unsigned int n)/延时延时n n(msms)函数)函数 unsigned int i,j;unsigned int i,j;for(i=0;in;i+)for(i=0;in;i+)for(j=0;j120;j+);for(j=0;j120;j+);void main()void main()P1=0 xfe;P1=0 xfe;while(1)while(1)P1=_crol_(P1,1);P1P1=_crol_(P1,1);P1向左循环移动向左循环移动delay(250);delay(250);延时延时250250毫秒毫秒
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。