找回密码
 立即注册

QQ登录

只需一步,快速开始

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

小白求助:STC8F1K08S2单片机无法进入外部中断

[复制链接]
跳转到指定楼层
楼主
AN1分别接外部中断4管脚(P3.0)和地,AN2分别接P3.1和地之间。上面的测试程序是按下AN1或者AN2,LED都会亮,实际上只有按下AN2灯会亮,按下AN1灯不亮,也就是没有进入中断。其他的外部中断也试了,也是没有进入中断。在15W系列上用都没有问题,8F系列第一次用,PDF好像也没看到需要特别注意的地方。搞了大半天了,也没看出来哪里问题。请求大佬们指点一下,不胜感激!
STC8F1K08S2   TSSOP-20封装



单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sfr INTCLKO = 0x8F;         //          外部中断
  6. sfr IE2       = 0xAF;               //中断使能寄存器2
  7. sfr AUXR      = 0x8E;               //辅助寄存器

  8. sfr P5 = 0xC8;   //xxxx,1111 端口5
  9. sbit LVP2=P1^0;         //高电平开,低电平关
  10. sbit LVP3=P1^1;         //高电平开,低电平关
  11. sbit SW3=P1^2;           //拨码开关3   
  12. sbit SW2=P1^3;           //拨码开关2         
  13. sbit SW1=P1^4;           //拨码开关1
  14. sbit OCP3=P1^5;          //高电平开,低电平关
  15. sbit OCP2=P1^6;          //高电平开,低电平关
  16. sbit OCP1=P1^7;          //高电平开,低电平关
  17. sbit AN1=P3^0;                  // AN1 启动/多功能按键
  18. sbit AN2=P3^1;                  // AN2 停止/多功能按键
  19. sbit OCP=P3^2;                 //        过流保护输入,正常高电平,过流低电平  
  20. sbit OTP=P3^3;                  // 过温保护输入,正常高电平,过温低电平        
  21. sbit CMPO=P3^4;                 //低压比较器输出:正常高电平,低压低电平
  22. sbit OY=P3^5;              //功率回路开关
  23. sbit LVP1=P3^6;            // 高电平开,低电平关         
  24. sbit CMPN=P3^7;            // 比较器正相输入         
  25. sbit LED=P5^4;                 //LED指示灯 :1亮,0灭。  
  26. sbit SVP=P5^5;           // 节能控制,OP电源开关 :高电平开
  27. uchar num,calt1;         

  28. void delayms(uint xms)          //xms
  29. {
  30.    uint i,j,m;                        
  31.    for(i=xms;i>0;i--)
  32.        for(j=50;j>0;j--)        //10.1ms
  33.               for(m=100;m>0;m--);        
  34. }

  35. void init123()   //初始化函数
  36. {
  37.    TMOD=0x01;  //设置定时器0为工作方式1(M1M0为0000 0001即01)
  38.    TH0=(65536-50000)/256;  //50ms
  39.    TL0=(65536-50000)%256;
  40.    TR0 = 1;      //启动定时器0
  41.    ET0 = 1;            //打开定时器0

  42.    //IT0=0;    //外部中断0,1为跳变沿触发方式 ,0为低电平触发。
  43.    //EX0=1;    //开外部中断0
  44.    IT1=0;    //外部中断1,1为跳变沿触发方式 ,0为低电平触发。
  45.    EX1=1;    //开外部中断1
  46.         
  47.    //INTCLKO = 0x10; //EX2=1;         //         打开外部中断2
  48.    //INTCLKO = 0x20; //EX3=1;         //         打开外部中断3
  49.    INTCLKO = 0x40; //EX4=1;            //         打开外部中断4
  50.    //INTCLKO = 0x70;        //234
  51.                         
  52.     OY=0;
  53.     LED=0;                     
  54.     SVP=1;           

  55.    EA=1;         //开总中断
  56. }

  57. void main()
  58. {
  59.    init123();
  60.    delayms(1);
  61.          while(1)
  62.          {
  63.             if(AN2==0)
  64.                 {
  65.                    LED=1;
  66.                 }
  67.                 else
  68.                 {
  69.                    LED=0;
  70.                    num=0;
  71.                 }
  72.          }
  73. }

  74. void INT1_time() interrupt 2         //外部中断1   
  75. {
  76.         LED=1;
  77. }

  78. void INT4_time() interrupt 16         //外部中断4 ,下降沿触发
  79. {
  80.         LED=1;
  81. }  

  82. void T0_time() interrupt 1         //T0
  83. {
  84.          num++;        
  85. }
复制代码





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

使用道具 举报

沙发
ID:25310 发表于 2019-12-6 13:25 | 只看该作者
你那个中断里面不处理自然看不到反应了。比如LED取反啥的也好啊。

STC自己的范例为你参考:

#include "reg51.h"
#include "intrins.h"

sbit    P10         =   P1^0;
sbit    P11         =   P1^1;

void INT1_Isr() interrupt 2
{
    if (INT1)                                   //判断上升沿和下降沿
    {
        P10 = !P10;                             //测试端口
    }
    else
    {
        P11 = !P11;                             //测试端口
    }
}

void main()
{
    IT1 = 0;                                    //使能INT1上升沿和下降沿中断
    EX1 = 1;                                    //使能INT1中断
    EA = 1;

    while (1);
}

回复

使用道具 举报

板凳
ID:377210 发表于 2019-12-6 15:34 | 只看该作者
pcbboy 发表于 2019-12-6 13:25
你那个中断里面不处理自然看不到反应了。比如LED取反啥的也好啊。

STC自己的范例为你参考:

好的,我改一下看看
回复

使用道具 举报

地板
ID:377210 发表于 2019-12-6 16:35 | 只看该作者
问题解决了:其实并不是没有进入中断,只是因为速度太快了,LED测试时肉眼看不出来,实际已经进入中断了的。8F系列速度确实比15W系列的快了,导致在15W系列上可以用的程序到8F系列却用不了,
通过增加延时时间,或者在中断服务程序里加个跳转函数处理即可解决。 谢谢@pcbboy 的指点
回复

使用道具 举报

5#
ID:644425 发表于 2020-4-11 22:24 来自手机 | 只看该作者
你测试中断,就要一个空的while(1); 在那里候着,啥事都让中断干,才行。你while里,只要an2没有按下,就关灯,循环还那么快,中断了都不知道。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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