单片机 c语言中的定时中断函数,在mian函数TH0和TL0有了初始化,为什么在中断函数timer0中又要初始化??
#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintuch...
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp,t0;
void init();
void mian()
{
init()
while(1)
{
}
}
void init()
{
temp=0xfe;
p1=temp;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if (t0=10)
{
t0=0;
temp=_crol_(temp,1);
p=temp;
}
}
程序代码如下 ,说为什么要在mian函数中初始化TH0和TL0,在中断函数中又一次赋值,mian函数中的赋值是否可以去掉 展开
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp,t0;
void init();
void mian()
{
init()
while(1)
{
}
}
void init()
{
temp=0xfe;
p1=temp;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if (t0=10)
{
t0=0;
temp=_crol_(temp,1);
p=temp;
}
}
程序代码如下 ,说为什么要在mian函数中初始化TH0和TL0,在中断函数中又一次赋值,mian函数中的赋值是否可以去掉 展开
展开全部
我谈谈我的看法吧:
首先,我们需要知道的是TH0和TL0寄存器在未赋值的时候都保持默认00H
其次,如果是加基数的话那么到IE开启的时候就要等待一段时间才中断(选择的模式的最大值)如果是减计数的话那么到IE开启的时候就会立即执行定时器中断(如果没有更高优先级的话),所以如果不设置初始值的话会造成一些误差,特别是在使用16位定时器的时候。其他倒是没有什么影响。
再次,楼主可以从程序上看到main()中的定时器只执行了一次而已,然而每次进入定时器都进行了赋值,所以主程序里面的赋值是否需要要根据实际情况定,如果需要大致精确的话,还是赋值比较好。
不好意思我单片机已经很久不玩了,不知道理解是否有偏差,如有请大家指证。
首先,我们需要知道的是TH0和TL0寄存器在未赋值的时候都保持默认00H
其次,如果是加基数的话那么到IE开启的时候就要等待一段时间才中断(选择的模式的最大值)如果是减计数的话那么到IE开启的时候就会立即执行定时器中断(如果没有更高优先级的话),所以如果不设置初始值的话会造成一些误差,特别是在使用16位定时器的时候。其他倒是没有什么影响。
再次,楼主可以从程序上看到main()中的定时器只执行了一次而已,然而每次进入定时器都进行了赋值,所以主程序里面的赋值是否需要要根据实际情况定,如果需要大致精确的话,还是赋值比较好。
不好意思我单片机已经很久不玩了,不知道理解是否有偏差,如有请大家指证。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
中断里的叫重装初值,定时器有三种模式,13位模式,8位模式(自动重装初值,就是初始化后,中断里无需给定时器高低位赋值),16位模式;13位模式和16位模式需要重装
追问
两次初值有什么联系?例如去掉mian函数的初值有什么影响?定时在TR0=1时候打开,TH0,TL0是在mian初值开始减还是从中断函数开始减啊?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
两者都是对TH0,TL0两个寄存器中的值进行修改,去掉main中的赋值的话,他会计时65536微秒,然后进入定时器中断服务程序,在TR0=1时,定时器才开始工作。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询