1、12:401第第4章章 80C51单片机的单片机的软软件件基础基础3.780C51单片机的指令系统单片机的指令系统4.1C51程序设计基础程序设计基础4.2C51语言的语句语言的语句4.3 C51的函数的函数4.4 C51的程序结构的程序结构4.512:402 单片机应用系统单片机应用系统是由是由硬件和软件硬件和软件共同组成的。要使单片机共同组成的。要使单片机实现所需要的控制功能,必须有控制软件,实现所需要的控制功能,必须有控制软件,没有控制软件没有控制软件的单片机是毫无用处的的单片机是毫无用处的。机器语言机器语言是计算机唯一能识别的语言,是计算机唯一能识别的语言,用汇编语言和高级用汇编语言和
2、高级语言编写的程序语言编写的程序(称为源程序称为源程序)最终都必须翻译成机器语言最终都必须翻译成机器语言的程序的程序(称为目标程序称为目标程序),计算机才能识别。,计算机才能识别。汇编语言汇编语言是能够利用单片机所有特性直接控制硬件的语言,是能够利用单片机所有特性直接控制硬件的语言,它直接使用它直接使用CPU的指令系统和寻址方式,从而得到占用空的指令系统和寻址方式,从而得到占用空间小、执行速度快的高质量程序。间小、执行速度快的高质量程序。对于一些实时控制要求对于一些实时控制要求高的场合,汇编语言是必不可少的。高的场合,汇编语言是必不可少的。但对于较复杂的单片但对于较复杂的单片机应用系统,它的编
3、写效率很低。机应用系统,它的编写效率很低。第第4章章 80C51单片机的单片机的软软件基础件基础12:403 为了提高软件的开发效率,编程人员采用高级语言为了提高软件的开发效率,编程人员采用高级语言C语语言来开发单片机应用程序。言来开发单片机应用程序。目前许多软件公司致力于单片机目前许多软件公司致力于单片机C编译器的开发研究,编译器的开发研究,许多许多C编译器的效率已接近汇编语言的水平,编译器的效率已接近汇编语言的水平,对于较复杂对于较复杂的应用程序,的应用程序,C语言产生的代码效率甚至超出了汇编语言。语言产生的代码效率甚至超出了汇编语言。同时目前单片机片内程序存储器的发展十分迅速,许多型同时
4、目前单片机片内程序存储器的发展十分迅速,许多型号的单片机片内号的单片机片内ROM已经达到已经达到64KB甚至更大,且具备在甚至更大,且具备在系统编程系统编程(ISP)功能,进一步推动了功能,进一步推动了C语言在单片机应用系语言在单片机应用系统开发中的应用。统开发中的应用。在学习在学习C语言之前,语言之前,了解汇编语言,能读懂汇编语言程了解汇编语言,能读懂汇编语言程序,并且会编中、小规模的汇编语言程序是十分必要的。序,并且会编中、小规模的汇编语言程序是十分必要的。12:4044.1 80C51单片机的指令系统单片机的指令系统4.1.1 指令格式指令格式一条汇编语言指令中最多包含一条汇编语言指令中
5、最多包含4个字段,其格式为:个字段,其格式为:标号标号:操作码操作码 目的操作数,源操作数;注释目的操作数,源操作数;注释例:例:LOOP:ADD A,10H ;A(A)+10H 根据设计使某台计算机具有的指令的集合便构成了这根据设计使某台计算机具有的指令的集合便构成了这一计算机的指令系统。一计算机的指令系统。80C51系列单片机的指令系统共有系列单片机的指令系统共有111条指令。条指令。12:4051.标号标号标号标号是用户定义的一个符号,是用户定义的一个符号,表示指令或数据的存储单元地址。表示指令或数据的存储单元地址。标号由以英文字母开始的标号由以英文字母开始的18个字母或数字串组成,以冒
6、号个字母或数字串组成,以冒号“:”结尾。不能用指令助记符、伪指令或寄存器名来做标号。一旦结尾。不能用指令助记符、伪指令或寄存器名来做标号。一旦使用了某标号定义一地址单元,在程序的其它地方就不能随意使用了某标号定义一地址单元,在程序的其它地方就不能随意修改这个定义,也不能重复定义。修改这个定义,也不能重复定义。一条指令中的标号代表该指令所存放的第一个字节存储单元的一条指令中的标号代表该指令所存放的第一个字节存储单元的地址,地址,故标号又称为符号地址,故标号又称为符号地址,在汇编时,把该地址赋值给该在汇编时,把该地址赋值给该标号。标号。12:4062.操作码操作码操作码操作码是用是用英文缩写的指令
7、或伪指令功能助记符英文缩写的指令或伪指令功能助记符,用来表示指,用来表示指令的性质或功能。如令的性质或功能。如MOV表示传送操作,表示传送操作,ADD表示加法操作。表示加法操作。12:4073.操作数操作数操作数字段给出参与操作的数据或数据所在单元的地址。操作数字段给出参与操作的数据或数据所在单元的地址。操作数字段的内容复杂多样,它可能为以下几种情况之一:操作数字段的内容复杂多样,它可能为以下几种情况之一:(1)工作寄存器名工作寄存器名(2)特殊功能寄存器名特殊功能寄存器名(3)标号名标号名(4)常数常数(5)$(6)表达式表达式 12:408(1)工作寄存器名工作寄存器名由由PSW.3和和P
8、SW.4规定的当前工作寄存器区中的规定的当前工作寄存器区中的R0R7都可以都可以出现在操作数字段中。出现在操作数字段中。(2)特殊功能寄存器名特殊功能寄存器名8051中的中的21个特殊功能寄存器的名字都可以作为操作数使用。个特殊功能寄存器的名字都可以作为操作数使用。(3)标号名标号名可以在操作数字段中引用的标号包括:可以在操作数字段中引用的标号包括:赋值标号:赋值标号:由汇编伪指令由汇编伪指令EQU等赋值的标号可以作为操作数。等赋值的标号可以作为操作数。指令标号:指令标号:指令标号虽未被赋值,但这条指令的第一字节地址指令标号虽未被赋值,但这条指令的第一字节地址就是这个标号的值,在以后指令操作数
9、字段中可以引用。就是这个标号的值,在以后指令操作数字段中可以引用。12:409(4)常数常数为了方便用户,汇编语言指令允许以各种数制表示常数,即常为了方便用户,汇编语言指令允许以各种数制表示常数,即常数可以写成二进制、十进制或十六进制等形式。数可以写成二进制、十进制或十六进制等形式。(5)$操作数字段中还可以使用一个专门符号操作数字段中还可以使用一个专门符号“$”,用来表示程序计数,用来表示程序计数器的当前值。这个符号最常出现在转移指令中,如器的当前值。这个符号最常出现在转移指令中,如“SJMP$”,该指令表示继续执行该指令,在原地循环。该指令表示继续执行该指令,在原地循环。12:4010(6
10、)表达式表达式 汇编程序允许把表达式作为操作数使用。在汇编时,计算出表汇编程序允许把表达式作为操作数使用。在汇编时,计算出表达式的值,并把该值填入目标码中。例如:达式的值,并把该值填入目标码中。例如:MOV A,SUM+l。12:40114.注释注释注释是对指令或程序段的简要功能说明,以方便阅读与调试程注释是对指令或程序段的简要功能说明,以方便阅读与调试程序。序。12:40124.1.2 指令系统的寻址方式指令系统的寻址方式寻找操作数所在单元的地址称为寻找操作数所在单元的地址称为寻址寻址;确定操作数所在单元;确定操作数所在单元地址的方法称为地址的方法称为寻址方式寻址方式。80C51单片机指令系
11、统中的寻址方式共有七类,分别为单片机指令系统中的寻址方式共有七类,分别为立即寻址、立即寻址、寄存器寻址、寄存器寻址、寄存器间接寻址、寄存器间接寻址、直接寻址、直接寻址、变址寻址、变址寻址、相对寻址、相对寻址、位寻址。位寻址。12:40131.立即寻址立即寻址操作数就跟在操作码的后面,可以立即参与指令所规操作数就跟在操作码的后面,可以立即参与指令所规定的操作,不须另去寄存器或存储器等处寻找和取数。定的操作,不须另去寄存器或存储器等处寻找和取数。例:例:MOV A,#30H ;A30H MOV DPTR,#2000H ;DPTR2000H书写单片机指令时,为了辨识是立即数,规定在它的书写单片机指令
12、时,为了辨识是立即数,规定在它的前面加一个前面加一个“#”号作为前缀。号作为前缀。12:40142.寄存器寻址寄存器寻址 寻址某工作寄存器,自该寄存器读取或存放操作数,寻址某工作寄存器,自该寄存器读取或存放操作数,以完成指令所规定的操作。以完成指令所规定的操作。例例 MOV R3,A ;R3(A)ADD A,R2 ;A(A)+(R2)可以寻址的寄存器种类有工作寄存器可以寻址的寄存器种类有工作寄存器R0R7、累加器、累加器A、寄存器、寄存器B、数据指针、数据指针DPTR、位累加器、位累加器Cy。12:40153.寄存器间接寻址寄存器间接寻址寄存器中存放的是地址而不是操作数,寻找到该工作寄存器寄存
13、器中存放的是地址而不是操作数,寻找到该工作寄存器后,以其内容为地址,去寻找所指的后,以其内容为地址,去寻找所指的RAM单元以读取或存放单元以读取或存放操作数,称为寄存器间接寻址。操作数,称为寄存器间接寻址。例例 设设R1的内容为的内容为40H,则,则MOV A,R1;A片内片内RAM(40H)的内容的内容。图图4-1 MOV A,R1指令执行过程指令执行过程 H00H400R1R3FHH401AHXXA1AH12:4016说明说明:(1)对于对于51子系列单片机来说,寄存器间接寻址可用于访问内部子系列单片机来说,寄存器间接寻址可用于访问内部RAM的的128个存储单元(个存储单元(00H7FH)
14、,对于),对于52子系列单片机子系列单片机芯片则可以访问内部芯片则可以访问内部RAM的的256个单元个单元(00HFFH)。(2)只能用只能用R0或或R1间接寻址,对外部间接寻址,对外部RAM,当地址值,当地址值256B时,时,用用DPTR间接寻址。间接寻址。(3)书写单片机指令时,为了辨识是间接地址,规定在寄存器的书写单片机指令时,为了辨识是间接地址,规定在寄存器的前面加一前面加一作为前缀作为前缀。(4)此方式也可用于访问外部此方式也可用于访问外部RAM的的64KRAM。(5)此方式不可以用于访问特殊功能寄存器此方式不可以用于访问特殊功能寄存器。12:401751子系列的RAM编址图52子系
15、列的RAM编址图MOV指令,间接寻址方式(用R0或R1间接寻址)MOVX指令,间接寻址方式(用DPTR间接寻址,低256B用R0或R1间接寻址)MOVX指令,间接寻址方式(用DPTR间接寻址,低256B用R0或R1间接寻址)MOV指令,直接或间接寻址方式(用R0或R1间接寻址)MOV指令,直接或间接寻址方式(用R0或R1间接寻址)12:40184.直接寻址直接寻址直接给出操作数所在的存储单元地址,以供寻址取数直接给出操作数所在的存储单元地址,以供寻址取数或存放的寻址方式称为直接寻址。或存放的寻址方式称为直接寻址。对于对于80C51系列单片机,直接寻址可用于访问程序存储系列单片机,直接寻址可用于
16、访问程序存储器,也可用于访问数据存储器。器,也可用于访问数据存储器。12:4019(1)访问程序存储器的转移类指令访问程序存储器的转移类指令。长转移长转移 LJMP addrl6绝对转移绝对转移 AJMP addr11长调用长调用 LCALL addrl6绝对调用绝对调用 ACALL addrll执行这些指令后,执行这些指令后,PC整整16位或低位或低11位地址将更换为指令直接给位地址将更换为指令直接给出的地址,机器将改为访问以所给地址为起始地址的存储器区出的地址,机器将改为访问以所给地址为起始地址的存储器区间,取指令间,取指令(或取数或取数)依次执行依次执行。12:4020(2)访问数据存储
17、器的含访问数据存储器的含direct的各条指令的各条指令。例例 MOV A,direct MOV Rn,direct MOV direct1,direct212:4021说明:说明:1)direct是一个是一个8位地址,称为直接寻址字节。它的值如位地址,称为直接寻址字节。它的值如小于等于小于等于127,可用于访问片内,可用于访问片内RAM的低的低128个单元,它的值个单元,它的值如大于如大于127,专用于访问特殊功能寄存器。,专用于访问特殊功能寄存器。2)直接寻址是访问特殊功能寄存器的唯一方法。特殊功能寄存直接寻址是访问特殊功能寄存器的唯一方法。特殊功能寄存器占用的是片内器占用的是片内RAM自
18、自80HFFH间的地址,对于间的地址,对于51子系列,子系列,片内片内RAM只有只有128个单元,它与特殊功能寄存器没有地址重个单元,它与特殊功能寄存器没有地址重叠。对于叠。对于52子系列,片内子系列,片内RAM有有256个单元,其高个单元,其高128个单元个单元与特殊功能寄存器间有重叠了。为了避免混乱,设计时规定与特殊功能寄存器间有重叠了。为了避免混乱,设计时规定了直接寻址指令不能访问片内了直接寻址指令不能访问片内RAM的高的高128个单元,要访问个单元,要访问这些单元,只能用寄存器间址指令。这些单元,只能用寄存器间址指令。12:402251子系列的RAM编址图直接寻址方式52子系列的RAM
19、编址图直接寻址方式12:40235.变址寻址变址寻址(或称基址加变址寄存器间接寻址或称基址加变址寄存器间接寻址)这种寻址方式只用于访问程序存储器,当然只能读这种寻址方式只用于访问程序存储器,当然只能读取,不能存放,它主要用于查表性质的访问。取,不能存放,它主要用于查表性质的访问。以程序计数器以程序计数器PC或数据指针或数据指针DPTR作为基址寄存器,作为基址寄存器,以累加器以累加器A作为变址寄存器,把它们的和作为程序存储作为变址寄存器,把它们的和作为程序存储器的地址,再寻址该单元,读取数据。器的地址,再寻址该单元,读取数据。指令指令 MOVC A,A+DPTR MOVC A,A+PC12:40
20、24例如:例如:MOVC A,A+DPTR;A(A)+(DPTR)设设(A)=10H,(DPTR)=2000H,程序存储器的,程序存储器的(2010H)=36H,则,则上面语句的功能是将上面语句的功能是将A的内容与的内容与DPTR的内容相加,形成操作数的内容相加,形成操作数的地址的地址2010H,把该地址中的数据传送到累加器,把该地址中的数据传送到累加器A。即。即(DPTR)+(A)A。结果。结果(A)=36H。图4-2 MOVC A,A+DPTR的执行示意图12:40256.相对寻址相对寻址在相对转移指令中采用相对寻址方式,在指令的操作数部分给在相对转移指令中采用相对寻址方式,在指令的操作数
21、部分给出地址的相对偏移量。相对偏移量为一个带符号的出地址的相对偏移量。相对偏移量为一个带符号的8位二进制数。位二进制数。将相对转移指令所在的地址称为源地址;转移后的地址称为目将相对转移指令所在的地址称为源地址;转移后的地址称为目的地址。的地址。目的地址目的地址=源地址源地址+转移指令字节数转移指令字节数+相对偏移量。相对偏移量。12:4026例例 SJMP 50H设指令所在设指令所在PC值为值为2000H,而指令的机器码为,而指令的机器码为2字节字节80H、50H,则转移去的地址则转移去的地址=2000H+02H+50H=2052H,故指令执行后,故指令执行后,PC的值变为的值变为2052H,
22、程序下一次执行的地址为,程序下一次执行的地址为2052H。在实际编程中,往往已知源地址和目的地址,从而计算偏移量在实际编程中,往往已知源地址和目的地址,从而计算偏移量。在在80C51中,常用中,常用“rel”表示为相对偏移量。表示为相对偏移量。rel计算方法:计算方法:rel=目的地址目的地址(源地址源地址+转移指令字节数转移指令字节数)12:40277.位寻址位寻址80C51单片机设有独立的位处理器单片机设有独立的位处理器(布尔处理器布尔处理器),位寻址时,可以,位寻址时,可以对内部对内部RAM和特殊功能寄存器的某些位寻址单元进行寻址。和特殊功能寄存器的某些位寻址单元进行寻址。区分位地址与字
23、节地址的方法:主要看是位操作指令还是其它指区分位地址与字节地址的方法:主要看是位操作指令还是其它指令,若为位操作指令,则操作数中的地址一定是位地址,反之则令,若为位操作指令,则操作数中的地址一定是位地址,反之则为字节地址。为字节地址。例:例:SETB 30H;(;(30H)1 12:4028寻址方式总结:寻址方式总结:MCS-51系统的各寻址方式对应不同的存储器空间,系统的各寻址方式对应不同的存储器空间,使用时要特别注意在各种不同的存储器中采用什么寻使用时要特别注意在各种不同的存储器中采用什么寻址方式。址方式。12:4029 51子系列的ROM编址图1.直接寻址方式(转移指令)2.变址寻址方式
24、(MOVC指令)3.相对寻址方式(SJMP指令)片内数据存储器1.直接寻址方式2.间接寻址方式3.位寻址1.直接寻址方式2.位寻址间接寻址方式片外数据存储器间接寻址方式80HFFHSFR00H7FH片内RAM80HFFH片内RAM8032805212:403080C51系列单片机的指令系统包括系列单片机的指令系统包括数据传送、数据传送、算术运算、算术运算、逻辑运算、逻辑运算、控制转移、控制转移、位操作位操作五大类指令。五大类指令。分类介绍指令之前,先介绍描述指令的一些符号的意义。分类介绍指令之前,先介绍描述指令的一些符号的意义。Rn:表示通用寄存器表示通用寄存器R0R7。Ri:表示通用寄存器中
25、可间接寻址表示通用寄存器中可间接寻址(即用做即用做8位地址指针位地址指针)的寄的寄存器存器R0和和R1。#data8:表示表示8位立即数。位立即数。#data16:表示表示16位立即数。位立即数。4.1.3 指令系统指令系统12:4031direct:表示表示8位片内位片内RAM或或SFR区的直接地址。区的直接地址。addr16/addr11:表示外部程序寄存器的表示外部程序寄存器的16位或位或11位地址。位地址。rel:表示表示8位偏移量。位偏移量。bit:表示直接位地址。表示直接位地址。:间接寻址寄存器或基址寄存器的前缀,如间接寻址寄存器或基址寄存器的前缀,如Ri,DPTR/:位操作数的前
26、缀,表示对该位取反。:位操作数的前缀,表示对该位取反。(X):X中的内容。中的内容。(X):由由X寻址的单元中的内容。寻址的单元中的内容。:指令操作流程,将箭头右边的内容送入箭头左边的单元指令操作流程,将箭头右边的内容送入箭头左边的单元12:4032例例4-1 用汇编语言编写程序,实现将数据用汇编语言编写程序,实现将数据00H-0FH写入到片内写入到片内RAM30H3FH,然后将数据依次读出来,在,然后将数据依次读出来,在P1.0P1.3引脚引脚用发光二极管显示出来,设二极管的阴极与用发光二极管显示出来,设二极管的阴极与P1口相连。用口相连。用keil软件调试并查看片内软件调试并查看片内RAM
27、单元中数据的变化,用单元中数据的变化,用Proteus软件软件观察仿真结果。观察仿真结果。12:4033 ORG 0000H ;复位后复位后PC的起始地址为的起始地址为0000HLJMPMAIN;跳转到用户程序真正跳转到用户程序真正的起始地址的起始地址0030HORG0030H MAIN:MOVR0,#10H;准备传送准备传送16个数据,个数据,设置循环次数为设置循环次数为16MOVR1,#30H;使传送的数据指针使传送的数据指针R1指向首地址指向首地址30HMOVA,#00H LOOP:MOVR1,A;传送传送16个个数据数据INCR1INCADJNZR0,LOOP NEXT:MOVR0,#
28、10H;准备显示准备显示16个数据,设置循环次数为个数据,设置循环次数为16MOVR1,#30H ;使显示的数据指针使显示的数据指针R1指向首地址指向首地址30H LOOP1:MOVA,R1 ;显示显示16个数据个数据LCALLDISPLAY;调用显示子程序调用显示子程序INCR1DJNZR0,LOOP1LJMP$;原地原地循环循环12:4034 ;显示子程序显示子程序 DISPLAY:MOVDPTR,#TABLE;表格首址赋值给表格首址赋值给DPTRMOVCA,A+DPTR;查表查表MOVP1,A;显示数据显示数据LCALLDELY1S;调用软件延时子程序调用软件延时子程序RET;延时子程序
29、延时子程序 DELY1S:MOVR5,#10;循环循环10 D2:MOVR6,#200;循环循环200 D1:MOV R7,#248DJNZ R7,$DJNZ R6,D1DJNZ R5,D2RET TABLE:DB0FFH,0FEH,0FDH,0FCH,0FBH ;用发光用发光二极管显示数字二极管显示数字0-4 DB0FAH,0F9H,0F8H,0F7H,0F6H ;用发光二极管显示用发光二极管显示数字数字5-9 DB0F5H,0F4H,0F3H,0F2H,0F1H,0F0H ;用发光二用发光二极管显示数字极管显示数字A-F12:40354.2 C51程序设计基础程序设计基础 1.头文件不同。
30、头文件不同。C51系列单片机头文件集中体现了各芯片的不系列单片机头文件集中体现了各芯片的不同功能,如定时器、中断、同功能,如定时器、中断、I/O等数量和功能的不同等数量和功能的不同。2.数据类型不同。数据类型不同。由于由于80C51系列单片机包含了位操作空间和系列单片机包含了位操作空间和丰富的位操作指令,可灵活地进行位指令操作。丰富的位操作指令,可灵活地进行位指令操作。3.数据存储类型不同。数据存储类型不同。C51中的存储类器型有中的存储类器型有code、data、idata、xdata,以及,以及bdata、pdata类型。类型。C51与与ANSI C不同,不同,它分为它分为SMALL、CO
31、MPACT、LARGE模式,各种不同的模模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。式对应不同的实际硬件系统,也将有不同的编译结果。4.2.1 C51和标准和标准ANSI C的区别的区别 12:4036 4.在函数的使用上有所不同。在函数的使用上有所不同。单片机资源有限,不允许太多的单片机资源有限,不允许太多的程序嵌套。程序嵌套。C51有更为丰富的库函数。有更为丰富的库函数。ANSI C中的中的printf和和scanf,通常用于屏幕打印和接收字符,在,通常用于屏幕打印和接收字符,在C51中,主要用于中,主要用于串行通信口数据的发送和接收。串行通信口数据的发送和接收。5.
32、在编译上有所不同。在编译上有所不同。由于由于80C51系列单片机是系列单片机是8位机,扩展位机,扩展16位字符位字符Unicode不被不被C51支持,并且支持,并且ANSI C所具备的递归特所具备的递归特性不被性不被C51所支持。所支持。12:40374.2.2 C51程序结构分析程序结构分析 例例2-1 2-1 第第1 1章章1.1.51.1.5节中介绍了点亮一个发光二极管的控制系统,在图节中介绍了点亮一个发光二极管的控制系统,在图1-21-2硬硬件不变的基础上,编写并调试让二极管以间隔件不变的基础上,编写并调试让二极管以间隔1s1s的时间亮灭闪烁的程序。的时间亮灭闪烁的程序。#includ
33、e /52系列单片机头文件sbit led1=P10;/声明单片机P1口的第一位unsigned int i,j;/声明无符号整型变量i,jvoid main()/主函数 while(1)/大循环led1=0;/点亮发光二极管D1for(i=1000;i0;i-)/延时for(j=110;j0;j-);led1=1;/关闭发光二极管D1for(i=1000;i0;i-)/延时for(j=110;j0;j-);12:4038 1.文件包含指令文件包含指令#include“文件名文件名”或或#include 上述两种格式略有区别。前者表示先从当前源文件所在的上述两种格式略有区别。前者表示先从当前源
34、文件所在的目录中查找被包含的文件,如果找不到,再到软件安装文件目录中查找被包含的文件,如果找不到,再到软件安装文件夹处去查找,也就是到夹处去查找,也就是到Keil/C51/INC文件夹下寻找。后者表文件夹下寻找。后者表示直接到软件安装文件夹处去查找,这种方法一般用于包含示直接到软件安装文件夹处去查找,这种方法一般用于包含头文件,如头文件,如#include,#include 等。等。例例2-112:4039 2.数据类型声明和函数声明数据类型声明和函数声明例例2-1中程序的第二行声明中程序的第二行声明led1是可寻址位的类型数据,它的意是可寻址位的类型数据,它的意思是将思是将P1口锁存器的第口
35、锁存器的第0位重新命名为位重新命名为led1,以后我们要操,以后我们要操作作P1口的第口的第0位时,就可直接操作位时,就可直接操作led1。程序的第三行程序的第三行unsigned int i,j声明声明i,j是无符号整数型变量。是无符号整数型变量。例例2-112:4040 3.主函数主函数main C语言的程序都是由若干个函数组成的,语言的程序都是由若干个函数组成的,每个程序有且只每个程序有且只有一个主函数。有一个主函数。一个一个C程序总是从程序总是从main()函数开始执行的。函数开始执行的。main后的小括后的小括号通常为空,说明该函数为无参函数,程序写在其后的大括号通常为空,说明该函数
36、为无参函数,程序写在其后的大括号中。号中。while(1)为循环控制语句,该控制语句使程序始终执为循环控制语句,该控制语句使程序始终执行行while(1)后大括号中的语句。后大括号中的语句。led1=0;使;使P1口的第口的第0位输出位输出0信号,点亮发光二极管,信号,点亮发光二极管,led1=1使使P1口的第口的第0位输出位输出1信号,信号,熄灭发光二极管,两条熄灭发光二极管,两条for语句用于拖延时间。语句用于拖延时间。12:40414.2.3 C51的标识符和关键字的标识符和关键字 标识符标识符常用来声明源程序中某个对象的名称,比如变量与常常用来声明源程序中某个对象的名称,比如变量与常量
37、的声明,数组和结构的声明,自定义函数的声明以及数据类量的声明,数组和结构的声明,自定义函数的声明以及数据类型的声明等。如型的声明等。如 int count;/count为整型变量的标识符为整型变量的标识符 char name 20;/name为包含为包含20个元素的数组的标识符个元素的数组的标识符 说明:说明:C51的标识符可以由字母、数字(的标识符可以由字母、数字(09)和下划线组)和下划线组成,最多可支持成,最多可支持32个字符。其中标识符的第一个字符必须为字个字符。其中标识符的第一个字符必须为字母或下划线,例如母或下划线,例如count2是正确的,而是正确的,而2count则是错误的。通
38、则是错误的。通常以下划线开头的标识符是编译系统专用的,因此在编写常以下划线开头的标识符是编译系统专用的,因此在编写C语语言源程序时一般不要使用以下划线开头的标识符。而且言源程序时一般不要使用以下划线开头的标识符。而且C语言语言是区分大小写的,是区分大小写的,name与与NAME是两个不同的标识符是两个不同的标识符。12:40424.2.3 C51的标识符和关键字的标识符和关键字 关键字关键字是是C51编译器已定义保留的编译器已定义保留的特殊标识符特殊标识符,又称为,又称为保留保留字字,它们具有固定的名称和功能,如,它们具有固定的名称和功能,如int、if、for等等。等等。在在Keil C51
39、开发环境的文本编辑器中编写开发环境的文本编辑器中编写C程序,系统会把程序,系统会把关键字以不同颜色显示。在关键字以不同颜色显示。在C语言的程序编写中不允许标识符语言的程序编写中不允许标识符与关键字相同。与其他计算机语言相比,与关键字相同。与其他计算机语言相比,C语言的关键字较少,语言的关键字较少,ANSI C标准共规定了标准共规定了32个关键字,个关键字,12:4043表表4-7 ANSI C标准关键字标准关键字序号序号关键字关键字用途用途说明说明1auto存储种类说明存储种类说明说明局部变量为自动变量,为默认值说明局部变量为自动变量,为默认值2break程序语句程序语句退出最内层循环体退出最
40、内层循环体3case程序语句程序语句switch语句中的选择项语句中的选择项4char数据类型声明数据类型声明声明字符型数据声明字符型数据5const存储类型声明存储类型声明在程序执行过程中不可更改的常量值在程序执行过程中不可更改的常量值6continue程序语句程序语句转向下一次循环转向下一次循环7default程序语句程序语句switch语句中的语句中的“其他其他”分支分支8do程序语句程序语句构成构成dowhile循环结构循环结构9double数据类型声明数据类型声明双精度浮点数双精度浮点数10else程序语句程序语句构成构成ifelse选择结构选择结构11enum数据类型声明数据类型声
41、明枚举枚举12extern存储种类声明存储种类声明在其他程序模块中声明了的全局变量在其他程序模块中声明了的全局变量13float数据类型声明数据类型声明单精度浮点数单精度浮点数14for程序语句程序语句构成构成for循环结构循环结构15goto程序语句程序语句构成构成goto转移结构转移结构12:4044续表4-7 ANSI C标准关键字16if程序语句程序语句构成构成ifelse选择结构选择结构17int数据类型声明数据类型声明整型整型数数18long数据类型声明数据类型声明长整型数长整型数19register存储种类声明存储种类声明寄存器变量寄存器变量20return程序语句程序语句函数返
42、回函数返回21short数据类型声明数据类型声明短整型数短整型数22signed数据类型声明数据类型声明有符号数,二进制数据的最高位为符号位有符号数,二进制数据的最高位为符号位23sizeof运算符运算符计算表达式或数据类型的字节数计算表达式或数据类型的字节数24static存储种类声明存储种类声明静态变量静态变量25struct数据类型声明数据类型声明结构类型数据结构类型数据26switch程序语句程序语句构成构成switch选择结构选择结构27typedef数据类型声明数据类型声明为系统固有的数据类型起别名为系统固有的数据类型起别名28union数据类型声明数据类型声明联合类型数据联合类型
43、数据29unsigned数据类型声明数据类型声明无符号数据无符号数据30void数据类型声明数据类型声明无类型数据无类型数据31volatile数据类型声明数据类型声明该变量在程序执行中可被隐含地改变该变量在程序执行中可被隐含地改变32while程序语句程序语句构成构成while和和dowhile循环结构循环结构12:4045表表4-8 Keil C51编译器扩展的关键字编译器扩展的关键字 序号序号关键字关键字用途用途说明说明1_at_地址定位地址定位为变量定义存储空间绝对地址为变量定义存储空间绝对地址2alien 函数特性说明函数特性说明声明与声明与PL/M51兼容的函数兼容的函数3bdat
44、a 存储器类型声明存储器类型声明可位寻址的内部可位寻址的内部RAM4bit 数据类型声明数据类型声明定义一个位变量或位类型函数定义一个位变量或位类型函数5code 存储器类型声明存储器类型声明程序存储器空间(程序存储器空间(ROM)6compact 存储模式存储模式使用外部分页使用外部分页RAM的存储模式的存储模式7data 存储器类型声明存储器类型声明直接寻址的内部直接寻址的内部RAM8idata 存储器类型声明存储器类型声明间接寻址的内部间接寻址的内部RAM9interrupt 中断函数声明中断函数声明定义一个中断服务函数定义一个中断服务函数10large 存储模式存储模式使用外部使用外部
45、RAM的存储模式的存储模式11pdata 存储器类型声明存储器类型声明分页寻址的外部分页寻址的外部RAM12_priority_ 多任务优先声明多任务优先声明规定规定RTX51或或RTX51 Tiny的任务优先级的任务优先级13reentrant 可重入函数声明可重入函数声明定义一个可重入函数定义一个可重入函数14sbit 数据类型声明数据类型声明定义一个可位寻址的变量定义一个可位寻址的变量15sfr 特殊功能寄存器声明特殊功能寄存器声明声明一个声明一个8位的特殊功能寄存器位的特殊功能寄存器16sfr16 特殊功能寄存器声明特殊功能寄存器声明声明一个声明一个16位的特殊功能寄存器位的特殊功能寄
46、存器17small 存储模式存储模式使用内部使用内部RAM的存储模式的存储模式18_task_任务声明任务声明定义实时多任务函数定义实时多任务函数19using寄存器组选择寄存器组选择选择工作寄存器组选择工作寄存器组20 xdata存储器类型声明存储器类型声明外部外部RAM12:40464.2.4 C51的数据结构的数据结构 具有一定格式的数字或数值称为具有一定格式的数字或数值称为数据数据,数据是计算机操作,数据是计算机操作的对象。的对象。数据的不同格式称为数据的不同格式称为数据类型数据类型,数据按一定的类型进行的,数据按一定的类型进行的排列、组合、架构称为排列、组合、架构称为数据结构数据结构
47、。数据结构是数据结构是程序设计程序设计的基础。的基础。12:40471.数据类型概述数据类型概述 C51中常用的数据类型有中常用的数据类型有整型、字符型、实型整型、字符型、实型等。等。C51中数据有常量与变量之分,它们分别属于以上这些类中数据有常量与变量之分,它们分别属于以上这些类型。由以上这些数据类型还可以构成更复杂的数据结构,因型。由以上这些数据类型还可以构成更复杂的数据结构,因此在程序中用到的所有的数据都必须为其指定类型。此在程序中用到的所有的数据都必须为其指定类型。图图4-13 C51的数据类型的数据类型 12:40482.常量与变量常量与变量 在程序运行过程中,其值不能被改变的量称为
48、在程序运行过程中,其值不能被改变的量称为“常量常量”,其,其值可以改变的量称为值可以改变的量称为“变量变量”。(1)常量常量 使用常量时可以直接给出常量的值,如使用常量时可以直接给出常量的值,如3,5,0 xfe等;也可等;也可以用一些符号来替代常量的值,这称之为以用一些符号来替代常量的值,这称之为“符号常量符号常量”。例例4-5 在第二章图在第二章图2-30所示的流水灯电路中,要求点亮所示的流水灯电路中,要求点亮P1.0所接所接LED发光二极管。发光二极管。程序如下:程序如下:#include#define Light0 0 xfevoid main()P1=Light0;程序中用程序中用#
49、define Light0 0 xfe来定义符号来定义符号Light0,以后在程序中所有出现,以后在程序中所有出现Light0的地方均会用的地方均会用0 xfe来代替,这个程序的执行结构就是来代替,这个程序的执行结构就是P1=0 xfe,即接在,即接在P1.0引脚上的引脚上的LED被点亮。被点亮。12:4049.30H34H35H31H32H33H.(2)变量变量 变量在内存中占据一定的存储单元,在这些存储单元中存放变量的变量在内存中占据一定的存储单元,在这些存储单元中存放变量的值,那么应该为这个存储单元命名。值,那么应该为这个存储单元命名。MOV 30H,#01HMOV 31H,#02HMO
50、V 32H,#03HMOV 33H,#04H 例如某仪表有例如某仪表有4位位LED数码管,分别显示一个字串数码管,分别显示一个字串“1234”,编程时,编程时将将30H33H作为显示缓冲区,用汇编语言编写如下:作为显示缓冲区,用汇编语言编写如下:变量X101H02H03H04Hx1=01H;x2=02H;x3=03H;x4=04H;变量X2变量X3变量X4用用C编写为:编写为:12:4050.30H34H35H31H32H33H.变量主要由两部分组成:一个是变量名,一个是变量变量主要由两部分组成:一个是变量名,一个是变量值。每个变量都有一个变量名,在内存中占据一定的存储值。每个变量都有一个变量