
使用定时器回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
在里面编写上面的程序,因为我们将B相接在PA7引脚,所以我们使用switch case语句进行判断引脚电平,如果单片机此缓检测到A相为高电平就会进入这个中断判断B相电平,低电平为反转,高电平极为正转(程序中灶拿的cnt为计数作用)。
单片机采用外部中断P3.3管脚和红外接收头的搜袜信号线相连,中断方式为边沿触发方式。并用定时器0计算中断的间隔时间,来区分前导码、二进制的“1”、“0”码。并将8位 *** 作码提取出来在数码管上显示。// 解码值在Im[2]中,当IrOK=1时解码有效。
/* 51单片机红外遥控解码程序 */
//用遥控器对准红外接收头,按下遥控器按键,在数码管前两位上就会显示对应按键的编码
#include <reg52.h>
#define uchar unsigned char
sbit dula=P2^6
sbit wela=P2^7
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}
uchar f
#define Imax 14000 //此处为晶振为11.0592时的取值,
#define Imin 8000 //如用其它频率的晶振时,
#define Inum1 1450 //要改变相应的取乱漏态值。
#define Inum2 700
#define Inum3 3000
unsigned char Im[4]={0x00,0x00,0x00,0x00}
uchar show[2]={0,0}
unsigned long m,Tc
unsigned char IrOK
void delay(uchar i)
{
uchar j,k
for(j=ij>0j--)
哗源 for(k=125k>0k--)
}
void display()
{
dula=0
P0=table[show[0]]
dula=1
dula=0
wela=0
P0=0xfe
wela=1
wela=0
delay(5)
P0=table[show[1]]
dula=1
dula=0
P0=0xfd
wela=1
wela=0
delay(5)
} //外部中断解码程序
void intersvr1(void) interrupt 2 using 1
{
Tc=TH0*256+TL0 //提取中断时间间隔时长
TH0=0
TL0=0 //定时中断重新置零
if((Tc>Imin)&&(Tc<Imax))
{
m=0
f=1
return
} //找到启始码
if(f==1)
{
if(Tc>Inum1&&Tc<Inum3)
{
Im[m/8]=Im[m/8]>>1|0x80m++
}
if(Tc>Inum2&&Tc<Inum1)
{
Im[m/8]=Im[m/8]>>1m++//取码
}
if(m==32)
{
m=0
f=0
if(Im[2]==~Im[3])
{
IrOK=1
}
else IrOK=0 //取码完成后判断读码是否正确
}
//准备读下一码
}
}
/*演示主程序*/
void main(void)
{
unsigned int a
m=0
f=0
EA=1
IT1=1EX1=1
TMOD=0x11
TH0=0TL0=0
TR0=1//ET0=1
while(1)
{
if(IrOK==1)
{
show[1]=Im[2] &0x0F //取键码的低四位
show[0]=Im[2] >>4
IrOK=0
}
for(a=100a>0a--)
{
display()
}
}
}
解码程序这个就能实现
不全,缺少 EXIT 标号。-----------------------------
EXIT: RETI
如果是这样,楼主给出的程序,就已经是“中断”方式。
这程序就不需要袜枣改了。
楼主要求改告清拆成外部中断0方式,只是需要改动“中断初始化”部分。
但是这部分,楼正弊主并没有给出。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)