《完美版课件资料单片机_4.ppt》由会员分享,可在线阅读,更多相关《完美版课件资料单片机_4.ppt(128页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第 4 章 单片机C语言程序设计羊大立E-mail: yangdali 主要内容主要内容一、一、C C语言与语言与MCS-51MCS-51二、二、C51C51的数据类型的数据类型三、三、C51C51的运算量与存储类型的运算量与存储类型四、四、C51C51的的运算符和表达式运算符和表达式五、表达式语句与复合语句五、表达式语句与复合语句六、六、C51C51的输入的输入/输出输出七、七、C51C51的程序结构的程序结构八、函数八、函数九、九、C51C51构造数据类型构造数据类型一、一、C C语言与语言与MCS-51MCS-511、C语言与语言与51单片机单片机2、C51与标准与标准C3、C51程序结
2、构程序结构1、C语言与语言与51单片机单片机nC语言目前已成为电子工程师进行单片机系统语言目前已成为电子工程师进行单片机系统开发时的常用编程语言。开发时的常用编程语言。n用用C语言来编写目标系统软件,会大大缩短开语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改发周期,且明显地增加软件的可读性,便于改进和扩充。进和扩充。n用用C语言编写的应用程序必须经单片机的语言编写的应用程序必须经单片机的C语语言编译器言编译器(简称简称C51),转换生成单片机可执行,转换生成单片机可执行的代码程序。的代码程序。n基于基于51系列单片机的系列单片机的C语言或语言或C语言编译器简语言编
3、译器简称为称为C51语言或语言或C51。1、C语言与语言与51单片机单片机n用汇编程序设计用汇编程序设计MCS51系列单片机应用程序系列单片机应用程序时,必须要考虑其时,必须要考虑其存储器结构存储器结构,尤其必须考虑,尤其必须考虑其片内数据存储器与特殊功能寄存器正确、合其片内数据存储器与特殊功能寄存器正确、合理的使用以及按实际地址处理端口数据。理的使用以及按实际地址处理端口数据。n用用C语言编写语言编写MCS51单片机的应用程序,虽单片机的应用程序,虽然不像用汇编语言那样具体地组织、分配存储然不像用汇编语言那样具体地组织、分配存储器资源和处理端口数据,但在器资源和处理端口数据,但在C语言编程中
4、,语言编程中,对数据类型与变量的定义,必须要与单片机的对数据类型与变量的定义,必须要与单片机的存储结构相关联,否则编译器不能正确地映射存储结构相关联,否则编译器不能正确地映射定位。定位。1、C语言与语言与51单片机单片机n支持支持MCS51系列单片机的系列单片机的C语言编译语言编译器有很多种。如器有很多种。如American Automation、Avocet、BSO/TASKING、DUNFIELD SHAREWARE、KEIL、Franklin等。等。n其中其中KEIL以它的代码紧凑和使用方便等以它的代码紧凑和使用方便等特点优于其它编译器,目前用得最为普特点优于其它编译器,目前用得最为普遍
5、。遍。2、C51与标准与标准CnC51的主要语法规定、程序结构及程序设计方法的主要语法规定、程序结构及程序设计方法都与标准的都与标准的C语言相同,但在某些方面有区别。语言相同,但在某些方面有区别。n具体地说,在以下几个方面不一样:具体地说,在以下几个方面不一样:(1)C51中定义的中定义的库函数库函数和标准和标准C语言定义的语言定义的库函数不同。标准的库函数不同。标准的C语言定义的库函数是按语言定义的库函数是按通用微型计算机来定义的,而通用微型计算机来定义的,而C51中的库函数中的库函数是按是按MCS-51单片机相应情况来定义的;单片机相应情况来定义的;(2)C51中的中的数据类型数据类型与标
6、准与标准C的数据类型也的数据类型也有一定的区别,在有一定的区别,在C51中还增加了几种针对中还增加了几种针对MCS-51单片机特有的数据类型;单片机特有的数据类型;2、C51与标准与标准C(3)C51变量的变量的存储模式存储模式与标准与标准C中变量的存中变量的存储模式不一样,储模式不一样,C51中变量的存储模式是与中变量的存储模式是与MCS-51单片机的存储器紧密相关的;单片机的存储器紧密相关的;(4)C51与标准与标准C的的输入输出处理输入输出处理不一样,不一样,C51中的输入输出是通过中的输入输出是通过MCS-51串行口来串行口来完成的,输入输出指令执行前必须要对串行完成的,输入输出指令执
7、行前必须要对串行口进行初始化;口进行初始化;(5)C51与标准与标准C在在函数函数使用方面也有一定的使用方面也有一定的区别,区别,C51中有专门的中断函数。中有专门的中断函数。表表1 ANSI C标标准关准关键键字字关关键键字字用用 途途说说明明auto存储种类说明用于声明局部变量,为默认值break程序语句退出最内层循环体case程序语句switch语句中的选择项char数据类型声明单字节整型数或字符型数据const存储种类说明在程序执行过程中不可修改的值continue程序语句转向下一次循环default程序语句switch语句中缺省选择项do程序语句构成dowhile 循环结构doubl
8、e数据类型声明双精度浮点数else程序语句构成ifelse 条件结构enum数据类型声明枚举类型数据extern存储种类说明在其他程序模块中声明了的全局变量float数据类型声明单精度浮点数for程序语句构成for循环结构goto程序语句构成goto循环结构if程序语句构成ifelse 条件结构int数据类型声明整型数long数据类型声明长整型数register存储种类说明使用CPU内部寄存器变量return程序语句函数返回short数据类型声明短整型signed数据类型声明有符号整型数sizeof运算符计算表达式或数据类型的字节数static存储种类说明静态变量struct数据类型声明结构体
9、类型数据switch程序语句构成switch选择结构typedef数据类型声明重新进行数据类型定义union数据类型声明联合类型数据unsigned数据类型声明无符号数据void数据类型声明无类型数据或函数volatile数据类型声明声明该变量在程序执行中可被隐含地改变while程序语句构成while和dowhile循环结构表表2 C51编译编译器器扩扩充关充关键键字字关关键键字字用途用途说说明明_at_地址定位地址定位为变为变量量进进行行绝对绝对地址定位地址定位_priority_ 多任多任务优务优先声先声明明规规定定RTX51或或RTX51 Tiny的任的任务优务优先先级级_task_任任
10、务务声明声明定定义实时义实时多任多任务务函数函数alien函数特性声明函数特性声明用于声明与用于声明与PL/M51兼容的函数兼容的函数bdata存存储储器器类类型声型声明明可位可位寻寻址的址的MCS-51内部数据存内部数据存储储器器bit位位变变量声明量声明声明一个位声明一个位变变量或位量或位类类型函数型函数code存存储储器器类类型声型声明明MCS-51的程序存的程序存储储空空间间compact存存储储器模式器模式按按compact模式分配模式分配变变量的存量的存储储空空间间data存存储储器器类类型声型声明明直接直接寻寻址址MCS-51的内部数据寄存器的内部数据寄存器idata存存储储器器
11、类类型声明型声明间间接接寻寻址址MCS-51的内部数据寄的内部数据寄存器存器interrupt中断函数声明中断函数声明定定义义一个中断服一个中断服务务函数函数large存存储储器模式器模式按按large模式分配模式分配变变量的存量的存储储空空间间pdata存存储储器器类类型声明型声明分分页寻页寻址的址的51外部数据空外部数据空间间sbit位位变变量声明量声明声明一个位声明一个位变变量量sfr特殊功能寄存器特殊功能寄存器声明声明声明一个声明一个8位特殊功能寄存器位特殊功能寄存器sfr16特殊功能寄存器特殊功能寄存器声明声明声明一个声明一个16位特殊功能寄存器位特殊功能寄存器small存存储储器模
12、式器模式按按small模式分配模式分配变变量的存量的存储储空空间间using寄存器寄存器组组定定义义定定义义MCS-51的工作寄存器的工作寄存器组组xdata存存储储器器类类型声明型声明定定义义MCS-51外部数据空外部数据空间间3、C51程序结构程序结构n和标准和标准C程序结构相同,采用函数结构程序结构相同,采用函数结构n每个每个C51程序由一个或多个函数组成,在这程序由一个或多个函数组成,在这些函数中至少应包含一个主函数些函数中至少应包含一个主函数main(),也可以包含一个也可以包含一个main()函数和若干个其它函数和若干个其它的功能函数。的功能函数。程序的执行总是从程序的执行总是从m
13、ain()函函数开始的,其位置无特殊规定。数开始的,其位置无特殊规定。n程序的开始部分一般是预处理命令、函数程序的开始部分一般是预处理命令、函数说明和变量定义等。说明和变量定义等。预处理命令预处理命令 include函数说明函数说明 long fun1();float fun2();int x,y;float z;功能函数功能函数1 fun1()函数体函数体 功能函数功能函数2 fun2()函数体函数体 主函数主函数 main()主函数体主函数体 实例实例 简单控制指示灯简单控制指示灯n功能要求:功能要求:u系统启动后,当按下一个按钮开关后再系统启动后,当按下一个按钮开关后再闪烁闪烁5次后熄灭
14、。次后熄灭。u以后每次按下按钮开关,发光二极管都以后每次按下按钮开关,发光二极管都会闪烁会闪烁5次。次。硬件设计:硬件设计:硬件设计:硬件设计:实际动手:实际动手:仿真:(仿真:(Proteus)C程序程序(续续):#include#include sbit p10=P10;sbit p20=P20;void delay(unsigned int i);void main()int n,c;P1=0 xff;P2=0 xff;C程序程序(续续):if(p20=0)c=1;if(c=1)n=5;while(n0)p10=0;delay(10000000);p10=1;delay(10000000
15、);n-;c=0;C程序程序(续续):void delay(unsigned int i)unsigned int j;for(j=0;ji;j+)汇编程序汇编程序org 0000hsjmp mainorg 0030hmain:mov p2,#0ffh mov c,p2.0 jc main mov r0,#5hloop:mov p1,#00h acall delay mov p1,#0ffh acall delay djnz r0,loop sjmp main汇编程序汇编程序delay:mov r1,#05hnext2:mov r2,#0ffhnext1:mov r3,#0FFh djnz r
16、3,$djnz r2,next1 djnz r1,next2 retend二、二、C51C51的数据类型的数据类型基本数据基本数据类类型型长长度度取取值值范范围围unsigned char1字字节节0255signed char1字字节节-128+127unsigned int2字字节节065535signed int2字字节节-32768+32767unsigned long4字字节节04294967295signed long4字字节节-2147483648+2147483647float4字字节节 1.175494E-38 3.402823E+38bit1位位0或或1sbit1位位0或或
17、1sfr1字字节节0255sfr162字字节节065535特殊功能寄存器型特殊功能寄存器型n这是这是C51扩充的数据类型,用于访问扩充的数据类型,用于访问MCS-51单片机中的特殊功能寄存器数据,它分单片机中的特殊功能寄存器数据,它分sfr和和sfr16两种类型。两种类型。usfr为字节型特殊功能寄存器类型,占一个内存单元;为字节型特殊功能寄存器类型,占一个内存单元;usfr16为双字节型特殊功能寄存器类型,占用两个字为双字节型特殊功能寄存器类型,占用两个字节单元。利用它们可以访问节单元。利用它们可以访问MCS-51内部的所有两内部的所有两个字节的特殊功能寄存器。个字节的特殊功能寄存器。n在在
18、C51中对特殊功能寄存器的访问必须先用中对特殊功能寄存器的访问必须先用sfr或或sfr16进行声明。进行声明。位类型位类型n这也是这也是C51中扩充的数据类型,用于访问中扩充的数据类型,用于访问MCS-51单片机中的可寻址的位单元。在单片机中的可寻址的位单元。在C51中,支中,支持两种位类型:持两种位类型:bit型和型和sbit型。型。n它们在内存中都只占一个二进制位,其值可以它们在内存中都只占一个二进制位,其值可以是是“1”或或“0”。其中用。其中用bit定义的位变量在定义的位变量在C51编译器编译时,在不同的时候位地址是可编译器编译时,在不同的时候位地址是可以变化的,而用以变化的,而用sb
19、it定义的位变量必须与定义的位变量必须与MCS-51单片机的一个可以寻址位单元或可位寻址的单片机的一个可以寻址位单元或可位寻址的字节单元中的某一位联系在一起,在字节单元中的某一位联系在一起,在C51编译编译器编译时,其对应的位地址是不可变化的。器编译时,其对应的位地址是不可变化的。三、三、C51C51的运算量与存储类型的运算量与存储类型1、常量、常量2、变量、变量 3、存储模式、存储模式4、绝对地址的访问、绝对地址的访问5、对特殊功能寄存器的访问、对特殊功能寄存器的访问6、对并行口的访问、对并行口的访问7、对位地址的访问、对位地址的访问1、常量、常量n常量是指在程序执行过程中其值不能改变的量。
20、nC51中支持整型常量、浮点型常量、字符型常量和字符串型常量。(1)整型常量)整型常量 C51中整型常量可以表示成以下几种形式:u十进制整数。如234、-56、0等。u十六进制整数。以0 x开头表示,如0 x12表示十六进制数12H。u长整数。在C51中当一个整数的值达到长整型的范围,则该数按长整型存放,在存储器中占四个字节,另外,如一个整数后面加一个字母L,这个数在存储器中也按长整型存放。如123L在存储器中占四个字节。(2)浮点型常量)浮点型常量 浮点型常量也就是实型常数。有十进制浮点型常量也就是实型常数。有十进制表示形式和指数表示形式。表示形式和指数表示形式。u十进制表示形式又称定点表示
21、形式,由数十进制表示形式又称定点表示形式,由数字和小数点组成。如字和小数点组成。如 0.123、34.645等都等都是十进制数表示形式的浮点型常量。是十进制数表示形式的浮点型常量。u指数表示形式为:指数表示形式为:数字数字.数字数字 e 数字数字 例如:例如:123.456e-3、-3.123e2等都是指等都是指数形式的浮点型常量。数形式的浮点型常量。(3)字符型常量)字符型常量u字符型常量是加字符型常量是加单引号单引号的字符,如的字符,如a、1、F等。等。u可以是可显示的可以是可显示的ASCII字符,也可以是不可显字符,也可以是不可显示的控制字符。示的控制字符。u对不可显示的控制字符须在前面
22、加上反斜杠对不可显示的控制字符须在前面加上反斜杠“”组成转义字符。利用它可以完成一些特组成转义字符。利用它可以完成一些特殊功能和输出时的格式控制。常用的转义字殊功能和输出时的格式控制。常用的转义字符如课本符如课本P73表表4-4所示。所示。表表4.4 常用转义字符常用转义字符转义转义字符字符含含 义义ASCII码码 0空字符(空字符(null)00H n换换行符(行符(LF)0AH r回回车车符(符(CR)0DH t水平制表符(水平制表符(HT)09H b退格符(退格符(BS)08H f换页换页符(符(FF)0CH 单单引号引号27H”双引号双引号22H 反斜杠反斜杠5CH(4)字符串型常量)
23、字符串型常量u字符串型常量由字符串型常量由双引号双引号“”括起的字符组成。括起的字符组成。如如“D”、“1234”、“ABCD”等。等。u字符串常量与字符常量是不一样的,一个字符字符串常量与字符常量是不一样的,一个字符常量在计算机内只用一个字节存放,而一个字常量在计算机内只用一个字节存放,而一个字符串常量在内存中存放时不仅双引号内的字符符串常量在内存中存放时不仅双引号内的字符一个占一个字节,而且系统会自动的在后面加一个占一个字节,而且系统会自动的在后面加一个转义字符一个转义字符“0”作为字符串结束符。因此作为字符串结束符。因此不要将字符常量和字符串常量混淆,如字符常不要将字符常量和字符串常量混
24、淆,如字符常量量A和字符串常量和字符串常量“A”是不一样的。是不一样的。2、变量、变量 n在在C51中,变量在使用前必须对变量进行中,变量在使用前必须对变量进行定义,指出变量的数据类型和存储模式。定义,指出变量的数据类型和存储模式。以便编译系统为它分配相应的存储单元。以便编译系统为它分配相应的存储单元。定义的格式如下:定义的格式如下:存储种类存储种类 数据类型数据类型 存储器类型存储器类型 变量名表变量名表(1)存储种类)存储种类n存储种类是指变量在程序执行过程中的作用范存储种类是指变量在程序执行过程中的作用范围。围。nC51变量的存储种类有四种,分别是自动变量的存储种类有四种,分别是自动(a
25、uto)、外部、外部(extern)、静态、静态(static)和寄存和寄存器器(register)。n如果省略存储种类,则该变量默认为自动如果省略存储种类,则该变量默认为自动(auto)变量。变量。(2)数据类型说明符)数据类型说明符 数据类型说明符:指明变量的数据类型,指明变量在存储器中占用的字节数。可以是基本数据类型说明符,也可以是组合数据类型说明符,还可以是用typedef或#define定义的类型别名。在C51中,为了增加程序的可读性,允许用户为系统固有的数据类型说明符用typedef或#define起别名,格式如下:typedef c51固有的数据类型说明符固有的数据类型说明符 别
26、名;别名;或#define 别名别名 C51固有的数据类型说明符;固有的数据类型说明符;定义别名后,就可以用别名代替数据类型说明符对变量进行定义。别名可以用大写,也可以用小写。例如:u#define uchar unsigned char u#define uint unsigned int 这样,在编程中,就可以用uchar代替unsigned char,用uint代替unsigned int来定义变量。(3)存储器类型)存储器类型n存储器类型存储器类型:是指定义变量时,根据:是指定义变量时,根据51单片机存单片机存储器的特点,指明该变量所处的单片机的内存空储器的特点,指明该变量所处的单片机
27、的内存空间。间。nMCS-51单片机的单片机的存储区存储区主要有:主要有:片内数据片内数据存储器,存储器,特殊功能特殊功能寄存器、寄存器、片外数据片外数据存储器、存储器、片内程序片内程序存存储器和储器和片外程序片外程序存储器。存储器。n使用汇编指令访问时,使用不同的指令和不同的使用汇编指令访问时,使用不同的指令和不同的寻址方式即可区分。在寻址方式即可区分。在C51中,则要通过定义中,则要通过定义存存储器类型储器类型来加以说明。来加以说明。(3)存储器类型)存储器类型nC5l编译器支持MCS-51单片机的硬件结构,可完全访问MCS-51硬件系统的所有部分。n编译器通过将变量或者常量定义成不同的存
28、储类型(data,bdata,idata,pdata,xdata,code)的方法,将它们定位在不同的存储区中。存储类型存储类型 与存储空间的对应关系与存储空间的对应关系 data 直接寻址直接寻址片内数据片内数据存储区,访问速度快存储区,访问速度快(128字节字节)bdata 可可位寻址位寻址片内数据片内数据存储区,允许位与字节混合访存储区,允许位与字节混合访问问(16字节字节)idata 间接寻址间接寻址片内数据片内数据存储区,可访问片内全部存储区,可访问片内全部RAM地址空间(地址空间(256字节)由字节)由MOV R0,A指令访问指令访问 pdata 分页寻址分页寻址片外数据片外数据存
29、储区存储区(256字节字节)由由MOVX R0,A指令访问指令访问 xdata 片外数据片外数据存储区存储区(64K),由,由MOVX DPTR,A指指令访问令访问 code 代码代码存储区存储区(64K),由,由MOVC A,A+DPTR指令指令访问访问 表 C51存储器类型(3)存储器类型)存储器类型n若未定义存储类型,则C51编译器自动选择默认存储器类型。默认的存储器类型与C51的存储模式有关。存储模式存储模式 默认的存储器类型默认的存储器类型 SMALL 默认为默认为data,最大为最大为128字节字节 COMPACT 默认为默认为pdata,每页每页256字节字节 LARGE 默认为
30、默认为xdata,最大为最大为64K(4)变量名表)变量名表n变量名表格式:变量名表格式:变量名变量名1=初值初值,变量名,变量名2=初值初值,.n在在C51中规定变量名可以由字母、数字和中规定变量名可以由字母、数字和下划线三种字符组成,且下划线三种字符组成,且第一个字母必须第一个字母必须为为字母字母或或下划线下划线。n变量名有两种:变量名有两种:普通变量普通变量名和名和指针变量指针变量名。名。指针变量名前面要带指针变量名前面要带“*”号。号。例:定义变量例:定义变量char i,j,k;unsigned int xdata m,n;unsigned pdata *dp1;long count
31、;sfr P1=0 x90;3、存储模式、存储模式n如果在变量定义时省略了存储器类型标识符,C51编译器会选择默认的存储器类型。默认的存储器类型由存储模式决定。n存储模式是编译器的编译选项。可在软件中设置,或用预处理命令设置。nC51的存储模式(memory models)有三种:SMALL、COMPACT和LARGE。3、存储模式、存储模式(1)小模式小模式(small model)。在小模式下,所有未声明存储器类型的变量,都默认驻留在内部数据区,即这种方式和用DATA进行显示说明一样。(2)紧凑模式紧凑模式(compact model)。在紧凑模式下,所有未声明存储器类型的变量,都默认驻留
32、在外部数据区的一个页上。即这种方式和用PDATA进行变量存储器类型的说明是一样的。该模式利用R0和R1寄存器来进行间接寻址(R0和Rl)。3、存储模式、存储模式(3)大模式大模式(large model)。在大模式下,所有未声明存储器类型的变量,都默认驻留在外部数据存储区,即和用XDATA进行显示说明一样。此时最大可寻址64KB的存储区域,使用数据指针寄存器(DPTR)来进行间接寻址。3、存储模式、存储模式 设定存储模式的预处理命令:设定存储模式的预处理命令:u#pragma smallu#pragma compactu#pragma large4、绝对地址的访问、绝对地址的访问(1)使用预定
33、义宏访问)使用预定义宏访问(2)使用指针访问)使用指针访问(3)使用)使用 _at_ 关键字访问关键字访问(1)使用预定义宏访问)使用预定义宏访问n C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。规定只能以无符号数方式访问,定义了8个宏定义,其函数原型放在absacc.h文件中。使用时须用预处理命令把该头文件包含到文件中,形式为:#include n这些宏定义函数原型如下:#define CBYTE(unsigned char volatile*)0 x50000L)#define DBYTE(unsigned char volat
34、ile*)0 x40000L)#define PBYTE(unsigned char volatile*)0 x30000L)#define XBYTE(unsigned char volatile*)0 x20000L)#define CWORD(unsigned int volatile*)0 x50000L)#define DWORD(unsigned int volatile*)0 x40000L)#define PWORD(unsigned int volatile*)0 x30000L)#define XWORD(unsigned int volatile*)0 x20000L)说
35、明:说明:Cxxxx:code区,区,Dxxxx:data区,区,Pxxxx:pdata区,区,Xxxxx:xdata区。区。BYTE:以字节形式寻址,:以字节形式寻址,WORD:以字形式寻址。:以字形式寻址。(1)使用预定义宏访问)使用预定义宏访问使用预定义宏访问绝对地址的形式如下:使用预定义宏访问绝对地址的形式如下:宏名宏名地址地址如:如:DBYTE0 x0030 XWORD0 x0005#include#include#define uchar unsigned char#define uint unsigned int void main(void)uchar var1;uint va
36、r2;var1=XBYTE0 x0005;/*访问片外访问片外RAM的的0005字节单元字节单元*/var2=XWORD0 x0000;/*访问片外访问片外RAM的的0000字单元字单元*/XWORD0 x0000=0 xAABB;/*将将0 xAABB送入片外送入片外RAM的的0000H0001H单元中单元中*/.while(1);(2)使用指针访问)使用指针访问 采用指针的方法,可以在C51程序中对任意指定的存储器单元进行访问。方法:先定义,后赋绝对地址值#define uchar unsigned char#define uint unsigned int void test_memor
37、y(void)uchar idata ivar1;uchar xdata *xdp;/*定义一个指向定义一个指向xdata区的指针区的指针*/char data *dp;/*定义一个指向定义一个指向data区的指针区的指针*/uchar idata *idp;/*定义一个指向定义一个指向idata区的指针区的指针*/xdp=0 x1000;/*xdp指针赋值指向指针赋值指向xdata区的区的1000H单元单元*/*xdp=0 x5A;/*数据数据5AH送到送到xdata区的区的1000H单元单元*/dp=0 x61;/*dp指针赋值指向指针赋值指向data区区61H单元单元*/*dp=0 x2
38、3;/*将数据将数据23H送到送到data区区61H单元单元*/idp=&ivar1;/*idp指针指向指针指向idata区的区的ivar1变量变量*/*idp=0 x16;/*数据数据16H送到送到idata区的变量区的变量ivar1所在的地所在的地址单元中,等价于址单元中,等价于ivar1=0 x16*/(3)使用)使用_at_关键字访问关键字访问n格式如下:存储器类型存储器类型 数据类型说明符数据类型说明符 变量名变量名 _at_ 地址常数;地址常数;n说明:u地址常数应在有效地址范围内u用_at_定义的变量必须是全局变量#define uchar unsigned char#defin
39、e uint unsigned int data uchar x1 _at_ 0 x40;/*在在data区中定义字区中定义字节变量节变量x1,它的地址为它的地址为40H*/xdata uint x2 _at_ 0 x2000;/*在在xdata区中定义区中定义字变量字变量x2,它的地址为它的地址为2000H*/void main(void)x1=0 xff;x2=0 x1234;.while(1);5、对特殊功能寄存器的访问、对特殊功能寄存器的访问n如果不作定义,对如果不作定义,对51单片机的特殊功能寄单片机的特殊功能寄存器只能用存器只能用直接寻址方式直接寻址方式访问。访问。n为了能用名字直
40、接访问这些特殊功能寄存为了能用名字直接访问这些特殊功能寄存器,器,C51提供了定义方法。提供了定义方法。n可分为以下两种方法:可分为以下两种方法:(1)用)用sfr/sfr16数据类型访问特殊功能数据类型访问特殊功能寄存器寄存器(2)用)用sbit数据类型访问特殊位数据类型访问特殊位(1)用)用sfr/sfr16数据类型访问数据类型访问n访问特殊功能寄存器可用数据类型定义的访问特殊功能寄存器可用数据类型定义的方法来实现。格式如下:方法来实现。格式如下:sfr/sfr16 特殊功能寄存器名特殊功能寄存器名=地址;地址;n说明:说明:u特殊功能寄存器名必须特殊功能寄存器名必须大写大写。usfr定义
41、定义8位寄存器;位寄存器;sfr16定义定义16位寄存器。位寄存器。u定义之后,就可以程序中直接引用寄存器名了。定义之后,就可以程序中直接引用寄存器名了。u标准标准SFR在在reg51.h等头文件中已经定义好,等头文件中已经定义好,只要只要用用#include包含命令申明包含命令申明即可使用。即可使用。(1)用)用sfr/sfr16数据类型访问数据类型访问n定义举例:定义举例:(地址可在表地址可在表2.4中查出中查出)sfr PSW=0 xd0;sfr SCON=0 x98;sfr TMOD=0 x89;sfr P1=0 x90;sfr16 DPTR=0 x82;sfr16 T1=0X8A;(
42、2)用)用sbit数据类型访问特殊位数据类型访问特殊位nMCS-51单片机内单片机内21个特殊功能寄存器中,个特殊功能寄存器中,共有共有11个特殊功能寄存器是可位寻址的。个特殊功能寄存器是可位寻址的。访问这些特殊位可用关键字访问这些特殊位可用关键字sbit定义数据类定义数据类型来实现。格式如下:型来实现。格式如下:sbit 特殊功能寄存器位名特殊功能寄存器位名=位地址;位地址;n其中,位地址有其中,位地址有3种表示方法:种表示方法:u特殊功能寄存器名特殊功能寄存器名位号位号 (如:如:P10)u特殊功能寄存器地址特殊功能寄存器地址位号位号 (如:如:0 xD00)u特殊功能寄存器绝对位地址特殊
43、功能寄存器绝对位地址 (如:如:0 xD7)(2)用)用sbit数据类型访问特殊位数据类型访问特殊位n定义举例:定义举例:sfr PSW=0 xD0;sbit OV=PSW2;sbit AC=0 xD02;sbit CY=0 xD7;(2)用)用sbit数据类型访问特殊位数据类型访问特殊位n程序中的例子:程序中的例子:#include sbit P10=P10;sbit P12=P12;void main()P10=1;P12=0;.6、对并行口的访问、对并行口的访问(1)内部并口内部并口 用用sfr定义(前面已介绍,略)定义(前面已介绍,略)(2)外部并口外部并口 对片外扩展的并口,应根据其
44、硬件译码对片外扩展的并口,应根据其硬件译码地址,将其看作片外数据存储器的一个单地址,将其看作片外数据存储器的一个单元,使用元,使用#define语句进行定义。定义时用语句进行定义。定义时用绝对地址定义,绝对地址定义在绝对地址定义,绝对地址定义在absacc.h头文件中。头文件中。6、对并行口的访问、对并行口的访问n例:操作片外并口例:操作片外并口#include#define PA XBYTE 0 xffecvoid main()PA=0 x30;/*将数据将数据30H写入地址为写入地址为0 xffec的存储单元或的存储单元或I/O端口端口*/7、对位地址的访问、对位地址的访问nC51中可使用
45、中可使用bit和和sbit数据类型对位地址进数据类型对位地址进行访问。行访问。nbit定义格式如下:定义格式如下:bit 位变量名;位变量名;例:例:bit data a1;bit bdata a2;四、四、C51C51的的运算符和表达式运算符和表达式1 1赋值运算符赋值运算符2 2算术运算符算术运算符3 3自增自减运算符自增自减运算符4 4关系运算符关系运算符5 5逻辑运算符逻辑运算符6 6位运算符位运算符7 7复合运算符复合运算符8.8.对指针操作的运算符对指针操作的运算符9.9.条件运算符条件运算符四、四、C51C51的的运算符和表达式运算符和表达式 1赋值运算符赋值运算符 赋值运算符赋
46、值运算符 =u在在C中它的功能是给变量赋值,如中它的功能是给变量赋值,如x=10。u赋值表达式后面加赋值表达式后面加“;”号就构成了一号就构成了一个赋值表达式语句。个赋值表达式语句。四、四、C51C51的的运算符和表达式运算符和表达式2算术运算符算术运算符C51中的算术运算符如下:中的算术运算符如下:+加或取正值运算符加或取正值运算符 减或取负值运算符减或取负值运算符*乘运算符乘运算符/除运算符除运算符%模(取余)运算符模(取余)运算符,如,如8%5=3,即,即8除除以以5的余数是的余数是33自增自减运算符自增自减运算符 自增:自增:+自减:自减:自增自减运算符可用在操作数之前,自增自减运算符
47、可用在操作数之前,也可放在其后,例如也可放在其后,例如“x=x+1”既可以写既可以写成成“+x”,也可写成,也可写成“x+”,其运算结,其运算结果完全相同。但在表达式中这两种用法是果完全相同。但在表达式中这两种用法是有区别的。有区别的。四、四、C51C51的的运算符和表达式运算符和表达式四、四、C51C51的的运算符和表达式运算符和表达式n例:例:x=99;y=+x;则则y=100,x=100,如果程序改为:,如果程序改为:x=99;y=x+;则则y=99,x=100。在这两种情况下,。在这两种情况下,x都被置为都被置为100。n一般来说,用自增和自减操作生成的程序代码一般来说,用自增和自减操
48、作生成的程序代码比等价的赋值语句生成的代码要快。比等价的赋值语句生成的代码要快。四、四、C51C51的的运算符和表达式运算符和表达式4关系运算符关系运算符 C51中有中有6种关系运算符:种关系运算符:大于大于 =大于等于大于等于 x+12”的计算,应看作是的计算,应看作是“10(x+12)”。四、四、C51C51的的运算符和表达式运算符和表达式5逻辑运算符逻辑运算符逻辑与:逻辑与:&逻辑或:逻辑或:|逻辑非:逻辑非:!用法:用法:逻辑与:条件式逻辑与:条件式1&条件式条件式2。逻辑或:条件式逻辑或:条件式1|条件式条件式2。逻辑非:逻辑非:!条件式。条件式。四、四、C51C51的的运算符和表达
49、式运算符和表达式例如,当例如,当a=7,b=6,c=0时,则:时,则:!a=0,!c=1。a&b=1;!a&b=0;b|c=1。(a0)&(b3)=1;(a8)&(b0)=0。四、四、C51C51的的运算符和表达式运算符和表达式6 6位运算符位运算符 位运算符的作用是按位对变量进行运算,位运算符的作用是按位对变量进行运算,但并不改变参与运算的变量的值。位运算符不能但并不改变参与运算的变量的值。位运算符不能用来对浮点型数据进行操作。位运算一般的表达用来对浮点型数据进行操作。位运算一般的表达形式如下:形式如下:变量变量1 1 位运算符位运算符 变量变量2 2 四、四、C51C51的的运算符和表达式
50、运算符和表达式6 6位运算符位运算符C51C51中共有中共有6 6种位运算符:种位运算符:&按位与按位与|按位或按位或 按位异或按位异或 按位取反按位取反 右移右移四、四、C51C51的的运算符和表达式运算符和表达式6 6位运算符位运算符 位运算符也有优先级,从高到低依次是:位运算符也有优先级,从高到低依次是:(按位取反)(按位取反)(右移)(右移)&(按位与)(按位与)(按位异或)(按位异或)|(按位或)(按位或)四、四、C51C51的的运算符和表达式运算符和表达式如:已知如:已知a=0 x54=0101 0100B,b=0 x3b=0011 1011B,则:,则:a&b=00010000;