c51单片机为什么有些在定时中断中需要重新赋初值有些又不用呢
时间: 2024-03-29 17:37:14 浏览: 132
C51单片机的定时器有两种工作模式:定时模式和计数模式。在定时模式下,定时器会按照设定的时间间隔不断计数,当计数值达到设定的值时,就会触发定时器中断,执行中断服务程序。在计数模式下,定时器则会根据外部事件的触发次数进行计数,达到设定值后触发中断。
对于定时模式下的定时器,有些需要在中断服务程序中重新赋初值,有些不需要。这是由于不同的应用场景下,定时器的工作方式和中断服务程序的需求是不同的。在某些应用场景下,需要定时器一直按照设定的时间间隔工作,直到程序结束,因此在中断服务程序中需要重新赋初值;而在其他应用场景下,每次触发中断后都需要重新设定定时器的时间间隔,因此不需要在中断服务程序中重新赋初值。
需要注意的是,在计数模式下,定时器的初值是由外部事件触发时自动更新的,因此不需要在中断服务程序中重新赋初值。
相关问题
c51单片机定时器
C51单片机有两个定时器,分别为Timer 0和Timer 1。定时器的主要功能是计时和延时,可以用于控制程序执行的时间。
以下是C51单片机定时器的基本操作步骤:
1. 设置定时器模式:选择定时器工作模式,如定时器模式或计数器模式。
2. 设置定时器计数值:确定计数器的初始值,即计时的时间。
3. 启动定时器:启动定时器开始计时。
4. 等待定时器计时结束:等待定时器计时结束,即达到设定的计数值。
5. 停止定时器:停止定时器计时。
以下是一个简单的C51单片机定时器示例程序:
```
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void timer0_init(); //定时器0初始化函数
void main()
{
timer0_init(); //调用定时器0初始化函数
while(1)
{
//程序执行任务
}
}
void timer0_init()
{
TMOD &= 0xF0; //设置定时器0为模式1
TH0 = 0x3C; //给定时器赋初值,定时1ms
TL0 = 0xAF;
ET0 = 1; //打开定时器0中断允许
EA = 1; //打开总中断允许
TR0 = 1; //启动定时器0
}
void timer0() interrupt 1 using 1
{
TH0 = 0x3C; //给定时器赋初值,定时1ms
TL0 = 0xAF;
//中断执行任务
}
```
在上面的程序中,timer0_init()函数用于初始化定时器0,设置为模式1,计时1ms;timer0()函数是定时器0的中断处理函数,当定时器0计时结束后,会自动进入此函数进行中断处理。在这个函数中,可以编写相应的任务执行代码。在主函数中,通过while(1)循环不停地执行程序任务,而定时器0会在后台进行计时和中断处理。
c51单片机秒表计时程序
以下是一个简单的C51单片机秒表计时程序:
```c
#include <reg52.h>
sbit LED = P1^0; //使用P1.0口作为LED灯输出口
unsigned char count = 0; //计数器,用于记录经过的秒数
void timer0() interrupt 1 { //定时器0中断服务函数
TH0 = 0xFC; //重新赋初值
TL0 = 0x67;
count++; //计数器加1
if (count == 60) { //如果计数器达到60,即经过1分钟
count = 0; //计数器清零
LED = ~LED; //LED取反,实现闪烁效果
}
}
void main() {
TMOD = 0x01; //定时器0工作方式1
TH0 = 0xFC; //赋初值,使定时器从65536-12288=53248开始计数,以获得1ms的定时效果
TL0 = 0x67;
EA = 1; //开总中断
ET0 = 1; //开定时器0中断
TR0 = 1; //启动定时器0
while(1); //程序进入死循环,等待中断发生
}
```
该程序使用定时器0中断实现计时功能,每经过1秒,LED灯闪烁一次,表示经过1分钟。在`timer0()`中断服务函数中,通过计数器`count`记录经过的秒数,当计数器达到60时,即经过1分钟,计数器清零,LED灯取反,实现闪烁效果。
你可以根据自己的需要进行修改和优化。
阅读全文