基于8952单片机的红外解码(TC9012F编码)

发布者:Ziyu2022最新更新时间:2015-08-07 来源: dzsc关键字:单片机  红外解码  TC9012F编码 手机看文章 扫描二维码
随时随地手机看文章
红外操作免去了和机器接触。第一是方便,第二也很自然的可以将用户与管理着分离(使用功能在遥控上,调试功能在机器上)。所以免不了在自己的电子钟设计中加入了红外。加的多,学得也多嘛。

虽然重点在后面,但是先上个程序

参考总结后,第一次参考归纳出源程序如下:

#include
#include
#include
////////////////////////////////////////////////

sbit ir=P3^2;//红外接口标志

////////////////////////////////////////////

unsigned char irtime;//电平宽度(以定时器来记录)
bit irpro_ok,irok;
unsigned char ircord[4];
unsigned char irdata[33];

//////////////////////////////////////////////

void ir_work(void);
void ircordpro(void);

//////////////////////////////////////////////////////////////////

void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数
{
irtime++;
}

///////////////////////////////////////////////////////////////////////
void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数
{
unsigned char i;
bit startflag;

if(startflag)
{
TR0=0;
if(irtime<38&&irtime>=34)//引导码判断(9MS)
i=0;
TR0=1;
//确认为引导码,初始为新的32位编码开始
irdata[i]=irtime;//i=0是引导码,后面是其余码。每次记录的是每次高低电平一起的脉冲宽度。
//收到到一个码算一次中断,中断结束前清零宽度计时
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}
//第一次进入中断开启startflag,用于第二次进入中断计时比对
else
{irtime=0;startflag=1;}

}

////////////////////////////////////////////////////////////////////
void TIM0init(void)//定时器0初始化
{

TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0;//reload value
TL0=0;//initial value
ET0=1;//开中断
TR0=1;
}
///////////////////////////////////////////////////////////////////
void EX0init(void)
{
IT0 = 1;
EX0 = 1;
EA = 1;
}
void ir_work(void)//红外键值散转程序
{

switch(ircord[2])//判断第三个数码值(数据码,后面是反码,前面是引导码和地址码)
{
case 0:P1=0x00;break;//1 LED显示相应的按键值
case 1:P1=0xfe;break;//2
case 2:P1=0xfd;break;//3
}

[page]

irpro_ok=0;//处理完成标志清零

}


void ircordpro(void)//红外码值处理函数
{
unsigned char i, j, k;
unsigned char cord,value;

k=1;//从1开始,是引导码以后的一帧所有数据
for(i=0;i<4;i++)//处理4个字节
{
for(j=0;j<8;j++) //处理1个字节8位
{
cord=irdata[k];
if(cord>7)//电平宽度大于某个值,可以判断为1(2.25ms) 时间范围要大点,否则重复按键出现混乱
{
value|=0x80;//若为1则赋值
}
//其余情况可以判断为0(是不是证明了,irdata接收的是引导码之后的一帧所有电平?)
else
{
value=value;//若判断为0则不变(移位后自然为0)
}
if(j<7)
{
value>>=1;//为什么|0X01 与<<1配合,不行。因为最后完成值要求最先写入的最低位,用这个想法会反过来。
}
k++;
}
ircord[i]=value;
value=0;
} irpro_ok=1;//处理完毕标志位置1

}

/////////////////////////////////////////////////////////////////

void main(void)
{
EX0init(); // 初始化中断

TIM0init();//初始化定时器0
while(1)//主循环
{
if(irok)
{
ircordpro();//码值处理
irok=0;
}

if(irpro_ok)//step press key
{
ir_work();//码值识别散转
}
}
}
程序基础来自已有程序,在看完下面的说明后,就可以移植了,毕竟同一个解码标准,都是大同小异,甚至就算不同解码标准也仅仅是判断编码的时间要求上长短不同。但为什么这是经过我自己消化的呢,这里有个非常有趣的问题。

在我单独实验红外模块的时候(也就是上面的源程序),能够正常运行。但是移植入开启了T2中断的大程序里之后,红外部分一点反应也没有。在接下来的调试过程中,因为不会使用DEBUG进入外部中断,在不断地比对程序中浪费了许多时间。当我使用LED调试法时(把P1=0x55;插入任意想要检验的程序行,亮了就证明程序走到了这里),亮与不亮在这里分界了(红色标记):

void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数
{
unsigned char i;
bit startflag;

if(startflag)
{
TR0=0;
if(irtime<38&&irtime>=34)

i=0;
TR0=1;
irdata[i]=irtime;

irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}

}

恰好最近有重温static定义变量的特点,不然可能死得不明不白。因为抱着单独运行正常,移植整合之后也正常的想法,源程序的static unsigned char i;被我改为了uchar i;(我在自己程序里已做#define uchar unsigned char)。

答案清楚了:因为我不允许任何配角程序打扰T2时钟工作,所以设置了最高优先级(PT2=1;),这样每次外部中断0里面局部变量i的累加会被打断,如果不能保值,就每次都被撤销和重新构建,或许永远达不到(i==33)要求。static按我的理解,最大的作用就是能够保持上一次的值,至于其他作用印象就不大深刻了。

哈哈,有意思,记住 中断里的局部变量定义 unsigned char i;要改为static unsigned char i;

关键字:单片机  红外解码  TC9012F编码 引用地址:基于8952单片机的红外解码(TC9012F编码)

上一篇:I^2C总线EEPROM编程心得
下一篇:基于单片机设计的音乐马桶

推荐阅读最新更新时间:2024-03-16 14:27

MCS-51系列基本型单片机
MCS是Intel公司生产的单片机的系列符号,例如,Intel公司的MCS-48、MCS-51、MCS-96系列单片机。MCS-51系列单片机是Intel公司在MCS-48系列的基础上于20世纪80年代初发展起来的,是最早进入我国并在我国得到广泛应用的单片机主流品种。      MCS-51系列单片机主要包括基本型产品8031/8051/8751(对应的低功耗型80C31/80C51/87C51)和增强型产品8032/805218752。虽然它们是8位的单片机,但是具有品种全、兼容性强、性能价格比高等特点,且软硬件应用设计资料丰富齐全,已为我国广大工程技术人员所熟悉和掌握。在20世纪80年代和90年代,MCS-51系列单片机
[单片机]
ARM11以后值得关注的Cortex产品系列
ARM在经典处理器ARM11以后的产品改用Cortex命名,并分成A、R和M三类,旨在为各种不同的市场提供服务。Cortex系列属于ARMv7架构,这是到2010年为止ARM公司最新的指令集架构。ARMv7架构定义了三大分工明确的系列:A系列面向尖端的基于虚拟内存的操作系统和用户应用;R系列针对实时系统;M系列对微控制器。由于应用领域不同,基于v7架构的Cortex处理器系列所采用的技术也不相同,基于v7A的称为Cortex-A系列,基于v7R的称为Cortex-R系列,基于v7M的称为Cortex-M系列。 今天就带大家来看看ARM11以后的Cortex产品系列: ARM推出ARMv8架构ARM Cortex-A50处理
[单片机]
ARM11以后值得关注的Cortex产品系列
基于51单片机的温度湿度采集系统
实现功能: 1、对温度、湿度进行采集 2、可以警报提示、修改温度、湿度上下限值 3、lcd显示相关信息 原理图: 部分程序: #include reg52.h #define uint unsigned int #define uchar unsigned char #include intrins.h typedef bit BOOL ; sbit io = P1^1 ;//(口线定义) sbit bee=P1^0; sbit rs = P2^5 ; sbit rw = P2^6 ; sbit ep = P2^7 ; bit flag_300ms ; sbit K1=P1^2; sbit K2=P1^3;
[单片机]
51单片机中断篇
51单片机中断原理 中断的概念: CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生),那么CPU就会暂停当前的工作(A事件),去执行B事件(中断响应和中断服务),然后B事件做完之后,再回到原来的事件(A事件)中继续工作。(中断的返回)。 中断作用 随着计算机技术的应用,人们发现中断技术不仅解决了快速主机与I/O设备的数据传送问题,而且还有具有如下的优点: 1. 分时操作:CPU可以分时为多个I/O设备服务,提高了计算机的利用率。 2. 实时操作:CPU能够及时处理应用系统的随机事件,系统的实时性大大增强。 3. 可靠性高:CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性更高。 中断
[单片机]
51<font color='red'>单片机</font>中断篇
51单片机红外遥控小车
学习51单片机,遥控小车小车是很多单片机爱好者、 电子制作 爱好者必先项目,这里为大家介绍一款51单片机红外遥控小车的制作。51单片机红外遥控小车材料准备,首先当然是淘宝网购啦,主要购买如下配件:单片机最小系统板、3轮小车底盘,L298N两个电机控制电路板、电池盒,还有一些铜柱、扎带等,所需要的配件很容易在一家店中购齐的。 51单片机红外遥控小车,十分简单,产生我们先从红外遥控部分开始。网上打一个红外的例程进行改,就成了51单片机红外遥控小车程序了。 51单片机红外遥控小车用单片机最小板是是一块6元钱的最小板(就是哪种直接把IO引出来,加个晶振),电机控制板,与P连接。先在电脑上测试程序,测试好后,再把程序下载到单
[单片机]
51<font color='red'>单片机</font>红外遥控小车
利用USB2.0单片机实现全数字图像的实时采集
引言 传统的方法是用视频采集卡(如1394)对视频信号进行采集,利用相应的软件传给PC机,既不方便,也不经济。本文介绍一种利用Cypress公司2002年发布的世界上第一块带 有USB2.0接口的芯片CY7C68013与PC机(主板为支持USB2.0的华硕主板PB533)实现了高分辨率(640×480点阵以上)、快速(24帧/s以上)、全数字图像的实时采集系统。 1 数字图像的实时采集原理 数字图像的实时采集原理如图1所示。在图1中,以Omnivision technologies公司的OV7620/7120芯片作为图像采集芯片,其主要特点是该芯片可提供0.5~30帧/s,640×480像素点阵CMOS的彩色或黑白数字图像,
[测试测量]
利用USB2.0<font color='red'>单片机</font>实现全数字图像的实时采集
AVR单片机与上位机通信协议的制定
单片机和上位机的串口通信协议分为上行协议和下行协议,要分别制定! 上行协议,即由单片机向上位机发送数据。 下行协议,即由上位机向单片机发送数据。 而通信协议又要分固定长度和不定长度两种 本文所介绍的协议属于简单的固定字长的通信协议! 下行协议由四个字节构成 起始字PRE 命令字ORD 值VAL 结束字END 附注 1byte 1byte 1byte 1byte   BBH AAH(ORD_SATA)     单片机状态转换命令标识 01H EEH 模式1:空闲 02H EEH 模式2:温度采集 03H EEH 模式3:温度采集向上位机传送采集值 04H EEH 模式4:PWM测试 BBH DDH(ORD_P
[单片机]
基于STC单片机的LED轮廓显示控制器设计
LED护栏管又名丽得管,是一种先进的LED装饰照明灯饰产品。以红、绿、蓝3种颜色的LED作为光源,使用了微电子和数码技术,能进行色彩追逐,色彩过渡渐变,灰度变化和七色变化,能产生十分丰富的色彩变幻效果。该产品外形采用一次成型,灯管和底座浑为一体,防水性更好,重量更轻。广泛适用于酒吧、舞厅、大厦、广场、桥梁、栏杆等各种大型建筑装饰,全彩管更可以在一个大范围的区域实现灯光群控和显示动态节目,适合大型主题夜景。 文中提出了一种主从式单片机的LED轮廓显示屏解决方案,该设计方案利用STC单片机自身的FLASH ROM和RAM,外部无需任何存储电路,电路结构简单。可实现交流同步显示,驱动当前LED亮化市场中的多款LED护栏管与点光源器
[单片机]
基于STC<font color='red'>单片机</font>的LED轮廓显示控制器设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved