预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共75页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

知识回顾与新课引入定时器/计数器原理及应用定时与计数原理6.1.1定时计数器概述硬件定时:用RC电路或逻辑部件定时如555电路,该方式除额外增加硬件资源外,使用起来灵活性也较差;采用单片机定时/计数器定时:为了使用方便,解决上述两种方式的弊端并增加单片机的控制功能,把定时计数逻辑电路集成在单片机芯片中,称之为定时计数器。计数器原理框图如图6-1所示。当外部发送来一个有效脉冲时,在S1闭合的情况下,计数器会加1,即表示计数器记录了一次外部事件。当外部脉冲为连续的脉冲时,计数器将不断地加1,直到计数器溢出(如8位计数器从00到FFH就溢出)。计数器溢出时计数器自动回“0”,同时向溢出标志TF进位,计数器又从“0”开始继续计数。6.1.2计数器原理 溢出标志TF的作用有两个:一是向CPU申请中断,二是当中断屏蔽时供CPU查询。一个8位的计数器从0开始到发出溢出中断请求,要记录256个脉冲。当它从初值156开始到发出溢出中断请求,则要记录100个脉冲。所以可在初值寄存器中设定不同的计数器初值,来确定每中断一次记录的脉冲数。其中的“初值寄存器”、“S1”、“S2‘’就是为编程应用而设置的。 初值寄存器的值是每次溢出后由此值开始计数,例如初值寄存器的值设为156,则每次溢出后都从156开始计数,所以每计100数后就到256,产生一次溢出。 S1闭合启动计数器工作,否则禁止计数器工作。 S2闭合允许计数器溢出中断,否则禁止溢出中断。 在对计数器编程时,这些寄存器、相应控制位等必须根据需要进行设置,以便计数器按预定要求正常工作。 定时功能实质上也是通过计数器的计数来实现的。当计数器的输入脉冲频率恒定时,计数器所记录的数值就代表了时间的概念。频率恒定的脉冲可以来自外部晶振,也可以来自内部RC电路。 6.1.3定时原理可见,当计数器的计数频率恒定时(lμs),可以根据计数器的“计数值”计算出定时时间。反过来也可按定时时间要求计算出计数器的预置初值。若要定时100微秒,则要记录100个数,计数器的预置值应该设置为156,即9CH。外引脚、内部RC振荡器、熔丝配置位、分频器、计数器、中断系统、控制寄存器等组成。0比较匹配输出使能位1熔丝选择位的内部RC振荡设置(0001-0100)CKLEL33定时计数器的预分频器 ATmegal6的T/CO和T/C1由一个10位的预定比例分频器提供时钟源。该预分频器将系统时钟按设定的比例进行分频,以产生不同周期的时钟clkT0、clkTl,分别作为时钟源提供给T/CO和T/C1使用。图6—7为T/CO、T/C1的预定比例分频器示意图。T/CO和T/C1的时钟源可来自芯片内部,也可来自外部引脚T0(PB0)和T1(PBl)。当选择外部引脚的输入信号为时钟源时,预分频器不对外部引脚的输入信号进行预分频。当选择芯片内部时钟时,通过设置预分频器可选择4种不同的分频比例,它们是8、64、256、1024分频。T0/T2控制寄存器TCCR0/TCCR2:16.1.5定时计数器应用举例//例1程序清单: #include<mega16.h>//器件文件头 voidmain(void)//主程序 {//端口初始化 DDRD=0xff;//设定PD口为输出。 TCCR1B=6;//用下降沿计数 TCNT1=0;//计数器初值; while(1) { PORTD=~TCNT1;//将计数结果取反后送D口显示。 } }//例2程序清单: #include<mega16.h>//器件文件头 voidmain(void)//主程序 {//端口初始化 DDRD=0xff;//设定PD口为输出。 TCCR0=6;//用下降沿计数 TCNT0=251;//计数器初值; while(1) { if(TIFR&1==1) PORTD=0;//当计数器溢出后灯亮。解释TIFR elsePORTD=0XFF;//灯灭 } } 例3分析:初值计算:设晶振频率为8MHz,采用8分频时,每计1个脉冲为1μs(8M/8=1M),若初值为0;则定时计数器从0开始计数到计满256后溢出所用时间为256μs。若初值为156;则定时计数器从156开始计数到计满256后溢出所用时间为100μs(0.1ms)。定时计数器溢出中断3000次为300ms。如图所示。 //例3程序清单: #include<mega16.h>//器件文件头 voidmain(void) {inti;//定义变量 DDRD=0xff;//设定PD口为输出控灯。 TCCR0=2;//T0定时且8分频 TCNT0=156;//计数器预置值; while(1) { PORTD=~PORTD; //D口取反 for(i=0;i<3000;i++)//300ms {while((TIFR&0x01)