基于STC89C52的简易学习型红外遥控器
做了个简单的单键学习,需要多键自行扩展添改程序主程序main.c:// 简易学习型红外遥控器,STC89C52RC @ 12MHz,使用定时器2可编程时钟输出 P1.0 产生38KHz
//
#include "share_main.h"
#include "EEPROM.H"
sbitIRS =P1^0; //发送【不可改】
sbitIRR =P1^1; //接收
sbitkeyA=P3^2; //学习键
sbitkeyB=P3^3; //发射键
sbitLED =P1^3; //学习指示灯
#define _NUM 68 //捕捉电平数目
#define NUMS (_NUM*2)//缓存大小
uint8ibuf;
bit B_finish;
//定时器2可编程时钟输出初始化(输出引脚P1.0)
// 6T模式 频率 = CPU_FOSC/(2*(65536-RCAP2HL))
//12T模式 频率 = CPU_FOSC/(4*(65536-RCAP2HL))
#define T2CLKO_INIT(_Hz)\
TR2 = 0;\
T2CON = 0;\
T2MOD = 0x02;\
RCAP2H = (uint16)(65536-(CPU_FOSC/4/_Hz+0.5))/256;\
RCAP2L = (uint16)(65536-(CPU_FOSC/4/_Hz+0.5))%256
#define T2CLKO_ON() TR2=1 //打开T2时钟输出
#define T2CLKO_OFF() TR2=0 //关闭T2时钟输出
/*****************************************************
函数:捕捉红外电平时间
*****************************************************/
void catch ()
{
uint8 i;
for (i=0; i<NUMS; i++) buf = 0;//清缓存
NEW_START:
TR0 = 0;
TH0 = 0;
TL0 = 0;
TF0 = 0;
while (IRR); //等待IRR=0
TR0 = 1; //启动T0计数低电平时间
for (i=0; i<4; i++) if (IRR)goto NEW_START; //是干扰误触发,跳往起点
for (i=0; (i<NUMS) && !TF0; )
{
while (!IRR && !TF0); //等待IR=1
TR0 = 0;
buf = TH0; //保存(管脚)低电平时间
i++;
buf = TL0;
TL0 = 0;
TR0 = 1; //启动T0计数高电平时间
TH0 = 0;
i++;
while (IRR && !TF0); //等待IR=0
TR0 = 0;
buf = TH0;
i++;
buf = TL0;
TL0 = 0;
TR0 = 1; //启动T0计数高电平时间
TH0 = 0;
i++;
}
TR0 = 0;
B_finish = 1; //接收完成
}
void SIR()
{
uint8i;
uint16 nc;
for (i=0; i<NUMS; i+=2)
{
nc = 65536 - (buf*256 + buf);//定时赋值计算
nc += 10; //数据修正
buf = nc/256;
buf = nc%256;
}
for (i=0; i<NUMS; )
{
TH0 = buf;
i++;
TL0 = buf;
i++;
TF0 = 0;
TR0 = 1;
T2CLKO_ON();
while (!TF0);
T2CLKO_OFF();
IRS = 1; //发射结束端口常态
TR0 = 0;
TH0 = buf;
i++;
TL0 = buf;
i++;
TF0 = 0;
TR0 = 1;
while (!TF0);
TR0 = 0;
}
}
void main(void)
{
s_uint16 count;
T2CLKO_INIT(38000);
TMOD &= 0xF0; //清除定时器0模式位
TMOD |= 0x01; //定时器0为16位工作方式
while (1)
{
if (!keyA)
{
LED = 0;
catch ();
EROM_C(0); //擦除扇区0
EROM_W_STR(0x0000, buf, NUMS);//将捕捉到的数据(缓存buf)从EEPROM地址0x0000开始依次装入
LED = 1;
}
if (!keyB)
{
if (++count > 10000)
{
count = 0;
EROM_R_STR(0x0000, buf, NUMS);//将EEPROM地址0x0000开始连续NUMS字节 读出装入缓存buf
SIR(); //发送红外
while (!keyB);
}
}
else {
count = 0;
}
}
}TKStudio、Keil工程源码:
谢谢BXAK,哈哈! 学习一下, {:smile:}mark
折腾完电源再说 记号一下 有机会电脑上看看,标记 BXAK,我想问两个问题:
1.NEC的重复码里面有约96ms的低电平、长虹遥控RC5连续发射时的间隔有约86ms低电平,不存这些重复码,有没有影响呢?
2.NEC编码有68个电平要保存,一个电平用两个字节保存,需要134个字节,假如我以NEC的这个容量,那其他制式的编码,这个容量够保存其他制式的电平么?
BXAK大哥,希望有空回复我一下,谢谢! 有人试验成功过吗? 多谢分享~~{:smile:} 发射电路怎么接
我手头上应该有红外的发射头就是不知道是不是38khz的
{:victory:}{:handshake:}支持一下。学习
页:
[1]