|
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.7d Professional
Automatic Program Generator
?Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com
Project : 红外解码
Version :
Date : 2007-9-4
Author : xxx
Company : xxx
Comments: 输出用PB0,1,2,3脚,增加译码只需要把相应的Codex修改掉就可以了
Chip type : ATtiny13
Clock frequency : 9.600000 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 16
*****************************************************/
#define Code1 0x0CA0
#define Code2 0x0C90
#define Code3 0x0d20
#define Code4 0x0d10
#define Code5 0x0d08
#define Code6 0x0d04
#define Code7 0x0d02
#define Code8 0xfffa
#define Code9 0xfff9
#define Code10 0xfff8
#define Code11 0xfff7
#define Code12 0xfff6
#define Code13 0xfff5
#define Code14 0xfff4
#define Code15 0xfff3
#include <tiny13.h>
unsigned char HighPoint,LowPoint; //高电压,低电压
long int ReceiveData;
int ReceiveData1,ReceiveData2,TimeCount; //这两个变量用来做效验,看2次收到的是否一样,对保持时间的计数
bit CodeOutFlag; //这个标志为用来表示是否在做译码输出
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void) //定时器保证每个时间间隔a采样10个点,42us的定时
{
if (PINB.4==0)
{
HighPoint++;
}
else
{if (HighPoint!=0)
{
LowPoint++;
}
}
if (CodeOutFlag==1)
{TimeCount++;
if (TimeCount==3809)
{TimeCount=0;
CodeOutFlag=0;
}
}
}
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
PORTB=0x10;
DDRB=0x0f;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 1200.000 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x02;
TCCR0B=0x02;
TCNT0=0x00;
OCR0A=0x38;
OCR0B=0x00;
// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x04;
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/512k
// Watchdog Timer interrupt: Off
WDTCR=0x38; //看门狗约为4s
WDTCR=0x28;
// Global enable interrupts
#asm("sei")
while (1)
{if (LowPoint==3) //采到3个低电平认为该位编码结束
{if ((HighPoint>5)&(HighPoint<15)) //认为收到0
{
ReceiveData=(ReceiveData<<1);
}
else if ((HighPoint>24)&(HighPoint<36)) //认为收到1
{
ReceiveData=(ReceiveData<<1)+1;
}
//如果不在范围内,不进行操作,相当于舍弃了该位
LowPoint=0;
HighPoint=0;
}
//下面为编码输出部分
ReceiveData1=(int)(ReceiveData&0x00000fff);
ReceiveData2=(int)((ReceiveData>>12)&0x00000fff);
if ((ReceiveData1==ReceiveData2)&(ReceiveData1!=0))
{
CodeOutFlag=1;
TimeCount=0;
switch(ReceiveData1)
{case Code1:PORTB=0x01;ReceiveData=0;break;
case Code2:PORTB=0x02;ReceiveData=0;break;
case Code3:PORTB=0x03;ReceiveData=0;break;
case Code4:PORTB=0x04;ReceiveData=0;break;
case Code5:PORTB=0x05;ReceiveData=0;break;
case Code6:PORTB=0x06;ReceiveData=0;break;
case Code7:PORTB=0x07;ReceiveData=0;break;
default:break;
}
}
if (CodeOutFlag==0) //时间到将编码输出置为全0;
{PORTB&=0xf0; //把PB0,1,2,3脚输出置0
}
#asm("WDR") //喂狗
};
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|