|
本帖最后由 liujian6f 于 2012-8-19 21:43 编辑
今天写了下ICP红外解码的程序 可解芯片upd6121 6122 pt2222 sc6121 hs6222 6221
内部16M时钟 红外头数据口 接LGT ICP(PD6)引脚 解码值直接发送到串口显示
水平有限只能这么地写了。
以下是程序- #include <avr/io.h>
- #include <lgt.h>
- #define F_CPU 16000000
- #include <util/delay.h>
- #include <avr/interrupt.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- #define delayms(x) _delay_ms(x)
- #define delayus(x) _delay_us(x)
- uchar i,flag,j,f,icpdat;
- uchar irtemp[32]={0};
- uchar ircode[4]={0};
- void usart_init(ulong buad)
- {
- UCSR0A=0X00;
- UBRR0H=(F_CPU/(16*buad)-1)/256;
- UBRR0L=(F_CPU/(16*buad)-1)%256;
- UCSR0B=0X18;
- UCSR0C=0X06;
- }
- void usart_t(uchar dat)
- {
- while(!(UCSR0A&0X20));
- UDR0=dat;
- }
- void icp_init()
- {
- DDRD&=~(1<<6);
- PORTD&=~(1<<6);
- TCCR1A=0X00;
- TCCR1B=0X85; //开ICP 1024分频 计数一次为 1/16000000/1024=0.064ms
- TIMSK1=0X20; //开ICP中断
- TIFR1=0X00;
- SREG|=0X80;
- }
- SIGNAL(TIMER1_CAPT_vect)
- {
- TCNT1=0;
- icpdat=ICR1L; //只读ICR1L ICR1H都为0不读
- if((icpdat>205)&&(icpdat<215)) //判断引导码9+4.5=13.5MS (13.5/0.064=210)
- {
- f=1;
- j=0;
- }
- if(f)
- {
- irtemp[j-1]=icpdat;
- if(j++==33){j=0;flag=1;f=0;}
- }
- if((icpdat>172)&&(icpdat<177)) //判断重复码9+2.25=11.25MS(11.25/0.064=175)
- {
- usart_t(0xaa); //串口发送重复码标志
- }
- ICR1L=0;
- }
- void ir()
- {
- uchar i,j;
- for(i=0;i<4;i++)
- {
- for(j=0;j<8;j++)
- {
- ircode[i]>>=1;
- if(irtemp[i*8+j]>25) //“0”为1.125MS(1.125/0.064=17) "1"为 2.25MS(2.25/0.064=35) 大于25为1 小于25为0
- {
- ircode[i]|=0x80;
- }
- }
- }
- }
- int main(void)
- {
- CLKPR=0X80;
- CLKPR=0X80;
- icp_init();
- usart_init(9600);
- while(1)
- {
- if(flag)
- {
- ir();
- for(i=0;i<4;i++)
- {
- usart_t(ircode[i]);
- }
- flag=0;
- }
- delayms(1);
- }
- }
复制代码 |
|