MOV 51H,#0FFH AJMP OVER NEXT2:
CJNE @R0,#55H,NEXT MOV 51H,#0 OVER:
18.编写程序,查找片内RAM的30H~50H单元中出现0的次数,并将查找的结果存入51H单元。 MOV R0,30H MOV 51H,#0 NEXT:
CJNE @R0,#00H,NEXT2 INC 51H NEXT2: INC R0
CJNE R0,#51H,NEXT
19.在片外RAM中有一个数据块,存有若干字符、数字,首地址为SOURCE要求将该数据块传送到片内RAM以DIST开始的区域,直到遇到字符“$”时结束($也要传送,它的ASCII码为24H)。 MOV DPTR,#SOURCE MOV R0,#DIST NEXT:
MOVX A,@DPTR MOV @R0,A INC DPTR INC R0
CINE A,#24H,NEXT
20.片内RAM的30H和31H单元中存放着一个16位的二进制数,高位在前,低位在后。编写程序对其求补,并存回原处。 CLR C MOV A,#0 SUBB A,31H MOV 31H,A MOV A,#0 SUBB A,30H MOV 30H,A
21.片内RAM中有两个4字节压缩的BCD码形式存放的十进制数,一个存放在30H~33H单元中,另一个存放在40H~43H单元中。编写程序将它们相加,结果的BCD码存放在30H~33H中。 CLR C
MOV R0,#30H MOV R1,#40H MOV R2,#4 NEXT:
MOV A,@R0 ADDC A,@R1 MOV @R0,A INC R0 INC R1
DJNZ R2,NEXT
22.编写程序,把片外RAM从2000H开始存放的16字节数据,传送到片内从30H开始的单元中。 MOV DPTR,#2000H MOV R0,#30H MOV R1,#0 NEXT:
MOVX A,@DPTR MOV @R0,A INC DPTR INC R0 INC R1
CINE R1,#16H,NEXT
第4章 单片机C语言及程序设计
1.用C51编程较汇编语言有哪些优势? 答:(1)编程容易
(2)容易实现复杂的数值计算 (3)容易阅读、调试、维护程序 (4)容易实现模块化开发 (5)程序可移植性好
2.C51字节数据、整型数据以及长整型数据在存储器中的存储方式各是怎样的?
答:字符变量(char)无论是unsigned char数据还是signed char数据,均为1个字节,即8位,因此被直接存储在RAM中,可能存储在0~0x7f区域(包括位寻址区域),也可能存储在0x80~0xff区域,与变量的定义有关。
整型变量(int)不管是unsigned int数据还是signed int数据,均为2个字节,即16位,其存储方法是高位字节保存在低地址(在前面),低位字节保存在高地址(在后面)。
长整型变量(long)为4个字节,即32位,其存储方法与整型数据一样,是最高位字节保存的地址最低(在最前面),最低位字节保存的地址最高(在最后面)。
3.C51定义变量的一般格式是什么?变量的4种属性是什么?特别要注意存储区属性。
答:[存储类型] 数据类型 [存储区] 变量名1[=初值] [,变量名2[=初值]] [,…] 变量的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中,对汇编语言函数的命名规则是怎样的,具体地说:不传递参数的函数名格式是什么?通过寄存器传递参数的函数名格式是什么?传递参数重入函数的函数名格式是什么?
答:?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
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,将