单片机g-习题7答案

更新时间:2024-04-16 00:00:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

习题7

1. 80C51单片机内部有几个定时器/计数器?它们由哪些特殊功能寄存器控制? 答:80C51单片机内部有两个独立的16位可编程定时/计数器,分别称为定时器0(简称T0)和定时器1(简称T1),它们由TH0、TL0、TH1、TL1、TMOD与TCON六个寄存器控制,其中TH0、TL0寄存器分别是T0 的16位计数寄存器的高、低8位,TH1、TL1寄存器分别是T1的16位计数寄存器的高低8位,而方式控制寄存器TMOD与控制寄存器TCON均是8位的,每一位的作用各不相同。

2. 定时器/计数器工作于定时和计数方式有何异同点?

答:定时是对周期固定的内部机器周期脉冲进行计数,计数时计数脉冲从T0 (P3.4)或T1 (P3.5)引脚接入。其余的控制寄存器是一样的。

3. 定时器/计数器的4种工作方式如何设定?4种工作方式各有何特点?

答:定时器/计数器有四种工作方式,由模式控制寄存器TMOD中的M1、M0两位进行设置,4种工作方式的特点如下表:

定时器/计数器0、1的工作方式选择

M1 0 0 1 1 M0 0 1 0 1 方式0,为13位定时器/计数器 方式1,为16位定时器/计数器 方式2,具有自动重装初值的8位定时器/计数器 方式3,仅适用于T0,T0分成两个独立的8位计数器,T1停止计数 工作方式

4. 如果系统的晶振频率fosc=12MHz,定时器/计数器工作在方式0、1、2下,其最大的定时时间各为多少?

答:如果晶振频率fosc=12MHz,则Tcy=1μs。各种方式的定时时间计算公式为(2n-x)×Tcy,当计数初值x为0时,各种方式最长的定时时间如下:

方式0: 213×Tcy=8192 μs=8.192 ms;方式1: 216×Tcy=65536 μs=65.536ms,方式2: 28×Tcy=256 μs。

5. 编程实现下列要求:利用定时器/计数器T0的方式1,产生10ms的定时,并使P1.0引脚上输出周期为20ms的方波,要求采用中断方式,用proteus仿真验证。设系统的晶振频率fosc=12MHz。

解:由于晶振频率为12MHz,机器周期Tcy=1μs。 (1) 计算TH0、TL0的计数初值

由于晶振频率为12MHz,所以机器周期Tcy=1μs,则定时时间为: T=(2n-x)×Tcy=(216-x)×1μs =10ms,

1

所以x=65536-10000=55536=D8F0H

即TH0=D8H,TL0=F0H,或者TH0=55536/256,TL0=55536%6 (2) TMOD寄存器初始化

根据题目要求,GATE (TMOD.3)=0,C/T(TMOD.2)=0,M1 (TMOD.1)=0,M0 (TMOD.0)=1,定时器/计数器1没有使用,相应的各个位状态随意,均取为0,则(TMOD)=01H。

(3) 如下:程序 #include #define uint unsigned int sbit fangbo=P1^0; void main() { }

void timer1() interrupt 3 //定时器0中断服务程序 { }

6. 编程实现下列要求: 利用定时器/计数器T1的方式1,产生0.5s的定时,并使P2.7引脚上输出周期为1s的方波,要求采用中断方式,用proteus仿真验证。设系统的晶振频率fosc=12MHz。

答:因为在晶振频率fosc=12MHz时,定时器在方式1下能获得的最大定时时间为65.536ms,即0.065536s,不能达到0.5s,只能采用多次中断的方式。选择定时器T1,方式1,设定T1的定时时间为50ms,每隔50ms中断1次,中断10次即为0.5s。程序设计如下:

#include #define uint unsigned int sbit fangbo=P2^7; unsigned char aa; void main()

2

TMOD=0x01; //设置T0为定时器模式,工作在方式1 TH0=0XD8; TL0= 0xF0;

ET0=1; //允许T0中断 TR0=1; // 启动T0 while(1);

EA=1; //开总中断

TH0=0XD8; TL0=0xF0; fangbo=~fangbo;

{ }

TMOD=0x10; //设置T1为定时器模式,工作在方式1 TH1=(65536-50000)/256; TL1=(65536-50000)%6; ET1=1; //允许T1中断 TR1=1; // 启动T1 while(1);

EA=1; //开总中断

void timer1() interrupt 3 { }

7. 编程实现下列要求:利用定时器/计数器T0产生定时,由单片机的P1口控制8个发光二极管,使8个发光二极管每隔1s依次点亮,采用中断方式,用proteus仿真验证。设系统的晶振频率fosc=12MHz。

答:程序设计如下: #include #include #define uint unsigned int unsigned char aa; void main() {

TH1=(65536-50000)/256; TL1=(65536-50000)%6; aa++; if(aa==10) { }

aa=0;

fangbo=~fangbo;

P1=0xfe;

TMOD=0x01; //设置T0为定时器模式,工作在方式1

TH0=(65536-50000)/256; TL0=(65536-50000)%6;

3

EA=1; //开总中断 }

void timer0() interrupt 1 { }

8. 已知fosc=12MHz,试编写程序使P2.7输出如图7-13所示的连续矩形脉冲,用proteus仿真验证。

TH0=(65536-50000)/256; TL0=(65536-50000)%6; aa++; if(aa==20) { }

aa=0;

P1=_crol_(P1,1);

ET0=1; //允许T1中断 TR0=1; // 启动T1 while(1);

40ms答:程序设计如下:

360ms图7-13 连续矩形脉冲信号

#include

#define uint unsigned int sbit boxing=P2^7; bit flag;

unsigned char aa; void main() {

TMOD=0x10; //设置T1为定时器模式,工作在方式1 TH1=(65536-40000)/256; TL1=(65536-40000)%6; EA=1; //开总中断 ET1=1; //允许T1中断 TR1=1; // 启动T1

4

boxing=1; flag=1; while(1); }

void timer1() interrupt 3 {

TH1=(65536-40000)/256; TL1=(65536-40000)%6; if(flag==1) { boxing=~boxing; flag=0; } aa++; if(aa==10) { aa=0; boxing=~boxing; flag=1; } }

5

本文来源:https://www.bwwdw.com/article/4k4p.html

Top