标题: 单片机C语言时间中断函数是否需要重新赋值? [打印本页]

作者: 风158    时间: 2023-8-26 15:58
标题: 单片机C语言时间中断函数是否需要重新赋值?
网上看到很多程序即使初始化时已经设置为自动重装,但是时间中断函数里仍然有重新赋值语句,例如:
void Time0() interrupt 1
{
    TH0  = (65535-15000)/256;   //重新赋值语句
    TL0  = (65535-15000)%256; //重新赋值语句
    if(++tc0 == 10)
    {
         tc0 = 0;
        P0 = _crol_(P0,1);
    }
}
但是STC官网给出的一个例程却没有重新赋值语句:
void timer0_int (void) interrupt TIMER0_VECTOR
{
   P17 = ~P17;
}
不知什么原因。
在高速运算时多两个语句耗时很明显。


作者: Hephaestus    时间: 2023-8-26 16:08
标准8051没有赋值语句等于赋值0xffff。

扩展型8051要自己去查手册里面对应的peripheral。
作者: ydatou    时间: 2023-8-26 17:22
标准8051的T0不支持16位自动重装,要在中断函数里重新赋值。
STC也有很多型号是不支持自动重装的,你要核对下。
作者: npn    时间: 2023-8-26 17:30
开启自动重装溢出后自动装入初值,不需要重新赋值,否则从0开始计数。
作者: zhuls    时间: 2023-8-26 17:45
“自动重装”,了解一下。
作者: Hephaestus    时间: 2023-8-26 19:13
npn 发表于 2023-8-26 17:30
开启自动重装溢出后自动装入初值,不需要重新赋值,否则从0开始计数。

标准51自动重装载模式只有8位,楼主代码显然说明了不是。
作者: npn    时间: 2023-8-26 22:07
ydatou 发表于 2023-8-26 17:22
标准8051的T0不支持16位自动重装,要在中断函数里重新赋值。
STC也有很多型号是不支持自动重装的,你要核 ...

TMOD寄存器结构有区别, 有16位自动重装就没有13位模式,具体见数据手册。
作者: a399288395    时间: 2023-8-27 10:34
根据单片机型号使用,一般为了程序的移植和兼容性, 都会使用常规51的方式,就是在中断里面重新装载赋值, 而STC的个别型号具有16位自动重装模式了;具体可以打开STC的ISP软件 定时器小工具里面有选项可以查看!
作者: yzwzfyz    时间: 2023-8-28 10:24
记住:计时必须有起点和终点!!
这里:定时器中的终点是固定的(0000H),自然必须在固定起点!
以上适用于所有定时的东东。
所谓自动重装:也就是每将计时到终点后,重新固定起点。也就不需要你再费心了。
当然,遇到个多心的人,不放心【别人】的重装,自己再装一遍,那是他有钱、高兴,有钱就是任性。

其实,所有定时、计数类的东东,如PWM,捕捉……,都是围绕起点,终点的设置做文章,而产生各种各样的说教。希望楼主自悟一下。
作者: coody_sz    时间: 2023-8-28 10:51
标准51的Timer0、Timer1支持8位自动重装,但16位要手动重装。Timer2支持16位自动重装。
STC15系列、STC8系列、STC32系列的MCU,都支持16位自动重装,1T模式,超好用,用过很多了。
作者: 风158    时间: 2023-8-28 12:39
谢谢各位回复。
作者: liucan2020    时间: 2023-8-28 16:10
看一下规格书自动重装载的就不用重新赋值了 ,不然就得手动




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1