打印

求助 计数不进中断

[复制链接]
2112|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huchengxtu|  楼主 | 2009-8-7 13:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用51对P3.5脚计脉冲个数 计数正常 就是不进中断程序
请大家帮忙看下程序

#include "reg52.h"
unsigned char sum; //计数
void IRQ_Ini()    //中断初始化
{
EA=1;
TCON=0x50;
TMOD=0x55;  //初始化为计数器
TL1=0;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}
void timer1(void) interrupt 3  //就是不进这个中断服务程序
{ P2=~P2;     //作为进入中断的提示
sum++;   
}
void main()  
{
    sum=0;
   IRQ_Ini();
   
while(1)
{
    P1=TL1;  //这里显示计数正常 就是P1=SUM;不行
}  
}

相关帖子

沙发
sz_kd| | 2009-8-7 14:13 | 只看该作者
这个你要看看你的全局中断和你的定时中断有没有打开,打开了应该可以进的啊

使用特权

评论回复
板凳
huchengxtu|  楼主 | 2009-8-7 15:02 | 只看该作者
全开了 程序

使用特权

评论回复
地板
smileagain| | 2009-8-7 18:15 | 只看该作者
程序好像没什么问题
P1=TL1; 这句从P1输出的是T1的低8位,也就是实际的计数值
sum++;  这句是把中断的次数赋给sum,但是根据你的设定TL1=0,可能要中断65536次sum才会加1,不知道问题会不会出在这里

还有一点建议:既然你在后面要打开TR1,之前TCON=0x50这句去掉
而且,T1赋值时要高低位一起赋,不要只写个TL1=0,TH1就不管了

使用特权

评论回复
5
救火车| | 2009-8-7 19:28 | 只看该作者
定时器0也打开了?又没有它的中断服务程序。这样定时器0溢出后就跳到 地址0000 了。

使用特权

评论回复
6
虾军师| | 2009-8-7 19:49 | 只看该作者
问题应该是4楼说的那样了
楼主大概是把中断溢出和计数器中断搞混了····
另外4楼说的也不全对 不是中断65536次 而是计65536次才中断一次执行中断服务程序
即65536个脉冲进入P3.5口后才能使sum++
:)

使用特权

评论回复
7
smileagain| | 2009-8-7 21:39 | 只看该作者
问题应该是4楼说的那样了
楼主大概是把中断溢出和计数器中断搞混了····
另外4楼说的也不全对 不是中断65536次 而是计65536次才中断一次执行中断服务程序
即65536个脉冲进入P3.5口后才能使sum++
:) ...
虾军师 发表于 2009-8-7 19:49

嗯,是我讲错了,应该是65536次计数后才能进一次中断程序,谢谢纠正

to 5楼,虽然定时器0打开了,但是TMOD=0x55已经把T0设成了计数器,即使启动也不会计数的,不会引发中断

使用特权

评论回复
8
huchengxtu|  楼主 | 2009-8-9 00:27 | 只看该作者
谢谢各位大哥的解答 已经证实了
关于 四楼大哥的建议“还有一点建议:既然你在后面要打开TR1,之前TCON=0x50这句去掉”
请问这是为什么呢?

使用特权

评论回复
9
smileagain| | 2009-8-9 14:10 | 只看该作者
定时器或计数器最好在设置完之后,并且在需要启动的时候才启动
虽然提前启动可能在多数场合下没什么差别,但在有些情况下会出错,比如提前溢出或进入中断
所以这个习惯不好

使用特权

评论回复
10
smileagain| | 2009-8-9 14:10 | 只看该作者
定时器或计数器最好在设置完之后,并且在需要启动的时候才启动
虽然提前启动可能在多数场合下没什么差别,但在有些情况下会出错,比如提前溢出或进入中断
所以这个习惯不好

使用特权

评论回复
11
hkhk888| | 2009-8-9 21:14 | 只看该作者
:D

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

58

帖子

0

粉丝