SAA3010红外遥控接收的C程序源代码

saa3010红外遥控接收的c程序源代码
// 用单片机进行红外遥控接收已经是很平常的应用了,基本上稍懂单片机就可以自己编//
// 但往往很多人编的程序要么繁琐,要么占用大量存储器、cpu资源, //
// 而且用于现场时还可能因为受到干扰而不能正常工作 //
// 真正试过的都会发现,要想编个真正好用的接收程序不是那么简单的 //
// 其实,所有遥控芯片的编码都是比较简单的(有限的状态),只要仔细分析它的编码//
// 我们完全可以用状态机的方式来处理各种可能的情况,甚至从被干扰的杂乱波形中找出正确的编码//
// 下面是基于状态机的saa3010红外遥控接收程序示例: //
//--------------------------------------------------------------------------//
// //
// (c) copyright 2001-2003 xuwenjun //
// all rights reserved //
// v1.00 //
//--------------------------------------------------------------------------//
//标 题: saa3010遥控芯片接收程序 //
//文件名: ir_3010.c //
//版 本: v1.00 //
//修改人: xuwenjun e-mail:xuwenjun@21cn.com //
//日 期: 03-06-14 //
//描 述: 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 //
// 有问题请mailto xuwenjun@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(ykbnum11&&ykbtc30){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);
}
}

纳米微型圆形和矩形连接器介绍
8轮融资超17亿元,未来锤子科技又将何去何从?
2017年新能源客车销量_中国新能源客车排名情况
CRT-DMC660ML全自动六轴双工位激光焊接示教系统
从AI最强大脑的产学经历中,我们应该学习什么?
SAA3010红外遥控接收的C程序源代码
STP、SFTP、UTP、FTP、ASTP双绞线都代表什么
一文深度了解红外传感器之热成像仪的应用场景
高逼格的SQL写法:行行比较
飞兆半导体的汽车级高速、低边驱动器系列 可提高效率、简化设计
空调远程控制器可以解决哪些问题
Profinet转ModbusTCP网关连接昆仑通态触摸屏配置案例
世界上第一个新型空气燃料电池在英国诞生
A.O.史密斯受邀出席中国高端电器新生态战略发动会
世强推出新能源汽车全套器件优选方案
普沃思中温再生解决方案有望成为锂电生产的必然选择
使电路板的组装和设计更加容易
FPC柔性线路板助力黄金赛道新能源市场
制作一个好梦机的方法
区块链的发展需要更快的进化能力