lclbf 发表于 2024-9-6 22:38:48

8H2K12U外部中断0使用问题 |已解决

用 8H2K12U来做一个遥控控制电路,出现遥控不起作用,自己没有找出来原因.

功能引脚如下:

OUT(LED) P54 1   8 P33 P11(蜂鸣器输出,高电平有效)
               VCC 2   7 P32 P10 INTN0(遥控输入)
               CAP 3   6 P31
            GND 4   5 P30(按键)

自己的程序如下:

***********************/
#include <STC8h.h>
#include <intrins.h>

/* IO引脚分配定义 */
sbit LED = P5^4;
//sbit BUZZ = P3^3;
//sbit KEY = P3^0;

extern bit irflag;
extern unsigned char ircode;
extern void InitInfrared();


void main()
{
      P_SW2 |= 0X80;
      
      P0M0 = 0XFF;
      P0M1 = 0X00;
      P1M0 = 0XFF;
      P1M1 = 0X00;
      P2M0 = 0XFF;
      P2M1 = 0X00;
      P3M0 = 0XFF;
      P3M1 = 0X00;
      P4M0 = 0XFF;
      P4M1 = 0X00;
      P5M0 = 0XFF;
      P5M1 = 0X00;
      
      EA = 1;      //开总中断      
      LED = 0;

      InitInfrared();   //初始化红外功能

      while (1)
      {
                        if (irflag)//接收到红外数据时刷新显示
                        {
                                        irflag = 0;
                                        if (ircode == 0x40)//0x09为+键码,正转1圈
                                        {
                                                      LED = ~LED;
                                        }
//                                        else if (ircode == 0x48)//0x15为-键码,反转1圈
//                                        {
//                                                      LED = 0;
//                                        }
                        }
      }
}




#include <STC8h.h>

sbit IR_INPUT = P3^2;//红外接收引脚

bit irflag = 0;//红外接收标志,收到一帧正确数据后置1
unsigned char ircode;//红外代码接收缓冲区

void InitInfrared()
{      
      IR_INPUT = 1;
      TMOD &= 0XF0;
      TMOD |= 0x01;
      TR0 = 0;
      ET0 = 0;
      IT0 = 1;
      EX0 = 1;
}
unsigned int GetHighTime()
{
      TH0 = 0;
      TL0 = 0;
      TR0 = 1;
      while(IR_INPUT)
      {
                if(TH0 > 0x40)
                {
                        break;
                }
      }
      TR0 = 0;

      return(TH0 * 256 + TL0);
}

unsigned int GetLowTime()
{
      TH0 = 0;
      TL0 = 0;
      TR0 = 1;
      while(!IR_INPUT)
      {
                if(TH0 > 0x40)
                {
                        break;
                }
      }
      TR0 = 0;

      return(TH0 * 256 + TL0);
}
void EXINT0_ISR() interrupt 0
{
      unsigned char i, j;
      unsigned int time;
      unsigned char byt;

      time = GetLowTime();
      if((time <7833) || (time > 8755))         
      {
                IE0 = 0;
                return;      
      }

      time = GetHighTime();
      if((time<3686) || (time > 4608))
      {
                IE0 = 0;
                return;
      }
      for(i=0; i<4; i++)
      {
                for(j=0; j<8; j++)
                {
                        time = GetLowTime();
                        if((time<313) ||(time >718))
                        {
                              IE0 = 0;
                              return;
                        }
                        time = GetHighTime();
                        if((time>313) && (time <718))
                        {
                              byt >>= 1;      
                        }
                        else if((time>1345) && (time<1751))
                        {
                              byt >>= 1;
                              byt |= 0x80;
                        }
                        else
                        {
                              IE0 = 0;
                              return;
                        }
                }
                ircode = byt;
      }
      irflag = 1;
      IE0 = 0;
}


希望高手指点。

晓飛飛 发表于 2024-9-6 22:43:28

P3M0 = 0XFF; P3M1 = 0X00;
这两句代码就把端口都配置为推挽输出了,既然端口是输出状态,怎么能够接受外部中断的触发

lclbf 发表于 2024-9-6 22:51:20

晓飛飛 发表于 2024-9-6 22:43
P3M0 = 0XFF; P3M1 = 0X00;
这两句代码就把端口都配置为推挽输出了,既然端口是输出状态,怎么能够接受外 ...

设置为高阻吗?

晓飛飛 发表于 2024-9-6 22:55:00

lclbf 发表于 2024-9-6 22:51
设置为高阻吗?

看你中断口接什么,如果是开关按键,那需要设置成准双向、高阻+上拉,或者开漏+上拉的模式,如果是接入TTL或CMOS信号,那设置成高阻即可。

lclbf 发表于 2024-9-6 22:57:01

晓飛飛 发表于 2024-9-6 22:55
看你中断口接什么,如果是开关按键,那需要设置成准双向、高阻+上拉,或者开漏+上拉的模式,如果是接入TT ...

接的红外遥控接收头,我现在设置为高阻输入还是不行。

lclbf 发表于 2024-9-6 22:58:41

lclbf 发表于 2024-9-6 22:57
接的红外遥控接收头,我现在设置为高阻输入还是不行。

设为准双向口也不行。

lclbf 发表于 2024-9-7 08:06:35

wnagming 发表于 2024-9-7 06:21
先看看代码有没有进中断,然后看定时器是否能计数,然后再加红外的代码

谢谢你的解答!我是开89C52开发板上移植过来的,现在用的是STC8H2K12U,可能是跑的速度不一样,红外遥控协议里面时间参数没有改引起的,晚上我再试试。

DebugLab 发表于 2024-9-7 09:37:37

lclbf 发表于 2024-9-6 22:57
接的红外遥控接收头,我现在设置为高阻输入还是不行。

不行,1838红外接收头是开漏输出的,单片机IO口要设置为双向并设置为1(高阻或开漏置1也行),最好再打开内部4K上拉

lclbf 发表于 2024-9-7 10:26:42

DebugLab 发表于 2024-9-7 09:37
不行,1838红外接收头是开漏输出的,单片机IO口要设置为双向并设置为1(高阻或开漏置1也行),最好再打开 ...

我开始的时候就是设置的双向口,你说的IO口要设置为双向并设置为1是啥意思?

DebugLab 发表于 2024-9-7 11:10:07

lclbf 发表于 2024-9-7 10:26
我开始的时候就是设置的双向口,你说的IO口要设置为双向并设置为1是啥意思? ...

比如P10=1,这样才是双向,设置为0是强下拉了
页: [1] 2
查看完整版本: 8H2K12U外部中断0使用问题 |已解决