自己做的红外学习格力空调的编码大家看看有没有错?
01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 01 00 01 00 01 00 01 00 01 00 01 00 46 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 1A 01 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 1B 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 01 08 01 00 01 00 01 00 01 00 01 00 01 00 01 01 00 01 00 01 1A 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 09 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 09 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 09 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 09 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 00 00448个字节。程序来自于本网站:
/*****************************************************
This program was produced by the
ICC V6.31A
Chip type : ATmega8L
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size: 0
Data Stack size : 256
需要256字节的BOOTLOADER区
*****************************************************/
#include "TimeCtrl.h"
//中断===============================================
#pragma interrupt_handler int0_isr:2
void int0_isr(void){ //RECEIVE中断
unsigned char study_measure_temp; //提高TCNT2的读取速度
if (study_measure_st==Study_Measure_Test)
{
study_measure_temp = TCNT2;
TCNT2 = 0x00;
wave_temp = study_measure_temp;
if (device_wave_num>=WAVE_MAX-1)
{
TCCR2=0x00; //start timer2,256分频
GICR=0; //禁止INT0中断
//UDR=0xaa;
//while(!(UCSRA&0x40));
//UCSRA|=0x40;
for(xunhuan=0;xunhuan<WAVE_MAX;xunhuan++)
{
//UDR=xunhuan;
//while(!(UCSRA&0x40));
//UCSRA|=0x40;
UDR=wave_temp;
while(!(UCSRA&0x40));
UCSRA|=0x40;
for(yanshi=0;yanshi<100;yanshi++);
}
/*
UDR=device_wave_num/256;
while(!(UCSRA&0x40));
UCSRA|=0x40;
for(yanshi=0;yanshi<100;yanshi++);
UDR=device_wave_num%256;
while(!(UCSRA&0x40));
UCSRA|=0x40;
for(yanshi=0;yanshi<100;yanshi++);
UDR=0xbb;
while(!(UCSRA&0x40));
UCSRA|=0x40;
*/
////for(xunhuan=0;xunhuan<WAVE_MAX;xunhuan++)
{
////wave_temp=0;
}
device_wave_num=0;
////wave_temp = 0;
study_measure_st = Study_Measure_End;
PORTB=0x00;
//PORTB=0x04;
xuexibiaoji=0;
} }
else
{
TCNT2=0; //定时计数器
TCCR2=0x06; //start timer2,256分频
TCCR1B=0; //停止其它timer
TCCR0=0; //定时计数器停止工作,在发送时才工作
TIFR=0xFF; //所有中断置标志
device_wave_num = 0;
study_measure_st= Study_Measure_Test;
PORTB=0x04;
} }
////#pragma interrupt_handler int1_isr:3
////void int1_isr(void){ //KEY0中断
////GICR=0x00;
////MCUCR=0x81;
////}
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void){ //38K载波
TCNT0=0xDD;
flag_38K=~flag_38K;
if (flag_38K&&flag_code)//flag_38K=0xFF;flag_code=0xFF;
{
asm("nop");
transmit_on;//#define transmit_on PORTD|=(1<<0)
}
else
transmit_off;//#define transmit_off PORTD&=~(1<<0),
PORTB=0x04;
}
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void){ //时间基准
/*
*/
}
//定时器2采集脉宽没有脉冲来时超时自动中断
#pragma interrupt_handler timer2_ovf_isr:5
void timer2_ovf_isr(void){ //记录波形溢出处理
GICR = 0; //禁止INT0中断
wave_temp = 0;
study_measure_st = Study_Measure_End;
}
//定时器输出脉冲直到结束
#pragma interrupt_handler timer2_comp_isr:4
void timer2_comp_isr(void){ //波形还原
OCR2 = wave_temp;
flag_code=~flag_code;
if(OCR2==0) asm("cli");
}
//发射函数=============================================
void TransmitWave (void){
asm("cli");
TCCR1B=0; //禁止TIMER1
TIFR = 0xFF;
TCNT0 = 0xCC;//启动定时器0
TCNT2 = 0; //定时计数器2为零
device_wave_num = 0;
OCR2 = wave_temp;
flag_38K=0xFF;
flag_code=0xFF;
asm("sei");
transmit_on; //红外管工作
TCCR2=0x0E; //定时器2 256分频,CTC,最高值OCR
TCCR0=0x01; //没有分频
while(OCR2) //波形未结束
//asm("sleep");
asm("cli");
transmit_off; //红外管截止
TCCR2 =0;
TCCR0 =0;
//TCNT1H=0xFF;
//TCNT1L=0x05;
//TCCR1B=0x03;
asm("sei");
PORTB=0x00;
}
//main=================================================
void device_init(void){
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State7=P State6=P State5=P State4=P State3=0 State2=0 State1=0 State0=0
DDRB=0x04;
////PORTB=0x04;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State6=P State5=P State4=P State3=0 State2=0 State1=0 State0=0
PORTC=0x70;
DDRC=0x0F;
// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=P State2=P State1=P State0=0
PORTD=0x0E;
DDRD=0xF1;
/*********************定时器0产生38KHZ方波******************/
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 4000.000 kHz
TCCR0=0x00;
//TCCR0=0x01;
TCNT0=0xDD;
/*********************定时器0产生38KHZ方波******************/
/********************定时器1为4毫秒中断一次****************/
//4毫秒中断一次
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 62.500 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
////TCNT1H=0xFF;
////TCNT1L=0x05;
//ICR1H=0x00;
//ICR1L=0x00;
//OCR1AH=0x00;
//OCR1AL=0x00;
//OCR1BH=0x00;
//OCR1BL=0x00;
////TCCR1A=0x00;
////TCCR1B=0x03;
/********************定时器1为4毫秒中断一次****************/
/****************定时器2为采集脉宽和输出脉宽***************/
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 15.625 kHz
// Mode: CTC top=OCR2
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
//TCCR2=0x06; //normal
//TCCR2=0x0E; //CTC
TCNT2=0x00;
OCR2=0x00;
/****************定时器2为采集脉宽和输出脉宽***************/
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
// INT1: On
// INT1 Mode: Low level
GICR=0x00;
GIFR=0x00;
//MCUCSR = 0x80;//禁止JTAG
//MCUCR=0x81; //空闲模式
////MCUCR=0xA1; //掉电模式
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0xC5;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
////ACSR=0x80;
////SFIOR=0x00;
UCSRB = 0x00;//禁止中断
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x19;
UBRRH = 0x00;
UCSRB = 0x08;
}
void main (void){
unsigned char temp,key_num=0;
unsigned char on_off_temp;
unsigned char work_temp,queue_temp,min_temp,fun_temp;
//unsigned char iix;
device_init();
////EEPROM_READ(EE_TASK,task);
////avil=EEPROMread(EE_AVIL);
////task_num=EEPROMread(EE_NUM);
////min=EEPROMread(EE_DATA)*30;
////task_cur=0;
//while(1)
{
//PORTB=0x00;
//PORTC=0x06;
//PORTD=0x00;
UDR=0x01;
while(!(UCSRA&0x40));
UCSRA|=0x40;
UDR=0x02;
while(!(UCSRA&0x40));
UCSRA|=0x40;
asm("sei");
}
while (1)
{
////key_num=0;
////if (flag_transmit) //遥控发射
{
//// asm("cli");
//// choose=0xF0;
//// read_wave(fun_read);//先读再发射
//// TransmitWave(); //再发射
//// flag_transmit=0;
}
if(xuexibiaoji==0)
{
if ((PINC&0x10)!=0x10)
{
GIFR=0x40;//中断0和1置标志,MCUCR=0xA1; //掉电模式
GICR=0x40;//开INT0
xuexibiaoji=1;
}
}
if(fasongbiaoji==0)
{
if ((PINC&0x20)!=0x20)
{
TransmitWave ( );
fasongbiaoji=0;
}
}
++dengyanshi;
if(dengyanshi<=65536)
{
////PORTB=0x04;
}
if((dengyanshi>65536)&&(dengyanshi<=125536))
{
////PORTB=0x00;
}
if(dengyanshi>125536)dengyanshi=0;
} } //// read_wave(fun_read);//先读再发射
//// TransmitWave(); //再发射
想歪了。。。./emotion/em034.gif./emotion/em034.gif 楼上我是先把遥控板上码读出来,然后打开空调,再把学习的码发送出去。 我解码过美的的。。 发一个正常使用的遥控器for Gree
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <iom48v.h>
#include <macros.h>
#include "lcd4bit.h"
#define delay_timer1(k) {TIFR1|=BIT(TOV1); TCNT1=65536-(k/2); TCCR1B=0x02; while (!(TIFR1&BIT(TOV1))); TCCR1B=0x0;}
const unsigned char asc={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
static unsigned char txbuf={1,0,0,1,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,1,0};
unsigned char work_mode=1; //"0":heat
//"1":cold
//"2":dehumidify
//"3":fan
//"4":auto
unsigned char power=0; //"0":power off
//"1":power on
unsigned char fan=0; //"0":auto
//"1":low
//"2":mid
//"3":high
unsigned char fanangle=0; //"0":fan angle off
//"1":fan angle on
unsigned char sleep=0; //"0":sleep off
//"1":sleep on
unsigned char temperature=25; //16+n,max 30,min 16
///////////////////////////////////////////////////////////////////////////////
void write_eeprom(unsigned int address,unsigned char dat)
{ while (EECR & (1<<EEWE)); //wait until EEWE to 0
EEAR=address;
EEDR=dat;
EECR|=(1<<EEMWE); //set EEMWE to 1
EECR|=(1<<EEWE); // set EEWE to 1
}
unsigned char read_eeprom(unsigned int address)
{ while (EECR &(1<<EEWE)); //wait until EEWE to 0
EEAR=address;
EECR|=(1<<EERE); // set EERE to 1
return (EEDR);
}
///////////////////////////////////////////////////////////////////////////////
void ir_send(unsigned char *p,unsigned char len)
{unsigned char k;
TCNT2=0; //send start bit
TCCR2A=0x42; //enable OC2
TCCR2B=0x01; //start timer2,
delay_timer1(9000); //delay 9000us
TCCR2B=0x0; //stop timer2
TCCR2A=0x0; //disable OC2
delay_timer1(4500); //delay 4500us
for (k=0;k<len;k++)
{ if (*p) //send "1"
{ TCNT2=0;
TCCR2A=0x42; //enable OC2
TCCR2B=0x01; //start timer2
delay_timer1(560); //delay 560us
TCCR2B=0x0; //stop timer2
TCCR2A=0x0; //disable OC2
delay_timer1(1680); //delay 1680us
}
else //send "0"
{ TCNT2=0;
TCCR2A=0x42; //enable OC2
TCCR2B=0x01; //start timer2
delay_timer1(560); //delay 560us
TCCR2B=0x0; //stop timer2
TCCR2A=0x0; //disable OC2
delay_timer1(560); //delay 560us
}
p++;
}
TCNT2=0;
TCCR2A=0x42; //start timer2,enable OC2
TCCR2B=0x01;
delay_timer1(560);
TCCR2B=0x0; //stop timer2
TCCR2A=0x0; //disable OC2
delay_timer1(10000);
}
void show_message(void)
{ LCD4_Home();
if (power)
{ if (work_mode==0)
LCD4_PutS("Heat_M ");
else if (work_mode==1)
LCD4_PutS("Cold_M ");
else if (work_mode==2)
LCD4_PutS("Debu_M ");
else if (work_mode==3)
LCD4_PutS("Fan_M");
else
LCD4_PutS("Auto_M ");
if (fan==1)
LCD4_PutS(" low");
else if (fan==2)
LCD4_PutS(" mid");
else if (fan==3)
LCD4_PutS(" high ");
else
LCD4_PutS(" auto ");
LCD4_PutS("fan");
LCD4_Home2();
LCD4_PutC(asc);
LCD4_PutC(asc);
LCD4_PutC('\"');
LCD4_PutC('C');
LCD4_PutS(" swing ");
if (fanangle)
LCD4_PutS("on ");
else
LCD4_PutS("off");
}
else
{LCD4_PutS("------ OFF -----");
LCD4_Home2();
LCD4_PutS(" ");
return;
}
}
////////////////////////////////////////////////////////////////////////////////
void main(void)
{ PORTD=0x04;
DDRD=0xF8;
PORTC=0x3F;
DDRC=0x0;
PORTB=0x01;
DDRB=0xFE;
OCR2A=0x35;
MCUCR=0x02; //INT0 falling edge
delay_ms(100);
LCD4_Init();
LCD4_Clear();
LCD4_PutS("GREE Remote for ");
LCD4_Home2();
LCD4_PutS("Air-Condition ");
delay_ms(1000);
show_message();
MCUCR=0x02; // set int0 to failing edge interrupt
while (1)
{ ir_send(txbuf,35);
delay_ms(200);
}
/* { unsigned char temp;
//SMCR=0x04;
//SMCR|=0x01;
//asm("sleep");
delay_ms(10);
temp=(~PINC)&0x3F;
if (temp==0)
continue; //no key pressed
delay_ms(20);
temp=(~PINC)&0x3F;
switch (temp)
{case 0x1: if (power) //PC0 to power control
power=0;
else
power=1;
txbuf=power;
show_message();
ir_send(txbuf,35);
break;
case 0x2: if (!power)
break;
work_mode++; //PC1 to mode control
if (work_mode>4)
work_mode=0;
txbuf=work_mode&0x1;
txbuf=(work_mode&0x2)>>1;
txbuf=(work_mode&0x4)>>1;
show_message();
ir_send(txbuf,35);
break;
case 0x4: if (!power)
break;
fan++; //PC2 to fan mode
if (fan>3)
fan=0;
txbuf=fan&0x1;
txbuf=(fan&0x2)>>1;
show_message();
ir_send(txbuf,35);
break;
case 0x8: if (!power)
break;
if (fanangle) //PC3 to fanangle control
fanangle=0;
else
fanangle=1;
txbuf=fanangle;
show_message();
ir_send(txbuf,35);
break;
case 0x10: if (!power)
break;
temperature--; //PC4 to increase temperature
if (temperature<16)
temperature=16;
else
txbuf=temperature&0x1;
txbuf=(temperature&0x2)>>1;
txbuf=(temperature&0x4)>>2;
txbuf=(temperature&0x8)>>3;
show_message();
ir_send(txbuf,35);
break;
case 0x20: if (!power)
break;
temperature++; //PC5 to increase temperature
if (temperature>30)
temperature=30;
else
txbuf=temperature&0x1;
txbuf=(temperature&0x2)>>1;
txbuf=(temperature&0x4)>>2;
txbuf=(temperature&0x8)>>3;
show_message();
ir_send(txbuf,35);
break;
default: break;//no key pressed
}
do
temp=(~PINC)&0x3F;
while (temp!=0);
delay_ms(100);
} */
} 我就不明白为什么还有00数据,高低电平之间应该有时间的. 总共就35个位,有必要搞的那么复杂吗?
做一个USB的红外分析仪不就可以了.
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1250086&bbs_page_no=1&search_mode=1&search_text=红外&bbs_id=1000 学习解码 自己编写的模拟PT2272波形的程序,是不是格力空调的比较复杂?
#include "iom16v.h"
#include <macros.h>
#define SyncH 440 // 同步码
#define SyncL 14080 // 同步码
#define Narr 300 // 窄脉冲
#define Wide 1400 // 宽脉冲上限
volatile unsigned char count;
volatile unsigned char num;
volatile unsigned char bit;
volatile unsigned char Data; //存储8位的数据。
volatile unsigned char flag; //定义标志位
void delay_nus(unsigned int n) //n微秒延时函数
{
unsigned int i;
for (i=0;i<n;i++)
{
asm("nop");
}
}
void delay_nms(unsigned int n)//n毫秒延时函数
{
unsigned int i;
for (i=0;i<n;i++) //执行n次1毫秒延时
delay_nus(1000);
}
void main(void)
{
unsigned char temp;
count=0;
num=0;
bit=0B00000001;
Data=0B00110010; //设置Data 实际运用时,这就是函数的参数
flag=0; //首先发射同步码
DDRD=0B00100000; //定义D口的PD5即OC1A为输出口;
PORTD=0B11111111; //PD位高电平;
while(1)
{
bit=0B00000001;
TCCR1A=0;
TCCR1B=0;
PORTD=0B11111111; //PD位高电平,亮;
count=0;
delay_nms(10); //延时34ms
OCR1A=SyncH; //同步码的高电平为4*110=440
TCCR1A=0B01010011; //设置TCCR1A
TCNT1=0; //初始化TCNT1;
TCCR1B=0B00011001; //设置TCCR1B,用模式15,启动计数器
OCR1A=SyncL; //同步码的低电平为128*110=14080;
temp=bit&Data;
if(temp==0) //判断数据Data是1还是0,这里代码写的不好,自己会改改
{
flag=0;
}
else
{
flag=1;
}
bit=bit<<1;
count+=1;
while(count<10)
{
if(flag==0 && ((TIFR&0B00000100)==0B00000100))
{//这里的switch主要是生成不同长度的脉宽来表示1或0,switch是不是有需要优化的地方?大家指证
switch(num)
{
case 0:
OCR1A=Narr;
num=1;
break;
case 1:
OCR1A=Wide;
num=2;
break;
case 2:
OCR1A=Narr;
num=3;
break;
case 3:
OCR1A=Wide;
num=0;
temp=bit&Data;
if(temp==0)
{
flag=0;
}
else
{
flag=1;
}
bit=bit<<1;
count+=1;
break;
}
TIFR=(TIFR&0B11111111); //向TIFR的TOV1置1,清零TOV1标志位
}
if(flag==1 && ((TIFR&0B00000100)==0B00000100))
{
switch(num)
{
case 0:
OCR1A=Wide;
num=1;
break;
case 1:
OCR1A=Narr;
num=2;
break;
case 2:
OCR1A=Wide;
num=3;
break;
case 3:
OCR1A=Narr;
num=0;
temp=bit&Data;
if(temp==0)
{
flag=0;
}
else
{
flag=1;
}
bit=bit<<1;
count+=1;
break;
}
TIFR=(TIFR&0B11111111); //向TIFR的TOV1置1,清零TOV1标志位
}
}
}
} mark mark 标注 mark mark mark 留着学习学习 mark一下 {:lol:}下下
页:
[1]