本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
最近在学红外遥控,从论坛上找了很多资料,自制红外遥控可以用了,只不过距离很不理想,仅有二三十厘米。请问会是什么问题呢?
我用STC89C52,晶振为11.0592MHZ。遥控程序如下:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit anjian=P3^2;
bit hwout; //红外管状态
sbit hw=P2^4; //红外发射信号引脚
uint count, set_count;//中断计数,设定中断次数
bit flag,biaoji;//红外发送标志,按键标志位
uchar code_8,send_data;
/**********************************************
延时1ms
***********************************************/
void delay(uint z)//延时1ms,晶振11.0592M
{
uint x,y;
for(x=z;x>0;x--)
for(y=250;y>0;y--); //122
}
/**************************************************
按键扫描
***************************************************/
void keydown(void)
{
if(anjian==0)
{
delay(20);
if(anjian==0)
{
biaoji=1;//有按键标志
send_data=0x10;//闹钟开关
}
}
}
/*******************************************
发送8位红外数据
*******************************************/
void sendcode_8(void)
{
uchar i;
for(i=0;i<8;i++)
{
set_count=12;//28发送0.56ms 38k红外波(编码中的0.56ms低电平)
flag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
if(code_8&0x01)//判断红外编码最低位,1宽的高电平,0窄的高电平
{
set_count=60; //120
}
else
{
set_count=12; //38
}
flag=0;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
code_8=code_8>>1;
}
}
/*******************************************
发送红外数据
*******************************************/
void sendcode(void)
{
set_count=156;//发送9ms
flag=1;
count=0;
TR0=1;
while(count<set_count);
count=0;
while(count<set_count);
TR0=0;
set_count=172;//间隔4.5ms
flag=0;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
code_8=0x00;//发送高8位地址码
sendcode_8();
code_8=0xff;//发送低8位数据码
sendcode_8();
code_8=send_data;//发送8位数据码
sendcode_8();
code_8=~send_data; //发送8位数据反码
sendcode_8();
set_count=12;//发送0.56ms 38k红外波(编码中的0.56ms低电平)
flag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
}
/*******************************************
定时器初始化
*******************************************/
void init_timer()
{
EA=1;
TMOD=0X02; //8位自动重载模式
ET0=1;
TH0=0Xf4; //定时13us,38K红外波,晶振11.0592
TL0=0Xf4;
}
/*******************************************
主函数
*******************************************/
void main(void)
{
char kkl=1;
init_timer();
count=0;
flag=0;
hwout=1;
while(1)
{
// keydown();
// while(1)
// {
sendcode(); //发送红外编码
// }
}
}
/*******************************************
定时器中断
*******************************************/
void timer0(void) interrupt 1
{
count++;
if(flag==1)
{
hwout=~hwout;
}
else
{
hwout=1;
}
hw=hwout;
}
程序是参考
太阳人”遥控电子时钟设计大赛
作者:山西农业大学电子061 刘雪亮 吴刚的,请问程序有什么问题吗?看了很多红外资料,说载波要38KHZ,貌似我好像没有,而且信号很差。测载波时,示波器是不是接在发射管处呢?
麻烦大家帮帮忙解决一下,谢谢了。 |