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

📄 avr单片机发射.c

📁 本程序是38kHz的红外线发射接收程序。发射部分为AVR单片机
💻 C
字号:

#include <mega8.h>
#include <key.h>


#define IF_STRAT_1m  0xf82f
#define IF_500  0xfe0b
#define IF_1000  0xfc17

#define IF_38K  0x68

// #define IF_38KL  0x95  //0x68
// #define IF_38KH   0xd3  //1:1//0x68


unsigned char CapCnt;
unsigned char Data;
unsigned char  IFMode;
unsigned char  Mode38K;
unsigned char  IFTemp;
bit   DataFlag;
unsigned char  IFend = 0; 
#define  IRD_TX    PORTB.3
#define  I    PORTB.4

void InitIF(unsigned char x);
void Open38K();
void Stop38K();
void SendEnd(void);
/*//////////////////////////////////////
//    中断程序                                 
//                                     
///////////////////////////////////////

////////////*/

interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
    OCR2 = IF_38K;
}


////////////*/
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
	TCNT0=0x83;                        //1m
	++DebounceCnt;
	Time1m = 1;
}

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{ 
   if(CapCnt == 9){            
              IFend = 1;
              CapCnt = 0;
     } 
   //  DataFlag ^= 1;
   if(DataFlag == 1){
       DataFlag = 0;
       if((IFTemp>>CapCnt)&0x01)
          Data = 1;
       else
          Data = 0;
       CapCnt ++; 
       TCNT1 = IF_500;
       Stop38K();
       IRD_TX = 0;
   }
   else{
        DataFlag = 1;
        switch(Data){
            case 0: TCNT1 = IF_500;            
                     break;
            case 1: TCNT1 = IF_1000;
                    break;
             }
       Open38K(); 
  }
 
}

void InitIF(unsigned char x)
{ 
 unsigned char temp;
 TCCR1A=0x00;
 TCCR1B=0x02;
 TCNT1 = IF_STRAT_1m;
 Open38K(); 
 TIMSK |=(1<<2);
 CapCnt = 0;
 IFMode = 0; 
 DataFlag = 1;
 IFend = 0;
 temp = x&0x0f;
 temp <<= 4;
 IFTemp = x|temp;
}

void Open38K(void)
{
 TCNT2 = 0x00;
 OCR2 = IF_38K;
 TCCR2=0x19;
 TIMSK |=(1<<7);
 Mode38K = 1;
}

void Stop38K(void)
{
 TCNT2 = 0x00;
 TIMSK &= ~(1<<7);
 TCCR2 = 0x00;
} 

void 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=In Func0=In 
// State7=T State6=T State5=T State4=T State3=0 State2=0 State1=T State0=T 
PORTB=0x1e;
DDRB=0xff;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x0f;
DDRC=0x0f;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0xf0;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x03;
TCNT0=0x83;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK |= (1<<0);

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;  

}

void SendEnd(void)
{
  TCCR1B=0x00;
  TCCR2=0x00;
  TIMSK=0x00;
// TIMSK |= (1<<0);
  TIFR |=(1<<2)|(1<<0); 
  IRD_TX = 0;
}
void main(void)
{
unsigned char temp;
unsigned char i;
init();
#asm("sei")

while (1)
      {          
//        temp = PINB&0x04;
//        if( temp == 0){
//        for(i=0;i<3;i++) 
//            InitIF(0x03); 
//            while(IFend == 0);
//            SendEnd();
//        } 
//        temp = PINB&0x02;
//        if( temp == 0){
//        for(i=0;i<3;i++) 
//            InitIF(0x06); 
//            while(IFend == 0);
//            SendEnd();
//        }    
// ScanKey();
KeyCode = PollingKey();
       switch(KeyCode){ 
        case KEY_0:
        case KEY_1:
        case KEY_2:
        case KEY_3:
        case KEY_4:
        case KEY_5:
        case KEY_6:
        case KEY_7:
        case KEY_8: 
        case KEY_9:
        case KEY_10:
        case KEY_11:
        case KEY_12:
        case KEY_13:
        case KEY_14:
        case KEY_15:
                 InitIF(KeyCode); 
                 while(IFend == 0);
                 SendEnd();
                 break;
        default: 
                  break; 
       }          
      };
}

⌨️ 快捷键说明

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