单片机定时器中断的问题

voidT1_INT()interrupt3{TH1=(65536-1000)/256;TL1=(65536-1000)%256;BEEP=-BEEP;//根据高温还是低... void T1_INT()interrupt 3
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
BEEP=-BEEP;
//根据高温还是低温警报设定不同延时间隔
if(L_LED==0)
{
if(++t!=150) return;
}
else
{
if(++t!=60) return;
}
t=0;
DelayMS(20);
}
这是c51单片机定时中断的一个部分。我想问那个”根据高温还是低温警报设定不同延时间隔“是怎么做到的,下半部分的程序看不懂
展开
 我来答
电力物联网小学生
2011-12-02 · TA获得超过480个赞
知道小有建树答主
回答量:249
采纳率:0%
帮助的人:89.8万
展开全部
这个程序你要明白几个知识点
1、这个中断函数是每1毫秒(12M晶振下)执行一次。
2、return:执行return之后,整个函数返回了,return之后的代码不在执行。

看你的代码

beep=-beep;应该是个喇叭什么的吧,只要中断函数执行,喇叭就会响。

如果L_LED等于0的时候,t会自加到150,在没有达到150之前,都会运行return,所以,这段时间是不会运行t=0;DelayMS(20);的,所以这段时间里中断美毫秒执行一次,DEEP也就每毫秒取反,输出方波,驱动喇叭

同理 L_LED等于1的时候,也是一样的原理

当达到条件运行DelayMS(20);的时候,程序中断会再这里空耗20毫秒,这20毫秒时间里,DEEP没有输出方波,喇叭就不响了。

应该看懂了吧,好好想想,想不通再联系我
追问
那么那个定时器的计数初值是起什么作用的?不是确定喇叭响的时间的吗?
追答
定时器的计数初值是确定定时器的溢出时间,
也就是中断函数多久运行一次,
这里的初值是65535-1000(/256和%256只是用于取高低八位)
也就是计时1000个时钟周期才溢出产生中断(加到65535就溢出了)
如果是12M晶振的话,就是1毫秒中断一次,中断了就执行中断函数
所以这个程序里中断函数每毫秒运行一次,
也就是每毫秒取反下DEEP,在deep引脚就输出方波了
定时器中断有两个作用,
一个作用是在BEEP引脚输出1毫秒的方波驱动喇叭
另一个作用就是响的时间了。

其实你想想你的程序里,你需要两个时间,一个时间是方波的周期,另一个时间是响的时间
输出方波的时间短(1毫秒),而响的时间长(60或者150毫秒)
而你只有一个定时怎么办?
办法那就是定时1毫秒产生方波,然后对这个1毫秒进行计数,计数达到响的时间了,就延时,延时的时候中断函数不会再执行,所以延时的时候DEEP没有方波输出,就不响了。

不知道这么说你明白了没有。
PS:强烈要求增加悬赏分......

还有,修正楼上的答案,响的时间只有t决定,而delay是决定不响的时间,另外,定时器初值对响的时间有影响,对喇叭的声调也有影响(输出方波的频率)

再有,给你列出关系: 响的时间 = 定时器初值 X t
不响的时间 = delayMS ( 和定时器初值一点关系没有)
喇叭声调 = 定时器初值

在修改下答案,补充
中断函数返回后,是返回到主函数了,继续执行主函数,等下一次定时器溢出(1毫秒)后,产生定时器中断,就又执行中断函数了
镭毅
2011-12-02 · TA获得超过1394个赞
知道大有可为答主
回答量:1155
采纳率:0%
帮助的人:1096万
展开全部
void T1_INT()interrupt 3
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
BEEP=-BEEP;
//根据高温还是低温警报设定不同延时间隔
if(L_LED==0)//L_LED一定是低温/高温显示,即L_LED==0是低温;==1是高温
{//如果是低温时,看看t到没到150,如果没到直接返回
if(++t!=150) return;
}
else
{//L_LED==1,说明是高温,看看t到没到60,如果没到直接返回
if(++t!=60) return;
}
\\低温时(L_LED==0),t==150说明是延时到了;或者高温时(L_LED==1),t==60说明延时到了。
t=0;//t清零
DelayMS(20);//延时
}
追问
如果返回是返回到哪继续执行?报警声频率是T定时器的计数值决定的还是t决定的或者是DelayMS决定的还是三者都有
追答
返回时此次中断结束,等待下一次定时中断。每一次定时中断有时间间隔的,频率由定时器常数决定。这里决定频率:(TH1=(65536-1000)/256;   TL1=(65536-1000)%256;
BEEP=-BEEP;

如果想改变频率, BEEP=-BEEP;的位置不对?

++t不是每一次把t加一了。t到60或150,t清零。
t和delay决定响的时长。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
本色李宁
2011-12-02 · TA获得超过168个赞
知道答主
回答量:69
采纳率:0%
帮助的人:50.1万
展开全部
if(++t!=150) return;//t等于150否,不等于就结束中断函数
if(++t!=60) return;//t 等于60否,不等于也跳出中断函数
假如你是12M晶振的
呵呵,其实就是低温报警延时150*1ms,高温报警60*1ms,报警声调是固定的嘛。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式