用单片机实现5秒定时,期间每隔1秒引发一次中断服务程序

#include"reg51.h"inti=0,j=0;main(){EA=1;//开总中断ET0=1;//定时器0中断允许TMOD=0x01;//T0为16位定时模式T... #include"reg51.h"
int i=0,j=0;
main()
{
EA=1;//开总中断
ET0=1;//定时器0中断允许
TMOD=0x01;//T0为16位定时模式
TH0=0x4b;//装定时器0初值
TL0=0xfc;
TR0=1;//开定时器1
while(j!=5);//等待中断,5s定时
}
void timer0() interrupt 1 using 0
{
TH0=0x4b;//装定时器0初值
TL0=0xfc;
i++;
if(i==20)//定时1s时间到
{
i=0;
j++;
}
}
自己写了一下,感觉不太对。我这个是每次定时器50ms溢出时都要引发中断,第20次中断时才代表1秒,也就是说只有这一次中断能进行真正的中断服务程序。有没有办法只在1s,2s。。。5s时才引发中断?
展开
 我来答
yiqifu
推荐于2018-04-05 · TA获得超过313个赞
知道小有建树答主
回答量:107
采纳率:0%
帮助的人:157万
展开全部
不能,
因为TH0和TLO都是8位的,两个加起来才16位,也就是说最大只能加到65535。
固最多可以达65毫秒。

如果想设置大于定时65毫秒的定时,你可以把它分成几次。比如:把1秒分成20次中断进行。每次中断的时间为50毫秒。

也就是相当在中断函数中加入
if(i==20)//定时1s时间到
{
.. //标语句
}
这时,就是产生20次中断才做一起操作.就相当于1秒做一次操作(或可以认为是1秒一次真正的中断)
jingufo11
2009-06-27 · TA获得超过167个赞
知道答主
回答量:128
采纳率:0%
帮助的人:95.9万
展开全部
没太明白你的意思。
按照我的理解是这里计时器是用来延时的。如果要在1S,2S。。。5S实现中断,那就当加个标志位,用别的函数实现1S。。。中断服务程序,如:
if(i==20)
{
i=0;
j++;
z=1;//标志变量,初值为0
}

if(z)
{
fun();//中断服务程序
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hepday
2009-06-27 · TA获得超过718个赞
知道小有建树答主
回答量:1074
采纳率:73%
帮助的人:298万
展开全部
把“int i,j;”改成“unsigned int i,j;”试试?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gzliumin
2009-06-27 · TA获得超过415个赞
知道小有建树答主
回答量:883
采纳率:0%
帮助的人:444万
展开全部
搞个软件计数器就可以了 进入中断一次计数器加一
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式