请教一个单片机的问题 很基础的
#include<reg52.h>sbitD1=P1^0;voidmain(){EA=1;ET0=1;TMOD=0x01;TL0=(65536-50000)/256;TH...
#include<reg52.h>
sbit D1=P1^0;
void main()
{
EA=1;ET0=1;TMOD=0x01;
TL0=(65536-50000)/256;
TH0=(65536-50000)%256;
TR0=1;
while(1);
}
void Time0() interrupt 1 using 0
{
D1=~D1;
TL0=(65536-50000)/256;
TH0=(65536-50000)%256;}这个程序是不是在T0计数溢出时才会进入到中断函数里去,那为什么我把一开始的TL0 TH0赋值语句删掉了 还是可以进入到中断函数并正常工作(第一个LED灯闪烁) 第二个问题是中断函数里的TL0 TH0重新赋值后是马上计数等计满后跳出函数 还是先跳出中断函数再进行计数 问的有点多 麻烦了~ 展开
sbit D1=P1^0;
void main()
{
EA=1;ET0=1;TMOD=0x01;
TL0=(65536-50000)/256;
TH0=(65536-50000)%256;
TR0=1;
while(1);
}
void Time0() interrupt 1 using 0
{
D1=~D1;
TL0=(65536-50000)/256;
TH0=(65536-50000)%256;}这个程序是不是在T0计数溢出时才会进入到中断函数里去,那为什么我把一开始的TL0 TH0赋值语句删掉了 还是可以进入到中断函数并正常工作(第一个LED灯闪烁) 第二个问题是中断函数里的TL0 TH0重新赋值后是马上计数等计满后跳出函数 还是先跳出中断函数再进行计数 问的有点多 麻烦了~ 展开
展开全部
是的,只有溢出才申请中断,要进入中断必须要EA=1,和ET0=1两个条件满足。至于你说的开始删除TH0和TL0赋初值也能进入中断的问题,很简单,你没赋初值,那么初值默认为0,经过65536次计数后也同样溢出申请中断。第二个问题嘛,计数是没有终止的,除非你TR0=0,所以你在给TH0和TL0赋值的过程中都在计数,所以安全的赋值过程是如下:
void Time0() interrupt 1 using 0
{
TR0=0;//赋值前暂时关闭计数
TL0=(65536-50000)/256;
TH0=(65536-50000)%256
TR0=1;//赋值后打开计数
D1=~D1;
}
void Time0() interrupt 1 using 0
{
TR0=0;//赋值前暂时关闭计数
TL0=(65536-50000)/256;
TH0=(65536-50000)%256
TR0=1;//赋值后打开计数
D1=~D1;
}
更多追问追答
追问
第一个懂了 第二个问题中计数的过程是在哪里进行的 在主函数里还是在中断函数里
追答
不在任何地方,是硬件自动完成的。
展开全部
我也刚学单片机程序,我的理解是这样的,一开始的TL0与TH0的赋值是第一次进入中断函数的计数初值,你删掉的话LED第一次闪烁的时间就是65ms了。你的第二个问题的答案是:中断函数是TH0与TL0计满溢出后才进入处理中断函数的语句,给TH0与TL0重新赋值后,就跳出中断函数了,继续处理while(1)语句,TH0与TL0寄存器的计数是不占用机器时间的。。。个人理解,希望对你有帮助
追问
很疑惑啊 重新赋值后程序到底会不会自己跳转到主函数中呢 上面那人说要RETI 到底会不会自动去继续处理while(1)语句呢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一个问题: 是的,只有在T0计数溢出时才会进入到中断函数里去,你把TH0和TL0删掉后,为什么还能进入中断呢,这是因为:你已经打开定时器0了。就算没有初值,它也会将TH0和TL0 进行递增,那就看原来里面值是多少了。
第二个问题:你在中断函数中再次将TH0和TL0进行赋值后,程序就跳转到主函数中,进行计数了,当下次出现溢出中断时,再次跳到中断函数中。
第二个问题:你在中断函数中再次将TH0和TL0进行赋值后,程序就跳转到主函数中,进行计数了,当下次出现溢出中断时,再次跳到中断函数中。
追问
很疑惑啊 重新赋值后程序到底会不会自己跳转到主函数中呢 上面那人说要RETI 但我一直认为是会自动跳转的啊
追答
C 语言对于中断结束的处理是自动跳转的,对于汇编语言的话,还需要RETI。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询