STC8H系列—7.定时器与计数器的控制教程

一、概述:

    STC8H系列的定时器与计数器与传统的c51在使上方法区别不大,在工作方式上添加了16位重载,使其在使用上更加简单,在定时器的频率源有1T和12T两种方式,扩大了频率的使用范围,输出周期更短,定时器3、4多了预分频,在使用时可以对频率源进行不同级别的分频,使输出周期的范围进一步拓宽。以下实例主要实现了使用定时器0,1T与12T频率源的切换(k2),然后能过LED1不同频率的闪灯来实现,通过按下K1实再定时后频率输出从P35输出至LED4灯。

定时器3实现LED2的频闪,其主要目的是预分频寄存器TM3PS的使用,通过预分频实再LED2的闪灯。定时器4是实再K3计数输入,计数次数为0时,按一次k3即LED3灯闪一次。

二、知识链接:

定时器0结构图

1、控制T0X12即可实现1T与12T频率源的切换,当T0X12=0时即传统单片机相同,当T0X12=1时提速原速的12倍速。

2、控制TR=1时,且GATE=0时,此时外部INT0控制定时器的开启与关闭,实现脉宽的测量。

3、当T0CLK0=1时,P35输出脉冲。

T3结构图

4、TM3PS是Sysclk的预分频,通过预分频后可以得到不同频率的频率源,进一步拓展频率输出范围。

T4结构图

5、当T4-C/T=1时,由外部引脚P06输入频率计数,当计数完成后产生中断。

三、实验平台搭建:

   1、MCU:STC-打狗棒系列核心实验板 V2.3

   2、实验板平台:德飞莱LY-51s

   3、硬件连接表:

     K1------>P20    P35脉冲输出控制

      K2------>P21    IT与12T频率源的切换

      K3------>P06    外部T4计数器脉冲输入

      LED1----->P00   指示灯1,指示T0定时脉冲显示

      LED2----->P01   指示灯2,指示T3定时脉冲显示

      LED3----->P02   指示灯3,指示T4计数器脉冲显示

      LED4----->P35   指示灯4,指示P35脉冲输出显示

四、测试源代码:

#include <STC8H.h>

#include "intrins.h"

sbit Led1=P0^0;

sbit Led2=P0^1;

sbit Led3=P0^2;

sbit Led4=P0^3;

unsigned int count=0,count3=0;

void Delay1ms(unsigned char x);//当主时钟频率为12M,1ms延时为基准

void init_IO();//初始化IO

void init_timer0();//定时器0的初始化

void init_timer3();//定时器3的初始化

void init_timer4();//定时器4的初始化

void main()

{

      P_SW2 |= 0x80;  //扩展寄存器XFR访问使能

      init_IO();

     init_timer0();

      init_timer3();

      init_timer4();//从T4口(P0.6)输入

   while(1)

    {

       if(P20==0)      //当P20按下时脉冲从P35输出

         INTCLKO|=0x01;

       else

         INTCLKO&=~0x01;

       

   }

}

void init_timer0()//定时器0的初始化

{

   if(P21==1)

   {

      AUXR &= 0x7F;    //定时器时钟12T模式70ms 

      TMOD &= 0xF0;    //设置定时器模式

      //设置定时器0受控于INT0,即GATE=1,当INT0按下定时器停止

      TMOD |=0xF8;   

      TL0 = 0x00;   //设置定时初始值

      TH0 = 0x00;   //设置定时初始值

      TF0 = 0;   //清除TF0标志

      TR0 = 1;   //定时器0开始计时

   }

   if(P21==0)//开机时按下切换到1T模式

   {

      AUXR |=~0x7F;   //定时器时钟1T模式5.8ms

      TMOD &= 0xF0;    //设置定时器模式

      TL0 = 0x00;   //设置定时初始值

      TH0 = 0x00;   //设置定时初始值

      TF0 = 0;   //清除TF0标志

      TR0 = 1;   //定时器0开始计时

   }

  

   ET0=1;//Timer0 开中断 

   EA=1;//开总中断

}

void init_timer3()//定时器3初始化,T3主频分频输入

{

  T4T3M |= ~0xFD;      //定时器时钟1T模式500us

   T3L = 0x90;   //设置定时初始值

   T3H = 0xE8;   //设置定时初始值

   T4T3M |= 0x08;      //定时器3开始计时

   TM3PS=0xC8;//主频200倍分频

   IE2|=0x20;//ET3开启

   EA=1;

}

void init_timer4()//定时器4初始化,T4外部输入(P06)测试

{

  T4T3M |= 0x40;//开启T4的CT=1

   T4L=0xFF;

   T4H =0xFF;

   T4T3M |= 0x80;      //定时器4开始计时

   IE2|=0x40;//ET4开启

   EA=1;

}

void init_IO()

{

   RSTCFG=0x50;  //开启RST键进入ISP模式

   P0M1 = 0x00;   P0M0 = 0x00;   //设置P0口为准双向口

   P2M1 = 0x00;   P2M0 = 0x00;   //设置P1口为准双向口

   P3M1 = 0x00;   P3M0 = 0x00;   //设置P3口为准双向口

  

}

void Delay1ms(unsigned char x)    //@12.000MHz

{

   unsigned char i, j;

   i = 16;

   j = 147;

   while(x--)

   {

      do

      {

        while (--j);

      } while (--i);

   } 

}

void Timer0_isr() interrupt 1//Timer0中断入口

{

      count++;

   if(count>=7)//约500ms或500/12ms翻转一次

   {

      Led1=~Led1;

      count=0;

   }

}

void Timer3_isr() interrupt 19//Timer3中断入口相当于100ms中断一次

{

   Led2=~Led2;

  

}

void Timer4_isr() interrupt 20//Timer4中断入口

{

   Led3=~Led3;

}

猜你喜欢

转载自blog.csdn.net/qq_21082985/article/details/132078706