单片机原理与接口技术(第二版)余锡存著 课后复习题答案 下载本文

应该保持1微秒,所以只能对原信号进行展宽,常用的方法是连接一个单稳态电路,其时常数不在1-1.5微秒之间即可。

10、MCS-51的中断服务程序能否放在65KB程序存储器的任意区域?如何实现?

MCS-51的中断服务程序可以放在65KB程序存储器的任意区域,只要在对应的中断矢量入口填写相应的跳转指令即可。例如外部中断IE1的中断服务程序的起始地址为3400H,则在0013H单元内填写 LCALL 3400H。

第六章

1、8051单片机内设几个可编程的定时/计数器?它们有几种工作方式?如何选择和设定?作为定时器或计数器,它们的波特率各为多少?

8051单片机内设有两个钧为16位的可编程的定时/计数器,共有4种工作方式,即:方式0—13位定时/计数器、方式1—16位定时/计数器、方式2—自动重载初值得8位定时/计数器和方式3—T0为两个独立的8位定时/计数器,在方式3下,T1停止工作。

8051定时/计数器的工作方式由控制寄存器TMOD的M0、M1两位设置,因为TMOD的地址为89H,所以M0、M1不能位寻址,只能通过字节操作的方式对M0、M1的值进行设定。

当用定时/计数器作为波特率发生器时,根据串口的工作模式,有三种情形: 方式0的波特率为主振频率fosc的十二分之一;

2SMOD?fosc,其中,SMOD为PCON寄方式2的波特率依照下式确定:Baud rate ?64存器中的波特率倍增位。

方式1和方式3的波特率计算依照下列关系求的TH1即可:

fosc2SMOD Baud rate ??3212?(256?TH1)

2、定时/计数器作定时器用时,其定时时间有哪些因素有关?做计数器用时,对外部计数频率有何限制?

8051的定时/计数器工作在定时器状态时,输入的时钟脉冲是由晶体振荡器的输出经12分频得到的,故其频率为晶振频率的十二分之一。所以,定时输出是晶振频率处以12再除以计数值。

8051的定时/计数器工作在计数器状态时,需要两个机器周期才能识别一个从“1”到“0”的跳变,故最高计数频率不大于晶振频率的二十四分之一。 3、8051单片机的晶振频率为6MHz,若只使用T0产生500微秒定时,可以选择哪几种定时方式?分别写出定时器的方式控制字和计数器初值。 选择方式0或方式1,计数器初值为8192-250,或65536-250。. 此处给一个C语言写的程序段,定时信号由P1.0输出: ORG 0000H LJMP MAIN ORG 000BH LJMP TO_INTERRUPT MAIN:SETB EA

MOV TH0, (65536-250)/256 MOV TL0, (65536-250)%6 SETB TR0 SETB ET0 SJMP $ T0_INTERRUPT: CLR TR0

MOV TH0, (65536-125)/256 MOV TL0, (65536-125)%6 P1^0 = ~P1^0 SETB TR0 RETI

4、某8051系统晶振频率为6MHz,先欲从P1.7引脚输出一个连续5Hz的方波信号,请编写程序。

5Hz的方波周期为200毫秒,高低电平各持续100毫秒,若晶振频率为6MHz,

则机器周期为2微秒,故其计数值应为: N=100ms/2μs=50000

采用方式1进行计数,则 X=M-N=65536-50000=15536H=0C350H 程序编写如下:

MOV TMOD, #05H; 设置T0工作方式,定时,方式1 MOV TH0,#0C3H; MOV TL0,#050H; SETB TR0;

LOOP: JBC

启动T0 写入计数器初值

TF0,$; 查询定时器溢出标志

MOV TH0,#0C3H; MOV TL0,#050H CPL P1.7 SJMP LOOP; END

也可以用C语言编写:

用定时/计数器T0从P1.7输出周期为5s的方波,晶振频率为6MHz。 #include

#define uchar unsigned char #define uint unsigned int sbit D1=P1^0; uchar a;

void init() //初始化 {

TMOD=0x01; //选择定数计数器0的工作方式为16位定时器

TH0=(65535-50000)%6; //赋初值,定时100ms TL0=(65535-50000)/256;

EA=1; //中断控制允许 ET0=1;

a=0;

TR0=1; //启动定时器0 }

void time0() interrupt 1 //定时器0中断函数 {

TH0=(65535-50000)%6; //赋初值,定时100ms TL0=(65535-50000)/256; a++;

TR0=1; }

void main() {

init(); while(1) {

while(a==25)//半个周期(2500ms)时,P1.7上的电平跳变一次。

{

a=0;

P1.7=~P1.7; //取反 } } }

5、某单片机系统,时钟频率为12MHz,定时/计数器T0用于20ms定时,T1用于100次计数,两者要求重复工作,问: (1)、外部计数脉冲从何引脚输入? (2)、编写达到上述要求的程序。

(3)、利用定时/计数器T0、T1编写延时2S的程序。