⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irda.c

📁 IRDA c语言源码范例!用在51、AVR等都可以。
💻 C
字号:
//包含所需头文件 
#include <avr/io.h> 
#include <avr/interrupt.h> 
#include <avr/signal.h> 
#include <avr/delay.h> 

#include "chuankou.h" 

/*------宏定义------*/ 
#define uchar        unsigned char 
#define uint        unsigned int 
#define BIT(x)        (1<<(x)) 
#define NOP()        asm("nop") 
#define WDR()         asm("wdr") 

//一般说来,volatile用在如下的几个地方: 
//1、中断服务程序中修改的供其它程序检测的变量需要加volatile; 
//2、多任务环境下各任务间共享的标志应该加volatile; 
//3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义; 
volatile uint data0;           //前16个脉冲存放地址 
volatile uint data1;           //后16个脉冲存放地址 
volatile uint Flag=0;          //接收完成一帧标志位 
volatile float oldFall=0,newFall=0;  //时间的先后纪录 
volatile uint bitcnt=0;        //脉冲个数纪录 

//端口初始化 
void port_init(void) 
{ 
        PORTB = 0x01; 
        DDRB  = 0x00; 
} 

//定时T1初始化 
//系统时钟为8M内频,64分频,最大定时时长524.228MS 
void timer1_init(void) 
{ 
        TCCR1B = 0x00;//停止定时器 
        TIMSK |= 0x20;//中断允许 
        ICR1H  = 0xFF; 
        ICR1L  = 0xFF;//输入捕捉匹配值 
        TCCR1A = 0x00; 
        TCCR1B = 0x83;//启动定时器 
} 


void init_devices(void) 
{ 
        cli(); //禁止所有中断 
        MCUCR  = 0x00; 
        MCUCSR = 0x80;//禁止JTAG 
        GICR   = 0x00; 
        port_init(); 
        timer1_init(); 
        sei();//开全局中断 
} 
//主函数 
int main(void) 
{ 
        init_devices(); //端口初始化 
        uart_init();    //串口初始化  
        //在这继续添加你的代码 
        while(1) 
        { 
                if(Flag) 
            { 
              Flag=0;  //清除标志位 
                  bitcnt=0;   //计数标志位清0 
                  _delay_ms(5); 
                  put_char((uchar)((data0&0xff00)>>8));//机器码 
                  _delay_ms(5); 
                  put_char((uchar)(data0&0x00ff));//机器反码 
                  _delay_ms(5); 
                  put_char((uchar)((data1&0xff00)>>8));//用户码 
                  _delay_ms(5); 
                  put_char((uchar)(data1&0x00ff));//用户反码 
                  _delay_ms(5); 
            } 
        } 
        return 0; 
} 


//数据头的时间:Th=9+4.5=13.5ms 
//数据“0”的时间:T0=0.565+0.56=1.125ms 
//数据“1”的时间:T1=1.685+0.56=2.245ms 
//定时器T1输入捕捉中断服务程序 
//#pragma interrupt_handler timer1_capt_isr:6 
//void timer1_capt_isr(void) 
SIGNAL(SIG_INPUT_CAPTURE1) 
{ 
        //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 
        // TIFR|=BIT(ICF1);//软件写1清中断标志 
        float time=0; 
        unsigned int temp=0; 
        newFall=ICR1;         //读取当前时间 
        time=newFall-oldFall; //计算脉冲加间隔的时间 
        oldFall=newFall;      //存放上一次的时间 
        if(time<0)  time=newFall-oldFall+0xffff;  //定时周期交叉的情况 
    temp=(unsigned int)time; //取整 
        //T0的8分频,即(1.125*1000)/8 = 140.625us ;正负20宽范围判断 
        if((temp>120) && (temp<160)) // "0"信号 
        { 
            temp=0; 
        } 
        //T1的8分频为280.625us 
        else if((temp>260) && (temp<300)) //“1”信号 
        { 
            temp=1; 
        } 
        //Th的8分频为1687.5us 
        else if((temp>1660) && (temp<1700)) //header头信号 
        { 
            bitcnt=0; 
                data0=0; 
                data1=0; 
                return; //返回,等待下次开始接收 
        } 
        else //干扰信号 
        { 
            bitcnt=0; 
                data0=0; 
                data1=0; 
            return; 
        } 
        bitcnt++; 
        if(bitcnt<16) //开始接收前16位 
        { 
            data0=data0|temp; 
                data0=data0<<1; 
        } 
        else if(bitcnt==16) 
        { 
            data0=data0|temp; 
        } 
        else if(bitcnt<32) //开始接收后16位 
        { 
            data1=data1|temp; 
            data1=data1<<1; 
        } 
        else if(bitcnt==32) //接收完最后一位 
        { 
           data1=data1|temp; 
           Flag=1;       //接收完一帧,标志位置1 
        } 
} 


/*头文件中的串口通讯子程序chuankou.h*/ 
#include <avr/io.h> 

#define fosc 8000000 
#define baud 4800 

/*字符串输出函数*/  
void put_char(unsigned char c)  
{           
       while (!(UCSRA&(1<<UDRE)));  
       UDR=c;      
}  

/*字符输入函数*/          
unsigned char getchar(void)  
{  
       while(!(UCSRA& (1<<RXC)));  
       return UDR;  
}  

/*字符串输出函数*/  
void put_s(unsigned char *s)  
{ 
      while (*s)  
      {  
           put_char(*s);  
           s++;  
       }          
       // put_char(0x0a);//回车换行  
       // put_char(0x0d);  
               
} 

/*UART初始化*/          
void uart_init(void)  
{  
       UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收  
       UBRRL=(fosc/16/baud-1)%256;  
       UBRRH=(fosc/16/baud-1)/256;  
       UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位  
}  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -