找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4197|回复: 15
打印 上一主题 下一主题
收起左侧

51定时器中断进入不了的原因?

  [复制链接]
跳转到指定楼层
楼主
ID:506091 发表于 2019-4-7 10:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include  "stc12c5a60s2.h"

#define  uchar unsigned char
#define  uint  unsigned int

/*======================
      定时器初值定义
======================*/
#define TH0_Init  0xff
#define TL0_Init  0x8C
#define TMOD_Init 0x01
#define TCON_Init 0x10
/*======================
       变量定义
======================*/
uchar Cnt2ms;
uchar Cnt10ms;
uint  Cnt1s;

sbit LED1=P2^3;
/*======================
       函数声明
======================*/
void T0_Init(void);

/*======================
       主函数
======================*/
void main()
{
    T0_Init();
        while(1);
}

/*======================
    定时器初始化函数
======================*/
void T0_Init(void)
{
        TMOD |=TMOD_Init;
        TL0=TL0_Init;
        TH0=TH0_Init;
        ET0=1;
        EA=1;
}
void T0_Start()
{
        TR0=1;
}
void T0_Stop()
{
        TR0=0;
}


void Timer0() interrupt 1
{
        T0_Stop();
        TL0=TL0_Init;
        TH0=TH0_Init;
        T0_Start();

        Cnt1s++;
        if(Cnt1s>=8000)
        {
                Cnt1s=0;
                LED1=~LED1;
        }
}  

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:506093 发表于 2019-4-7 10:53 | 只看该作者
你初始化时TR0没有置1,所以进入不了T0的中断!另外你为什么要在中断里面清零TR0?
回复

使用道具 举报

板凳
ID:506093 发表于 2019-4-7 10:54 | 只看该作者
你初始化时TR0没有置1,所以定时器没有开始运行!
回复

使用道具 举报

地板
ID:213173 发表于 2019-4-7 11:09 | 只看该作者
定时器TR0=1;在中断函数里才能打开,这个中断如何产生???悖论!!!void T0_Start(),void T0_Stop()这两个函数纯属蛇足。
void T0_Init(void)
{
        TMOD |=TMOD_Init;
        TL0=TL0_Init;
        TH0=TH0_Init;
        TR0=1;
       ET0=1;
        EA=1;
}
回复

使用道具 举报

5#
ID:229821 发表于 2019-4-7 12:33 | 只看该作者
stc的烧录软件中有源码例子,封装管脚等等的资料。很方便的。stc-isp-15xx-v6.86r.exe
回复

使用道具 举报

6#
ID:451718 发表于 2019-4-7 16:53 | 只看该作者
这个段代码凑得还是蛮严谨,应该只是没有搞懂定时器是什么原理而已。   很多初学者开始都会把定时器和中断混为一堆,用到定时器就以为一定要发生中断。  所以才会出现在定时器中断里面去 操作TR的想法。  不妨从一下4个步骤去体会一下定时器的运用。
第一步:设置特殊功能寄存器TMOD,配置定时器的工作模式。
第二步:设置计数寄存器TH 和TL 的初值。(溢出后也要重新设置,不然就要从0x0000开始重新计数了)
第三步:设置TCON,通过TR置1来让定时器开始计数。
第四步:判断TCON寄存器的TF位,监测定时器溢出情况。(可以通过寄存器中断机制,在这里给计数器付初值,而不是去开关计数器。)
回复

使用道具 举报

7#
ID:46065 发表于 2019-4-7 20:49 | 只看该作者
你程序里TR0=1;只有在中断里才执行,TR0没开中断就不开,不开开中断更执行不发TR0=1,你可以在中断初始化函数里开下TR0=1
回复

使用道具 举报

8#
ID:430571 发表于 2019-4-7 20:59 | 只看该作者
设置
TR0=1;
回复

使用道具 举报

9#
ID:448979 发表于 2019-4-7 22:58 | 只看该作者
TR0=1;
回复

使用道具 举报

10#
ID:425268 发表于 2019-4-8 13:02 | 只看该作者
没开中断  TR0=1
回复

使用道具 举报

11#
ID:506927 发表于 2019-4-8 13:39 | 只看该作者
TRO=1; //中断
回复

使用道具 举报

12#
ID:74585 发表于 2019-4-8 15:17 | 只看该作者
初始化未启动定时器。初始化的时候加上T0_Start()就可以了
回复

使用道具 举报

13#
ID:506091 发表于 2019-4-8 15:28 | 只看该作者
飞云 发表于 2019-4-7 10:53
你初始化时TR0没有置1,所以进入不了T0的中断!另外你为什么要在中断里面清零TR0?

好的,谢谢你的回答
回复

使用道具 举报

14#
ID:506091 发表于 2019-4-8 15:29 | 只看该作者
wulin 发表于 2019-4-7 11:09
定时器TR0=1;在中断函数里才能打开,这个中断如何产生???悖论!!!void T0_Start(),void T0_Stop()这 ...

谢谢你的回答,我去修改修改
回复

使用道具 举报

15#
ID:506091 发表于 2019-4-8 15:29 | 只看该作者
saya0769 发表于 2019-4-7 12:33
stc的烧录软件中有源码例子,封装管脚等等的资料。很方便的。stc-isp-15xx-v6.86r.exe

好的,谢谢你的回答
回复

使用道具 举报

16#
ID:481497 发表于 2019-4-9 12:44 | 只看该作者
少了TRO=1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表