找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

学习型红外遥控设计一 发送部分资料

[复制链接]
admin 发表于 2012-8-24 10:53:19 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
最近在折腾学习型遥控器,对红外遥控的编解码也有了一定了解,论坛里也有一些介绍的帖子。我在这里就不多说了,把我折腾的发送代码拿来分享下,也请大家多多指教。原理图我是手画的,等把其他相关的程序都调试成功了,我就用protel画一个完整的再发上来吧,功能是当on/off键和学习/发射键都按下后开始发送
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
bit irout;//红外管状态
sbit ir=P1^0;//红外发射管控制脚(高电平发数据)
sbit keytemp0=P2^0;//学习/发射键
sbit keytemp1=P2^1;//on/off键
uint count, set_count;//中断计数,设定中断次数
bit flag,keyflag0,keyflag1;//红外发送标志,按键标志位
uchar irsys[2]={0x1a,0xa1};//16位系统码
uchar irdata=0x12;//8位数据码
uchar ircode;
/**********************************************
延时1ms
***********************************************/
void delay(uint z)//延时1ms,晶振12M
{
uint x,y;
for(x=z;x>0;x--)
for(y=199;y>0;y--);
}
/**********************************************
按键扫描
**********************************************/
void keyscan(void)
{
keytemp0=1;
keytemp1=1;
if(keyflag1==1)
{
if(keytemp0!=1)
{
delay(20);
keytemp0=1;
if(keytemp0!=1)
{
keyflag0=1;//学习/发射键 有按键标志
}
}
}
else
{
if(keytemp1!=1)
{
delay(20);
keytemp1=1;
if(keytemp1!=1)
{
keyflag1=1;//on/off键 有按键标志
}
}
}
}
/*******************************************
发送8位红外数据
*******************************************/
void sendcode_8(void)
{
uchar i;
for(i=0;i<8;i++)
{
set_count=10;//发送0.56ms 38k红外波(编码中的0.56ms低电平)
flag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
//停止发送红外信号(即编码中的高电平)
if(ircode&0x01)//判断红外编码最低位,1宽的高电平,0窄的高电平
{
set_count=41;
}
else
{
set_count=15;
}
flag=0;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
ircode=ircode>>1;
}
}
/*******************************************
发送红外数据
*******************************************/
void sendcode(void)
{
set_count=223;//发送9ms 38K红外光
flag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
set_count=117;//间隔4.5ms
flag=0;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
ircode=irsys[0];//发送16位系统码的前1-8位
sendcode_8();
ircode=irsys[1];//发送16位系统码的前9-16位
sendcode_8();
ircode=irdata;//发送8位数据码
sendcode_8();
ircode=~irdata; //发送8位数据反码
sendcode_8();
set_count=10;//发送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;//定时器0方式2,8位自动重载模式
ET0=1;
TH0=0XE6;//定时26us,38K红外波,晶振12
TL0=0XE6;
}
/*******************************************
主函数
*******************************************/
void main(void)
{
ir=0;
init_timer();
count=0;
flag=0;
irout=0;
while(1)
{
keyscan();
if(keyflag0==1&&keyflag1==1)//若两键都被按下,则发送
{
delay(10);
sendcode();//发送红外编码
delay(500);
keyflag0=0;//按键标志清零
keyflag1=0;
}
}
}
/*******************************************
定时器中断
*******************************************/
void timer0(void) interrupt 1
{
TH0=0XE6;//定时26us,38K红外波,晶振12
TL0=0XE6;
count++;
if(flag==1)
{
irout=~irout;
}
else
{
irout=0;
}
ir=irout;
}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 11:06 , Processed in 0.057885 second(s), 12 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表