是已定义的SFR的名字。“^”后的“位置”语句定义了基地址上的特殊位的位置。该位置必须是0~7的数。如:
第二种方法:
sbit 位名=字节地址^位置;
这种方法是以一个整常数为基地址,该值必须在0x80~0xFF之间,并能被8整除,确定位置的方法同上。
第三种方法: sbit 位名=位地址;
这种方法将位的绝对地址赋给变量,地址必须在0x80~0xFF之间。 6.C51 的 data、bdata、idata 有什么区别?(6分)
答:data、bdata、idata是表明数据的存储类型, data是指片内RAM的低128字节,可在一个周期内直接寻址; bdata是指片内RAM的位寻址区,16字节;
idata是指片内RAM的256字节,必须采用间接寻址。 7.C51中的中断函数和一般的函数有什么不同?(6分)
答:C51编译器允许用C51创建中断服务函数,中断函数是由中断系统自动调用的。 中断函数的定义格式为:
函数类型 函数名 interrupt n using n 其中:
interrupt和using为关键字;
interrupt后面的n 为中断源的编号,即中断号; using后面的n所选择的寄存器组,取值范围为0~3。
定义中断函数时,using是一个选项,可以省略不用。如果不用using选项,则由编译器选择一个寄存器组作为绝对寄存器组。
8051的中断过程通过使用interrupt关键字和中断号(0~31)来实现,中断号告诉编译器中断函数的入口地址。
8.按照给定的数据类型和存储类型,写出下列变量的说明形式(6分) (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;
(6)定义特殊功能寄存器变量P3。 答:Sfr P3=0xB0;
9.什么是重入函数?重入函数一般什么情况下使用,使用时有哪些需要注意的地方? 答: 多个函数可以同时使用的函数,称为重入函数。(6分)
通常情况下,C51函数不能被递归调用,也不能应用导致递归调用的结构。有此限制是由于函数参数和局部变量是存储在固定的地址单元中。重入函数特性允许你声明一个重入函数。即可以被递归调用的函数。 重入函数可以被递归调用,也可以同时被两个或更多的进程调用。重入函数在实时应用中及中断服务程序代码和非中断程序代码必须共用一个函数的场合中经常用到。
10.如何消除键盘的抖动?(5分)
答:由于按键是机械开关结构,所以当用手按下其中一个键时,往往会出现所按键在闭合位置和断开位置之间发生跳几下后才会稳定到闭合状态的情况。在释放一个键时,也会出现类似的情况,这就是键的抖动,抖动的持续时间不一,但通常不会大于10ms。 若抖动问题不解决,就会引起对闭合键的多次读入。对于键抖动最方便的解决方法就是当发现有键按下后,不是立即进行扫描,而是延时大约10ms后再进行。由于一个键按下的时间一般会持续上百毫秒,所以延迟10ms后再扫描处理并不迟。
11.在使用8051的定时器/计数器前,应对它进行初始化,其步骤是什么?(4分) 答: (1)确定T/C的工作方式——编程TMOD寄存器; (2)计算T/C中的计数初值,并装载到TH和TL;
(3)T/C在中断方式工作时,须开CPU中断和源中断——编程IE寄存器; (4)启动定时器/计数器——编程TCON中TR1或TR0位。
五、程序分析题(10分)
1.设单片机时钟频率为6MHz,分析下面程序实现什么功能?
#include \sbit P10=P1^0; void main() {
TMOD=0x01;
TH0=(65536-12500)/256; TL0=(65536-12500)%6; ET0=1; EA=1; TR0=1; while(1); }
void T0_srv(void)interrupt 1 using 1 {
TH0=(65536-12500)/256; TL0=(65536-12500)%6; P10=!P10; }
解:P1.0引脚输出50ms周期的方波。
2.分析下面程序实现什么功能?
#include \#include \void init_ser()
{ SCON = 0x50; /*SCON:工作模式1,8-bit UART,允许接收*/ TMOD |= 0x20; /*TMOD:定时器T1,工作模式2, 8位自动重载方式*/ TH1 = 0xf3; /*当波特率为2400时,定时器初值*/ TR1 = 1; /*定时器T1开始运行*/ TI = 1; /*允许发送数据*/ }
long factorial(int n) reentrant { long result; if(n==0) result=1; else result=n*factorial(n-1); return result; }
void main()
{ int j; long tmp; long (*p)(int n); /*函数指针变量定义*/ init_ser(); p=(void*)factorial; /*函数指针变量p指向factorial()函数*/ for(j=0;j<11;++j) { tmp=(*p)(j); /*用指针变量p调用factorial()函数*/ printf(\ } for(;;){;} }
解:输出0~10的阶乘。
六、编程题(30分)
1.在8051系统中,已知振荡频率是12MHz,用定时器/计数器T0实现从P1.1产
生周期是2s的方波,试编程。(10分)
解:
#include
//定义位变量 //定时次数
void timer0over(void); //函数声明(定时50ms函数) void main( ) //主函数 { i=0; TMOD=0x01;
//定时器T0定时50ms,方式1
TH0=(65536-50000)/256; TL0=(65536-50000)%6; TR0=1; for(;;) { }
if(TF0)
timer0over( );
//开T0
}
void timer0over(void) {
TH0=(65536-50000)/256; TL0=(65536-50000)%6; TF0=0; i++;
if(i==20) { } }
i=0;
P1_1=!P1_1;
//20次到了吗?
2.在8051系统中,已知振荡频率是12MHz,用定时器/计数器T1实现从P1.1产生高
电平宽度是10ms,低电平宽度是20ms的矩形波,试编程。(10分) 解:
#include
void main( ) { i=0; TMOD=0x10;
//T1定时方式1,定时时间10ms
//主函数
TH0=(65536-10000)/256; TL0=(65536-10000)%6; EA=1; ET1=1;
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库C51语言复习题参考答案(2)在线全文阅读。
相关推荐: