[,?]
变量的4种属性是存储类型,数据类型,存储区,变量名
4.C51的数据存储区域类型有哪些?各种存储区域类型是哪种存储空间,存储范围是什么?如何将变量定义存储到确定的位置?
答:bit 片内数据区的位寻找区,位地址0x00~0x7f,128位(字节地址0x20~0x2f)
data 直接寻址片内数据区的低128字节
bdata 片内数据区的位寻址区0x20~0x2f,也可字节访问,16字节 idata 间接寻址片内数据区的256字节,与MOV @Ri 对应
pdata 分页寻址片外数据区的256字节,与MOVX @Ri 对应,P2不变 xdata 片外数据区的全空间,64KB code 全部程序存储空间,64KB
绝对定位关键字_at_ ,指针,库函数的绝对定位宏。
5.C51位变量的定义格式是什么?如何定义bdata型字节变量的位变量?
答:[存储类型] bit 位变量名1[=初值] [,位变量名2[=初值]] [,?] sbit 位变量名 = bdata型变量名^位号常数 6.如何定义8位字节型特殊功能寄存器?如何定义16位特殊功能寄存器?如何定义特殊功能寄存器的位变量?
答:sfr 特殊功能寄存器名 = 地址常数 sfr16 特殊功能寄存器名 = 地址常数
sbit 位变量名 = 特殊功能寄存器名^位号常数
7.C51专用指针定义的一般格式是什么?如何确定专用指针定义的指向空间和指针变量本身存储的空间?
答:[存储类型] 数据类型 指向存储区 *[指针存储区] 指针名1 [,*[指针存储区] 指针名2,?]
*的左面是指向存储区,*的右面是指针存储区
8.C51函数定义的一般形式是什么?如何定义中断处理程序?如何选择工作寄存器组?
答:返回类型 函数名(形参表) [函数模式] [reentrant] [interrupt m] [using n] {
局部变量定义 执行语句 }
[interrupt m]字段中的m定义中断处理程序的中断号 [using n]字段中的n选择工作寄存器组
9.在C51中,对汇编语言函数的命名规则是怎样的,具体地说:不传递参数的函数名格式是什么?通过寄存器传递参数的函数名格式是什么?传递参数重入
11
函数的函数名格式是什么?
答:?PR?函数名?模块名 //不传递参数
?PR?_函数名?模块名 //通过寄存器传递参数
?PR?_?函数名?模块名 //对重入函数通过堆栈传递参数
10.在C51中,函数返回值传递的规则是什么? 答:(1)调用时参数的传递 分三种情况:少于等于3个参数时通过寄存器传递(寄存器不够用时通过存储区传递),多于3个时有一部分通过存储区传递,对于重入函数参数通过堆栈传递。通过寄存器传递速度最快。 (2)函数返回值的传递
当函数有返回值时,其传递都是通过寄存器
11.在C51中,怎样嵌入汇编语言程序?怎样进行处理实现混合编程? 答:其方法是用编译控制指令“#pragma src”、“#pragma asm”和“#pragma endasm”实现。编译控制命令“#pragma src”是控制编译器将C源文件编译成汇编文件,“#pragma src”要放在文件的开始;“#pragma asm”和“#pragma endasm”指示汇编语言程序的开始和结束,分别放在汇编程序段的前面和后面。 对于函数的调用方法,与调用汇编语言中的函数一样,
在C语言文件中调用汇编语言中的函数,必须先声明再调用。声明格式如下: extern 返回值类型 函数名(参数表);
12.在C51中如何定义模块名?在C51文件中的模块名是什么? 答:模块定义格式如下: NAME 模块名 13.在汇编语言文件中:怎样声明函数段?怎样声明公共函数?怎样声明引用函数?怎样声明引用变量?定义函数的格式是什么? 答:对本模块定义的函数段作声明,其格式为: ?PR?函数名?模块名 SEGMENT CODE 公共函数声明。声明格式为: PUBLIC 函数名
引用声明。声明格式为: EXTRN CODE(函数名) 引用声明。声明格式为:
EXTRN 存储区域类型(变量名) 汇编语言函数的格式如下: RSEG ?PR?函数名?模块名 函数名:
14.在C51中怎样把函数定义到确定的位置? 答:对函数的定位方法, CSEG AT 001BH
12
15.如何在C51文件和汇编语言文件中相互调用对方文件中的函数?
答:汇编语言文件中对于函数的调用方法,与调用汇编语言中的函数一样,如: LCALL DISPLAY
在C语言文件中调用汇编语言中的函数,必须先声明再调用。声明格式如下: extern 返回值类型 函数名(参数表);
例如: extern unsigned char right_shift ( char, char );
16.在C51中,如何访问DATA空间、PDATA空间、XDATA空间、CODE空间某个确定地址单元?
答:用指针定义的访问存储器的宏
使用时需要用预处理命令把该头文件包含到文件中,形式为:#include 。
(1)按字节访问存储器宏的形式 宏名[地址]
(2)按整型数访问存储器宏的形式 宏名[下标]
17.在某程序中需要定义如下变量:
(1)定义数码管的显示0~9的共阴极显示代码(0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07, 0x7f, 0x6f)数组dis_code,将其定义在CODE区。
(2)定义定时器/计数器0的赋计数值的高、低字节变量TL0_L和TH0_H,将其定义在DATA去区的0x30、0x31处。
(3)定义长度为20的无符号字符型数组data_buf于IDATA区中。 (4)定义长度为100的无符号字符型数组data_array于XDATA区中。 (5)先定义一个无符号字符型变量status于BDATA区中,再定义8个与status的8个位对应的位变量flag_lamp1、flag_lamp2、flag_machine1、flag_machine2、flag_port1、flag_port2、flag_calcu1和calcu2(从低位到高位)。
答:(1)unsigned char code dis_code[10]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f};
(2)unsigned char data TL0_L _at_ 0x30, TH0_H _at_ 0x31; (3)unsigned char idata data_buf[20]; (4)unsigned char xdata data_array[100]; (5)unsigned char bdata status; sbit flag_lamp1=status^0; sbit flag_lamp2=status^1; sbit flag_machine1=status^2; sbit flag_machine2=status^3; sbit flag_port1=status^4; sbit flag_port2=status^5; sbit flag_calcu1=status^6; sbit flag_calcu2=status^7;
18.在89C52单片机中增加了定时器/计数器2(T2),修改头文件“REG51.H”,
13
添加如下内容:
(1)特殊功能寄存器T2CON、T2MOD、RCAP2L、RCAP2H、TL2、TH2,地址分别为0xc8~ 0xcd。 (2)对T2CON的8个位分别定义位变量CP_RL2、C_T2、TR2、EXEN2、TCLK、RCLK、EXF2、和TF2(从低位到高位)。
(3)定义位变量T2、T2EX对应于P1口的第0位和第1位;定义位变量ET2对应于EI的第5位;定义位变量PT2对应于IP的第5位;
(4)对P1口的8个位分别定义位变量P0_0、P0_1、P0_2、P0_3、P0_4、P0_5、P0_6和P0_7(从低位到高位)。 答:(1) sfr T2CON=0xc8; sfr T2MOD=0xc9; sfr RCAP2L=0xca; sfr RCAP2H=0xcb; sfr TL2=0xcc; sfr TH2=0xcd; (2)
sbit CP_RL2=T2CON^0; sbit C_T2=T2CON^1; sbit TR2=T2CON^2; sbit EXEN2=T2CON^3; sbit TCLK=T2CON^4; sbit RCLK=T2CON^5; sbit EXF2=T2CON^6; sbit TF2=T2CON^7; (3)
sbit T2=P1^0; sbit T2EX=P1^1; sbit ET2=EI^5; sbit PT2=IP^5; (4)
sbit P0_0=P0^0; sbit P0_1=P0^1; sbit P0_2=P0^2; sbit P0_3=P0^3; sbit P0_4=P0^4; sbit P0_5=P0^5; sbit P0_6=P0^6; sbit P0_7=P0^7; 19.编写一C51函数,把从键盘输入的5位十进制数数转换成一个无符号整型数(假设未超出整型数范围)。设从键盘输入的数存放在一无符号数组中,低位数为低下标元素。
unsigned char data key_buffer[5];
14
unsigned int trans_int(void) {
unsigned char data i; unsigned int data temp=0; for(i=0;i<5;i++) {
temp=temp*10+key_buffer[i]-0x30; }
return temp; }
20.编写一C51函数,把一整型数按十进制数将其各位分离,分离后放在一无符号数组中,便于显示。要求把低位数作为低下标元素。 unsigned char data shu[5]; void main(unsigned int x) {
unsigned int temp; unsigned char i; for(i=0;i<4;i++) {
shu[i]=temp; temp=temp/10;
}
shu[4]=temp; }
21.编写一C51函数,使用专用指针,把片外数据存储器中从0x100开始的30个字节数据,传送到片内从0x40开始的区域中。 void main() {
unsigned char data i,*dpt; unsigned char xdata *xdpt; dpt=0x40; xdpt=0x100;
for(i=0;i<30;i++)
*(dpt+i)=*(xdpt+i); }
22.编写一C51程序,实现从P1口输出产生的流水灯,要求用汇编语言函数实现数据左移或右移。 #pragma src
#include void main() {
15