答: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;
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; i++;
if(i==20)
{ i=0;
P1_1=!P1_1;
主函数
//定时器T0定时50ms,方式1
//开T0
//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; TR1=1; while(1); }
void timer1_int(void) interrupt 3 {
TH0=(65536-10000)/256; TL0=(65536-10000)%6; i++;
if(i==1) P1_1=0; else if(i==3) {
} }
i=0; P1_1=1;
3.用单片机和内部定时器来产生矩形波,要求频率为100Hz,占空比为2:1,设单片机的时钟频率为12MHz,写出有关程序。(10分) 解:
#include
void main() { }
void timer1_int(void) interrupt 3 {
TH0=(65536-10000)/256; TL0=(65536-10000)%6; i++;
if(i==2) P1_1=0; i=0; TMOD=0x10;
TH0=(65536-10000)/256; TL0=(65536-10000)%6; EA=1; ET1=1; TR1=1; while(1);