|
这个周么,我的遥控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 |
|