找回密码
 立即注册
查看: 659|回复: 13

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:344
  • 最近打卡:2025-05-09 07:44:58

19

主题

205

回帖

844

积分

高级会员

积分
844
发表于 2024-9-6 22:38:48 | 显示全部楼层 |阅读模式
用 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[4];
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[2] == 0x40)  //0x09为+键码,正转1圈
                                        {
                                                        LED = ~LED;
                                        }
//                                        else if (ircode[2] == 0x48)  //0x15为-键码,反转1圈
//                                        {
//                                                        LED = 0;
//                                        }
                        }
        }
}




#include <STC8h.h>

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

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

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;
}


希望高手指点。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-09 00:28:12
已绑定手机

35

主题

2111

回帖

2263

积分

荣誉版主

积分
2263
发表于 2024-9-6 22:43:28 | 显示全部楼层
P3M0 = 0XFF; P3M1 = 0X00;
这两句代码就把端口都配置为推挽输出了,既然端口是输出状态,怎么能够接受外部中断的触发
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:344
  • 最近打卡:2025-05-09 07:44:58

19

主题

205

回帖

844

积分

高级会员

积分
844
发表于 2024-9-6 22:51:20 | 显示全部楼层
晓*** 发表于 2024-9-6 22:43
P3M0 = 0XFF; P3M1 = 0X00;
这两句代码就把端口都配置为推挽输出了,既然端口是输出状态,怎么能够接受外 ...

设置为高阻吗?

点评

看你中断口接什么,如果是开关按键,那需要设置成准双向、高阻+上拉,或者开漏+上拉的模式,如果是接入TTL或CMOS信号,那设置成高阻即可。  详情 回复 发表于 2024-9-6 22:55
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-09 00:28:12
已绑定手机

35

主题

2111

回帖

2263

积分

荣誉版主

积分
2263
发表于 2024-9-6 22:55:00 | 显示全部楼层
lcl*** 发表于 2024-9-6 22:51
设置为高阻吗?

看你中断口接什么,如果是开关按键,那需要设置成准双向、高阻+上拉,或者开漏+上拉的模式,如果是接入TTL或CMOS信号,那设置成高阻即可。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:344
  • 最近打卡:2025-05-09 07:44:58

19

主题

205

回帖

844

积分

高级会员

积分
844
发表于 2024-9-6 22:57:01 | 显示全部楼层
晓*** 发表于 2024-9-6 22:55
看你中断口接什么,如果是开关按键,那需要设置成准双向、高阻+上拉,或者开漏+上拉的模式,如果是接入TT ...

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

点评

不行,1838红外接收头是开漏输出的,单片机IO口要设置为双向并设置为1(高阻或开漏置1也行),最好再打开内部4K上拉  详情 回复 发表于 2024-9-7 09:37
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:344
  • 最近打卡:2025-05-09 07:44:58

19

主题

205

回帖

844

积分

高级会员

积分
844
发表于 2024-9-6 22:58:41 | 显示全部楼层
lcl*** 发表于 2024-9-6 22:57
接的红外遥控接收头,我现在设置为高阻输入还是不行。

设为准双向口也不行。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:344
  • 最近打卡:2025-05-09 07:44:58

19

主题

205

回帖

844

积分

高级会员

积分
844
发表于 2024-9-7 08:06:35 | 显示全部楼层
wnag*** 发表于 2024-9-7 06:21
先看看代码有没有进中断,然后看定时器是否能计数,然后再加红外的代码

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:431
  • 最近打卡:2025-05-09 09:00:33
已绑定手机

77

主题

4874

回帖

8500

积分

超级版主

DebugLab

积分
8500
发表于 2024-9-7 09:37:37 | 显示全部楼层
lcl*** 发表于 2024-9-6 22:57
接的红外遥控接收头,我现在设置为高阻输入还是不行。

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:344
  • 最近打卡:2025-05-09 07:44:58

19

主题

205

回帖

844

积分

高级会员

积分
844
发表于 2024-9-7 10:26:42 | 显示全部楼层
Debu*** 发表于 2024-9-7 09:37
不行,1838红外接收头是开漏输出的,单片机IO口要设置为双向并设置为1(高阻或开漏置1也行),最好再打开 ...

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

点评

比如P10=1,这样才是双向,设置为0是强下拉了  详情 回复 发表于 2024-9-7 11:10
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:431
  • 最近打卡:2025-05-09 09:00:33
已绑定手机

77

主题

4874

回帖

8500

积分

超级版主

DebugLab

积分
8500
发表于 2024-9-7 11:10:07 | 显示全部楼层
lcl*** 发表于 2024-9-7 10:26
我开始的时候就是设置的双向口,你说的IO口要设置为双向并设置为1是啥意思? ...

比如P10=1,这样才是双向,设置为0是强下拉了
DebugLab
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-9 09:22 , Processed in 0.174156 second(s), 113 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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