定位置的方法同上。
第三种方法: sbit 位名=位地址;
这种方法将位的绝对地址赋给变量,地址必须在0x80~0xFF之间。
4.简述C51对51单片机片内I/O口和外部扩展的I/O口的定义方法
答:
C51对51单片机片内I/O口的定义方法是将片内I/O口看成SFR。 C51对51单片机片外I/O的访问有两种比较常用的访问方法: (1)绝对宏
C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。在程序中,用“#include
CBYTE以字节形式对code区寻址;CWORD以字形式对code区寻址; DBYTE以字节形式对data区寻址;DWORD以字形式对data区寻址; XBYTE以字节形式对xdata区寻址;XWORD以字形式对xdata区寻址; PBYTE以字节形式对pdata区寻址;PWORD以字形式对pdata区寻址; (2)_at_关键字
可以使用关键字_at_对指定的存储器空间的绝对地址进行访问,一般格式如下: [存储器类型] 数据类型说明符 变量名 _at_地址常数;
其中,存储器类型为C51能识别的数据类型,如省略则按存储器模式规定的默认存储器类型确定变量的存储器区域;数据类型为C51支持的数据类型;地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;使用_at_定义的变量必须为全局变量。
5.简述C51对51单片机位变量的定义方法
答:除了通常的C数据类型外,C51编译器支持bit数据类型。 采用关键字“bit”进行定义。如: bit direction_bit; bit lock_pointer;
/* 将direction_bit定义为位变量 */ /* 将lock_pointer定义为位变量 */
9
bit display_invers; /* 将display_invers定义为位变量 */
6.C51 和Turbo C 的数据类型和存储类型有哪些异同点?
答:C51增加了位变量,取消了布尔变量。
7.C51 的data、bdata、idata 有什么区别?
答:data、bdata、idata是表明数据的存储类型, data是指片内RAM的低128字节,可在一个周期内直接寻址; bdata是指片内RAM的位寻址区,16字节;
idata是指片内RAM的256字节,必须采用间接寻址。
8.C51中的中断函数和一般的函数有什么不同?
答:C51编译器允许用C51创建中断服务函数,中断函数是由中断系统自动调用的。 中断函数的定义格式为:
函数类型 函数名 interrupt n using n 其中:
interrupt和using为关键字;
interrupt后面的n 为中断源的编号,即中断号; using后面的n所选择的寄存器组,取值范围为0~3。
定义中断函数时,using是一个选项,可以省略不用。如果不用using选项,则由编译
器选择一个寄存器组作为绝对寄存器组。
8051的中断过程通过使用interrupt关键字和中断号(0~31)来实现,中断号告诉编译器中断函数的入口地址。
9.C51采用什么形式对绝对地址进行访问?
答:绝对地址的访问包括片内RAM、片外RAM及I/O的访问。C51提供了两种比较常用的访问绝对地址的方法。
(1)绝对宏
C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。在程序中,用“#include
10
用方法参考absacc.h头文件。其中:
CBYTE以字节形式对code区寻址;CWORD以字形式对code区寻址; DBYTE以字节形式对data区寻址;DWORD以字形式对data区寻址; XBYTE以字节形式对xdata区寻址;XWORD以字形式对xdata区寻址; PBYTE以字节形式对pdata区寻址;PWORD以字形式对pdata区寻址; 如:
#include
#define PORTA XBYTE[0xFFC0]/*将PORT定义为外部I/O口,地址为0xFFC0,长度为8位*/
#define NRAM DBYTE[0x40] /*将NRAM定义为片内RAM,地址为40H,长度为8位*/
(2)_at_关键字
可以使用关键字_at_对指定的存储器空间的绝对地址进行访问,一般格式如下: [存储器类型] 数据类型说明符 变量名 _at_地址常数;
其中,存储器类型为C51能识别的数据类型,如省略则按存储器模式规定的默认存储器类型确定变量的存储器区域;数据类型为C51支持的数据类型;地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;使用_at_定义的变量必须为全局变量。
10.按照给定的数据类型和存储类型,写出下列变量的说明形式
答:
(1)在data区定义字符变量val1
char data vall;
(2)在idata区定义整型变量val2
int idata val2;
(3)在xdata区定义无符号字符型数组val3[4]。 unsigned xdata val3[4];
(4)在xdata区定义一个指向char类型的指针px。 char xdata *px;
(5)定义可位寻址变量flag。
bit flag;
11
(6)定义特殊功能寄存器变量P3。
Sfr P3=0xB0;
11.break和continue语句的区别是什么?
答:break语句用于从循环代码中退出,然后执行循环语句之后的语句,不再进入循环。 Continue语句用于退出当前循环,不再执行本轮循环,程序代码从下一轮循环开始执
行,直到判断条件不满足为止。
和break的区别是该语句不是退出整个循环。
12.C51选择语句、循环语句包含那些?
答:参看课本P68~P77。
13.什么是重入函数?重入函数一般什么情况下使用,使用时有哪些需要注意的地方?
答: 多个函数可以同时使用的函数,称为重入函数。
通常情况下,C51函数不能被递归调用,也不能应用导致递归调用的结构。有此限制是由于函数参数和局部变量是存储在固定的地址单元中。重入函数特性允许你声明一个重入函数。即可以被递归调用的函数。 重入函数可以被递归调用,也可以同时被两个或更多的进程调用。重入函数在实时应用中及中断服务程序代码和非中断程序代码必须共用一个函数的场合中经常用到。
14.如何消除键盘的抖动?
答:由于按键是机械开关结构,所以当用手按下其中一个键时,往往会出现所按键在闭合位置和断开位置之间发生跳几下后才会稳定到闭合状态的情况。在释放一个键时,也会出现类似的情况,这就是键的抖动,抖动的持续时间不一,但通常不会大于10ms。 若抖动问题不解决,就会引起对闭合键的多次读入。对于键抖动最方便的解决方法就是当发现有键按下后,不是立即进行扫描,而是延时大约10ms后再进行。由于一个键按下的时间一般会持续上百毫秒,所以延迟10ms后再扫描处理并不迟。
15.在使用8051的定时器/计数器前,应对它进行初始化,其步骤是什么?
答: (1)确定T/C的工作方式——编程TMOD寄存器; (2)计算T/C中的计数初值,并装载到TH和TL;
(3)T/C在中断方式工作时,须开CPU中断和源中断——编程IE寄存器; (4)启动定时器/计数器——编程TCON中TR1或TR0位。
16.外部中断源初始化步骤是什么?
外部中断源初始化 2个外部中断源:
/INT0中断,外部中断0请求,占用P3.2引脚,其中断请求号为0。 /INT1中断,外部中断1请求,占用P3.3引脚,其中断请求号为2。 (1)TCO寄存器中的IT0、IT1位
12