一、概述:
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;
}