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

📄 r.c

📁 用来控制无线数传电台收发信息
💻 C
字号:
#include <at89x051.h>//原例使用12M晶振,现在改为6M

#define byte unsigned char
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

sbit ZJ=P1^6;
sbit Red=P1^1;
sbit Green=P1^2;
sbit Yellow=P1^3;
sbit DOG=P1^7;
	
//定义毫秒、秒、分
uint data i,j;
uint data C_lock,time;
uint data min16=0X4B00;//0x4B00 //test for 16s
uchar data ms200=4;


//以下变量接收数据和解码用
uchar data wd;        
uchar data temp[3];

uchar data dc_p;//解码的中间变量
uchar data rx;
bit bdata Launch;
uchar data FaulseNum;
//以上变量接收数据和解码用

void wait(void)
 {for(i=0;i<0xFFFF;i++)
     //DOG=!DOG;
	 ;
 }

/*void send(char ch) //无ACC
 {
   EA=0;
   SBUF=ch; 
   while(TI==0){}
   TI=0;
   EA=1;
 }*/


void uart0_init() //using Timer1
{DOG=!DOG;
 EA=0;   //关全局中断
 ES=0;
 TMOD|=0x20;//MODE 2 
 
 TL1=0xFA;
 TH1=0xFA;//FA--9600;FC--14400

 SCON|=0x50;//MODE 1
 PCON=0x80;//SMOD=1
 
 ET1=0;
 TR1=1;    //开Timer1
 PS=1;//串口中断优先级设定为高
 IE |=0x90;//开全局中断,接收允许//ES=1;EA=1;
}

void Timer0_Initial()   //11.0592M晶振,一个机器周期是1.08507us;方式1,是16位计数,也就是最多65536;71.11ms
{ DOG=!DOG;
  EA=0; //          
  TMOD|=0x01;                   //开定时器0,方式1
  TH0=0x4C;                    //得到0.05s=50ms;得到50ms是0x4C00;46080*1.08507us
  TL0=0x00;
  ET0=1;
  PT0=0;//中断优先级设定 低
  TR0=1; //开Timer0
  EA=1;
}

void uart0_isr(void) interrupt 4 using 1
 {
  if(RI)
    {RI=0;
	 rx=SBUF;
	 DOG=!DOG;
     if((rx==0x68)&&(dc_p==0))//以下是解码 如果收到的是0x68并且第一次进(dc_p==0)
       {dc_p++;
	    wd=0;
	    //goto nop;
	   } 
     else if(dc_p==1)//第二次进来,dc_p==1
       {temp[wd]=rx;
		wd++;
		if(wd==2)//存2个数,wd++2次
          {dc_p=2;
		   if((temp[0]==0xff)&&(temp[1]==0x68)||(temp[0]==0x00)&&(temp[1]==0x68))//判断命令报头 Launch
               {dc_p=3;
			    wd=0;
			   }
		   else{wd=0;dc_p=0;FaulseNum++;}//restart 报头错误
		  }	
        }
      else if(dc_p==3)  //第三次进来,dc_p==1
	    {temp[2]=rx;
         C_lock=0;//min16 的设定清零
		 if(temp[2]==0x55) //NormalCode
			   {FaulseNum=0;
				dc_p=0;
			   }
		 else if(temp[2]==0xAA)//LaunchCode
		       {Launch=1;
                FaulseNum=0;
			    ZJ=0;
	            Green=1;
	            Red=0;
	            Yellow=1;
			    dc_p=0;
                TR0=0;//关Timer0
	            C_lock=0;
	            time=ms200;
                TR0=1;//开Timer0
                }
		 else{wd=0;dc_p=0;FaulseNum++;}//FaulseCode 报文错误
		}
	  else{wd=0;dc_p=0;}//restart
      if(FaulseNum>=3)
		{ZJ=0;
		 FaulseNum=0;
	     EA=0;	   //CPU闭锁,等待人工复位 
	     while(1)
	       {ZJ=0;
		    //DOG=!DOG;
		    Green=1;
	        Red=0;
		    Yellow=0;
		    wait();
		    Yellow=1;
		    wait();
		   }
		 }
	}//RI end
 }



void intsvr0(void) interrupt 1 using 2   /*定时器0的服务子程序*/                        
{ 
  TH0=0x4C;
  TL0=0x00;
  C_lock++;
  if(C_lock==time)
    {if(time==min16)
       {ZJ=0;
	    EA=0;	  //CPU闭锁,等待人工复位 
	    while(1)
	         {ZJ=0;
		      DOG=!DOG;
		      Green=1;
	          Red=0;
		      Yellow=0;
		      }
	    }
	  else if(time==ms200)
	    {Launch=0;
		 C_lock=0;
		 time=min16;
		 ZJ=1;
		 ZJ=1;
		}
	  else{}
	}
   DOG=!DOG;
}
 
main(void)
{DOG=!DOG;
 ZJ=1;
 Green=1;
 Red=0;
 Yellow=0;
 time=min16;
 uart0_init();
 Timer0_Initial();
 while(1)
 {if(Launch==0)
   {Red=1;
    Yellow=1;
	Green=0;
	wait();
	Green=1;
    wait();
   }
 }
}


	     

⌨️ 快捷键说明

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