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;
}
希望高手指点。
P3M0 = 0XFF; P3M1 = 0X00;
这两句代码就把端口都配置为推挽输出了,既然端口是输出状态,怎么能够接受外部中断的触发 晓飛飛 发表于 2024-9-6 22:43
P3M0 = 0XFF; P3M1 = 0X00;
这两句代码就把端口都配置为推挽输出了,既然端口是输出状态,怎么能够接受外 ...
设置为高阻吗? lclbf 发表于 2024-9-6 22:51
设置为高阻吗?
看你中断口接什么,如果是开关按键,那需要设置成准双向、高阻+上拉,或者开漏+上拉的模式,如果是接入TTL或CMOS信号,那设置成高阻即可。 晓飛飛 发表于 2024-9-6 22:55
看你中断口接什么,如果是开关按键,那需要设置成准双向、高阻+上拉,或者开漏+上拉的模式,如果是接入TT ...
接的红外遥控接收头,我现在设置为高阻输入还是不行。 lclbf 发表于 2024-9-6 22:57
接的红外遥控接收头,我现在设置为高阻输入还是不行。
设为准双向口也不行。 wnagming 发表于 2024-9-7 06:21
先看看代码有没有进中断,然后看定时器是否能计数,然后再加红外的代码
谢谢你的解答!我是开89C52开发板上移植过来的,现在用的是STC8H2K12U,可能是跑的速度不一样,红外遥控协议里面时间参数没有改引起的,晚上我再试试。 lclbf 发表于 2024-9-6 22:57
接的红外遥控接收头,我现在设置为高阻输入还是不行。
不行,1838红外接收头是开漏输出的,单片机IO口要设置为双向并设置为1(高阻或开漏置1也行),最好再打开内部4K上拉 DebugLab 发表于 2024-9-7 09:37
不行,1838红外接收头是开漏输出的,单片机IO口要设置为双向并设置为1(高阻或开漏置1也行),最好再打开 ...
我开始的时候就是设置的双向口,你说的IO口要设置为双向并设置为1是啥意思? lclbf 发表于 2024-9-7 10:26
我开始的时候就是设置的双向口,你说的IO口要设置为双向并设置为1是啥意思? ...
比如P10=1,这样才是双向,设置为0是强下拉了
页:
[1]
2