红外解码程序,但是单片机上电数码管不亮,更别说遥控器控制他了,求高手指点错误

红外解码程序,但是单片机上电数码管不亮,更别说遥控器控制他了,求高手指点错误,第1张

#include<reg52h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit IR=P3^2; //红外接口标志

#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换

sbit LATCH1=P2^2;//定义锁存使能端口 段锁存

sbit LATCH2=P2^3;// 位锁存

/------------------------------------------------

全局变量声明

------------------------------------------------/

unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9

unsigned char irtime;//红外用全局变量

bit irpro_ok,irok;

unsigned char IRcord[4];

unsigned char irdata[33];

/------------------------------------------------

函数声明

------------------------------------------------/

void Ir_work(void);

void Ircordpro(void);

/------------------------------------------------

定时器0中断处理

------------------------------------------------/

void tim0_isr (void) interrupt 1 using 1

{

irtime++; //用于计数2个下降沿之间的时间

}

/------------------------------------------------

外部中断0中断处理

------------------------------------------------/

void EX0_ISR (void) interrupt 0 //外部中断0服务函数

{

static unsigned char i; //接收红外信号处理

static bit startflag; //是否开始处理标志位

if(startflag)

{

if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+45ms

i=0;

irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1

irtime=0;

i++;

if(i==33)

{

irok=1;

i=0;

}

}

else

{

irtime=0;

startflag=1;

}

}

/------------------------------------------------

定时器0初始化

------------------------------------------------/

void TIM0init(void)//定时器0初始化

{

TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值

TH0=0x00; //重载值

TL0=0x00; //初始化值

ET0=1; //开中断

TR0=1;

}

/------------------------------------------------

外部中断0初始化

------------------------------------------------/

void EX0init(void)

{

IT0 = 1; //指定外部中断0下降沿触发,INT0 (P32)

EX0 = 1; //使能外部中断

EA = 1; //开总中断

}

/------------------------------------------------

键值处理

------------------------------------------------/

void Ir_work(void)//红外键值散转程序

{

switch(IRcord[2])//判断第三个数码值

{

case 0x0c:DataPort=dofly_DuanMa[1];break;//1 显示相应的按键值

case 0x18:DataPort=dofly_DuanMa[2];break;//2

case 0x5e:DataPort=dofly_DuanMa[3];break;//3

case 0x08:DataPort=dofly_DuanMa[4];break;//4

case 0x1c:DataPort=dofly_DuanMa[5];break;//5

case 0x5a:DataPort=dofly_DuanMa[6];break;//6

case 0x42:DataPort=dofly_DuanMa[7];break;//7

case 0x52:DataPort=dofly_DuanMa[8];break;//8

case 0x4a:DataPort=dofly_DuanMa[9];break;//9

default:break;

}

irpro_ok=0;//处理完成标志

}

/------------------------------------------------

红外码值处理

------------------------------------------------/

void Ircordpro(void)//红外码值处理函数

{

unsigned char i, j, k;

unsigned char cord,value;

k=1;

for(i=0;i<4;i++) //处理4个字节

{

for(j=1;j<=8;j++) //处理1个字节8位

{

cord=irdata[k];

if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差

value|=0x80;

if(j<8)

{

value>>=1;

}

k++;

}

IRcord[i]=value;

value=0;

}

irpro_ok=1;//处理完毕标志位置1

}

/------------------------------------------------

主函数

------------------------------------------------/

void main(void)

{

EX0init(); //初始化外部中断

TIM0init();//初始化定时器

DataPort=0xfe; //取位码 第一位数码管选通,即二进制1111 1110

LATCH2=1; //位锁存

LATCH2=0;

while(1)//主循环

{

if(irok) //如果接收好了进行红外处理

{

Ircordpro();

irok=0;

}

if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等

{

Ir_work();

}

}

}

经过试验是可以的

//这是IRh提供给外部调用的函数

#ifndef _IR_H_

#define _IR_H_

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

void ir_init(void);

void ir_run(void);

#endif

下面使用说明:

void ir_init(void);//红外初始化

void ir_run(void);//红外运行

extern uchar ir_code[2];//键盘码

例子:

void main()

{

ir_init();

while(1)

{

ir_run();

write_smg(0,ir_code[2]/16);//写数码管0显示

write_smg(1,ir_code[2]%16);//写数码管1显示

}

}

可到百度文库下载源码IRc(搜索关键字:IR红外解码模块)

感兴趣的还有:WDT看门狗模块

很好用!!!

这是我用汇编做的,你可以参考一下:

;-------------红外解码程序---------------------------

EXINT0:

PUSH ACC

PUSH PSW

PUSH 1

PUSH 2

PUSH 6

CLR EA ;暂时关闭中断请求

MOV R6,#10

EXINT10:

LCALL DELAY09MS ;调用900us延时子程序

JB IRIN,INTOUT1 ;判断P32是否有高电平,如果有就退出解码程序

DJNZ R6,EXINT10 ;循环10次,检测在900微妙中是否存在高电平。以上完成对遥控信号的9000微秒的初始低电平信号的识别。

JNB IRIN,$ ;等待高电平避开9毫秒低电平引导脉冲

LCALL DELAY45MS ;延时45毫秒

;-------------接受32位代码--------------------------

MOV R1,#IRUSERL

MOV R2,#04H

EXINT101:

MOV R6,#08H ;每组数据位8位

EXINT102:

JNB IRIN,$ ;等待地址码第一组数据的高电平信号

LCALL DELAY09MS ;高电平开始后延时判断信号此时的高/低状态

MOV C,IRIN ;将P32引脚此时的电平状态0或1存入C中

JNC INT1OUT ;如果为0跳出

LCALL DELAY1MS

INT1OUT:

MOV A,@R1

RRC A ;将C中的数据0/1移入A中最低位

MOV @R1,A ;将A中的数据暂存在R1

DJNZ R6,EXINT102 ;接受完8位代码

INC R1

DJNZ R2,EXINT101 ;接受完4组32位代码

;--------------数据码比较-------------------------------

MOV A,IRDATAL

; LCALL SENDRXDAT

MOV A,IRDATAL

CPL A

CJNE A,IRDATAH,INTOUT1 ;判断数码正误,不等退出

MOV IR_DAT,IRDATAL ;相等则保存正确数据

MOV A,IR_DAT

; LCALL SENDRXDAT

SETB IRBIT

INTOUT1:

LCALL DELAY45MS

SETB EA ;允许中断

POP 6

POP 2

POP 1

POP PSW

POP ACC

RETI

;;110592900=9953

DELAY09MS: ;6

PUSH 4 ;4

PUSH 3 ;4

MOV R4,#20 ;2

DLY900:

MOV R3,#122 ;2

DJNZ R3,$ ;4

DJNZ R4,DLY900 ;4

MOV R4,#11 ;2

DJNZ R4,$ ;4

POP 3 ;3

POP 4 ;3

RET ;4

;TOTAL=9952

;;110592560=6193

DELAY056: ;6

PUSH 4 ;4

PUSH 3 ;4

MOV R4,#12 ;2

DLY5600:

MOV R3,#122 ;2

DJNZ R3,$ ;4

DJNZ R4,DLY5600 ;4

MOV R4,#71 ;2

DJNZ R4,$ ;4

POP 3 ;3

POP 4 ;3

RET ;4

;TOTAL=6194

;;1105924500=49766

DELAY45MS: ;6

PUSH 4 ;4

PUSH 3 ;4

MOV R4,#52 ;2

DLY45:

MOV R3,#236 ;2

DJNZ R3,$ ;4

DJNZ R4,DLY45 ;4

MOV R4,#85 ;2

DJNZ R4,$ ;4

POP 3 ;3

POP 4 ;3

RET ;4

;;TOTAL=49768

;;1105921000=11059

DELAY1MS: ;6

PUSH 4 ;4

PUSH 3 ;4

MOV R4,#20 ;2

DLY1MS:

MOV R3,#136 ;2

DJNZ R3,$ ;4

DJNZ R4,DLY1MS ;4

MOV R4,#8 ;2

DJNZ R4,$ ;4

POP 3 ;3

POP 4 ;3

RET ;4

;TOTAL=11060

;;

DELAY100US: ;6

PUSH 4 ;4

MOV R4,#140 ;2

DJNZ R4,$ ;4

MOV R4,#131 ;2

DJNZ R4,$ ;4

POP 4 ;3

RET ;4

;TOTAL=1105

;;

 这个程序太简单了,我之前写过红外发射程序的,接收程序也很简单,你这个项目我2个小时都能帮你解决,但是89C52单片机发射38K不准需要把晶振加大,提高单片机的运行速度。

你的项目只要主机A发射红外协议后面加一个地址,单片机B接收的时候全部进入接收状态,判接收的地址是否符合对于单片机B的地址,如果地址符合,那就先回应一个数据例如:55FF55,主机接收到55FF55后后面开始接收数据,把接收到的数据直接写入单片机内EEPRM里面!

以下文件是51单片机实现遥控解码,通过数码管显示键码的程序,P0口驱动数码管段选,p26和p27为数码管位选,接收头连到P32口。此程序以通过验证,可以直接编译使用,另外还有一个继电器和蜂鸣器的控制,不用可以屏蔽掉。

;

; 描述:

; 遥控键值读取器

; 数码管显示, P0口为数码管的数据口

;

;

;遥控键值解码-数码管显示

;/

#include <reg51h>

#include <intrinsh>

void IR_SHOW();

void delay(unsigned char x);//x014MS

void delay1(unsigned char ms);

void beep();

sbit IRIN = P3^2;

sbit BEEP = P3^7;

sbit RELAY= P1^3;

sbit GEWEI= P2^7;

sbit SHIWEI= P2^6;

unsigned char IRCOM[8];

unsigned char code table[16] =

{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

main()

{

IE = 0x81; //允许总中断中断,使能 INT0 外部中断

TCON = 0x1; //触发方式为脉冲负边沿触发

delay(1);

IRIN=1;

BEEP=1;

RELAY=1;

for(;;)

{

IR_SHOW();

}

} //end main

void IR_IN() interrupt 0 using 0

{

unsigned char i,j,k,N=0;

EA = 0;

I1:

for (i=0;i<4;i++)

{

if (IRIN==0) break;

if (i==3) {EA =1;return;}

}

delay(20);

if (IRIN==1) goto I1; //确认IR信号出现

while (!IRIN) //等 IR 变为高电平

{delay(1);}

for (j=0;j<4;j++)

{

for (k=0;k<8;k++)

{

while (IRIN) //等 IR 变为低电平

{delay(1);}

while (!IRIN) //等 IR 变为高电平

{delay(1);}

while (IRIN) //计算IR高电平时长

{

delay(1);

N++;

if (N>=30) {EA=1;return;}

}

IRCOM[j]=IRCOM[j] >> 1;

if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}

N=0;

}//end for k

}//end for j

if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}

IRCOM[5]=IRCOM[2] & 0x0F;

IRCOM[6]=IRCOM[2] & 0xF0;

IRCOM[6]=IRCOM[6] >> 4;

beep();

EA = 1;

}

void IR_SHOW()

{

P0 = table[IRCOM[5]];

GEWEI = 0;

SHIWEI = 1;

delay1(4);

P0 = table[IRCOM[6]];

SHIWEI = 0;

GEWEI = 1;

delay1(4);

}

void beep()

{

unsigned char i;

for (i=0;i<100;i++)

{

delay(5);

BEEP=!BEEP;

}

BEEP=1;

}

void delay(unsigned char x)//x014MS

{

unsigned char i;

while(x--)

{

for (i = 0; i<13; i++) {}

}

}

void delay1(unsigned char ms)

{

unsigned char i;

while(ms--)

{

for(i = 0; i<120; i++)

{

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

我用Keil c51 编译的。在程序开头部分加上下面的的头文件:

#include"reg51h"

另外,工程的文件夹下要包含头文件:

#include"beeph"

这样就没有错误了。

以上就是关于红外解码程序,但是单片机上电数码管不亮,更别说遥控器控制他了,求高手指点错误全部的内容,包括:红外解码程序,但是单片机上电数码管不亮,更别说遥控器控制他了,求高手指点错误、51单片机DX们请帮忙看下红外解码的程序问题出在哪里按键无反应,发射芯片是HS5104,急、急、急......、1T单片机红外解码 大神们求助啊 急用!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9360032.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存