5 2 Keil C ANSI C Keil C

  • Slides: 83
Download presentation

§ 5. 2 Keil C 和 ANSI C Ø Keil C 51基本� 法与ANSI C相同,��

§ 5. 2 Keil C 和 ANSI C Ø Keil C 51基本� 法与ANSI C相同,�� 8051内核� 片机硬件等� 行了� 展。 Ø 5. 2. 1 Keil C 51� 展关� 字 (共 19个)(keil帮助文件介� 21个) _at_, sbit, sfr, bit, sfr 16, code, idata, bdata, xdata, pdata, small, compact, large, using, reentrant, _priority_, far interrupt, alien, _task_, alien(声明与Intel编译器PL/M 51兼容的函数)。far声明3字节扩展地 址。 _task_, _priority_分别定义实时多任务操作系统的实时任务及其优 下面分� 介� 常用关� 字: 先级。 (参考keil� 件帮助文件books window →Cx 51 Compiler User's Guide) (或参考keil官网http: //www. keil. com/support/man/docs/c 51/) (或参考“keil software Cx 51 �� 器用� 手册09. 2001 -��� 和� 展的8051微� 理器的� 化的C�� 器和� 参考”) 20

1、存储区域(Memory Areas) 存� 模式 (Small, large, Compact) 数据存� � 型的指定: 数据 Ø 变量或函数参数存储 类型可由

1、存储区域(Memory Areas) 存� 模式 (Small, large, Compact) 数据存� � 型的指定: 数据 Ø 变量或函数参数存储 类型可由 存储 模式 (Small, large, Compact) (Options for Target ‘Target 1’. . . �� )指定缺省存�� 型; Ø 也可由关� 字code、data、idata、bdata、xdata、 pdata直接声明指定。 例如: unsigned char data buffer; char code array[ ]=“hello!”; unsigned char xdata arr[10][4][4]; 27

(4)特殊功能寄存器(SFR) (128字� : 0 x 80~0 x. FF) sbit:位� 址 用于声明可位� 址的特殊功能寄存器位� 量, 三种方法:

(4)特殊功能寄存器(SFR) (128字� : 0 x 80~0 x. FF) sbit:位� 址 用于声明可位� 址的特殊功能寄存器位� 量, 三种方法: 方法 1:sbit bitname=sfr_name^bit_number; sfr_name必� 是已定� SFR的名字, bit_number是位号(0~7)。 如:sbit CY=PSW^7; //定� CY� PSW的第 7位。 方法 2:sbit bitname=sfr_address^bit_number; sfr_address是SFR所在地址(0 x 80~0 xff), bit_number是位号(0~7)。 如:sbit OV=0 x. D 0^2;//定� PSW中的OV位 方法 3:sbit bitname=bit_address; 其中,bit_address是位地址。 如: sbit EA=0 x. AF; //第 0 x. AF位� IE寄存器的EA位 IE位地址 IE字� 地 AEH ADH ACH ABH AAH (� 46�AFH 特殊功能寄存器SFR中位地址) 址A 8 H 寄存器IE位名称 EA ELVD EADC ES ET 1 EX 1 29 A 9 H A 8 H ET 0 EX 0

4、变量或数据类型 数据� 型 bit* signed char unsigned char enum signed short unsigned short signed

4、变量或数据类型 数据� 型 bit* signed char unsigned char enum signed short unsigned short signed int unsigned int signed long unsigned long float sbit* sfr 16* 39 含 � 位型 � 符号字符型 无符号字符型 � 符号短型 无符号短型 � 符号整型 无符号整型 � 符号� 整型 无符号� 整型 浮点型 C 51特有特殊 功能寄存器类 型 表 5 -1 C 51数据类型 位数 (bit) 1 8 8 8/16 16 16 32 32 32 1 8 16 字� 数 (byte) 取� 范� 0或 1 1/8 1 -128~+127 1 0~255 -128~+127 or 1 or 2 32768~+32767 -32768~+32767 2 0~65535 2 -2147483648~ 4 +2147483647 0~4294967295 4 +1. 175494 E 38~ 4 +3. 402823 E+38 1/8 0 -1 1 0 x 80 -0 xff 2 0 x 0000~0 xffff

4、变量或数据类型 定义为char就不存在此不对应问题 下面� 例� 明位� 址的声明方法。先存高字节, 再存低字节 例, int bdata bittest _at_ 0 x

4、变量或数据类型 定义为char就不存在此不对应问题 下面� 例� 明位� 址的声明方法。先存高字节, 再存低字节 例, int bdata bittest _at_ 0 x 20; //也可省略“_at_ 0 x 20” sbit 0= bittest ^0; //0 x 20� 元的第 0位(bittest的第 8位) 0 x 20� 元的0~7位是bittest的第 8~15 � � 位的位置与位号bit 0~7不相 位 符 sbit 15= bittest ^15; //0 x 21� 元的第 7位(bittest的第 7位) 0 x 21� 元的0~7位是bittest的第 0~7位 参� “Cx 51 Compiler User‘s 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 second byte. This is physical bit position 8 when accessed using an sbit data type. ” 注意: 可位� 址� 象的位的声明只能放到main函数的外部, 作� 全局� 量使用, 否� , �� 会出� 。bit无限制。 45

方法 2:使用C 51预定义指针访问外部扩展I/O口 � 了方便�� 外部存� 器及I/O端口, 在C 51的absacc. h � 文件做了如下定� , 利用�

方法 2:使用C 51预定义指针访问外部扩展I/O口 � 了方便�� 外部存� 器及I/O端口, 在C 51的absacc. h � 文件做了如下定� , 利用� 些定� 可以方便地�� 外部I/O端口。 #define CBYTE ((unsigned char volatile code *) 0) #define DBYTE ((unsigned char volatile data *) 0) #define PBYTE ((unsigned char volatile pdata *) 0) #define XBYTE ((unsigned char volatile xdata *) 0) volatile修饰了的变量随程序的执行其值会被改变, “易变” 57

方法 2:使用C 51预定义指针访问外部扩展I/O口 #define XBYTE ((unsigned char volatile xdata *) 0) 定� XBYTE数� 的首地址是

方法 2:使用C 51预定义指针访问外部扩展I/O口 #define XBYTE ((unsigned char volatile xdata *) 0) 定� XBYTE数� 的首地址是 0 例如: #include <absacc. h> #define PORTA XBYTE[0 x 7 ff 0] //其中, PORTA� 程序定� 的I/O端口名称, [ ]内的内容 //7 ff 0 H� PORTA的地址 XBYTE [0 x 7 ff 0]的中括号内的 void main(void) 值 0 x 7 ff 0, 指出了(定义)数组 XBYTE首地址的偏移地址 { char a; PORTA=0 x 81; //*� 出 81 H到端口 7 ff 0 H a=PORTA; //� 端口 7 ff 0 H到� 量a } 58

2、软件设置 按上述要求,将例5 -1中程序� 行改写后的程序如下: #include “stc 15. h” //STC 15 F 2 K 60

2、软件设置 按上述要求,将例5 -1中程序� 行改写后的程序如下: #include “stc 15. h” //STC 15 F 2 K 60 S 2� 片机寄存器定�� 文 件 char code reserved[6] _at_ 0 x 73; //在程序中� 行声明 sbit P 10=P 1^0; //定� P 1. 0引脚 void delay(unsigned long cnt); //延� 函数声明 void main(void) { P 10=1; while(1) //主程序循� { delay(60000); P 10=~P 10; } } void delay(unsigned long cnt) //延� 函数 { while(cnt>0) cnt--; } 80