最全单片机参考答案(姜志海)

答:除了通常的C数据类型外,C51编译器支持bit数据类型。 采用关键字“bit”进行定义。如: bit direction_bit; bit lock_pointer; bit display_invers;

/* 将direction_bit定义为位变量 */ /* 将lock_pointer定义为位变量 */ /* 将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

9.C51采用什么形式对绝对地址进行访问?

答:绝对地址的访问包括片内RAM、片外RAM及I/O的访问。C51提供了两种比较常用的访问绝对地址的方法。

(1)绝对宏

C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。在程序中,用“#include”即可使用其中声明的宏来访问绝对地址,包括CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD,具体使用方法参考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;

10

(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;

(6)定义特殊功能寄存器变量P3。

Sfr P3=0xB0;

11.break和continue语句的区别是什么?

答:break语句用于从循环代码中退出,然后执行循环语句之后的语句,不再进入循环。 Continue语句用于退出当前循环,不再执行本轮循环,程序代码从下一轮循环开始执行,直

到判断条件不满足为止。

和break的区别是该语句不是退出整个循环。

12.复习C语言的基本运算、数组、指针、函数、流程控制语句

答:参看课本P35~P68。

11

第3章 单片机内部资源的C51编程

1.在8051系统中,已知振荡频率是12MHz,用定时器/计数器T0实现从P1.1产生周期是2s的方波,试编程。

#include sbit P1_1=P1^1; unsigned char i;

void timer0over(void); void main( ) //{ i=0; TMOD=0x01;

TH0=(65536-50000)/256; TL0=(65536-50000)%6; TR0=1;

for(;;) { if(TF0)

timer0over( );

} }

void timer0over(void) {

TH0=(65536-50000)/256; TL0=(65536-50000)%6; TF0=0;

//定义位变量 //定时次数

//函数声明(定时50ms函数) 主函数

//定时器T0定时50ms,方式1

//开T0

12

联系客服:779662525#qq.com(#替换为@)