AT89S52怎么实现用定时器2定时一秒钟来实现功能?
voidmain{TMOD=0x11;TCLK=0;//可令T2CON=0;或TCLK=0,RCLK=0;RCLK=0;//【T2CON中其他位可默认为0,而TCLK和R...
void main
{TMOD=0x11;
TCLK=0; //可令T2CON=0;或TCLK=0,RCLK=0;
RCLK=0; //【T2CON中其他位可默认为0,而TCLK和RCLK必须手动置0】
//因RCAP2L和RCAP2H是由软件预设的
T2MOD=0x00;
RCAP2H=(65536-50000) / 256; //或TH2=0x3c
RCAP2L=(65536-50000) % 256; //或TL2=0xb0
//TH2 = RCAP2H;
//TL2 = RCAP2L;
EA=1;
ET2 = 1;
TR2 = 1;
if(tt==20)
{
}
}
void timer2 (void) interrupt 5
{
TF2 = 0; //必须软件置0
TH2 = (65536-50000) / 256; //或TH2=0x3c
TL2 = (65536-50000) % 256; //或TL2=0xb0
tt++;
} 展开
{TMOD=0x11;
TCLK=0; //可令T2CON=0;或TCLK=0,RCLK=0;
RCLK=0; //【T2CON中其他位可默认为0,而TCLK和RCLK必须手动置0】
//因RCAP2L和RCAP2H是由软件预设的
T2MOD=0x00;
RCAP2H=(65536-50000) / 256; //或TH2=0x3c
RCAP2L=(65536-50000) % 256; //或TL2=0xb0
//TH2 = RCAP2H;
//TL2 = RCAP2L;
EA=1;
ET2 = 1;
TR2 = 1;
if(tt==20)
{
}
}
void timer2 (void) interrupt 5
{
TF2 = 0; //必须软件置0
TH2 = (65536-50000) / 256; //或TH2=0x3c
TL2 = (65536-50000) % 256; //或TL2=0xb0
tt++;
} 展开
2个回答
展开全部
AT89S52定时器2是一个可以实现自动重装载功能的16位定时器,相对于定时器0和定时器1来说有其自身的优势。当然要实现1秒定时,也需要用到循环,因为16位定时器,在12M晶振的情况下,最多也只能定时65毫秒左右,下面举例说明:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit Led=P0^0; //定义LED位
void Timer2() interrupt 5 //调用定时器2,自动重装载模式
{
static uchar i=0; //定义静态变量i
TF2=0; //定时器2的中断标志要软件清0
i++; //计数标志自加1
if(i==20) //判断是否到1s
{
i=0; //将静态变量清0
Led=~Led; //LED位求反
}
}
void main()
{
RCAP2H=(65536-50000)/256; //重装载计数器赋初值
RCAP2L=(65536-50000)%256;
ET2=1; //开定时器2中断
EA=1; //开总中断
TR2=1; //开启定时器,并设置为自动重装载模式
while(1);
}
以上程序实现LED灯1秒亮灭的功能。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit Led=P0^0; //定义LED位
void Timer2() interrupt 5 //调用定时器2,自动重装载模式
{
static uchar i=0; //定义静态变量i
TF2=0; //定时器2的中断标志要软件清0
i++; //计数标志自加1
if(i==20) //判断是否到1s
{
i=0; //将静态变量清0
Led=~Led; //LED位求反
}
}
void main()
{
RCAP2H=(65536-50000)/256; //重装载计数器赋初值
RCAP2L=(65536-50000)%256;
ET2=1; //开定时器2中断
EA=1; //开总中断
TR2=1; //开启定时器,并设置为自动重装载模式
while(1);
}
以上程序实现LED灯1秒亮灭的功能。
展开全部
AT89S52跟AT89S51一样,12MHz晶振条件下,定时器的一次最长定时时间大概是65ms,因此无法一次完成1s的定时,必须加上循环控制。
你现在用T2定时器定时1s,程序写法与使用T0,T1类似。定时周期可以设置成50ms(初值,3CB0),然后进行20个循环。
只是T2定时器有自动重装载功能,你在定时器中断服务程序里不需要把初值重新送TH2和TL2,但定时器的中断标志必须手动清零,启动也需要手动控制。相比T0,T1,可以节约1个机器周期的样子,如果不做补偿T2定时的精度会比T0、T1稍微高一点。
你现在用T2定时器定时1s,程序写法与使用T0,T1类似。定时周期可以设置成50ms(初值,3CB0),然后进行20个循环。
只是T2定时器有自动重装载功能,你在定时器中断服务程序里不需要把初值重新送TH2和TL2,但定时器的中断标志必须手动清零,启动也需要手动控制。相比T0,T1,可以节约1个机器周期的样子,如果不做补偿T2定时的精度会比T0、T1稍微高一点。
追问
void main()
{TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
T2CON=0x00;
T2MOD=0x00;
TH2 = (65536-50000) / 256;
TL2 = (65536-50000) % 256;
EA=1;
ET0=1;
//ET1=1;
TR0=1;
//TR1=1;
ET2 = 1;
TR2 = 1; }
void Timer2_Server(void) interrupt 5
{TF2=0;
tt++;} 仿真上可以,烧写进去就不行了
追答
unsigned char tt=0;//(这个部分要增加)
RCAP2H=0x3C;//(这个部分要增加)
RCAP2L=0xB0;//(这个部分要增加)
void Timer2_Server(void) interrupt 5
{
TR2=0;//(这个部分要增加)
TF2=0;
tt++;}
这段明显不对。
起码你得在tt++;后面加上。
if(tt>=20) tt=0;//(这个部分要增加)
TR2=1;//(这个部分要增加)
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询