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

📄 iremote_ir._c

📁 一个用ICCAVR7.0开发的红外线发射程序.单片机是AVR的ATtiny13V.
💻 _C
字号:
//ICC-AVR application builder : 2008-10-29 9:40:16
// Target : T13
// Crystal: 9.6000Mhz
#include <iot13v.h>
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
#define WDR() 	asm("wdr")
#define SEI()	asm("sei")
#define CLI()	asm("cli")
#define NOP()	asm("nop")
#define SBIT(val, bitn) (val|=(1<<(bitn)))//置位
#define CBIT(val, bitn) (val&=~(1<<(bitn)))//清位
#define FBIT(val, bitn) (val^=(1<<bitn))  //位取反
#define PW_ON  SBIT(PORTB,4)
#define PW_OFF CBIT(PORTB,4)
#define IR_ON  SBIT(PORTB,0)
#define IR_OFF CBIT(PORTB,0)
uchar time_10ms;
uchar User_ID[7],pw_off_ram;
//===========================================
#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
void timer0_ovf_isr(void){
 TCNT0 = 0xA3; //reload counter value
 time_10ms++;
}
uchar EEPROM_read(uchar Addr){
  while(EECR & (1<<EEWE));//等待上一次写操作结束
  EEARL = Addr;//设置地址寄存器
  EECR |= (1<<EERE);//设置EERE 以启动读操作
  return EEDR;//自数据寄存器返回数据
}
void EEPROM_write(uchar Addr,uchar ucdata){
  while(EECR & (1<<EEWE));//等待上一次写操作结束
  EEAR = Addr;//设置地址和数据寄存器
  EEDR = ucdata;  
  EECR=0b00000100;//置位EEMWE
  EECR=0b00000110;//置位EEWE 以启动写操作
//  EECR |= (1<<EEMWE);//置位EEMWE
//  EECR |= (1<<EEWE);//置位EEWE 以启动写操作  
}
void delay_500us(void){
uchar ii;
for(ii=0;ii<250;ii++){//500us/0.10417us=4799.88
 WDR();NOP();NOP();NOP();NOP();NOP();NOP();
 NOP();NOP();NOP();NOP();NOP();NOP();NOP();
 NOP();NOP();NOP();NOP();NOP();
}
}
void ir_500us(void){
uchar ii,kk;
 ii=0;
 do{
   IR_ON;   //38Khz=26.3us  占空比=1/3  9.6MHz晶振时=0.10417时钟周期指令
   for(kk=0;kk<20;kk++);
   IR_OFF;  
   for(kk=0;kk<39;kk++);
   ii++;
 }while(ii<16); 
}
void send_code(void){
uchar ii,kk,nn,mm;
for(ii=0;ii<10;ii++){
 ir_500us();//2.00ms+0.50ms开始码 
 ir_500us();
 ir_500us();
 ir_500us();
 delay_500us();
 for(mm=0;mm<7;mm++){
   kk=User_ID[mm];
   for(nn=0;nn<8;nn++){
     if(!(kk&0x80)){
	   ir_500us();//0.50ms+0.50ms逻辑低
	   delay_500us();	 
	 }
	 else{
	   ir_500us();//1.00ms+0.50ms逻辑高
	   ir_500us();
	   delay_500us();
	 }
	 kk<<=1;
   }
 } 
}
ir_500us();//0.50ms结束码
}
void main(void){
uchar temp1,temp2,temp5;
uint temp3,temp4;
ulong ID; 
 EECR=0;
 while(pw_off_ram==0xaa){
   DDRB  = 0b11010111;
   PW_OFF;WDR();
 }
 MCUSR=0;
 WDTCR=0x1f;
 WDTCR=0x0f;//WD=2Second
 OCR0A = 0x5D;
 OCR0B = 0x5D;
 TCNT0 = 0xA3; //set count
 TCCR0A = 0x00; 
 TCCR0B = 0x05; //start timer   
 TIMSK0 = 0x02;
 SEI();  
 PORTB = 0b11111000; 
 DDRB  = 0b11010111;    
 time_10ms=0;temp1=0;temp2=0;
 do{
   if(temp1!=time_10ms){
     temp1=time_10ms;
     if((PINB&0x08)==0){
	   temp2++;
	 }
   } 
 }while(time_10ms<10);  
 User_ID[0]=EEPROM_read(0x10);
 User_ID[1]=EEPROM_read(0x11);
 User_ID[2]=EEPROM_read(0x12);
 User_ID[3]=EEPROM_read(0x13);
 User_ID[4]=EEPROM_read(0x14);
 User_ID[5]=EEPROM_read(0x15); 
 EEPROM_read(0x38);
 EEPROM_read(0x39);  
 if(temp2>5){ 
   temp3=User_ID[2];
   temp3<<=8;
   temp3|=User_ID[3];
   temp4=User_ID[4];
   temp4<<=8;
   temp4|=User_ID[5];
   ID=temp3;
   ID<<=16;
   ID|=temp4; 
   time_10ms=0;temp1=0;temp2=0;temp5=0;
   do{
     WDR();
     if(temp1!=time_10ms){
       temp1=time_10ms;
	   if((PINB&0x08)==0){	     
		 time_10ms=0; 
		 temp2++;temp5=0;
		 if(temp2>150)temp2=200;
	   }
	   else{
	     temp5++;
		 if(temp5>10)break;
	   }	 
	 }
	 User_ID[2]++;
	 ID++;
   }while(time_10ms<200); 
   TCCR0B=0;
   TIMSK0=0;
   CLI();      
   if(temp2>150){  
     temp4=ID;
     temp3=ID>>16;   
     User_ID[3]=temp3;
     User_ID[2]=(temp3>>8)+User_ID[2];
     User_ID[5]=temp4;
     User_ID[4]=temp4>>8;
	 if(pw_off_ram!=0xaa){
	   EEPROM_write(0x12,User_ID[2]);
       EEPROM_write(0x13,User_ID[3]);
       EEPROM_write(0x14,User_ID[4]);
       EEPROM_write(0x15,User_ID[5]);	
	   EEPROM_write(0x38,0x55);	
	   EEPROM_write(0x39,0xaa);	  
	   temp2=0;
       for(temp1=0;temp1<6;temp1++){
         temp2+=User_ID[temp1];
       }
       User_ID[6]=temp2; 
	   send_code();
	 }
   }         
 }
 else{
   TCCR0B=0;
   TIMSK0=0;
   CLI(); 
   temp2=0;
   for(temp1=0;temp1<6;temp1++){
     temp2+=User_ID[temp1];
   }
   User_ID[6]=temp2;
   send_code();
 }  
 while(1){
   pw_off_ram=0xaa;//写入防重复RESET误写码
   PW_OFF;
 }  
}

⌨️ 快捷键说明

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