1、2023-1-171单片机应用技术单片机应用技术 (C C语言版)语言版)第第4 4章章 C51C51程序设计入门程序设计入门2023-1-172第第4 4章章 单片机单片机C C语言及程序设计语言及程序设计4.1 C514.1 C51的基本数据类型的基本数据类型4.2 C514.2 C51变量的存储区域变量的存储区域4.3 C514.3 C51的运算符的运算符4.4 4.4 数组数组4.5 4.5 指针指针4.6 4.6 结构结构4.7 C514.7 C51程序设计程序设计4.8 4.8 函数的定义与调函数的定义与调用用目录目录2023-1-173 本章内容完全是结合单片机来讲解,也本章内容
2、完全是结合单片机来讲解,也就是补充就是补充C C语言在单片机方面的概念、数据语言在单片机方面的概念、数据定义和函数定义等。定义和函数定义等。通过本章学习,使读者能够比较顺利地通过本章学习,使读者能够比较顺利地编写编写C51C51程序。程序。2023-1-174 “C51”“C51”概念:概念:把把“单片机单片机C C语言语言”称为称为“C51”C51”,也称为,也称为“Keil C”Keil C”。用用C51C51编写单片机程序,与用编写单片机程序,与用ANSI CANSI C编写程序的编写程序的不同之处是不同之处是,需要根据单片需要根据单片机存储器结构及内部资源,定义相应的机存储器结构及内部
3、资源,定义相应的数据类型和变量数据类型和变量。其它的其它的语法规定、程序结构及程序语法规定、程序结构及程序设计方法,设计方法,都与都与ANSI CANSI C相同。相同。1 1、C C5151概述概述2023-1-1752 2、C C语言编程的优势语言编程的优势在编程方面,使用在编程方面,使用C51C51较汇编语言有诸多较汇编语言有诸多优势:优势:1 1)编程容易)编程容易 2 2)容易实现复杂的数值计算)容易实现复杂的数值计算3 3)容易阅读与交流)容易阅读与交流4 4)容易调试与维护程序)容易调试与维护程序5 5)容易实现模块化开发)容易实现模块化开发 6 6)程序可移植性好)程序可移植性
4、好 2023-1-176用汇编语言编写程序时,必须考虑其存用汇编语言编写程序时,必须考虑其存储器的结构储器的结构,尤其要考虑其片,尤其要考虑其片内数据存储器、内数据存储器、特殊功能寄存器特殊功能寄存器是否正确合理的使用,以及是否正确合理的使用,以及按照实际地址端口数据按照实际地址端口数据的处理。的处理。2023-1-1773 3、C C5151扩展的关键字扩展的关键字由于单片机在结构及编程上的特殊要求,由于单片机在结构及编程上的特殊要求,C51C51有自己的特殊关键字,称之为有自己的特殊关键字,称之为C51C51扩展的关键字扩展的关键字,下面给出常用的下面给出常用的C51C51扩展的关键字。扩
5、展的关键字。_at_at_bdatabdata bit bit codecodedatadataidataidata interruptinterruptpdatapdatareentrant reentrant sbitsbitsfrsfrsfr16sfr16xdataxdata这些关键字在后面会陆续接触到,此处先不给这些关键字在后面会陆续接触到,此处先不给出它们的含义。出它们的含义。2023-1-1784.1 C514.1 C51基本数据类型基本数据类型1 1、数据类型:数据的不同格式。、数据类型:数据的不同格式。2 2、数据类型分类:、数据类型分类:基本型基本型(表(表4.14.1)、)
6、、构构造类型造类型(数组、结构体、共同体、枚(数组、结构体、共同体、枚举)、举)、指针类型指针类型和和空类型空类型2023-1-179 在计算机中不能随意给一个变量赋任在计算机中不能随意给一个变量赋任意的值,因为变量在单片机的内存中要占意的值,因为变量在单片机的内存中要占空间的,变量不同,所占的空间不同。空间的,变量不同,所占的空间不同。为了合理利用单片机的内存空间,在为了合理利用单片机的内存空间,在编程时要设定合适的编程时要设定合适的数据类型数据类型。2023-1-1710表表4-1 C514-1 C51数据类型、长度和数值范围数据类型、长度和数值范围数据类型数据类型表示方法表示方法长长 度
7、度数数 值值 范范 围围无符号字符型无符号字符型 unsigned charunsigned char1 1字节字节 0 0255255有符号字符型有符号字符型 signed charsigned char1 1字节字节-128128127127无符号整型无符号整型unsigned unsigned intint2 2字节字节 0 06553565535有符号整型有符号整型signed intsigned int2 2字节字节-32768327683276732767无符号长整型无符号长整型 unsigned unsigned longlong4 4字节字节 0 042949672954294
8、967295有符号长整型有符号长整型 signed longsigned long4 4字节字节-2147483648214748364821474836472147483647 浮点型浮点型floatfloat4 4字节字节 1.1755E-381.1755E-383.40E+383.40E+38特殊功能寄特殊功能寄存器型存器型sfrsfrsfr16sfr161 1字节字节2 2字节字节0 02552550 06553565535位类型位类型bitbit、sbitsbit1 1位位0 0或或1 12023-1-1711补充:补充:C51C51特殊功能寄存器与位变量特殊功能寄存器与位变量的定义
9、(的定义(P82P82)主要内容主要内容1 1、8 8位特殊功能寄存器的定义位特殊功能寄存器的定义2 2、16 16位特殊功能寄存器的定义位特殊功能寄存器的定义3 3、sbit sbit型位变量的定义型位变量的定义4 4、bit bit型位变量的定义型位变量的定义2023-1-17121 1、8 8位特殊功能寄存器的定义位特殊功能寄存器的定义定义的一般格式为:定义的一般格式为:sfrsfr 特殊功能寄存器名特殊功能寄存器名 地址常数地址常数地址常数范围:地址常数范围:0 x800 x800 xff0 xff。特殊功能寄存器定义例子(见特殊功能寄存器定义例子(见reg51.hreg51.h、re
10、g52.hreg52.h等文件):等文件):sfrsfr P0=0 x80;P0=0 x80;/定义定义P0P0寄存器寄存器sfrsfr P1=0 x90;P1=0 x90;/定义定义P1P1口寄存器口寄存器sfrsfr PSW=0 xd0;PSW=0 xd0;/定义定义PSWPSWsfrsfr IE=0 xa8;IE=0 xa8;/定义定义IEIE 2023-1-17132 2、1616位特殊功能寄存器的定义位特殊功能寄存器的定义定义的一般格式为:定义的一般格式为:sfr16 sfr16 特殊功能寄存器名地址常数特殊功能寄存器名地址常数地址常数范围:地址常数范围:0 x800 x800 xf
11、f0 xff。例如(见例如(见reg51.hreg51.h、reg52.hreg52.h等文件):等文件):sfr16 DPTR=0 x82;sfr16 DPTR=0 x82;sfr16 T2=0 xcc;sfr16 T2=0 xcc;/含含TL2TL2和和TH2TH22023-1-1714几点说明:几点说明:1 1)定义特殊功能寄存器中的地址必须)定义特殊功能寄存器中的地址必须在在0 x800 x800 xff0 xff范围内。范围内。2 2)定义特殊功能寄存器,必须放在函)定义特殊功能寄存器,必须放在函数外面作为全局变量。数外面作为全局变量。3 3)用)用sfrsfr或或sfr16sfr1
12、6每次只能定义一个特每次只能定义一个特殊功能寄存器。殊功能寄存器。4 4)用)用sfrsfr或或sfr16sfr16定义的是绝对定位的定义的是绝对定位的变量(因为名字是与确定地址对应的),变量(因为名字是与确定地址对应的),具有特定的意义,在应用时不能像一般变具有特定的意义,在应用时不能像一般变量那样随便使用。量那样随便使用。2023-1-17153 3、sbit sbit型位变量的定义型位变量的定义特殊功能寄存器的位声明特殊功能寄存器的位声明 一般格式为:一般格式为:sbitsbit 位变量名位变量名 位地址表达式位地址表达式这里的位地址表达式有三种形式:这里的位地址表达式有三种形式:直接位
13、地址直接位地址特殊功能寄存器名带位号特殊功能寄存器名带位号字节地址带位号字节地址带位号2023-1-1716 a a、用直接位地址定义位变量、用直接位地址定义位变量定义特殊功能寄存器的定义特殊功能寄存器的位位。例如:。例如:sbitsbitP0_0=0 x80;P0_0=0 x80;sbitsbitP1_1=0 x91;P1_1=0 x91;sbitsbitRS0=0 xd3;RS0=0 xd3;/定义定义PSWPSW的第的第3 3位位sbitsbitET0=0 xa9;ET0=0 xa9;/定义定义IEIE的第的第1 1位位 2023-1-1717b b、特殊功能寄存器名带位号定义、特殊功能
14、寄存器名带位号定义定义格式为:定义格式为:sbitsbit 位变量名位变量名 特殊功能寄存器名特殊功能寄存器名 位号常数位号常数这里的位号常数为这里的位号常数为0 07 7。例如:。例如:sbitsbitP0_3=P0P0_3=P0 3;3;sbitsbitP1_4=P1P1_4=P1 4;4;sbitsbitOV=PSWOV=PSW 2;2;/定义定义PSWPSW的第的第2 2位位sbitsbitES=IEES=IE 4;4;/定义定义IEIE的第的第4 4位位 2023-1-1718c c、寄存器地址带位号定义位变量、寄存器地址带位号定义位变量定义格式为:定义格式为:sbitsbit 位变
15、量名位变量名 特殊功能寄存器地址特殊功能寄存器地址 位号常数位号常数这里的位号常数同上,为这里的位号常数同上,为0 07 7。例如:。例如:sbitsbitP0_6=0 x80P0_6=0 x80 6;6;sbitsbitP1_7=0 x90P1_7=0 x90 7;7;sbitsbitOV=0 xd0OV=0 xd0 2;2;/定义定义PSWPSW的第的第2 2位位sbitsbitES=0 xa8ES=0 xa8 4;4;/定义定义IEIE的第的第4 4位位 2023-1-1719d d、几点说明、几点说明1 1)用)用sbitsbit定义的位变量,定义的位变量,必须能够按位必须能够按位操作
16、操作,而不能够对无位操作功能的位定义位,而不能够对无位操作功能的位定义位变量。变量。2 2)用)用sbitsbit定义位变量,定义位变量,必须放在函数外必须放在函数外面作为全局位变量面作为全局位变量,而不能在函数内部定义。,而不能在函数内部定义。3 3)用)用sbitsbit每次只能定义一个位变量。每次只能定义一个位变量。4 4)用)用sbitsbit定义的是一种定义的是一种绝对定位绝对定位的位变的位变量(因为量(因为名字是与确定位地址对应的名字是与确定位地址对应的),具),具有特定的意义,不能随便使用。有特定的意义,不能随便使用。2023-1-17204 4、bit bit型位变量的定义型位
17、变量的定义常说的位变量指的就是常说的位变量指的就是bitbit型位变量型位变量。C51C51的的bitbit型位变量定义的一般格式为:型位变量定义的一般格式为:存储类型存储类型 bit bit位变量名位变量名1=1=初值初值 ,位变量名,位变量名2=2=初值初值 ,bitbit位变量被保存在位变量被保存在RAMRAM中的位寻址区域中的位寻址区域例如:例如:bitbit flag_run=0flag_run=0;static bitstatic bitsend_bitsend_bit;2023-1-1721数据类型转换数据类型转换(p56)(p56)1 1)自动转换)自动转换把赋值号右边的类型转
18、换成左边的类型。把赋值号右边的类型转换成左边的类型。A A:实型赋予整型实型赋予整型B:B:整型赋予实型整型赋予实型C:C:字符型赋予整型字符型赋予整型D D:整型赋予字符型整型赋予字符型2023-1-17222 2)强制转换)强制转换像像ANSI CANSI C一样,一样,通过强制类型转换的通过强制类型转换的方式进行转换方式进行转换。如:。如:unsignedunsignedintint b;b;floatfloatc;c;b=(int)c;b=(int)c;2023-1-17234.2 C514.2 C51变量存储区域变量存储区域1 1、C51C51变量的定义变量的定义2 2、C51C51
19、变量的存储类型变量的存储类型3 3、C51C51变量的存储区域变量的存储区域4 4、C51C51变量定义举例变量定义举例5 5、C51C51变量的存储模式变量的存储模式2023-1-17241 1、C51C51变量的定义变量的定义C51C51变量定义的一般格式为:变量定义的一般格式为:存储类型存储类型 数据类型数据类型 存储区域存储区域 变量名变量名1=1=初值初值,变量名变量名2=2=初值初值,或或 存储类型存储类型 存储区域存储区域 数据类型数据类型 变量名变量名1=1=初值初值,变量名变量名2=2=初值初值,staticstatic unsigned char unsigned char
20、 datadata i=0;i=0;2023-1-17252 2、C51C51变量的存储类型变量的存储类型按照按照ANSI CANSI C,C C语言的变量有语言的变量有4 4种存储类种存储类型型:(P71P71)动态存储(动态存储(autoauto)静态存储(静态存储(staticstatic)全局存储(全局存储(externextern)寄存器存储(寄存器存储(registerregister)2023-1-1726(1 1)动态变量)动态变量动态(存储)变量:动态(存储)变量:用用autoauto定义的为动定义的为动态变量,也叫自动变量态变量,也叫自动变量。作用范围:作用范围:在定义它的
21、函数内或复合语在定义它的函数内或复合语句内部。句内部。执行时,分配存储空间,结束时释执行时,分配存储空间,结束时释放存储空间。放存储空间。定义变量时,定义变量时,autoauto可以省略可以省略2023-1-1727(2 2)静态变量)静态变量静态(存储)变量:静态(存储)变量:用用staticstatic定义的为定义的为静态变量静态变量。函数退出时,变量的值不消失。函数退出时,变量的值不消失。分为静态局部和静态全局变量。分为静态局部和静态全局变量。静态局部变量:静态局部变量:在函数体内定义在函数体内定义静态全局变量:静态全局变量:在函数体外部定义在函数体外部定义 若非必要,不要多用静态变量若
22、非必要,不要多用静态变量2023-1-1728(3 3)外部变量)外部变量外部(存储)变量:外部(存储)变量:用用externextern声明声明的变的变量为外部变量量为外部变量,是在,是在其它文件其它文件定义过的全局定义过的全局变量。变量。用用externextern声明后,便可以在所声明声明后,便可以在所声明的文件中使用。的文件中使用。2023-1-1729补充:补充:函数的定义:函数的定义:函数功能的确立,包括制函数功能的确立,包括制定函数名、函数值类型、形参及其类型、定函数名、函数值类型、形参及其类型、函数体等,是一个完整的、独立的函数函数体等,是一个完整的、独立的函数单位。单位。函数
23、的声明:函数的声明:把函数的名字、函数类型把函数的名字、函数类型以及形参类型、个数和顺序通知编译系以及形参类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行统,以便在调用该函数时系统按此进行对照检查。对照检查。2023-1-1730#include#includevoid main()void main()int max(int,int);/int max(int,int);/对被调函数的声明对被调函数的声明 int A=13,B=3;int A=13,B=3;定义外部变量定义外部变量printf(“%dn”,max(A,B);printf(“%dn”,max(A,B);int ma
24、x(int x,int y)/int max(int x,int y)/定义子函数定义子函数 int z;int z;z=xy?x:y;z=xy?x:y;return(z);return(z);2023-1-1731(4 4)寄存器变量)寄存器变量寄存器(存储)变量:寄存器(存储)变量:用用registerregister定义定义的变量为寄存器变量的变量为寄存器变量。寄存器变量存放在寄存器变量存放在CPUCPU的寄存器中的寄存器中,这种,这种变量处理速度快,但数目少。变量处理速度快,但数目少。C51C51中的寄存器变量:中的寄存器变量:C51C51的编译器在编的编译器在编译时,能够自动识别程序
25、中使用译时,能够自动识别程序中使用频率高的变频率高的变量量,并将其,并将其安排为寄存器变量安排为寄存器变量,用户不用专用户不用专门声明,对门声明,对C51C51无实际意义。无实际意义。2023-1-17323 3、C51C51变量的存储区域(变量的存储区域(P P5757)变量的存储区属性是单片机扩展的概念变量的存储区属性是单片机扩展的概念,非常重要,非常重要,它涉及到它涉及到6 6个新的关键字个新的关键字。MCS-51MCS-51单片机有四个存储空间单片机有四个存储空间,分成三,分成三类,它们是类,它们是片内片内RAMRAM、片外片外RAMRAM和和ROMROM。2023-1-1733表表4
26、.2 C514.2 C51存储区与存储空间的对应关系存储区与存储空间的对应关系关键字关键字对应的存储空间及范围对应的存储空间及范围datadata片内片内RAMRAM,直接寻址,低,直接寻址,低128128字节字节bdatabdata 片内片内RAMRAM,位寻址区,位寻址区0 x200 x200 x2f0 x2f,可字节访问,可字节访问idataidata 片内片内RAMRAM,间接寻址,间接寻址,256256字节,与字节,与 Ri Ri 对应对应pdatapdata片外片外RAMRAM,低低256256字节,与字节,与MOVX Ri MOVX Ri 对应对应xdataxdata 片外片外R
27、AMRAM,64KB64KB全空间全空间codecodeROMROM空间,空间,64KB64KB全空间全空间2023-1-17344 4、C51C51变量定义举例变量定义举例1 1)定义存储在)定义存储在datadata区域区域的的动态动态unsigned unsigned charchar变量:变量:unsigned char unsigned char datadata sec=0,min=0,hou=0;sec=0,min=0,hou=0;2 2)定义存储在)定义存储在datadata区域区域的的静态静态unsigned unsigned charchar变量:变量:staticstat
28、ic unsigned char unsigned char datadata scan_code=0 xfe;scan_code=0 xfe;3 3)定义存储在)定义存储在datadata区域区域的的静态静态unsigned unsigned intint变量:变量:staticstatic unsigned int unsigned int datadata d;d;2023-1-17354 4)定义存储在)定义存储在bdatabdata区域区域的的动态动态unsigned unsigned charchar变量:变量:unsigned char unsigned char bdatabd
29、ata operate,operate1;operate,operate1;5 5)定义存储在)定义存储在idataidata区域区域的的动态动态unsigned unsigned charchar数组:数组:unsigned char unsigned char idataidata temp20;temp20;6 6)定义在)定义在pdatapdata区域区域的的动态动态有符号有符号intint数组:数组:int int pdatapdata send_data30;send_data30;2023-1-17367 7)定义存储在)定义存储在xdataxdata区域区域的的动态动态unsi
30、gned unsigned intint数组:数组:unsigned int unsigned int xdataxdata receiv_buf50;receiv_buf50;8 8)定义存储在)定义存储在codecode区域区域的的unsigned charunsigned char数数组:组:unsigned char unsigned char codecode a10=a10=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;0 x6d,0 x7d,0 x
31、07,0 x7f,0 x6f;/定义共阴极数码管段码数组定义共阴极数码管段码数组2023-1-17375 5、C51 C51变量的存储模式变量的存储模式(P58)(P58)存储模式:存储模式:如果在定义变量时缺省了存如果在定义变量时缺省了存储区,则编译器会自动选择默认的存储区域,储区,则编译器会自动选择默认的存储区域,也就是存储模式也就是存储模式。存储模式分为三种:存储模式分为三种:小模式(小模式(smallsmall)、)、紧凑模式(紧凑模式(compactcompact)和大模式()和大模式(largelarge)。)。编译模式由编译控制命令决定。编译模式由编译控制命令决定。存储模式(编译
32、模式)决定了变量的默存储模式(编译模式)决定了变量的默认存储区域和参数的传递方法认存储区域和参数的传递方法。2023-1-1738(1)(1)smallsmall模式模式在在smallsmall模式下,变量的默认存储区域是模式下,变量的默认存储区域是“data”“data”、“idata”“idata”,并且,并且堆栈也安排在堆栈也安排在该区域中该区域中。smallsmall模式的特点:模式的特点:存储容量小,但速度存储容量小,但速度快。快。默认存储模式:默认存储模式:如果文件或函数未指明如果文件或函数未指明存储模式,则编译器按存储模式,则编译器按smallsmall模式处理模式处理。2023
33、-1-1739 (2)compact(2)compact模式模式在在compactcompact模式下,变量的默认存储区域模式下,变量的默认存储区域是是“pdata”pdata”,最大变量数为,最大变量数为256256字节,并且字节,并且堆栈也安排在该区域中堆栈也安排在该区域中。compactcompact模式的其特点:模式的其特点:是存储容量较是存储容量较smallsmall模式大,速度较模式大,速度较smallsmall模式稍慢,但比模式稍慢,但比largelarge模式要快。模式要快。2023-1-1740(3)large(3)large模式模式在在largelarge模式下,变量的默认
34、存储区域是模式下,变量的默认存储区域是“xdata”xdata”,最大变量数可达,最大变量数可达64KB64KB。largelarge模式的特点:模式的特点:存储容量大,速度慢存储容量大,速度慢2023-1-1741默认存储模式:默认存储模式:如果文件或函数未指明如果文件或函数未指明存储模式,则编译器按存储模式,则编译器按smallsmall模式处理模式处理。存储模式控制命令:存储模式控制命令:“#pragma#pragma small(small(或或compactcompact、large)”large)”应放在文件的应放在文件的开始。开始。2023-1-17424.3 C51的运算符20
35、23-1-1743思考题思考题1 1:10/3=?10/3=?10/3.0=?10/3.0=?10/3.00=?10/3.00=?2023-1-1744思考题思考题2 2:j+;j+;j-;j-;+j;+j;-j;-j;例:例:char c=1;char a;char c=1;char a;求:(求:(1 1)a=c+;a=c+;后,后,a a,c c值是多少?值是多少?(2 2)a=+c;a=+c;后,后,a a,c c值是多少?值是多少?2023-1-17451|1=1|1=?4|5=4|5=?2023-1-17462023-1-1747复合运算符:复合运算符:a+=b;a+=b;x x*
36、=a+b;=a+b;复合运算的表达方式有利于复合运算的表达方式有利于提高编译效提高编译效率率,产生质量较高的目标代码。但可读性,产生质量较高的目标代码。但可读性相对较差。相对较差。2023-1-17484.4 4.4 数组数组1 1、数组、数组:同一类型变量的有序组合。:同一类型变量的有序组合。注:数组和普通变量一样,要先定义再使用。注:数组和普通变量一样,要先定义再使用。2 2、定义方式:、定义方式:数据类型数据类型 数组名数组名 常量常量表达式表达式 unsigned int a10;unsigned int a10;4.4.1 4.4.1 一维数组一维数组2023-1-17493 3、赋
37、值方式:、赋值方式:数据类型数据类型 存储区域存储区域 数组名数组名 常量常量表达式表达式=常量表达式常量表达式;unsigned char bunsigned char b2 2=1,2=1,2;unsigned char unsigned char codecode table=table=0 x3f,0 x06,0 x5b,0 x4f,0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0
38、x5e,0 x79,0 x71;0 x39,0 x5e,0 x79,0 x71;2023-1-17504.4.2 4.4.2 字符数组字符数组1 1、字符数组:、字符数组:基本类型为基本类型为字符类型字符类型的数组。的数组。用来存放字符的。用来存放字符的。2 2、定义:、定义:方法同一般数组。方法同一般数组。如:如:char char a5=h,e,l,l,a5=h,e,l,l,o;o;for(i=0;i5;i+)for(i=0;i5;i+)printf(“%c”,ai);printf(“%c”,ai);2023-1-17513 3、字符串:、字符串:在在C C语言中,将字符串作为字语言中,将
39、字符串作为字符数组来处理的。符数组来处理的。用字符串常量来使字符数组初始化:用字符串常量来使字符数组初始化:char a=“hello”;char a=“hello”;或或:char a=“hello”;char a=“hello”;问:在内存中怎么存储的?问:在内存中怎么存储的?2023-1-1752 注:注:C C语言规定以语言规定以00作为字符串结作为字符串结束的标志,在程序中依靠检测的位置来束的标志,在程序中依靠检测的位置来判定字符串是否结束。判定字符串是否结束。char a=“hello”;i=0;while(ai!=0)write_data(ai);i+;2023-1-17534.
40、5 4.5 指针指针主要内容主要内容4.5.1 4.5.1 指针概念指针概念4.5.2 4.5.2 指针变量的定义、赋值与引用指针变量的定义、赋值与引用4.5.3 Keil C514.5.3 Keil C51的指针类型的指针类型2023-1-1754 指针:指针:对于一个存储单元来讲,单元的对于一个存储单元来讲,单元的地址即为指针。地址即为指针。指针变量:指针变量:存放指针的变量,用来指向存放指针的变量,用来指向另一个变量。另一个变量。区别:区别:一个指针是指一个地址,是一个一个指针是指一个地址,是一个常量;常量;一个指针变量可以被赋予不同的一个指针变量可以被赋予不同的指针(地址),是一个变量
41、。指针(地址),是一个变量。4.5.1 指针概念指针概念2023-1-17554.5.2 4.5.2 指针的定义、赋值与引用指针的定义、赋值与引用1 1、定义、定义其格式为:其格式为:存储类型存储类型 数据类型数据类型 *指针名指针名1 1,*指针名指针名2 2,例如:例如:char char *cpt;cpt;/定义了一个指针变量定义了一个指针变量cptcpt,它所指向的是一个字,它所指向的是一个字符型的数据。符型的数据。或定义或定义cptcpt为指向字符型变量的指针变量为指向字符型变量的指针变量指针说明符指针说明符2023-1-17562 2、赋值(指针变量使用前必须赋值)、赋值(指针变量
42、使用前必须赋值)指针变量只能赋予地址。指针变量只能赋予地址。int cint c;int int*p=&c;(int p=&c;(int*p;p=&c;)p;p=&c;)2023-1-17573 3、指针变量的引用、指针变量的引用注意:注意:指针变量的定义和引用中指针变量的定义和引用中*的意义不的意义不同!同!在指针变量定义中:在指针变量定义中:*是类型说明符,说明是类型说明符,说明其后的变量是指针类型其后的变量是指针类型在指针变量的引用中:在指针变量的引用中:*是运算符,(取内是运算符,(取内容)容)int int*p=&a,int a,c;p=&a,int a,c;c=c=*p;p;202
43、3-1-17584.7 C514.7 C51的程序设计的程序设计4.7.1 C514.7.1 C51程序结构程序结构常用常用C51C51的的头文件:头文件:reg51.h (定义特殊功能寄存器等);(定义特殊功能寄存器等);math.h (数学函数);(数学函数);ctype.h (字符函数);(字符函数);stdio.h (一般(一般IO函数);函数);stdlib.h (标准函数);(标准函数);absacc.h(绝对地址访问);(绝对地址访问);string.h (串函数)(串函数).func1()局部变量定义局部变量定义 funcN()局部变量定义局部变量定义 main()局部变量定义
44、局部变量定义 包含包含 函数声明函数声明全局变量、参数定义全局变量、参数定义2023-1-1759#include sbit LED1=P32;/定义定义SFR中引脚的中引脚的“位位”sbit LED2=P33;sbit LED3=P34;void delayms(unsigned int x);/毫秒延时函数毫秒延时函数 void main(void)/主程序主程序 while(1)/非非0为真,此为无限循环为真,此为无限循环 LED1=0;LED2=1;LED3=1;delayms(1000);LED1=1;LED2=0;LED3=1;delayms(1000);LED1=1;LED2=1
45、;LED3=0;delayms(1000);void delayms(unsigned int x)/毫秒延时函数毫秒延时函数 unsigned char j;while(x-)/非非0,为真,即,为真,即x=0时退出循环时退出循环 for(j=0;j123;j+);包含文件包含文件 全程变量、全程变量、参数定义参数定义函数声明函数声明主函数主函数子函数子函数2023-1-17604.7.2 C514.7.2 C51流程控制流程控制1.选择语句选择语句ifif(表达式表达式)语句语句;例:例:if(p1!=0)c=30;if(条件表达式条件表达式)语句语句1;else 语句语句2;例:例:if
46、(a=b)a+;else a-;当当 a 等于等于 b 时,时,a=a+1,否则否则 a=a-1 if(表达式表达式1)语句语句1;else if(表达式表达式2)语句语句2;else if(表达式表达式3)语句语句3;else if(表达式表达式m)语句语句m;else 语句语句n;注:语句中为单一语句,注:语句中为单一语句,可以不用花括弧。可以不用花括弧。2023-1-1761if if(表达式(表达式1 1)if()if()语句语句1;1;else()else()语句语句2 2;else else if()if()语句语句1;1;else()else()语句语句2 2;嵌套嵌套2023-
47、1-1762 if(k1=0)if(k1=0)num+;num+;if(num=10)if(num=10)num=0;num=0;举例:举例:2023-1-1763switch(表达式表达式)case case 常量表达式常量表达式1:1:语句语句1;break;1;break;case case 常量表达式常量表达式2:2:语句语句2;break;2;break;case case 常量表达式常量表达式3:3:语句语句3;break;3;break;case case 常量表达式常量表达式n:n:语句语句n;break;n;break;default:default:语句语句n+1;n+1;
48、2.switch/case语句语句也不是必须的也不是必须的2023-1-17643.while语句语句while(条件表达式真条件表达式真)语句语句;while(P0!=0)x=P0;先判断先判断后循环后循环例例非零为真非零为真2023-1-1765补充:补充:(a a)while(1)while(1);/;/无限循环无限循环(b b)while(1)while(1).break;break;/退出大循环退出大循环(c c).while(1);/while(1);/停止(等待)停止(等待)2023-1-1766do 语句语句;while(条件表达式真条件表达式真);int sum=0,i=0;
49、do i+;sum=sum+i;while(i=10)先循环先循环后判断后判断例例2023-1-1767for(for(初值设定表达式初值设定表达式;循环条件表达式循环条件表达式;条件更新表达式条件更新表达式)循环语句循环语句;例:例:int i,sum=0;int i,sum=0;for(i=0;i=10;i+)for(i=0;i0;i-)for(i=1000;i0;i-)for(j=110;j0;j-);for(j=110;j0;j-);外层是多少,延外层是多少,延时大约多少时大约多少msms2023-1-1769本课程不是专门学习本课程不是专门学习C C语言的课程,语言的课程,相关相关c
50、 c语言的系统知识请同学们自行复语言的系统知识请同学们自行复(学)习。(学)习。2023-1-17704.8 4.8 函数的定义与调用函数的定义与调用主要内容主要内容4.8.1 4.8.1 函数函数4.8.3 C514.8.3 C51中调用汇编中调用汇编4.8.4 4.8.4 预处理命令预处理命令4.8.5 4.8.5 头文件头文件 2023-1-1771C51C51函数定义的一般格式如下:函数定义的一般格式如下:函数类型函数类型 函数名(形参表)函数名(形参表)局部变量定义局部变量定义执行语句执行语句 2023-1-1772延时若干延时若干msms的子函数:的子函数:void delay(u