格力空调遥控器(YB0F2)解码
CUP:STC89C52RC 晶振:11.0569MHz
直接如串口输出 波特率:57600
************************************ 说 明 **********************************************
解码方式:
以一个9ms的低电平和4.5ms的高电平为引导码,后跟35位二进制代码接着0.565ms低电平和20MS高电平跟32位二进制代码
前4个字节每个字节为8位,中间1个字节只有3位,接着为20MS高电平,跟后4个字节每个字节为8位
以低电平为0.565ms、高电平为0.56ms、 周期为1.125ms的组合表示"0";
以低电平为0.565ms、高电平为1.685ms、周期为2.25ms的组合表示"1"。
注意:经过红外接收头解调后单片机接收到的高低电平是和遥控器发射时是相反的一个过程
* 兼容 1T-12T单片机中断方式红外接收数据,并通过串口发送
程序编辑: lbq691477940 22/07/2011
#include
typedef unsigned char uint8;
sbit Ir_Pin = P3^2;
uint8 Ir_Buf[9]; //用于保存解码结果
void int1_init(void)
{
IT0 = 1; //下降沿有效
EX0 = 1;
EA = 1;
}
void uart_init(void)
{
TMOD = 0x21;
SCON = 0x50;
PCON |= 0x80;
TH1 = 0xff; //57600bps @ 11.0592MHz
TL1 = 0xff;
TR1 = 1;
}
void UART_Send_Byte(uint8 dat)
{
SBUF = dat;
while (TI == 0);
TI = 0;
}
unsigned int Ir_Get_Low()
{
TL0 = 0;
TH0 = 0;
TR0 = 1;
while (!Ir_Pin && (TH0 & 0x80)==0);//一直计到Ir_Pin不等0与计到大于1.085*32768=35553.28us
TR0 = 0;
return (TH0 * 256 + TL0); //返回T1 高八位和低八位计数值
}
unsigned int Ir_Get_High()
{
TL0 = 0;
TH0 = 0;
TR0 = 1;
while (Ir_Pin && (TH0 & 0x80)==0);//一直计到Ir_Pin不等1与计到大于1.085*32768=35553.28us
TR0 = 0;
return (TH0 * 256 + TL0); //返回T1 高八位和低八位计数值
}
main()
{
uart_init();
int1_init();
while (1);
}
void int1_isr() interrupt 0
{
unsigned int temp;
char i,j;
temp = Ir_Get_Low();
if ((temp < 7833) || (temp > 8755)) //引导脉冲低电平8500~9500us
return; //不在这范围则说明出错 //1.085*7833=8498us ~ 1.085*8755=9499us
temp = Ir_Get_High();
if ((temp < 3686) || (temp > 4608)) //引导脉冲高电平4000~5000us
return; //不在这范围则说明出错 //1.085*3686=3999us ~ 1.085*4608=4999us
for (i = 0; i < 4; i++) //4个字节
{
for (j = 0; j < 8; j++) //每个字节8位
{
temp = Ir_Get_Low();
if ((temp < 184) || (temp > 737)) //200~800us
return; //不在这范围则说明出错 //1.085*200=217us ~ 1.085*800=868us
temp = Ir_Get_High();
if ((temp < 184) || (temp > 1843)) //200~2000us
return; //不在这范围则说明出错 //1.085*200=217us ~ 1.085*2000=2170us
Ir_Buf[i] >>= 1; //先将它自动补0
if (temp > 1032) //1120us //1.085*1032=1119us
Ir_Buf[i] |= 0x80; //如果大于1119us才将它设为1
}
}
for (i = 4; i <= 4; i++) //1个字节
{ Ir_Buf[i] = 0;
for (j = 0; j < 3; j++) //每个字节8位
{
temp = Ir_Get_Low();
if ((temp < 184) || (temp > 737)) //200~800us
return; //不在这范围则说明出错 //1.085*200 = 217us ~ 1.085*800 = 868us
temp = Ir_Get_High();
if ((temp < 184) || (temp > 1843)) //200~2000us
return; //不在这范围则说明出错 //1.085*200 = 217us ~ 1.085*2000 = 2170us
Ir_Buf[i] <<= 1; //先将它自动补0
if (temp > 1032) //1120us //1.085*1032 = 1119us
Ir_Buf[i] |= 0x01; //如果大于1119us才将它设为1
}
}
//delay21ms(); //实测波形只20ms但如果只延时20ms读出会出错故延时21ms
temp = Ir_Get_Low();
if ((temp < 184) || (temp > 737)) //200~800us
return; //不在这范围则说明出错 //1.085*200 = 217us ~ 1.085*800 = 868us
temp = Ir_Get_High();
if ((temp < 17498) || (temp > 19354)) //19~21ms
return; //不在这范围则说明出错 //1.085*17498 = 18985us ~ 1.085*19354 = 20999us
for (i = 5; i < 9; i++) //4个字节
{
for (j = 0; j < 8; j++) //每个字节8位
{
temp = Ir_Get_Low();
if ((temp < 184) || (temp > 737)) //200~800us
return; //不在这范围则说明出错 //1.085*200 = 217us ~ 1.085*800 = 868us
temp = Ir_Get_High();
if ((temp < 184) || (temp > 1843)) //200~2000us
return; //不在这范围则说明出错 //1.085*200 = 217us ~ 1.085*2000 = 2170us
Ir_Buf[i] >>= 1; //先将它自动补0
if (temp > 1032) //1120us //1.085*1032 = 1119us
Ir_Buf[i] |= 0x80; //如果大于1119us才将它设为1
}
}
for(i = 0;i < 9;i++) //通过串口将代码发出
{
UART_Send_Byte(Ir_Buf[i]); //将9个字节的遥控键值通过串口输出
}
}
关键字:单片机 中断方式 空调遥控器 YB0F2
引用地址:
1T-12T单片机中断方式格力空调遥控器(YB0F2)解码
推荐阅读最新更新时间:2024-03-16 14:37
51单片机红外线接收系统设计文档
红外线接收系统,是基于51单片机的普通红外线接收器, 图1 红外线接收器原理图 2.1.首先我们先解释一下红外线: 人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为0.62~0.76μm;紫光的波长范围为0.38~0.46μm。比紫光波长还短的光叫紫外线,比红光波长还长的光叫红外线.红外线遥控就是利用波长为0.76~1.5μm之间的近红外线来传送控制信号的。 2.2 对于红外接收器而言 红外接收设备是由红外接收电路、红外解码、电源和应用电路组成。红外遥控接收器的主要作用是将遥控发射器发来的红外光信好转换成电信号,再放大、限幅、检波、整形,形成遥控指令脉冲,输出至遥控微处
[单片机]
基于单片机ATmega16的CCD驱动电路的设计
CCD是一种固体成像器件 ,应用广泛。CCD工作需要多路脉冲驱动,并且各路脉冲在时序上要严格对应。对于CCD时序的设计,通常采用CPLD和FPGA技术,CPLD在低频CCD时序设计中使用 ,FPGA则用在更为复杂的时序设计中 。对于驱动比较简单的线阵CCD没有必要用这种成本比较高的电路。本文针对东芝公司的线阵CCD芯片TCD1304设计了基于单片机ATmega16的 驱动电路 。采用ATmega16的定时器/计数器timer0的CTC(比较匹配时清零定时器)模式和timer1的相位与频率修正PWM模式产生所需要的基本波形,可通过修改单片机程序中的参数来改变输出波形的频率和占空比,使得波形调整便捷。 1 ATmega16的CT
[单片机]
51单片机实现按健连加减程序
************************************************************************/ /********按键记数0-99 长按键连续加或者连续减实验******************/ /********按k1键加一,超过一定时间连续加一,加到99后k1在按无效*******/ /********按k2键减一,超过一定时间连续减一,减到00后k2在按无效*******/ /************************************************************************/ /****************宏定义****
[单片机]
单片机与PC电话远程通信系统设计
1、 引言 随着通信技术的不断发展,计算机网络系统通信是当今技术发展的一个重要的方向,然而在网络系统中利用现有电话网作为通信信道则是最经济、最方便和最可靠的方法。当前现代电话通信网已经进入程控交换时代,技术比较先进,速度快,容量大,因此采用电话通信网建立数据通信系统确实具有其独特的优越性。 利用单片机系统采集灌区水位、水流量,实现无人职守和科学的管理水资源具有实际意义,特别对少雨缺水地区更具有应用价值。 2、 系统硬件设计 本系统采用了MODEM将前端单片机采集的数据通过电话网远程传输到中心站PC机,并实现一对多点通信(站点数、通信距离均不限),后台PC机通过拨号的方式对各站点进行数据接收并实时存储
[单片机]
51单片机的P0口工作原理详细讲解
三态门:三态门缓冲器: 51单片机 P0口输入缓冲器 P0口的输出驱动:两个MOS管组成的推拉式结构 P0口作为IO线输入状态时:①读引脚;②读锁存器; P0口作为地址/数据复用口 P0口作为IO线输出时,只能输出低电平、高阻态,需要外接上拉电阻,使高阻态变为输出高电平(对比 AVR单片机 的推挽输出结构) 一、P0端口的结构及工作原理 P0端口8位中的一位结构图见下图: 由上图可见,P0端口由锁存器、输入缓冲器、切换开关、一个与非门、一个与门及场效应管驱动电路构成。再看图的右边,标号为P0.X引脚的图标,也就是说P0.X引脚可以是P0.0到P0.7的任何一位,即在P0口有8个与上图相同的电路组成。 下
[单片机]
单片机延时时间怎样计算
C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。 以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。 一. 500ms延时子程序 程序: void delay500ms(void) { unsigned char i,j,k; for(i=15;i 0;i--) for(j=202;j 0;j--) for(k=81;k 0;k--); } 计算分析: 程 序共有三层循环 一层循环n
[单片机]
SST89C54/58系列单片机的IAP应用技术
摘要:SST89C54/58j Silicon Storage Technology公司推出的带有20KB/36KB Flash的单片机。芯片内部集成了可以对Flash进行操作的功能模块。通过对Flash的分区实现在应用中可编程的功能。本文介绍它们的IAP功能,并给出IAP功能的一些子程序。
关键词:SST89C54/58 IAP Flash存储器
SST89C54/58单片机是MCS-51系列单片机的派生产品。它们在指令系统、硬件结构和片内资源上与标准8052单片机完全兼容,只是加大了内部程序存储器Flash的容量。
SST89C54/58的特色:
*256%26;#215;8位内部RAM;
*3个16位定时/计数器(
[应用]
基于C8051F311单片机实现汽车座椅自动控制系统的软硬件设计
引言 随着人们生活水平的提高,对汽车座椅的舒适性要求也越来越高,要求对汽车座椅地调节能够更加简单、方便、快捷。目前,汽车座椅位置的调节多采用基于手动调节方式的机械和电动控制两种方式。汽车座椅位置的调节主要有三个方向,即高度调节、水平位置调节以及座椅靠背倾角的调节。 对于家庭使用的汽车,往往由多个成员驾驶同一辆汽车;当不同的驾驶者坐在同一个座椅时,由于个人的身体差异,所需要的汽车座椅的位置各不相同,需经常调节座椅位置;而目前的大部分汽车座椅没有记忆功能,使同一个人在不同的时间驾驶汽车时,汽车座椅的位置可能被其他成员改变,而需重新调节座椅各个方向位置,比较繁琐。 座椅在汽车内安装时,由于不同汽车的内部空间不相同,座椅在各方向所
[单片机]