收藏 分享(赏)

第5章 C语言程序设计及仿真调试.ppt

上传人:涵涵文库 文档编号:5533620 上传时间:2019-03-06 格式:PPT 页数:86 大小:3.74MB
下载 相关 举报
第5章 C语言程序设计及仿真调试.ppt_第1页
第1页 / 共86页
第5章 C语言程序设计及仿真调试.ppt_第2页
第2页 / 共86页
第5章 C语言程序设计及仿真调试.ppt_第3页
第3页 / 共86页
第5章 C语言程序设计及仿真调试.ppt_第4页
第4页 / 共86页
第5章 C语言程序设计及仿真调试.ppt_第5页
第5页 / 共86页
点击查看更多>>
资源描述

1、第五章 单片机的C语言程序设计及仿真调试,任课教师:刘忠国 山东大学课程中心网站:http:/ 宏晶官方网站:http:/ STC单片机编译(汇编)/编程(烧录)/仿真工具说明书; stc15系列单片机器件手册等 keil vision软件下载及指导手册(Helpvision Help) http:/ Keil Software Cx51 编译器用户手册: Cx51编译器-对传统和扩展的8051微处理器的优化的C编译器和库参考,2,第五章 单片机的C语言程序设计及仿真调试,本章学习目标 掌握单片机C语言程序中的常用功能 掌握Keil C的程序设计 掌握STC15F2K60S2单片机C语言程序调

2、试过程,3,汇编语言和C语言的选择问题,设计规模较小的嵌入式应用系统时,可以使用汇编语言。因为代码一般不长,且较简单。 当程序比较复杂,且没有很好的注释时,使用汇编语言编写的程序,可读性和可维护性会很差,代码的可重用性也比较低。 使用C语言编程,编写简单、直观易读、便于维护、通用性好。 在控制任务比较复杂或者具有大量运算的系统中,C语言优势明显。由于模块化,用C语言编写的程序具有很好的可移植性。,4,5.1 单片机C语言程序中的常用功能,5.1.1 逻辑运算和位运算 1、逻辑运算符 逻辑运算符包括与(&), 或(|), 非(!)3种, 用于逻辑运算。 逻辑运算符的表达式, 返回0表示“假”,

3、返回1表示“真”。,5,与运算符(&) 功能:两个条件同时满足时(即两个条件都为真时),结果才为真。 如一个程序在同时满足条件a10和b=7时,则执行某些操作,应使用关系运算符和逻辑与运算符(&) 来写这个条件的代码: (a10)&(b=7)。,1、逻辑运算符,或运算符(|) 功能:检查两个条件中是否有一个为真,只要有一个条件为真,运算结果就为真。 对条件a10和b=7, 若任一条件为真,程序执行某操作,则条件代码为:(a10) | (b=7);,6,逻辑非运算符(!) 功能:表示对表达式的真值取反。 例如,如果变量s小于10,程序需执行某些操作,则条件代码如下: (s=10) /s不大于等于

4、10,2、位运算符,很多系统程序常要求进行位(bit)运算或处理。语言提供了六种位运算符:按位与(&)、按位或(|)、按位异或()、取反()、左移() 。,7,(1)按位“与”运算: 按位与运算符“&” 是双目运算符。 功能: 参与运算的两数各对应二进制位相与。只有对应的两位均为1时,结果位才为1,否则为0。 例如,9&5的算式:00001001&0000010100000001 按位与运算通常用来对某些位清0或保留某些位。 例把16位数a的高8位清0,保留低8位,可作运算:a&255(255的二进制数为0000000011111111)。,(2)按位“或”运算,按位或运算符“|”是双目运算符

5、。 功能是参与运算的两数各对应的二进制位相或。只要对应的两个位有一个为1时,结果位就为1。 例如,9|5的算式:00001001(十进制为9)| 00000101(十进制为5)00001101 (十进制13) 或运算通常用来对某些位置1。,8,(2)按位“异或”运算,按位异或运算符“”是双目运算符。 功能是参与运算的两数各对应的二进制位相异或。当两个对应的位相异时,结果为1。 例如,95的算式: 00001001(十进制为9) 00000101(十进制为5) 00001100 (十进制12) 异或运算通常用来对某些位取反。,9,(4)求反运算,求反运算符“”为单目运算符,具有右结合性。 功能是

6、对参与运算的数的各二进制位按位求反。 例如,9的运算为: (0000000000001001)结果为:1111111111110110,10,(5)左移运算 左移运算符“”是双目运算符。 功能:把“”左边运算数的各二进制位全部左移若干位,由“” 右边的数指定移动位数,高位丢弃,低位补0。 例如:a4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。,(6)右移运算,右移运算符“”是双目运算符。 功能是把“”左边的运算数的各二进制位全部右移若干位,“”右边的数指定移动的位数。 例如,设 a=15,a2000001111右移2位为000

7、00011(十进制3)。 对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。,11,5.1.2 预处理,以“#”号开头的命令是预处理命令。语言的预处理功能包括宏定义#define, 文件包含#include, 条件编译等。 合理地使用预处理功能,可以使得编写的程序便于阅读、修改、移植和调试,也利于模块化程序设计。,12,1、宏定义(#define) 在语言源程序中允许用一个标识符来表示一个字符串,称为宏。被定义为宏的标识符称为宏名。 在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去代换,这称为宏代

8、换或宏展开。 宏代换是由预处理程序自动完成的。在语言中,宏分为有参数和无参数两种。,(1)无参宏定义,无参宏的宏名后不带参数。其定义的一般形式为:#define 标识符 字符串 其中,标识符为所定义的宏名。字符串可以是常数,表达式,格式串等。 若要终止宏定义,可用#undef命令: #undef 标识符 符号常量的定义就是一种无参宏定义。此外,常对程序中反复使用的表达式进行宏定义。,13,例如: #define PI 3.14159#define M (y*y+3*y) 程序中的语句: L=2*PI; s=3*M+M/2; 经宏代换后为:L=2*3.14159; s=3*(y*y+3*y)+(

9、y*y+3*y)/2,(2)带参宏定义,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。 带参宏定义的一般形式为:#define 宏名(形参表) 字符串,14,在字符串中含有各个形参。例如:#define MAX(a,b) (ab)?a:b /取a和b的最大数,例如,程序中的语句: max=MAX(x,y); 经宏代换后为:max=(xy)?x:y;,带参宏调用的一般形式为:宏名(实参表);,2、文件包含(#include),文件包含的一般形式为: #include “文件名“ 功能是把指定文件插入该命令行位置取代该命令

10、行,从而把指定的文件和当前的源程序文件连成一个源文件。,15,说明: (头)文件名可用双引号括起来(用户头文件), 也可用尖括号括起来(系统头文件)。如:#include “stdio.h”, #include 。二者区别: 用尖括号表示在包含文件目录中去查找(包含目录可由用户在开发环境中设置, 一般在INC), 而不在源文件目录去查找;用双引号则表示首先在当前源文件目录中查找, 若未找到才到包含目录中去查找。,3、条件编译,条件编译就是按不同的条件去编译不同的程序部分,从而产生不同的目标代码文件。 条件编译对于程序的移植和调试(可以分段调试)非常有用。特别在操作系统的裁减中,经常使用条件编译

11、。,16,(1)第一种形式:#ifdef 标识符程序段1#else 程序段2#endif 功能是:如果标识符已被#define命令定义过,则对程序段1进行编译;否则对程序段2进行编译。如果没有程序段2(它为空),本格式中的#else可以没有。,3、条件编译,(2)第二种形式: #ifndef 标识符程序段1#else程序段2#endif 功能是:如果标识符未被#define命令定义过则对程序段1进行编译,否则对程序段2进行编译。这与第一种形式的功能正相反。,17,3、条件编译,(3)第三种形式: #if 常量表达式程序段1#else程序段2#endif 功能是,如果常量表达式的值为真(非0),

12、则对程序段1进行编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完成不同的功能。,18,5.2 Keil C 和 ANSI C,Keil C51基本语法与ANSI C相同,针对8051内核单片机硬件等进行了扩展。 5.2.1 Keil C51扩展关键字(共19个)_at_, sbit, sfr, bit, sfr16, idata, bdata, xdata, pdata, data, code, alien, small, compact, large, using, reentrant, interrupt, _task_ 下面分类介绍常用关键字:,19,(或参考keil官网ht

13、tp:/ window Cx51 Compiler Users Guide),(或参考“keil software Cx51 编译器用户手册09.2001-对传统和扩展的8051微处理器的优化的C编译器和库参考”),1、存储区域(Memory Areas),8051结构支持几个物理分开的程序和数据存储空间, 这些存储空间可能: 可读不可写; 可读写; 读写比别的存储空间快。 (1)程序存储器: 程序(CODE)存储区只读不能写 ,可在8051CPU片内或片外或都有, 根据8051派生硬件决定, STC15F2K60S只在片内。 最多可有64K字节的程序存储区。存储程序代码, 包括所有函数和库,

14、 常数变量。8051可执行程序只保存在程序存储区。 C51编译器中, 通过存储类型标识符code可访问程序存储器。,20,关键字,1、存储区域(Memory Areas),(1)程序存储器: 通过存储类型标识符code可访问程序存储器。 code用来限定常量或函数的存储类型, 而程序的函数默认为code存储类型, 并不需code限定符(也可写上)。code一般只用来定义常量, 例: static code unsigned char DPY_TAB16=0X3f, 0X06, 0X5b, 0X4f, 0X66, 0X6d, 0X7d, 0X07, 0X7f, 0X6f, 0X77, 0X7c,

15、 0X39, 0X5e, 0X79, 0X71;/ 用code定义共阴极数码管显示09,AF时对应的字模,21,关键字,1、存储区域(Memory Areas),data:直接寻址区,内部RAM的低128字节, 地址范围是: 00H7FH。idata: 间接寻址区, 包括整个内部RAM区, 256字节, 地址范围为00H0FFH。bdata: 可位寻址区,地址范围为20H2FH。,22,(2)内部RAM数据存储器。 位于51片内,可读写。根据51种类不同,最多256字节。低128字节可直接寻址,而高128字节只能间接寻址。可用以下关键字分为3种存储类型:,特殊功能寄存器(0x800xFF)单独

16、一类,见后。,1、存储区域(Memory Areas),(3)外部数据存储器:可读写。采用数据指针访问,比访问内部数存要慢,最多可达64K字节。外部RAM可由以下关键字标识分为2种存储类型: : xdata:可指定多达64KB的外部直间接寻址区, 地址范围0000H0FFFFH。,23,xdata 可访问外部数存64K字节的任意位置, 只能通过数据指针(MOVX DPTR)来访问。 pdata: 可访问外部数存的一页即256字节, 通过R0和R1 (MOVX Ri)来访问(有时可能需P2指出高8位地址)。,51对外设采取统一编址, 外设也占用此空间, 可通过访问外部数存来控制外设-存储器映射I

17、/O, 所以可用空间可能不足64K字节。,在Xtal(MHz)右侧框输入6, 其余按默认设置。,4-10-2 Keil Vision集成开发环境调试汇编语言程序方法,Project窗口,选中Target 1, 并单击右键, 出现浮动菜单。浮动菜单中选中 Options for Target Target 1.选项。,24,20:20:55,出现Options for Target Target 1 对话框界面。在该界面中,点击Target标签。在该标签界面中,按下面设置参数:,在此设置使用晶振的频率,3. 针对目标硬件设置工具选项,Memory Model右侧下拉选择: Small, Comp

18、act, large。,1、存储区域(Memory Areas),数据存储类型的指定: 变量或函数参数存储类型可由存储模式 (Small, large, Compact) (Options for Target Target 1.选项)指定缺省存储类型; 在small模式下, 函数参数和局部变量位于由data定义的单片机片内数据RAM(007FH)中; 在compact模式下, 函数参数和局部变量位于pdata定义的扩展数据RAM中(访问用MOVX Ri)。 在large模式下, 函数参数和局部变量位于xdata定义的扩展数据RAM中(访问用MOVX DPTR),25,数据,1、存储区域(Me

19、mory Areas),数据存储类型的指定: 变量或函数参数存储类型可由存储模式 (Small, large, Compact) (Options for Target Target 1.选项)指定缺省存储类型; 也可由关键字code、data、idata、xdata、pdata直接声明指定。 例如: unsigned char data buffer;char code array =“hello!”;unsigned char xdata arr1044;,26,数据,1、存储区域(Memory Areas),(4)特殊功能寄存器(SFR) (128字节: 0x800xFF) 单片机特殊功

20、能寄存器(SFR)可位寻址,字节寻址或字寻址, 用来控制定时器, 计数器, 串口, I/O及其他部件。 通过关键字sfr, sfr16和sbit声明数据类型,访问SFR。,27,sfr:字节寻址。语法如下:sfr sfr_name = int_constant; 如 sfr P0=0x80; 0x80为P0口寄存器的地址, “=” 后为常数用来指定地址, 且其范围必须位于80H到FFH。,sfr16:字寻址。 如sfr16 DPTR=0x82 ;指定DPTR地址DPL=0x82, DPH=0x83。,(4)特殊功能寄存器(SFR) (128字节: 0x800xFF),sbit:位寻址用于声明可

21、位寻址的特殊功能寄存器位变量,三种方法:,28,方法1:sbit bitname=sfr_namebit_number;sfr_name必须是已定义SFR的名字, bit_number是位号(07)。如:sbit CY=PSW7; /定义CY为PSW的第7位。 方法2:sbit bitname=sfr_addressbit_number;sfr_address是SFR所在地址(0x800xff), bit_number是位号(07)。如:sbit OV=0xD02;/定义PSW中的OV位 方法3:sbit bitname=bit_address;其中,bit_address是位地址。如: sb

22、it EA=0xAF; /第0xAF位为IE寄存器的EA位(见46页特殊功能寄存器SFR中位地址),IE字节地址A8H,20:20,位寻址区-图3-11特殊功能寄存器SFR中位地址,特殊功能寄存器中位地址范围: 80H0FFH。,图3-11特殊功能寄存器中的位地址,29,1、存储区域(Memory Areas),Keil Cx51没有预先定义SFR的名字, 而是提供了一个包含所有特殊功能寄存器和它们的位定义的头文件reg51.h。通过包含头文件可很容易的进行新的扩展。 附录C提供了STC15F2K60S2单片机的头文件stc15.h的内容,其中包含了标准8051单片机寄存器的定义,编程时只需包

23、含这一个文件即可。 该文件可从www.mcu001stcmcu. com中下载。在STC新ISP软件V6.85I中选择菜单选项 “头文件”即可找到STC各系列的头文件(包括stc15.h)。,30,1、存储区域(Memory Areas),STC15F2K60S2单片机的头文件stc15.h的内容,,31,/*- 8051内核特殊功能寄存器 -*/ sfr ACC = 0xE0; /累加器 sfr B = 0xF0; /B 寄存器 sfr PSW = 0xD0; /程序状态字寄存器 sbit CY = PSW7; /进位标志位 sbit AC = PSW6; /辅助进位标志位 sbit F0

24、= PSW5; /用户标志位0 sbit RS1 = PSW4; /工作寄存器组选择控制位 sbit RS0 = PSW3; /工作寄存器组选择控制位 sbit OV = PSW2; /溢出标志位 sbit F1 = PSW1; /用户标志位1 sbit P = PSW0; /奇偶标志位 sfr SP = 0x81; /堆栈指针寄存器 sfr DPL = 0x82; /数据指针0低字节 sfr DPH = 0x83; /数据指针0高字节 /*- 系统管理特殊功能寄存器 -*/ sfr PCON = 0x87; /电源控制寄存器 sfr AUXR = 0x8E; /辅助寄存器 sfr INT_C

25、LKO = 0x8F; /外部中断和时钟输出控制寄存器 sfr AUXR1 = 0xA2; /辅助寄存器1 sfr CLK_DIV = 0x97; /时钟分频控制寄存器 sfr BUS_SPEED = 0xA1; /总线速度控制寄存器 sfr WKTCL= 0xAA; /掉电唤醒专用定时器低字节 sfr WKTCH= 0xAB; /掉电唤醒专用定时器高字节 /*- 中断控制特殊功能寄存器 -*/ sfr IE = 0xA8; /中断允许寄存器 sbit EA = IE7; /总中断允许位 sbit ELVD = IE6; /低电压检测中断控制位 sbit EADC = IE5; /ADC中断允

26、许控制位 sbit ES = IE4; /串口1中断允许位 sbit ET1 = IE3; /定时器1溢出中断允许位 sbit EX1 = IE2; /外部中断1允许位 sbit ET0 = IE1; /定时器0溢出中断允许位 sbit EX0 = IE0; /外部中断0允许位 sfr IE2 = 0xAF; /中断允许寄存器2 sfr IP = 0xB8; /中断优先级寄存器 sbit PPCA = IP7; / PCA中断优先级控制位 sbit PLVD = IP6; /低电压检测中断优先级控制位 sbit PADC = IP5; /ADC中断优先级控制位 sbit PS = IP4; /

27、串口1中断优先级控制位 sbit PT1 = IP3; /定时器1中断优先级控制位 sbit PX1 = IP2; /外部中断1优先级控制位 sbit PT0 = IP1; /定时器0中断优先级控制位 sbit PX0 = IP0; /外部中断0优先级控制位 sfr IP2 = 0xB5; /第二中断优先级寄存器低字节 /*- I/O 口特殊功能寄存器 -*/ sfr P0 = 0x80; /P0口寄存器 sfr P0M1 = 0x93; /P0口工作模式寄存器1 sfr P0M0 = 0x94; /P0口工作模式寄存器0 sfr P1 = 0x90; /P1口寄存器 sfr P1M1 = 0

28、x91; /P1口工作模式寄存器1 sfr P1M0 = 0x92; /P1口工作模式寄存器0 sfr P1ASF = 0x9D; /P1口模拟量功能设置寄存器 sfr P2 = 0xA0; /P2口寄存器 sfr P2M1 = 0x95; /P2口工作模式寄存器1 sfr P2M0 = 0x96; /P2口工作模式寄存器0 sfr P3 = 0xB0; /P3口寄存器 sbit T1 = P35; /定时器1外部输入 sbit T0 = P34; /定时器0外部输入 sbit INT1 = P33; /外部中断1 sbit INT0 = P32; /外部中断0 sbit TXD = P31;

29、 /串行输入通道 sbit RXD = P30; /串行输出通道 sfr P3M1 = 0xB1; /P3口工作模式寄存器1 sfr P3M0 = 0xB2; /P3口工作模式寄存器0 sfr P4 = 0xC0; /P4口寄存器 sfr P4M1 = 0xB3; / P4口工作模式寄存器1 sfr P4M0 = 0xB4; / P4口工作模式寄存器0 sfr P5 = 0xC8; /P5口(只有P5.3 P5.2 P5.1 P5.0) sfr P5M1 = 0xC9; / P5口工作模式寄存器1 sfr P5M0 = 0xCA; / P5口工作模式寄存器0 sfr P_SW2=0xBA; /

30、外设功能切换控制寄存器 /*- 定时器特殊功能寄存器 -*/ sfr TCON = 0x88; /定时/计数控制寄存器 sbit TF1 = TCON7; /定时器1溢出中断标志 sbit TR1 = TCON6; /定时器1运行控制位 sbit TF0 = TCON5; /定时器0溢出中断标志 sbit TR0 = TCON4; /定时器0运行控制位 sbit IE1 = TCON3; /外部中断1请求标志 sbit IT1 = TCON2; /选择外部中断请求1为边沿触发方式的控制位 sbit IE0 = TCON1; /外部中断0请求标志 sbit IT0 = TCON0; /选择外部中

31、断请求0为边沿触发方式的控制位 sfr TMOD = 0x89; /定时/计数模式控制寄存器 sfr TL0 = 0x8A; /定时/计数器0低字节 sfr TH0 = 0x8C; /定时/计数器0高字节 sfr TL1 = 0x8B; /定时/计数器1低字节 sfr TH1 = 0x8D; /定时/计数器1高字节 sfr T2H=0xD6; /定时器2重新装载时间常数高字节 sfr T2L=0xD7; /定时器2重新装载时间常数低字节 /*- 串行口特殊功能寄存器 -*/ sfr SCON = 0x98; /串行口控制寄存器 sbit SM0 = SCON7; /串行口工作方式设定控制位0(

32、与FE功能复用) sbit FE = SCON7; sbit SM1 = SCON6; /串行口工作方式设定控制位1 sbit SM2 = SCON5; /UART的SM2设定 sbit REN = SCON4; /接收允许位 sbit TB8 = SCON3; /发送数据的第九位 sbit RB8 = SCON2; /接收数据的第九位 sbit TI = SCON1; /发送中断标志 sbit RI = SCON0; /接收中断标志 sfr SBUF = 0x99; /串口数据缓冲器 sfr SADEN = 0xB9; /从机地址掩码寄存器 sfr SADDR = 0xA9; /从机地址寄存

33、器 sfr S2CON = 0x9A; /串行口2控制寄存器 sfr S2BUF = 0x9B; /串行口2数据缓冲器 /*- 看门狗定时器寄存器 -*/ sfr WDT_CONTR = 0xC1; /看门狗定时器控制寄存器 /*- PCA 寄存器 -*/ sfr CCON = 0xD8; /PCA控制寄存器 sbit CF = CCON7; /PCA计数器溢出(CH,CL由FFFFH变为0000H)标志 sbit CR = CCON6; /PCA计数器计数允许控制位 sbit CCF2 = CCON2; /PCA模块2中断标志 sbit CCF1 = CCON1; /PCA模块1中断标志 s

34、bit CCF0 = CCON0; /PCA模块0中断标志 sfr CMOD = 0xD9; /PCA工作模式寄存器 sfr CL = 0xE9; /PCA计数器低8位 sfr CH = 0xF9; /PCA计数器高8位 sfr CCAPM0 = 0xDA; /PAC模块0的工作模式寄存器 sfr CCAPM1 = 0xDB; /PAC模块1的工作模式寄存器 sfr CCAPM2 = 0xDC; /PAC模块2的工作模式寄存器 sfr CCAP0L = 0xEA; /PAC模块0捕捉/比较寄存器低8位 sfr CCAP0H = 0xFA; /PAC模块0捕捉/比较寄存器高8位 sfr CCAP

35、1L = 0xEB; /PAC模块1捕捉/比较寄存器低8位 sfr CCAP1H = 0xFB; /PAC模块1捕捉/比较寄存器高8位 sfr CCAP2L = 0xEC; /PAC模块2捕捉/比较寄存器低8位 sfr CCAP2H = 0xFC; /PAC模块2捕捉/比较寄存器高8位 sfr PCA_PWM0 = 0xF2; /PCA模块0 PWM寄存器 sfr PCA_PWM1 = 0xF3; /PCA模块1 PWM寄存器 sfr PCA_PWM2 = 0xF4; /PCA模块2 PWM寄存器 /*- ADC 寄存器 -*/ sfr ADC_CONTR = 0xBC; /ADC控制寄存器,

36、 本寄存器不支持位操作 sfr ADC_RES = 0xBD; /ADC转换结果高8位寄存器 sfr ADC_RESL = 0xBE; /ADC转换结果低2位寄存器 /*- SPI 寄存器 -*/ sfr SPSTAT = 0xCD; /SPI状态寄存器,本寄存器不支持位操作 sfr SPCTL = 0xCE; /SPI控制寄存器 sfr SPDAT = 0xCF; /SPI数据寄存器 /*- ISP_IAP_EEPROM 寄存器 -*/ sfr IAP_DATA = 0xC2; /ISP/IAP Flash数据寄存器 sfr IAP_ADDRH = 0xC3; /ISP/IAP Flash地

37、址高字节 sfr IAP_ADDRL = 0xC4; /ISP/IAP Flash地址低字节 sfr IAP_CMD = 0xC5; /ISP/IAP Flash命令寄存器 sfr IAP_TRIG = 0xC6; /ISP/IAP Flash命令触发器 sfr IAP_CONTR = 0xC7; /ISP/IAP控制寄存器,2、_at_关键字,若要实现变量的绝对定位(称为绝对变量),可以直接在数据定义后加上“_at_ 常数地址”即可。注意: (1)绝对变量不能被初始化; (2)bit型函数及变量不能用_at_指定。,32,例如:unsigned char idata ADCdata _at_

38、 0x40; /指定ADCdata变量在40H处unsigned char xdata buffer20 _at_ 0x0010;/指定buffer数组从XRAM的0010H单元开始,3、存储模式,存储模式决定了没有明确指定存储类型的变量时、函数参数等的缺省存储区域,有Small、Compact和Large三种模式。,33,指定存储模式,图5-1 指定存储模式,3、存储模式,(1)Small模式 在该模式中所有变量都默认位于单片机内部数据存储器(007FH) ,这和使用data指定存储器类型的方式一样。 此模式访问变量的效率很高,但所有的数据对象和堆栈必须适合内部RAM堆栈的大小。 如果将变量

39、都能配置在内部数据存储器内,Small模式是最佳选择。 该模式的优点是访问速度快,缺点是空间有限,只适用于小程序。,34,(2)Compact模式,所有缺省变量均位于外部RAM区的一页内(256字节),这和使用pdata指定存储器类型一样。 该模式通过寄存器R0和R1(R0,R1)间接寻址。 R0和R1只提供地址低字节,如果COMPACT模式使用多于256字节的外部存储区,高字节地址或页由8051的P2(口地址0A0H)提供; 初始化PORT2及指定PDATA起始地址的工作可在起始代码中STARTUP.A51文件中说明。 该模式空间比Small宽裕,速度比Small慢,比Large快,是一种中

40、间状态。,35,3、存储模式,(3)Large模式 所有缺省变量可放在多达64KB的外部RAM区,这和使用xdata指定存储器类型一样,使用数据指针DPTR进行寻址。 通过数据指针访问外部数据存储器的效率较低,特别是当变量为2个字节或更多字节(用一般指针)时。 Large模式的数据访问比Small和Compact产生更多的代码。 优点是空间大,可存变量多,缺点是速度较慢。,36,4、变量或数据类型,表5-1 C51数据类型,37,4、变量或数据类型,C51提供以下几种扩展数据类型:bit:位变量值为0或1。格式: bit 位名 = value; sbit:从可位寻址的字节中定义的位变量(0或1

41、)。sfr:sfr字节地址(0x800xff)。sfr16:sfr字地址(0x800xff, 其实占用两个连续地址)。例: sfr16 DPTR=0x82h; 其余数据类型如:char、enum、short、int、long、float等与ANSI C相同。下面着重介绍位变量及其声明。,38,0或1,20:20,图3-10 内部RAM中的位地址,20H2FH之间单元既可按字节存取, 也可按位存取,共128位, 位地址范围: 00H7FH。,位寻址区,39,4、变量或数据类型,(1)bit型变量 bit型变量可用于变量类型声明、函数参数列表和函数返回值等, 存储于内部RAM的20H2FH单元中。

42、 注意:1) 使用禁止中断 (#pragma disable) 或用一个明确的寄存器组声明 (using n) 的函数不能返回位值,否则,编译器会识别出来并产生一个错误信息。2) 位不能声明为一个指针。如bit *bit_poiter;是错误的。3) 不能有bit数组如:bit arr5;是错误的。4) bit型函数及变量不能用不能定位到一个绝对地址。,40,(#pragma的作用是设定编译器的状态或者指示编译器完成一些特定的动作),4、变量或数据类型,(2)可位寻址区的说明 使用sbit声明可独立访问可位寻址对象的位。sbit声明要求基址对象的存贮器类型为“bdata”(特殊功能寄存器除外)

43、, 否则只有绝对的位声明方法是合法的。 位的位置( 操作符号后的数字)的最大值依赖于指定的基址变量类型 对于char/uchar而言是07, 对于int/uint/short/ushort而言是015, 对于long/ulong而言是031。,41,4、变量或数据类型,下面举例说明位寻址的声明方法。 例, int bdata bittest _at_ 0x20; /也可省略“_at_ 0x20”sbit bit0= bittest 0; /0x20单元的第0位(bittest的第8位)sbit bit15= bittest 15; /0x21单元的第7位(bittest的第7位)参见“Cx51

44、 Compiler Users Guide ”-“Bit-Addressable Objects”最后一段“Physical bit position 0 refers to bit position 0 of the first byte. Physical bit position 8 refers to bit position 0 of the second byte. Because int variables are stored high-byte first, bit 0 of the integer is located in bit position 0 of the se

45、cond byte. This is physical bit position 8 when accessed using an sbit data type.” 注意:可位寻址对象的位的声明只能放到main函数的外部, 作为全局变量使用, 否则, 编译会出错。bit无限制。,42,先存高字节, 再存低字节,5.2.2 扩展I/O口的使用,STC15F2K60S2单片机除了芯片上的I/O口外,还可在片外扩展I/O端口。 由于使用C语言访问外部I/O时用到指针的功能,因此,首先介绍Keil C51的指针。,43,1、Keil C51指针 Keil C51支持一般指针(Generic Pointer)和存储器指针(Memory Specific Pointer)。 一般指针的声明和使用均与标准C相同,同时还可以说明指针的存储类型。,1、Keil C51指针,例如,下面的语句都声明pt为指向保存在外部RAM中unsigned char数据的指针,但pt本身的保存位置却不同: unsigned char xdata *pt; /pt本身依存储模式存放 unsigned char xdata * data pt; /pt被保存在内部RAM中 unsigned char xdata * xdata pt; /pt被保存在外部RAM中,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报