GATE=0用TR0和TR1来控制T1和T0的启动,GATE=1则用外部中断来控制。
C/T为0表示定时器模式。为1表示计数器模式,对T0或T1的外部负跳变脉冲计数。
定时器初值的计算:
TH0 = (65536 - (24/12) * 1000)/256; //65536 Timer0 M1=0,M0=1 工作在模式1,16位定时/计数器,2^16=65536 24Mhz晶振 1000um = 1ms
TL0 = (65536 - (24/12) * 1000)%256;
THX=(2^定时器位数 - (晶振频率/12) * 定时时间um) / 256;
TLX= (2^定时器位数 - (晶振频率/12) * 定时时间um) % 256;
注意:记得开总中断 EA = 1;
#include
#include
#include
#include
#include
static unsigned long SysTick = 0;
static unsigned long preTime = 0;
/***********************************************************
* 系统毫秒延时
*
************************************************************/
void mdelay(u8 m)
{
preTime = (unsigned long)(m + SysTick);
while(preTime > SysTick)
{
_nop_();
}
}
/***********************************************************
* 系统秒延时
*
************************************************************/
void sdelay(u8 s)
{
preTime = (unsigned long)((s * 1000) + SysTick);
while(preTime > SysTick)
{
_nop_();
}
}
void Timer0_Init(void)
{
TMOD |= 0x01; //定时/计数器工作在方式 1;
TH0 = (65536 - (24/12) * 1000)/256; //65536 Timer0 M1=0,M0=1 工作在模式1,16位定时/计数器,2^16=65536 24Mhz晶振 1000um = 1ms
TL0 = (65536 - (24/12) * 1000)%256;
ET0 = 1; //允许定时/计数器0 中断
TR0 = 1; //启动定时/计数器0 中断
}
void main()
{
Timer0_Init();
while(1)
{
P0 = !P0;
}
}
/********************************************************************
*
* Timer0 用于产生系统时钟滴答 1ms为周期
*
********************************************************************/
void Timer0_ISR (void) interrupt 1
{
TH0 = (65536 - (24/12) * 1000)/256; //65536 Timer0 M1=0,M0=1 工作在模式1,16位定时/计数器,2^16=65536 24Mhz晶振 1000um = 1ms
TL0 = (65536 - (24/12) * 1000)%256;
SysTick++;
}
Timer2使用:
/*-----------------------------------------------
名称:定时器2
论坛:www.doflye.net
编写:shifang
日期:2009.5
修改:无
内容:通过定时让LED灯闪烁
------------------------------------------------*/
#include
sbit LED=P1^0; //定义LED端口
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void TIM2Inital(void)
{
RCAP2H = (65536-(12/12)*1000*60)/256;//晶振12M 60ms 16bit 自动重载
RCAP2L = (65536-60000)%256;
ET2=1; //打开定时器中断
EA=1; //打开总中断
TR2=1; //打开定时器开关
}
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
TIM2Inital();
while(1);
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void TIM2(void) interrupt 5 using 1//定时器2中断
{
TF2=0;
LED=~LED; //指示灯反相
}
上一篇:C51 引脚功能定义,内部框图
下一篇:C51 GPIO口模拟IIC读写24CXX
推荐阅读最新更新时间:2024-03-16 16:20