51单片机中的定时器自动重载和非自动重载的区别

0x00 介绍

定时器是一种计时器,可以在一定时间间隔内产生中断信号。在51单片机中,定时器可以用来控制外设的工作时间或者进行时间测量等操作。

自动重载和非自动重载是定时器的两种工作模式。在自动重载模式下,定时器计数器达到设定值后会自动重新开始计数,循环往复。而在非自动重载模式下,定时器计数器达到设定值后会停止计数,需要手动重新启动计数器。

举个例子,比如我们需要控制一个LED灯每隔1秒钟闪烁一次。我们可以使用51单片机的定时器,将定时器设定为1秒钟,并选择自动重载模式。当定时器计数器达到1秒钟时,会产生中断信号,我们可以在中断服务函数中控制LED灯的闪烁。这样就可以实现LED灯每隔1秒钟闪烁一次的效果。

0x01 代码示例

定时器 0 16位 自动重载

void Timer0_Isr(void) interrupt 1
{
// 这里直接写中断里面的代码即可

}

void Timer0_Init(void)      //100微秒@12.000MHz
{
    AUXR |= 0x80;           //定时器时钟1T模式
    TMOD &= 0xF0;           //设置定时器模式
    TL0 = 0x50;             //设置定时初始值
    TH0 = 0xFB;             //设置定时初始值
    TF0 = 0;                //清除TF0标志
    TR0 = 1;                //定时器0开始计时
    ET0 = 1;                //使能定时器0中断
}

定时器 0 16位 不自动重载

void Timer0_Isr(void) interrupt 1
{
// 最大的区别就在这,在这里甩开重新指定定时器的初值
    TL0 = 0x50;             //设置定时初始值
    TH0 = 0xFB;             //设置定时初始值
//下面在写中断函数里面的东西。
}

void Timer0_Init(void)      //100微秒@12.000MHz
{
    AUXR |= 0x80;           //定时器时钟1T模式
    TMOD &= 0xF0;           //设置定时器模式
    TMOD |= 0x01;           //设置定时器模式
    TL0 = 0x50;             //设置定时初始值
    TH0 = 0xFB;             //设置定时初始值
    TF0 = 0;                //清除TF0标志
    TR0 = 1;                //定时器0开始计时
    ET0 = 1;                //使能定时器0中断
}

0x02 总结

各有各的好处。并不是说非自动重载一无是处,他可以做可变的定时器。定时器里面写进去公式即可。
有一点需要注意。定时器里面如果是1us,还写了非常复杂的中断函数,那么很有可能,还没执行完,又到时间要进中断。
所以中断里面的函数尽量简单,或者就是返回出一些值,进到别的函数里面去处理,

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇