本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
bit irout;//红外管状态
sbit ir=P1^0;//红外发射管控制脚?
uint count, set_count;//中断计数,设定中断次数
bit flag,keyflag;//红外发送标志,按键标志位
uchar irsys[]={0x00,0xff};//8位用户码和8位用户反码
uchar ircode,irdata;
/**********************************************
延时1ms
***********************************************/
void delay(uint z)//延时1ms,晶振22.1184M
{
uint x,y;
for(x=z;x>0;x--)
for(y=225;y>0;y--);
}
/**********************************************
按键扫描
**********************************************/
void keyscan(void)
{
uchar keytemp;
P3=0xff;
keytemp=P3&0x0f;
if(keytemp!=0x0f)
{
delay(20);
keytemp=P3&0x0f;
if(keytemp!=0x0f)
keyflag=1;//有按键标志
switch(keytemp)
{
case 0x0e:irdata=0x44;break;//按键1对应该遥控器P+的键值
case 0x0d:irdata=0x40;break;//按键2对应该遥控器P-的键值
case 0x0b:irdata=0x15;break;//按键3对应该遥控器VOL+的键值
case 0x07:irdata=0x07;break;//按键4对应该遥控器VOL-的键值
}
}
keytemp=P3&0xf0;
if(keytemp!=0xf0)
{
delay(20);
keytemp=P3&0xf0;
if(keytemp!=0xf0)
keyflag=1;//有按键标志
switch(keytemp)
{
case 0xe0:irdata=0x43;break;//按键4对应该遥控破鼽值
case 0xd0:irdata=0x09;break;//按键4对应该遥控器EQ
}
}
}
/*******************************************
发送8位红外数据
*******************************************/
void sendcode_8(void)
{
uchar i;
for(i=0;i<8;i++)
{
set_count=28;//发送0.56ms 38k红外波(编码中的0.56ms低电平)
flag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
if(ircode&0x01)//判断红外编码最低位,1宽的高电平,0窄的高电平
{
set_count=120;
}
else
{
set_count=38;
}
flag=0;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
ircode=ircode>>1;
}
}
/*******************************************
发送红外数据
*******************************************/
void sendcode(void)
{
set_count=575;//发送9ms 38K红外光
flag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
set_count=320;//间隔4.5ms
flag=0;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
ircode=irsys[0];//发送8位用户码
sendcode_8();
ircode=irsys[1];//发送8位用户码反码
sendcode_8();
ircode=irdata;//发送8位数据码
sendcode_8();
ircode=~irdata; //发送8位数据反码
sendcode_8();
set_count=28;//发送0.56ms 38k红外波(编码中的0.56ms低电平)
flag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
ir=0;
delay(23);//延时23ms(编码中的23ms高电平)
set_count=575;//发送9ms 38k红外波
flag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
set_count=330;//间隔4.5ms
flag=0;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
set_count=30;//发送0.56ms 38k红外波(编码中的0.56ms低电平)
flag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
ir=0;
}
/*******************************************
定时器初始化
*******************************************/
void init_timer()
{
EA=1;
TMOD=0x02;//8位自动重载模式
ET0=1;
TH0=0xE6;//定时13us,38K红外波,晶振22
TL0=0xE6;
}
/*******************************************
主函数
*******************************************/
void main(void)
{
ir=0;
init_timer();
count=0;
flag=0;
irout=0;
while(1)
{
keyscan();
if(keyflag)//若有新按键
{
delay(10);
sendcode();//发送红外编码
delay(500);
keyflag=0;//按键标志清零
}
}
}
/*******************************************
定时器中断
*******************************************/
void timer0(void) interrupt 1
{
count++;
if(flag==1)
{
irout=1;
}
else
{
irout=~irout;
}
ir=irout;
}
红外发射头在工作,但是接收端没反应,这个程序有什么问题吗? |