单片机第7章答案
复装入计数初值影响定时精度的问题。适用于精确定时,比如波特率的产生。 4.THx 与 TLx(x = 0,1)是普通寄存器还是计数器?其内容可以随时用指令更改吗?更改后的新值是
立即刷新还是等当前计数器计满后才能刷新? 答:THx 与 TLx(x = 0,1)是计数器,其内容可以随时用指令更改,但是更改后的新值要等当前计数器
图 LED 数码管显示的秒表原理电路及仿真
参考程序如下:
#include<reg51.h>
//包含 51 单片机寄存器定义的头文件
unsigned char code discode1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
//数码管显示 0~9 的段码表, 带小数点
unsigned char code discode2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//数码管显示 timer=0;
//记录中断次数
unsigned char second;
//定时器 T1 中断函数
//关闭定时器 T1 //P1.7 输出求反
//定时器 T1 的高 8 位重新赋初值. //定时器 T1 的低 8 位重新赋初值.
//启动定时器 T1
7. Proteus 虚拟仿真 制作一个 LED 数码管显示的秒表,用 2 位数码管显示计时时间,最小计时单位为“百毫秒”,计时范围 0.1~ 9.9s。当第 1 次按下并松开计时功能键时,秒表开始计时并显示时间;第 2 次按下并松开计时功能键时,停止 计时,计算两次按下计时功能键的时间,并在数码管上显示;第 3 次按下计时功能键,秒表清 0,再按 1 次 计时功能键,重新开始计时。如果计时到 9.9s 时,将停止计时,按下计时功能键,秒表清零,再按下重新开 始计时。 答:本秒表应用了 AT89C51 的定时器工作模式,计时范围 0.1~9.9s。此外还涉及如何编写控制 LED 数 码管显示的程序。 LED 数码管显示的秒表原理电路如图所示。
//包含头文件
sbit sound=P1^7;
//将 sound 位定义为 P1.7 引脚
#define f1(a) (65536-a)/256
//定义装入定时器高 8 位的时间常数
#define f2(a) (65536-a)%256
//定义装入定时器低 8 位的时间常数
unsigned int i = 500;
第7章
思考题及习题 7 1.如果采用的晶振的频率为 24MHz,定时器/计数器工作在方式 0、1、2 下,其最大定时时间各为多少? 答:晶振的频率为 24MHz, 机器周期为 0.5µs。 方式 0 最大定时时间=0.5µs×213=0.5µs×8192=4096µs 方式 1 最大定时时间=0.5µs×216=0.5µs×65536=327686µs 方式 2 最大定时时间=0.5µs×28=0.5µs×256=128µs 2.定时器/计数器用作计数器模式时,对外界计数频率有何限制? 答:外部输入的计数脉冲的最高频率为系统振荡器频率的 1/24。 3.定时器/计数器的工作方式 2 有什么特点?适用于哪些应用场合? 答:方式 2 为初值自动装入的 8 位定时器/计数器,克服了在循环定时或循环计数应用时就存在用指令反
unsigned int j = 0;
void main(void)
{
EA=1;
//开总中断.
ET1=1;
//允许定时器 T1 中断
.
TMOD=0x10;
//TMOD=0001 000B,使用 T1 的方式 1 定时
TH1=f1(i);
//给定时器 T1 高 8 位赋初值.
TL1=f2(i);
//给定时器 T1 低 8 位赋初值.
TR1=1;
//启动定时器 T1
while(1)
{
//循环等待
i=460;
while(j<2000) ;
j=0; i=360;
while(j <2000) ;
j=0;
}
}
void T1(void) interrupt 3 using 0 {
TR1= 0; sound=~sound; TH1=f1(i); TL1=f2(i); j++; TR1=1; }
//储存秒
unsigned char key=0;
//记录按键次数
main()
//主函数
{
TMOD=0x01;
//定时器 T0 方式 1 定时
ET0=1;
//允许定时器 T0 中断
EA=1;
//总中断允许
second=0;
5.Proteus 虚拟仿真 使用定时器 T0,采用方式 2 定时,在 P1.0 脚输出周期为 400µs,占空比为 4:1 的矩形脉冲,要求在 P1.0 脚接有虚拟示波器,观察 P1.0 脚输出的矩形脉冲波形。 答:略 6.Proteus 虚拟仿真 利用定时器 T1 的中断来使 P1.7 控制蜂鸣器发出 1kHz 的音频信号,假设系统时钟频率为 12MHz。 答:利用定时器 T1 的中断控制 P1.7 引脚输出频率为 1kHz 的方波音频信号,驱动蜂鸣器发声。系统时钟 为 12MHz。方波音频信号的周期为 1ms,因此 T1 的定时中断时间为 0.5 ms,进入中断服务程序后,对 P1.7 求反。电路如图所示。
图 控制蜂鸣器发出 1kHz 的音频信号 先计算 T1 初值,系统时钟为 12MHz,则方波的周期为 1µs。1kHz 的音频信号周期为 1ms,要定时计数 的脉冲数为 a。则 T1 的初值:
TH1=(65 536 −a)/256; TL1=(65 536 −a) %256
参考程序如下:
#include<reg51.h>
计满后才能刷新。答:THX 与 TLX(X=0,1)是由特殊功能寄存器构成的计数器,其内容可以随时用指令更改, 更改后的新值是立即刷新。但在读 THX、TLX 的值时,应该先读 THX 值,后读 TLX,再读 THX。若两次读 得 THX 相同,则可确定读得的内容正确。若前后两次读得的 THX 有变化,再重复上述过程。