80C51单片机定时器 C/T 我想单独控制,怎么弄,

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-08-15
51单片机定时器/计数器我想用它来控制继电器定时半个钟头能设置的了吗。

这个肯定能设置的啊,不过对于定时器来说可能存在累计误差,可对初值进行修正,减少误差

有几个步骤。
首先说明一下几个和定时器有关的寄存器。
第一,方式控制寄存器TMOD,地址89H,不可位寻址,这个寄存器可以对定时器的工作方式进行设置。
第二,TCON寄存器,地址88H,可以位寻址,控制寄存器的开启关闭,寄存器的溢出标志也在这个寄存器中。
第三,中断控制寄存器IE,用来控制各中断的开启或关闭。
现在开始介绍2个定时器的用法
1。设置TMOD
2。分别给两个定时器赋初值
3。开中断
4。开启定时器
5。设置循环语句等待中断
下面举一个例子:
#include
void
main(void)
{
TMOD=0x01;//前四位控制t1,后四位控制t0
TH0=0x00;//赋初值
TL0=0x00;
TH1=0x43;
TL1=0x32;
EA=1;//开总中断
ET0=1;//开t0中断
ET1=1;//开t1中断
TR0=1;//开启定时器t0
TR1=1;//开启定时器t1
while(1)//等待中断
{
}
}

TMOD寄存器地址是89H,不可位寻址,因此不能直接写M1=1 或 C/T = 0
想单独对某一位操作只能用"与""或"操作
如想使定时器1作为计数器使用,则需使第7位(D6)C/T = 1
写法如下:TMOD|=0X40; 即 TMOD=TMOD|0X40;
要想让其清0: TMOD&=~0X40;即 TMOD=TMOD&(~0X40);
如果想让定时器1作为16位计器而定时器0状态不变:
TMOD|=0X50;
如果想让定时器0作为16位定时器而定时器1状态不变:
TMOD|=0X01;
不过定时器一般在初始化时设置,程序运行中不改变其工作性质,还是应该一次设置2个定时器,如
TMOD=0X11或TMOD=0X51;
即使分开设置也不应多次改变其工作状态
如你对定时器1操作
先让 TMOD|=0X50;定时器1工作在16位计数器状态
然后 TMOD|=0X10;定时器1工作在16位定时器状态
本来应该是后设置的有效,结果相反,第二条语句没有任何意义,因第7位C/T原来是1,第二次操作后仍是1(你期望它变0,需TMOD&=~0X40),原来第5位M0就是1,你再再次给它置1也没意义