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

📄 2260.c

📁 实现无线控制功能
💻 C
字号:
//ICC-AVR application builder : 2008-6-24 22:38:41
// Target : M32
// Crystal: 4.0000Mhz

#include <iom32v.h>
#include <macros.h>
#define uchar  unsigned char
#define uint   unsigned int
#define ulong  unsigned long
//==============================================================================
//口线定义

#define wuxian_js    PA3  //无线接收
#define bjkz         PC1  //报警
#define zhuangtai_d  PC7  //LED
#define power_led    PC6  
//==============================================================================
//EEPROM地址安排  
#define mima            0                 //密码
#define bianma1         mima+20           //无线遥控编码1
#define bianma2         bianma1+20        //无线遥控编码2
#define chetai          bianma2+20         //无线遥控编码3

//==============================================================================
uchar dingshi=0;//
uchar zhishi_ys=0;//指示灯延时

uchar baojing_bz=0;//有报警事件标志
uchar shefang_b=0;//设撤防标志
uchar chengxu_s=0;
uint  yaokong_s1=0,yaokong_s2=0;//遥控解码时间
uchar yaokong_hc[12];
uchar yaokong_hc1[12];
uchar deng_b=0;
uchar chishu=0,shijian=0;




//==============================================================================
void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0x00;
 
}
//Watchdog initialize
// prescale: 1024K
void watchdog_init(void)
{
 WDR(); //this prevents a timout on enabling
 WDTCR = 0x0E; //WATCHDOG ENABLED - dont forget to issue WDRs
}

//==============================================================================
void eeprom_writ(uchar dz,uchar sj) //写EEPROM  
{
     CLI(); //清总中断
	 while(EECR & (1<<EEWE)){;}
	 EEARH=0x00;
	 EEARL=dz;
	 EEDR=sj;
	 EECR |= (1<<EEMWE);
	 EECR |= (1<<EEWE);
     SEI();
}
//==============================================================================
uchar eeprom_read(uchar dz)     //读EEPROM
{
    CLI(); //清总中断
	while(EECR & (1<<EEWE)){;}
	EEARH=0x00;
	EEARL=dz;
	EECR |= (1<<EERE);
	SEI();
	return(EEDR); 
}



//TIMER2 initialize - prescale:8
// desired value: 100uSec
// actual value: 100.000uSec (0.0%)
void timer2_init(void)
{
 TCCR2 = 0x00; //stop
 ASSR  = 0x00; //set async mode
 TCNT2 = 0xCE; //setup
 OCR2  = 0x32;
 TCCR2 = 0x02; //start
}

#pragma interrupt_handler timer2_ovf_isr:10
void timer2_ovf_isr(void)
{
    TCNT2 = 0xCE; //reload counter value
	if(yaokong_s1<65535){++yaokong_s1;}
	if(yaokong_s2<65535){++yaokong_s2;}
}
//==============================================================================

//TIMER1 initialize - prescale:1024
// desired value: 100mSec
// actual value: 99.840mSec (0.2%)
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0xFE; //setup
 TCNT1L = 0x7A;
 OCR1AH = 0x01;
 OCR1AL = 0x86;
 OCR1BH = 0x01;
 OCR1BL = 0x86;
 ICR1H  = 0x01;
 ICR1L  = 0x86;
 TCCR1A = 0x00;
 TCCR1B = 0x05; //start 
}

#pragma interrupt_handler timer1_ovf_isr:14
void timer1_ovf_isr(void)
{
 //TIMER1 has overflowed
 TCNT1H = 0xFE; //reload counter high value
 TCNT1L = 0x7A; //reload counter low value
	++dingshi;
	if(zhishi_ys!=0){--zhishi_ys;}

	if(dingshi>9)
	{//秒
	   dingshi=0;
	   if(chengxu_s!=0){--chengxu_s;}//程序中死等时间
	}
}
//**********************************************
//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();
 timer2_init();
 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x44; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

//***************************************************
void dengshan(uchar chishu)
{
    uchar i,deng_b;
	zhishi_ys=3;
    for(i=0;i<chishu;++i)
    {
        if(zhishi_ys==0)
        {
          if(deng_b==0){PORTC&=~(1<<zhuangtai_d);zhishi_ys=3;deng_b=1;}
          else if(deng_b==1){PORTC|=(1<<zhuangtai_d);zhishi_ys=3;deng_b=0;}
        }
    }
}
//******************************************************
void kuaishan(void)
{
	   uchar i,deng=10;
	   DDRC|=(1<<zhuangtai_d);PORTC&=~(1<<zhuangtai_d);
	   for(i=0;i<9;++i)
	   {
	      if(PINC&(1<<zhuangtai_d)){PORTC&=~(1<<zhuangtai_d);zhishi_ys=--deng;}
		  else{PORTC|=(1<<zhuangtai_d);zhishi_ys=--deng;}
		  //while(1){WDR();
		  if(zhishi_ys==0){break;}//}
	   }
	   for(i=0;i<100;++i)
	   {
	      if(PINC&(1<<zhuangtai_d)){PORTC&=~(1<<zhuangtai_d);yaokong_s1=0;}
		  else{PORTC|=(1<<zhuangtai_d);yaokong_s1=0;}
		  //while(1){WDR();if(yaokong_s1>500){break;}}
	   }
	   PORTC|=(1<<zhuangtai_d);
}

//*********************************************
uchar yaokongjieshou(void)//遥控解码接收
{
    uchar wei1,wei2,i,j,k=0,hc,deng_b;
	DDRA&=~(1<<wuxian_js);PORTA|=(1<<wuxian_js);
	yaokong_s2=0;deng_b=0;
    while(1)
    {
        if(yaokong_s2>250){return(0xff);}
		hc=PINA&(1<<wuxian_js);WDR();
		if(deng_b==1){break;}
     	while(hc==0)
		{
    		yaokong_s1=0;WDR();if(yaokong_s2>250){return(0xff);}
			while(1)
			{
    			hc=PINA&(1<<wuxian_js);WDR();if(yaokong_s2>250){return(0xff);}
             	if(hc!=0)
             	{
            		if(yaokong_s1>78&&yaokong_s1<84)
					{
    					deng_b=1;break;
					}
                	else{deng_b=0;break;}
                }
			}
			break;
		}
		if(deng_b==1){break;}
    }

	for(i=0;i<12;++i)
	{
    	k=0;
		for(j=0;j<2;++j)
		{
    		yaokong_s1=0;
			while(1)
			{
    			hc=PINA&(1<<wuxian_js);WDR();
				if(hc==0){break;}
    			if(yaokong_s1>200)
    			{
        			return(0xff);
    			}
			}
        	if(k==0){if(yaokong_s1>1&&yaokong_s1<5){wei1=0;}else{wei1=1;}k=1;}
			else{if(yaokong_s1>1&&yaokong_s1<5){wei2=0;}else{wei2=1;}}
			yaokong_s1=0;
			while(1)
			{
    			WDR();
				hc=PINA&(1<<wuxian_js);
				if(hc!=0){break;}
				if(yaokong_s1>200)
    			{
        			return(0xff);
    			}
			}
		}
		if(wei1==0&&wei2==0){yaokong_hc[i]=0;}
		else if(wei1==1&&wei2==1){yaokong_hc[i]=1;}
		else if(wei1==0&&wei2==1){yaokong_hc[i]=2;}
		else if(wei1==1&&wei2==0){yaokong_hc[i]=3;}
	}
	return(1);
}
//*****************************************************
void yaokongcaxun(void)//遥控接收
{
    uchar chishu=0,hc,i,deng_b,jiao,men;
	DDRC&=~(1<<bjkz);PORTC|=(1<<bjkz);
	if(shefang_b==0)
	{//记忆遥控编码
	   jiao=PINC&(1<<bjkz);
	   
	   if(jiao==0)
	   {
	       chengxu_s=15;
		   kuaishan();
		   chishu=6;
		   chengxu_s=10;deng_b=0;
		   while(chishu>5)
		   {
    		   
			   while(1)
    		   {
    		       deng_b=yaokongjieshou();
				   if(chengxu_s==0){dengshan(10);return;}
				   WDR();
				   if(deng_b==1){break;}
    		   }
			   for(i=0;i<15;++i){yaokong_hc1[i]=yaokong_hc[i];}
			   while(1)
    		   {
    		       deng_b=yaokongjieshou();
				   if(chengxu_s==0){dengshan(10);return;}
				   WDR();
				   if(deng_b==1){break;}
    		   }
			   for(i=0;i<10;++i){if(yaokong_hc1[i]!=yaokong_hc[i]){break;}}
			   if(i==10){deng_b=1;break;}
		   }
		   if(deng_b==1)
		   {
		       //保存编号eeprom_writ(uchar dz,uchar sj)
			   for(i=0;i<10;++i)
    		   {
   				    eeprom_writ((bianma1+i),yaokong_hc[i]);WDR();
   			   }
   			   kuaishan();
			   chengxu_s=10;deng_b=0;
    		   while(chishu>5)
    		   {
        		   while(1)
        		   {
        		       deng_b=yaokongjieshou();
    				   if(chengxu_s==0){dengshan(10);return;}
    				   WDR();
    				   if(deng_b==1){break;}
        		   }
    			   for(i=0;i<15;++i){yaokong_hc1[i]=yaokong_hc[i];}
    			   while(1)
        		   {
        		       deng_b=yaokongjieshou();
    				   if(chengxu_s==0){dengshan(10);return;}
    				   WDR();
    				   if(deng_b==1){break;}
        		   }
    			   for(i=0;i<10;++i){if(yaokong_hc1[i]!=yaokong_hc[i]){break;}}
    			   if(i==10){deng_b=1;break;}
    		   }
    		   if(deng_b==1)
    		   {
    			   for(i=0;i<10;++i)
        		   {
       				    eeprom_writ((bianma2+i),yaokong_hc[i]);WDR();
       			   }
       			   PORTC|=(1<<zhuangtai_d);
				   zhishi_ys=10;
				   while(1){WDR();if(zhishi_ys==0){break;}}
				   PORTC&=~(1<<zhuangtai_d);
				   
				   if(deng_b<600){deng_b=0;}else{deng_b=1;}
				   eeprom_writ(chetai,deng_b);
			   }
			   return;
		   }
		  // else{return;}
	   }
	}  
	
    	deng_b=yaokongjieshou();
		if(deng_b==1)
		{
		   deng_b=1;
		   for(i=0;i<8;++i)
		   {if(eeprom_read(bianma1+i)!=yaokong_hc[i]){deng_b=0;break;}}
		   if(deng_b==0)
		   {
    		   deng_b=1;
    		   for(i=0;i<8;++i)
    		   {if(eeprom_read(bianma2+i)!=yaokong_hc[i]){deng_b=0;break;}}
		   }
		}                                          
    	if(deng_b==1)
    	{
    	   
			if(yaokong_hc[8]==1)//设防
			{PORTC|=(1<<zhuangtai_d);}
			
			else if(yaokong_hc[11]==1)//撤防
			{PORTC&=~(1<<zhuangtai_d);}
			
			
    		else if(yaokong_hc[9]==1)//打开电锁
    		{
			   PORTC|=(1<<zhuangtai_d);
    		}
    		else if(yaokong_hc[10]==1)//讯车
    		{
    		   PORTC&=~(1<<zhuangtai_d);
    		}
    		
	}
}

//==============================================================================
void main(void)
{

	init_devices();
    DDRC|=(1<<power_led);PORTC&=~(1<<power_led);
	//DDRC|=(1<<zhuangtai_d);PORTC&=~(1<<zhuangtai_d);
	PORTC|=(1<<bjkz);DDRC&=~(1<<bjkz);
	
    while(1)
	{
	   
	  // kuaishan();
	   zhishi_ys=3;
	   while(1)
	   {
	      WDR();
         yaokongjieshou();
		 // yaokongcaxun();//遥控接收

	   }
	}
}
//==============================================================================

⌨️ 快捷键说明

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