1、第7章思考题及习题71如果采用的晶振的频率为24MHz,定时器/计数器工作在方式0、1、2下,其最大定时时间各为多少?答:晶振的频率为24MHz, 机器周期为0.5s。方式0最大定时时间=0.5s213=0.5s8192=4096s方式1最大定时时间=0.5s216=0.5s65536=327686s方式2最大定时时间=0.5s28=0.5s256=128s2定时器/计数器用作计数器模式时,对外界计数频率有何限制?答:外部输入的计数脉冲的最高频率为系统振荡器频率的1/24。3定时器/计数器的工作方式2有什么特点?适用于哪些应用场合?答:方式2为初值自动装入的8位定时器/计数器,克服了在循环定时
2、或循环计数应用时就存在用指令反复装入计数初值影响定时精度的问题。4THx与TLx(x=0,1)是普通寄存器还是计数器?其内容可以随时用指令更改吗?更改后的新值是立即刷新还是等当前计数器计满后才能刷新?答:THx与TLx(x=0,1)是计数器,其内容可以随时用指令更改,但是更改后的新值要等当前计数器计满后才能刷新。5Proteus虚拟仿真使用定时器T0,采用方式2定时,在P1.0脚输出周期为400s,占空比为4:1的矩形脉冲,要求在P1.0脚接有虚拟示波器,观察P1.0脚输出的矩形脉冲波形。答:略6Proteus虚拟仿真利用定时器T1的中断来使P1.7控制蜂鸣器发出1kHz的音频信号,假设系统时
3、钟频率为12MHz。答:利用定时器T1的中断控制P1.7引脚输出频率为1kHz的方波音频信号,驱动蜂鸣器发声。系统时钟为12MHz。方波音频信号的周期为1ms,因此T1的定时中断时间为0.5 ms,进入中断服务程序后,对P1.7求反。电路如图所示。图 控制蜂鸣器发出1kHz的音频信号先计算T1初值,系统时钟为12MHz,则方波的周期为1s。1kHz的音频信号周期为1ms,要定时计数的脉冲数为a。则T1的初值:TH1=(65536a)/256;TL1=(65536a)%256参考程序如下:#include /包含头文件sbit sound=P17; /将sound位定义为P1.7引脚#defin
4、e f1(a) (65536-a)/256/定义装入定时器高8位的时间常数#define f2(a) (65536-a)%256/定义装入定时器低8位的时间常数unsigned int i = 500; 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; w
5、hile(j2000); j=0; i=360; while(j 2000); j=0;void T1(void) interrupt 3 using 0/定时器T1中断函数 TR1= 0; /关闭定时器T1 sound=sound; /P1.7输出求反 TH1=f1(i); /定时器T1的高8位重新赋初值. TL1=f2(i); /定时器T1的低8位重新赋初值. j+; TR1=1; /启动定时器T17 Proteus虚拟仿真制作一个LED数码管显示的秒表,用2位数码管显示计时时间,最小计时单位为“百毫秒”,计时范围0.19.9s。当第1次按下并松开计时功能键时,秒表开始计时并显示时间;第2
6、次按下并松开计时功能键时,停止计时,计算两次按下计时功能键的时间,并在数码管上显示;第3次按下计时功能键,秒表清0,再按1次计时功能键,重新开始计时。如果计时到9.9s时,将停止计时,按下计时功能键,秒表清零,再按下重新开始计时。答:本秒表应用了AT89C51的定时器工作模式,计时范围0.19.9s。此外还涉及如何编写控制LED数码管显示的程序。LED数码管显示的秒表原理电路如图所示。图 LED数码管显示的秒表原理电路及仿真参考程序如下:#include /包含51单片机寄存器定义的头文件unsigned char code discode1=0xbf,0x86,0xdb,0xcf,0xe6,
7、0xed,0xfd,0x87,0xff,0xef; /数码管显示09的段码表, 带小数点unsigned char code discode2=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /数码管显示09的段码表,不带小数点unsigned char timer=0; /记录中断次数unsigned char second; /储存秒unsigned char key=0; /记录按键次数main() /主函数 TMOD=0x01; /定时器T0方式1定时ET0=1; /允许定时器T0中断EA=1; /总中断允许second=0; /设
8、初始值P0=discode1second/10; /显示秒位0P2=discode2second%10; /显示0.1s位0while(1) /循环if(P3&0x80)=0x00) /当按键被按下时 key+; /按键次数加1switch(key) /根据按键次数分三种情况case 1: /第一次按下为启动秒表计时TH0=0xee; /向TH0写入初值的高8位TL0=0x00; /向TL0写入初值的低8位,定时5msTR0=1; /启动定时器T0break;case 2: /按下两次暂定秒表TR0=0; /关闭定时器T0break;case 3: /按下3次秒表清0key=0; /按键次数清
9、0second=0; /秒表清0P0=discode1second/10; /显示秒位0 P2=discode2second%10; /显示0.1s位0break; while(P3&0x80)=0x00); /如果按键时间过长在此循环void int_T0() interrupt 1 using 0 /定时器T0中断函数TR0=0; /停止计时,执行以下操作(会带来计时误差)TH0=0xee; /向TH0写入初值的高8位TL0=0x00; /向TL0写入初值的低8位,定时5mstimer+; /记录中断次数if (timer=20) /中断20次,共计时20*5ms=100ms=0.1sti
10、mer=0; /中断次数清0second+; /加0.1sP0=discode1second/10; /根据计时时间,即时显示秒位 P2=discode2second%10; /根据计时时间,即时显示0.1s位if(second=99) /当计时到9.9s时TR0=0; /停止计时second=0; /秒数清0 key=2; /按键数置2,当再次按下按键时,key+,即key=3,秒表清0复原 else /计时不到9.9s时TR0=1; /启动定时器继续计时8 Proteus虚拟仿真制作一个采用LCD1602显示的电子钟,在LCD上显示当前的时间。显示格式为“时时:分分:秒秒”。设有4个功能键
11、k1k4,功能如下:(1)k1进入时间修改。(2)k2修改小时,按一下k2,当前小时增1。(3)k3修改分钟,按一下k3,当前分钟增1。(4)k4确认修改完成,电子钟按修改后的时间运行显示。答:本题难点在于处理功能键K1K4的输入,由于每个功能键都具有相应的一种或多种功能,因此程序中需要大量使用dowhile或while循环结构,以检测是否有按键按下的具体功能。按键检测函数如下:void time_change() unsigned char keyvalue0=0,keyvalue1=0; keyvalue0=keyscan();/检测是否有按键按下 if(keyvalue0)/如果有按键按
12、下,继续检测 if(keyvalue0=1)/按键1,走时停止,开始判断更改值,直到按键4按下 while(key0);/防抖,直到按键松开时才进行下一步的操作 TR0=0;/控制走时的中断停止 do keyvalue1=keyscan();/检测按键按下 if(keyvalue1=2)/如果按键2按下,改变时间 while(key1);/防抖 if(hour23)/如果小时数小于23则加1 hour+; else/如果小时数为23,置位为0 hour=0; else if(keyvalue1=3)/如果按键3按下,改变分钟 while(key2);/防抖 if(minute59)/如果分钟数
13、小于59则加1 minute+; else/如果分钟数为59,置位为0 minute=0; clock_write(); while(keyvalue1!=4);/重复对时间的修改直到按键4按下 while(key3=0);/防抖 TR0=1;/调整时间后重新开始走时 必须注意,程序设计中,小时、分钟、秒变量hour、minute、second必须置为全局变量,才能如上述函数一样在各处函数中直接进行修改,如为局部变量,则上述形式的直接修改无效。1602 液晶显示模块以及基于单片机定时器的时钟实现见教材的介绍,不再赘述。LCD时钟原理电路图如下图。程序执行后工作指示灯D1闪动一下,表示时钟开始运行。按下按键K1后,D1停止闪烁,即时钟停止走时,时钟停在当前时刻;按下按键K2和K3后,可改变小时和分钟;按下按键K4后,时钟从修改后的时间重新开始运行。为加强AT89C51的驱动能力,原理图中加入作为上拉电阻的排电阻(CTRESPACK-7),即图中的RP1。图 LCD电子钟电路原理电路图与仿真