本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
我用的单片机是89c52..红外接收头是TSOP1838。用的是家里的万能遥控器。程序是想把遥控按下的键值显示在单片机的数码管上。每次按下的时候,没反应,但是数码管有点闪烁,不过还是显示零。。程序如下;
#include<reg52.h>
//#define ir_syscode 0x00
#define uchar unsigned char
unsigned char ir_data;
sbit dula=P2^6;//段选
sbit wela=P2^7;//位选
sbit beep=P2^3;
char ge,shi;
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void delay_100us(void) //延时程序
{
unsigned char i=48;
while(--i);
}
void delay1(uchar x) //MS延时程序
{
uchar a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void ir_svr(void) interrupt 2 //外部中断1程序
{
unsigned char datair[4];
unsigned char width;
unsigned char i=0;
EX1=0;
width=0;
while(!INT1) //引导码信号
{
delay_100us();
width++;
}
if(width<90) //判断低电平时间是否9MS,如不是返回,
{ //if(width<90)这里好奇怪,我把90改成10,20数码管就有反应,但是不是显示我按下遥控的键值
EX1=1;
return;
}
width=0;
while(INT1) //引导结果码4MS高电平,
{
delay_100us();
width++;
}
if(width<40) //判断如小于4Ms就返回
{
EX1=1;
return;
}
while(i++<32) //接收16位地址码和16为数据码,
{
while(!INT1);
width=0x00;
while(INT1)
{
delay_100us();
width++;
}
ir_data<<=1; //补'0';
if(width>8)
ir_data|=0x01; //补'1';
if(i==8)
datair[0]=ir_data;
if(i==16)
datair[1]=ir_data;
if(i==24)
datair[2]=ir_data;
if(i==32)
datair[3]=ir_data;
}
if(datair[2]!=~datair[3]) //判断8位数据码和8为数据反码是否相同
{
EX1=1; //如不同返回。
return;
}
/*if(datair[0]!=ir_syscode)
return;*/
ir_data=datair[2];
EX1=1;
P1=ir_data;
}
void main()
{
IE=0x00;
EA=1;
IT1=1;
EX1=1;
ir_data=0;
delay_100us();
delay_100us();
while(1)
{
shi=(ir_data>>4)&0x0f;
ge=ir_data&0x0f;
dula=0;
P0=table[shi];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay1(1);
P0=table[ge];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay1(1);
if(ir_data==0xe8)
{
beep=0;
}
if(ir_data==0xc8)
{
beep=1;
}
}
}
我用的是万能遥控,是不是不同的遥控要不同的编码格式啊??是不是要专门买一个32位或者42为的红外遥控才可以用啊。。。希望能回答我问题。我在家里自学单片机。只有在网上才能找人解决问题。认识的人都不懂单片机的。或者有更好的程序的请发给我。。我的邮箱123275178@qq.com。谢谢高手们。。 |