当前位置:首页 > 单片机 > 单片机
[导读]// 用单片机进行红外遥控接收已经是很平常的应用了,基本上稍懂单片机就可以自己编// // 但往往很多人编的程序要么繁琐,要么占用大量存储器、CPU资源, // // 而且用于现场时还可能因为受到干扰而不能正常工作 //

// 用单片机进行红外遥控接收已经是很平常的应用了,基本上稍懂单片机就可以自己编//
// 但往往很多人编的程序要么繁琐,要么占用大量存储器、CPU资源, //
// 而且用于现场时还可能因为受到干扰而不能正常工作 //
// 真正试过的都会发现,要想编个真正好用的接收程序不是那么简单的 //

// 其实,所有遥控芯片的编码都是比较简单的(有限的状态),只要仔细分析它的编码//
// 我们完全可以用状态机的方式来处理各种可能的情况,甚至从被干扰的杂乱波形中找出正确的编码//
// 下面是基于状态机的SAA3010红外遥控接收程序示例: //
//--------------------------------------------------------------------------//
// //
// (c) Copyright 2001-2003 xuwenjun //
// All Rights Reserved //
// V1.00 //
//--------------------------------------------------------------------------//
//标 题: SAA3010遥控芯片接收程序 //
//文件名: ir_3010.c //
//版 本: V1.00 // //
//描 述: SAA3010遥控芯片接收程序 //
//--------------------------------------------------------------------------//
//老版本: 无 老版本文件名: //
//创建人: xuwenjun E-mail:xuwenjun@21cn.com //
//日 期: 03-06-14 //
//描 述: SAA3010遥控芯片接收程序 //
// 当ykok=1时,ykcode中的数据就是接收到的遥控码(14位的最后8位) //
//--------------------------------------------------------------------------//
//占用以下资源: //
// 1. 遥控使用外部中断0,接P3.2口 //
// 2. 遥控使用定时计数器1 //
// 3. 5.1字节data RAM //
// 4. 293字节 code ROM //
//--------------------------------------------------------------------------//
//声 明: //
// 以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //
// 如用于商业用途请与作者联系. E-mail:xuwenjun@21cn.com //
// 有问题请mailtoxuwenjun@21cn.com 欢迎与我交流! //
//--------------------------------------------------------------------------//

#i nclude
#define uchar unsigned char

// SAA3010存储定义
uchar ykcode; //遥控码(14位的最后8位)
bit ykok; //遥控数据有效标志

uchar ykbnum; //遥控已接收位数
uchar ykbtc; //遥控中断时 ykbtc=TH1
uchar ykdelay; //遥控延时接收
bdata uchar ykcodetemp; //遥控临时码
sbit ykcodetemp0=ykcodetemp^0;


// SAA3010端口定义
//sbit YKIO=P3^3; //遥控使用外部中断0,接P3.2口

// SAA3010函数原型: 公用函数
void YkInit(void); //遥控接收初始化
unsigned char YkGetcode(void); //返回遥控码
bit YkTest(void); //检查有无遥控信号

/*
// SAA3010函数原型: 公用函数
extern void YkInit(void); //遥控接收初始化
extern unsigned char YkGetcode(void); //返回遥控码
extern bit YkTest(void); //检查有无遥控信号
*/

/*
// 外部引用四位LED显示模块 //
extern unsigned char code tab_duam[]; //位映射
extern void led_send(unsigned char d); //发送子程序
extern void led_cls(void); //清除显示
extern void led_show(unsigned int n); //显示数字子程序
extern void led_showhh(unsigned int n); //16进制显示数字子程序
extern void led_test(void); //4LED测试函数
extern void led_delay(unsigned char ms); //延迟函数
*/

// SAA3010函数内容
void YkInit(void) //遥控接收初始化
{
TMOD=0x11; //TMOD T0,T1均选用方式1(16位定时)
SCON=0x00;
TH1=0;
TL1=0;
IE|=0x89; //SETB EX0 0x1 外部中断 0 允许
//SETB ET0 0x8 定时器 1 中断允许
//SETB EA 0x80 开中断
IP|=0x01; //SETB INT0 中断优先
TCON |= 0x41; //TCON EX0下降沿触发,启动T1 //
ykbnum=0;
ykcodetemp=0;
ykdelay=0;

}

unsigned char YkGetcode(void) //返回遥控码
{
return(ykcode);
}

bit YkTest(void) //检查有无遥控信号
{
return(ykok);
}

void intx0() interrupt 0 using 2 //遥控使用外部中断0,接P3.2口
{
ykbtc=TH1;TH1=0;TL1=0;TR1=1;ET1=1;
switch(ykbnum)
{
case(0):
ykbnum=1;
break;
case(1):
if(ykbtc==6)ykbnum=2;
else ykbnum=0;
break;
case(2):
if(ykbtc==6||ykbtc==9)ykbnum=3;
else ykbnum=0;
break;
case(3):
if(ykbtc==9||ykbtc==6){ykbnum=4;}
else ykbnum=0;
break;
default:
if(ykbnum<7)if(ykbtc==6)ykbnum++;
else ykbnum=0;
else
{
if(ykbtc==6){if(ykcodetemp0)ykcodetemp=ykcodetemp*2+1;
else ykcodetemp=ykcodetemp*2;
ykbnum++;
}
else if(ykbtc==9){ if(ykcodetemp0){ykbnum++;ykcodetemp=ykcodetemp*2;}
else {ykbnum+=2;ykcodetemp=ykcodetemp*2;ykcodetemp=ykcodetemp*2+1;}
}
else if(ykbtc>11&&ykbtc<15)
{ykbnum+=2;ykcodetemp=ykcodetemp*2;ykcodetemp=ykcodetemp*2+1;}
else if(ykbtc>30){EX0=1;}
else ykbnum=0;
}
}
}

void intt1() interrupt 3 using 3 //遥控使用定时计数器1
{
if(ykdelay){ykdelay--;EX0=0;} //ykdelay不为0暂停接收
else
{
if(ykbnum==13) //遥控码最后一位为0,补0
{
ykcode=ykcodetemp*=2;
ykdelay=3;
EX0=0; //暂停接收
ykok=1; //遥控数据有效
}
else if(ykbnum==14) //遥控码最后一位为1,不用补
{
ykcode=ykcodetemp;
ykdelay=3;
EX0=0; //暂停接收
ykok=1; //遥控数据有效
}
else EX0=1; //ykbnum不为13,14接收无效,继续接收
ykbnum=0;
ykcodetemp=0;
}
}

/*
// SAA3010测试主函数内容
main()
{
YkInit();
led_test(); //4LED测试函数
for(;1;) //主程序
{
if (YkTest())
led_showhh(YkGetcode());
led_delay(10);
}
}
*/

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

随着科技的发展,无线遥控开关被广泛的使用,无线遥控开关是采用高科技的射频识别技术设计制作,用无线遥控开关设备控制各类灯饰、家电、门、窗帘等家居用品,是一种新型智能化开关,可对室内灯具、家电等进行无线控制,操作简单方便,性...

关键字: 无线遥控开关 红外遥控

摘要:基于传统直角坐标机器人控制技术,以蓄电池极板连续生产线的码垛机器人为应用案例,根据设备需求、机器人控制原理和系统状态机的设计,介绍了一种通用的、灵活的、开发周期短的多轴直角坐标机器人控制方法。该机器人经过实践,验证...

关键字: 直角坐标机器人 状态机 控制系统

▼点击下方名片,关注公众号▼欢迎关注【玩转单片机与嵌入式】公众号,回复关键字获取更多免费资料。回复【加群】,限时免费进入知识共享群;回复【3D封装库】,常用元器件的3D封装库;回复【电容】,获取电容、元器件选型相关的内容...

关键字: 单片机 状态机 传感器中

在单片机裸机的编程方法中,状态机的方法是比较好的,经典的比如按键的检测判断等。其实,有很多地方可以使用这种思想,比如传感器的数据采集。因为单片机不可能一直等待着运行,那样的效率是很低的,通常都是结合fsmtimer的方式...

关键字: 单片机 状态机

摘 要 :万能空调遥控器的核心是学习模式,即利用红外模块接收、识别、存储信号,再调用发射信号。学习的实质就是记录下学习对象的红外编码,记录高低电平各自持续的时间长度,需要时将其发射出来。识别记录红外编码信号可使用直接记录...

关键字: 万能遥控器 学习算法 红外遥控 单片机 红外编码 PWM PPM

摘要:以搭建的湖南农业农村信息化乡村广播项目为基础,利用红外遥控与亚音频率通信技术设计了一款基于STC单片机的无线广播控制设备。此设备由手持红外发射、红外接收、音量控制、系统处理、存储、蜂鸣器、音频输入输出接口及亚音信号...

关键字: 红外遥控 亚音系统 农村无线广播 STC单片机

关注、星标公众号,直达精彩内容来源:技术让梦想更伟大作者:ming_mei前言前些日子在微信上看到李肖遥的公众号,里面系统讲述了QP框架,我很有感触。我用QP框架很多年了,一开始是使用QM和QPC,到后来抛弃了QM,直接...

关键字: 单片机 状态机

星标「嵌入式大杂烩」,一起进步!来源:https://blog.csdn.net/qq_36969440/article/details/110387716状态机基本术语现态:是指当前所处的状态。条件:又称为“事件”,当...

关键字: 嵌入式 状态机 编程

关注、星标公众号,直达精彩内容来源:小鱼儿飞丫飞整理:技术让梦想更伟大|李肖遥前言:本框架实现的目的是在基于51单片机为控制芯片的产品内,因为51单片机的内存和堆栈比较有限,此框架比较简洁高效的。如果用于其他高性能的处理...

关键字: 状态机

来源:裸机思维作者:GorgonMeducer【说在前面的话】在前面的讲解中,我们介绍了如何使用状态图的方式来设计有限状态机、明确了状态图设计的“清晰”原则,并结合最简单和常用的switch状态机翻译模式详细说明了状态图...

关键字: 状态机
关闭
关闭