找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3881|回复: 7
收起左侧

请教,关于STC89C52单片机定时计数器2的中断使用

[复制链接]
ID:695269 发表于 2020-3-13 00:11 | 显示全部楼层 |阅读模式
HELLO:        最近准备用STC89C52单片机做个小东西(40脚封装),但是在T/C2的使用上卡壳了。想请教论坛的前辈,望不吝赐教。
       是这样的,写的程序需要一个外部中断。而定时器0定时器1以及两个外部中断都被用了。所以,就想用定时器T2扩展一个外部中断出来。但是程序烧入芯片后开发板测试,发现不能产生中断。KEIL4仿真,也是进不了中断。(定时器2寄存器设置以及中断调用代码如下)
        T2MOD = 0;                //初始化模式寄存器(手册上波特率发生器模式下,T2ES/P1.1脚可以作为外部中断)
        RCLK=1;
        TCLK=1;
        EXEN2=1;
        C_T2=1;
        TR2=1;
        ET2=1;
        EA=1;

void Time2 (void) interrupt 5                //扩展外部中断2
{        nDataTH0=TH0;
        nDataTL0=TL0;
        nDataTH1=TH1;
        nDataTL1=TL1;       
        nDataZheng=(nDataTH0<<8)+nDataTL0;
        nDataFan=(nDataTH1<<8)+nDataTL1;
        nData=nDataZheng-nDataFan;
        //nDataMax=(nData>=0)?nData:(~nData+1);
        if(nData<0)
                {nDataMax=~nData+1;
                }                                       
        else
                {nDataMax=nData;
                }
           TH0=0;
        TL0=0;
        TH1=0;
        TL1=0;
        nData=0;
        TF2=0;
        EXF2=0;                                                //复位中断溢出位,给下次中断做准备
}

于是改变策略,用计数器2自动重装扩展。(中断程序不变,T2寄存器设置如下)
        T2MOD = 0;                //初始化模式寄存器
        TL2 = 0xff;                //设置定时初值
        TH2 = 0xff;                //设置定时初值
        RCAP2L = 0xff;                //设置定时重载值
        RCAP2H = 0xff;                //设置定时重载值
        RCLK=0;
        TCLK=0;
        EXEN2=0;
        C_T2=1;
        TR2=1;
        ET2=1;
        EA=1;

用T2/P1.0触发。可是,依然不能进入中断。。。。
*************************
随后单独写了个小程序测试,发现定时模式下也不能进入中断!!!(如下)
#include <reg52.h>
//#include<stdio.h>
sfr T2MOD        = 0x0c9;
void Timer2Init(void);
void main (void)
{        void Timer2Init(void);
        ET2=1;        //定时/计数器2 中断使能
        EA=1;
        while(1);
}
void Timer2 (void) interrupt 5 using 3
{        TF2=0;
        while(1);
}
void Timer2Init(void)                //1000微秒@11.0592MHz
{
        T2MOD = 0;                //初始化模式寄存器
        T2CON = 0;                //初始化控制寄存器
        TL2 = 0x66;                //设置定时初值
        TH2 = 0xFC;                //设置定时初值
        RCAP2L = 0x66;                //设置定时重载值
        RCAP2H = 0xFC;                //设置定时重载值
        TR2 = 1;                //定时器2开始计时
}

另外又从KEIL中分别设置AT89C52和STC89C52RS进行仿真,依然不能进入中断。
51hei图片20200313000700.png

?????????????
问题出在哪里呢?

回复

使用道具 举报

ID:294296 发表于 2020-3-13 02:32 | 显示全部楼层
Timer2Init的东西(定时器的配置)写在主函数while(1)上面那里,把要写的逻辑写在中断函数里面
回复

使用道具 举报

ID:213173 发表于 2020-3-13 06:54 | 显示全部楼层
楼主莫非把外部中断2与T2外部计数搞混淆了。
void exint2() interrupt 6
回复

使用道具 举报

ID:94031 发表于 2020-3-13 09:20 | 显示全部楼层
定时计数器2的中断处理里不能有 while(1);
回复

使用道具 举报

ID:707532 发表于 2020-3-13 11:09 | 显示全部楼层
C52单片机的定时器2是一个16位定时/计数器。它溢出时,置位T2CON的TF2标志引起中断,捕捉脉冲是否生效,取决于T2MOD的捕捉允许位。
回复

使用道具 举报

ID:695269 发表于 2020-3-13 21:35 | 显示全部楼层
wulin 发表于 2020-3-13 06:54
楼主莫非把外部中断2与T2外部计数搞混淆了。
void exint2() interrupt 6

用的40引脚封装的STC89C52,没有外部中断2
回复

使用道具 举报

ID:695269 发表于 2020-3-13 21:37 | 显示全部楼层
顺风顺水 发表于 2020-3-13 11:09
C52单片机的定时器2是一个16位定时/计数器。它溢出时,置位T2CON的TF2标志引起中断,捕捉脉冲是否生效,取 ...

不是用T2捕捉,而是T2进不了中断。
回复

使用道具 举报

ID:505058 发表于 2021-6-17 00:35 来自手机 | 显示全部楼层
咖妃污 发表于 2020-3-13 21:35
用的40引脚封装的STC89C52,没有外部中断2

有,你没配置好
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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