|
/*------------------------------------------------------------------------------
- Device : 2313
- Crystal : 8.0Mhz
- Descrip : 6122解码程序
- Revision : Ver1.00
- Author : 崔庆伟
- Date : 23/03/2006
- Modify :
------------------------------------------------------------------------------*/
#include <io2313v.h>
#include <macros.h>
// 起始位 1 0 重复码
// +-------------+ +--------+ +------+ ........ +-------------+ +---
// | | | | | | ........ | | |
//_| |____| |_____| |_____........_| |__|
// |<----irHpulse---->|<--ir1Pulse-->|<-ir0Pulse->| |<---irRpulse--->|
#define irHPulse 9000 + 4500 // 引导码 us
#define irRPulse 9000 + 2250 // 重复码 us
#define ir1Pulse 1680 + 560 // 1 us
#define ir0Pulse 565 + 560 // 0 us
#define irdelta 50 // 误差 us
unsigned char OK_flag; // 接收完成标志
unsigned char irdata[4]; // 接收编码缓存
unsigned char irbits; // 接收有效编码位数
unsigned char ircode; // 有效指令
void uart_putc (unsigned char c); // 简单串口发送程序
void port_init(void)
{
PORTB = 0x00;
DDRB = 0xFF;
PORTD = 0x20;
DDRD = 0x00;
}
//Watchdog initialize
// prescale: 2048K
void watchdog_init(void)
{
WDR(); //this prevents a timout on enabling
WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget WDR
}
//UART0 initialize
// desired baud rate: 4800
// actual: baud rate:4760 (0.8%)
void uart0_init(void)
{
UCR = 0x00; //disable while setting baud rate
UBRR = 0x67; //set baud rate
UCR = 0x18; //enable
}
void uart_putc(unsigned char c)
{
while( !(USR & (1<<UDRE)) );
UDR=c;
}
//TIMER1 initialize - prescale:1
// desired value: 1uSec
// actual value: 1.000uSec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop timer
TCNT1H = 0x00; //set count value
TCNT1L = 0x00;
OCR1H = 0x00; //set compare value
OCR1L = 0x01;
TCCR1A = 0x00;
TCCR1B = 0x82; //start Timer
}
// 使能噪音抑制,下降沿触发中断
#pragma interrupt_handler timer1_capt_isr:4
void timer1_capt_isr(void)
{
//timer 1 input capture event, read (int)value in ICR1 using;
// value=ICR1L; //Read low byte first (important)
// value|=(int)ICR1H << 8; //Read high byte and shift into top byte
unsigned char i,bit;
unsigned int times; // us
times = ICR1L;
times |= (unsigned int)(ICR1H << 8);
TCNT1H = 0x00; // 清捕捉计数
TCNT1L = 0x00;
if((times>(ir0Pulse-irdelta))&&(times<(ir0Pulse+irdelta))) // "0"信号
bit = 0;
else if((times>(ir1Pulse-irdelta))&&(times<(ir1Pulse+irdelta))) // "1"信号
bit = 1;
else if((times>(irRPulse-irdelta))&&(times<(irRPulse+irdelta))) // repeat信号
{
OK_flag = 1;;
return; // 重复,返回
}
else if((times>(irHPulse-irdelta))&&(times<(irHPulse+irdelta))) // header信号
{
irbits = 0;
return; // 返回,等待下次开始接收
}
else
return; // 干扰信号
irbits++;
/*算法1:简洁、便占MCU空间大
if ( irbits<=32 )
{
if(irbits%8) // irbits%8 = 1~7
{
irdata[irbits/8] |= bit;
irdata[irbits/8]<<= 1;
}
else
irdata[irbits%8] |= bit;
if(irbits==32)
{
/* 校验 *
if ((irdata[0]&irdata[1]==0)&&(irdata[2]&irdata[3]==0))
{
return; // 无效编码
}
else
{
/* 遥控发射先发高位,数据格式转换 *
bit = irdata[2];
for (i=0; i<7; i++)
{
if (bit&0x01)
ircode |= 0x01;
else
ircode &=~0x01;
bit >>= 1;
ircode <<= 1;
}
if (bit&0x01)
ircode |= 0x01;
else
ircode &=~0x01;
OK_flag = 1;
}
}
}
*/
/*算法2:冗长、但占MCU空间小*/
if(irbits<8) // 用户码
{
irdata[0] |= bit;
irdata[0]<<= 1;
}
else if(irbits==8)
irdata[0] |= bit;
else if(irbits<16) // 用户反码
{
irdata[1] |= bit;
irdata[1] <<= 1;
}
else if(irbits==16)
irdata[1] |= bit;
else if(irbits<24) // 数据码
{
irdata[2] |= bit;
irdata[2] <<= 1;
}
else if(irbits==24)
irdata[2] |= bit;
else if(irbits<32) // 数据反码
{
irdata[3] |= bit;
irdata[3] <<= 1;
}
else if(irbits==32)
{
irdata[3] |= bit;
/* 校验 */
if ((irdata[0]&irdata[1]==0)&&(irdata[2]&irdata[3]==0))
{
return; // 无效编码
}
else
{
/* 遥控发射先发高位,数据格式转换 */
bit = irdata[2];
for (i=0; i<7; i++)
{
if (bit&0x01)
ircode |= 0x01;
else
ircode &=~0x01;
bit >>= 1;
ircode <<= 1;
}
if (bit&0x01)
ircode |= 0x01;
else
ircode &=~0x01;
OK_flag = 1;
}
}
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
watchdog_init();
timer1_init();
uart0_init();
MCUCR = 0x00;
GIMSK = 0x00;
TIMSK = 0x08;
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void main(void)
{
init_devices();
OK_flag = 0;
irbits = 0;
while (1)
{
WDR();
if (OK_flag)
{
uart_putc(ircode); // 通过串口将键值送出
OK_flag=0;
}
}
}
/*-------------------------------------end-----------------------------------*/
-----此内容被qingwei_cui于2006-11-03,19:43:01编辑过 |
|