我的遥控PC制作成功,发一个用c写的红外遥控接收程序,供初学者参考,并附遥控芯片的一些
这个周么,我的遥控PC制作顺利完成,谢谢网站提供的范例,现发一个用C写成的遥控接收程序,供参考,望高手点评。#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
uchar remote_value=0;
uchar remotenow=0;
uchar remotecode=0;
uchar remoteold=0;
uchar remotecnt=0;
uchar remotedelay=0;
uchar t30mscnt=0;
//**************************************
#define set_bit(x,y) (x|=(1<<y)) //将x中的y位置1
#define clr_bit(x,y) (x&=~(1<<y)) //将x中的y位清0
#define xor_bit(x,y) (x^=(1<<y)) //将x中的y位取反
#define bit(x) (1<<x) //将1左移x位
#define get_bit(x,y) (x&(1<<y)) //取x中的第y位
//**************************************
#define remote (PIND&(1<<2)) //PD2
uchar flag1;
#define fremint 1 //遥控中断
#define fremreq 2 //遥控请求
#define fremeff 3 //遥控有效
//**************************************//
// 函数名称:void timer2_ovf_isr(void)
// 输--入:无
// 输--出:无
// 功--能:定时器2中断服务程序(遥控译码)
// 影响标志:
// 创--建:
// 修--改:
//**************************************//
#pragma interrupt_handler timer2_ovf_isr:5
void timer2_ovf_isr(void)
{ //200us
TCNT2 = 0x38;//自动重装
//=================
//--遥控取码
if(get_bit(flag1,fremint))
{
if(++remotedelay>4)
{
if(remote==0)
remote_value|=1<<0;
else
remote_value&=(~(1<<0));
clr_bit(flag1,fremint);
remotecnt++;
remote_value<<=1;
if(remotecnt==12)
remotenow=remote_value;
else if(remotecnt>=48)
{
set_bit(flag1,fremreq);
remotecnt=0;
remote_value=0;
}
}
}
//================
if(++t30mscnt>=150)
{
t30mscnt=0;
remotecode=0; //与遥控有关
remotecnt=0;
}
}
//**************************************//
// 函数名称:void int0_isr(void)
// 输--入:无
// 输--出:无
// 功--能:遥控接收
// 影响标志:
// 创--建:
// 修--改:
//**************************************//
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
set_bit(flag1,fremint);
t30mscnt=0;
remotedelay=0;
}
//**************************************//
//**************************************//
// 函数名称:void RemoteProcess(void)
// 输--入:无
// 输--出:无
// 功--能:遥控处理
// 影响标志:
// 创--建:
// 修--改:
//**************************************//
void RemoteProcess(void)
{
if(flag1&(1<<fremreq))
{
clr_bit(flag1,fremreq);
if(remotenow!=remoteold)
remoteold=remotenow;
else
set_bit(flag1,fremeff);
}
if(flag1&(1<<fremeff))
{
clr_bit(flag1,fremeff);
if(remoteold==remotecode)
{
;//有连键
}
else
{
;//单键
}
............
}
}
利用了外部中断+定时器的方法来解码的。
有什么不对的地方,请大家指正!!
附资料:点击此处打开armok0165846.doc
点击此处打开armok0165847.pdf 小样,挺厉害的,,,,哈哈!!!!
支持一下!!! 用什么接收器咯! 用的是HS0038接收头 DING 1 是哪种格式的呀!RC5???? 我觉得应该将遥控处理写到int0的中断服务程序里面,如果用定时器中断去处理的话,跟查询方式有什么区别啊?你这样写起不到节电的作用啊。 同意 看不懂啊,到底如何接受到信息啊?利用什么呢? http://www.unsp.com.cn/app/html/2002102393038.shtml 高手 感兴趣 不好意思,我是个绝对新手,对这个很感兴趣,请问有没有电路图??? 正在对SC9148解码,方式也是INT0+T2,但误码率很高,希望楼主能传电路做参考,或直接交流指导,QQ:254653474,不胜感激!!!!!! 学习 jh 最近我也想做一个玩玩,楼主能不能发一份详细的电路图给我。不胜感激 sabergcl@163.com MARK PC端有一个软件很好用,自己做个头插在串口上就可以了。很好用。 楼主用的是Girder么? mark 有无原理图?支持按键持续的功能吗? 学习红外编码 学习,是不是红外协议自己可以随便定义? mark 我也正想作这个,楼主谢了,, 学习了,不错 楼主好,最近我也想做个玩玩,楼主可否发个电路图给我wwl6955611@163.com....xiexie 我也看过这个 但是这个但是真正的红外线我还真没有玩过肯定很刺激 有机会我也试试
页:
[1]