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

📄 c_main.c

📁 433.92m无线模块的接收到有效数据后
💻 C
字号:
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
#include <Reg935.h>
#include <intrins.h>
#include <cewen.h>
#include <UART2.H>
#include <W_R_E2RAM.h>
////////////////////////////////////////////////////
unsigned char sendRQ=0;
unsigned char ch=0;
char text[]="response at 9600 baud";
////////////////////////////////////////////////////
//////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------------------
//delayms: 在使用内部RC震荡器时延时毫秒子程序
//入口参数: i 延时MS数
//出口参数: (无)
//---------------------------------------------------------------------------------------
void delayms(int i)
{
  unsigned int k;
  while(i>0)
       {
        for(k=0;k<670;k++);
           i--;
       }
}
//---------------------------------------------------------------------------------------
//InitTimer: 初始化系统定时器
//---------------------------------------------------------------------------------------
void InitTimer(void)
{
  AUXR1=0x10; //ENT0=1,允许T0溢出触发输出
  TMOD = 0x12; //TIMER0工作在MODE6,TIMER1工作在MODE1
  TAMOD = 0x01;
  //TH0=0x80; //赋初值
  TR0=0; //启动定时器0
  ET1=1;
  EA=1;
}
/////////////////////////////////////////////////////////////////////////////////////////
void Init_Serial(void)
{ 			
	 SSTAT=0x60;				       // separate Rx / Tx interrupts
	 PCON&=0x3f;                       /*UART 设置工作方式3,11 位数据*/
	 if(WorkMode==0x01) SCON=0x50; 
     else               SCON=0xd0;     // select BRG as UART Baud Rate Gen
     BRGCON=0x00;                      /*装入波特率常数,0--1200bps   1--2400bps  2--4800bps*/
     if(botelv==1)     BRGR1_DATA=0x17;
     else if(botelv==2)BRGR1_DATA=0x0b;
     else if(botelv==3)BRGR1_DATA=0x05;
     else if(botelv==4)BRGR1_DATA=0x02;
     BRGR0_DATA=0xf0;
//////////////////////////////////////////////////////////////////////
     BRGR1=BRGR1_DATA;
     BRGR0=BRGR0_DATA;
     BRGCON=0x03;                      //enable BRG
     EST=0;
	 ESR=1;
	 ES = 1;	
     EA=1;
}
////////////////////////////////////////////////////////////////////////////////////////
void UART_ISR(void) interrupt 4
{
	RI = 0;						// clear receive interrupt flag
	TI = 0;
	ser_dat[ch]=SBUF;				    // copy input bufffer to ch
	ch++;
    if(sendRQ==0)   sendRQ=1;		            // set flag for polling in main loop     
}
////////////////////////////////////////////////////////////////////////////////////////
/********************************************************************
串口发送一个字节
功能:发送一个字节数据
入口参数:发送数据
出口参数:无
********************************************************************/
void Send_Data(uchar Serial_data)
{
  ACC=Serial_data;
  TB8=P;TI=0;
  SBUF=Serial_data;
  while(!TI);
  TI=0;        /*发送一个字节,并进行偶校验*/
}
////////////////////////////////////////////////////////////////////////////////////////
/*void sendtoPC(char* dat)
{
	int j=0;
	if(WorkMode==1)
      {while(dat[j])				// send string
	     {
		 TI=0;					// clear transmit interrupt flag
	  	 SBUF=dat[j];			// start sending one byte
		 while (!TI);			// wait until sent
		 j++;
  	    }
      }
    else 
     { while(dat[j])				// send string
       {Send_Data(dat[j]); j++;}
	   
    }

}*/
////////////////////////////////////////////////////////////////////////////////////////
void sendtoPCa(void)
{	int j=0;
	if(WorkMode==1)
      {while(ch--)				// send string
	     {
		 TI=0;					// clear transmit interrupt flag
	  	 SBUF=ser_dat[j];			// start sending one byte
		 while (!TI);			// wait until sent
		 j++;
  	    }
      }
    else 
     { while(ch--)				// send string
       {Send_Data(ser_dat[j]);j++; }
	   
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
//初始化CPU——IO口
////////////////////////////////////////////////////////////////////////////////////////
void Init_cpuio(void)
{  P0M1=0x5e; //01011110		//P0.4~p0.1设置为仅为输入状态AD_io//
   P0M2=0x80; //10000000        //p0.0-key1,p.05-key2//p0.6-RX,p0.7-TX 无线接收发射//
   /////////////////////////////////////////////////////////////////////////////////////
   P1M1=0x3e; //00111111		//P10-RXD,P11-TXD
   P1M2=0xff; //11111111        //P16-LED_RED,LED-GREE
   /////////////////////////////////////////////////////////////////////////////////////
   P2M1=0x6c; //01101100		//RFC-P20,SD3-P21,
   P2M2=0xff; //11111111        //SD2-P26,SD1-P27
   /////////////////////////////////////////////////////////////////////////////////////
   KF=1;
   RFC=1;                       //无线接收状态控制位0为发送,1为接收状态
   uart2txd=0;                  //无线发射端
   CTRL485=1;                   //1为接收;0为发送485接收状态
   LED_red=1;                   //
   LED_green=1;                 // 
   ES = 1;	
   EA=1;
}
////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------------------------
//功能:RTC初始化
//--------------------------------------------------------------------------------------
void RTC_Init()
 {
  Time_S=0;
  Time_M=0;                     //Time_M,Time_S初始化为0
  IEN0|=0xC0; //使能RTC中断,使能EA中断
  WDCON=0xE0; //关闭看门狗中断
  RTCH=0xE0;
  RTCL=0xFF;  //7.3728MHz下,1s中断1次时,RTC的定时值
  RTCCON=0x63; //开启RTC模块
 }
/*------------------------------------------------------------------------------------*/
//-------------------------------------------------------------------------------------
//功能:模拟时钟变化,
//Time_S为秒,Time_M为分
//--------------------------------------------------------------------------------------
void Inc_time()
{
  Time_S++;
  if(Time_S>59)
  {
   Time_S=0;
   Time_M++;
   if(Time_M>59)
     {
      Time_M=0;
      Time_x++;
      if(Time_x>23) Time_x=0;
      }
   }
}
/////////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
//功能:RTC中断服务程序
//-----------------------------------------------------------------------------
 void RTC_ISR() interrupt 10
 {
   EA=0;
   RTCCON&=0x63; //清除RTC中断标志位
   Inc_time();
   EA=1;
}
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
uchar Int_System(void)
{ uchar count,num=0,i;
  uchar idata work_dat[16]={0}; 
  Read_Datato_E2RAM(16,0,work_dat);
  if(work_dat[0]==0x36)
    {
     count=work_dat[1];
     for(i=0;i<count+1;i++)
         {
            num+=work_dat[1+i];
          }
     if(num==0) 
        { WorkMode=work_dat[3];
          //Load_x=work_dat[6];
          //Load_M=work_dat[7];
          //Load_S=work_dat[8];
          botelv=work_dat[8];
          Readnum=work_dat[13];    
                return(0x01);}        
     else       return(0x00);
    }
  else  return(0x00);
}
//////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
void Wait_Code1(void)
{
  uchar idata work_dat[16]={0}; 
  uchar i1,ki1,j1;
  LED_red=1;                   
  LED_green=0;
   KF=0;
   RFC=0;                       //无线接收状态控制位0为发送,1为接收状态
   uart2txd=0;                  //无线发射端
   delayms(100);
   KF=1;
   RFC=1;
  while(1){
         	 while(1){
                     if(uart2read()==0x55)ki1++;
		             else ki1=0;
		             if(ki1>5)break;
		            }
		     while(1){if(uart2read()==0x36)
		                 {work_dat[0]=0x36;break;}
		              }
		     ki1=uart2read();
		     work_dat[1]=ki1;
	         for(i1=0;i1<ki1;i1++)work_dat[i1+2]=uart2read();
              j1=0;  
              for(i1=1;i1<ki1+2;i1++)j1+=work_dat[i1];
              if(j1==0)
                {Write_Datato_E2RAM(16,0,work_dat);
                 botelv=work_dat[8];
                 for(i1=0;i1<botelv;i1++)
                    {
                     LED_red=!LED_red;
                     delayms(600);
                     LED_red=!LED_red;
                     delayms(600);
                     }
                  WorkMode=work_dat[3];
                   for(i1=0;i1<work_dat[3];i1++)
                    {
                     LED_green=!LED_green;
                     delayms(600);
                     LED_green=!LED_green;
                     delayms(600);
                     }
                  break;
                }
              
            }     
}
/////////////////////////////////////////////////////////////////////////////////////////
uchar Wait_Code2(void)
{
  uchar idata work_dat[16]={0}; 
  uchar ki1;
  Time_S=0;
      while(Time_S<3){
              if(uart2read()==0x55)ki1++;
		      else ki1=0;
		      if(ki1>5)break;
		      }
	   while(Time_S<4){
		        if(uart2read()==0xff)break;
		        }
	   while(Time_S<5){
		        if(uart2read()==0x35)
		           {
		            work_dat[0]=0x35;break;
		            }
		       }
      ki1=uart2read();
      if(ki1==1)return(0x01);
      else      return(0x00);
                 
}
////////////////////////////////////////////////////////////////////////////////////////
void SendDatatowless_a()
{uchar i_3,i;
     for(i_3=0;i_3<3;i_3++)
      {
       LED_red=!LED_red;
       delayms(600);
       LED_red=!LED_red;
       uart2txd=0; RFC=0;
       delayms(10);
       for(i=0;i<10;i++)uart2send(0x55);
       for(i=0;i<2;i++)uart2send(0x00);
       uart2send(0x06);uart2send(ch);
       for(i=0;i<ch;i++){uart2send(ser_dat[i]);} 
       delayms(2); 
       uart2txd=0; RFC=1;
       delayms(15); 
      // if(Wait_Code2()==1)break; 
      }                     
}

/////////////////////////////////////////////////////////////////////////////////////////
void SendDatatowless_b()
{
  Time_S=0;Time_M=0;
  while(Time_S>1);
  LED_green=!LED_green;
  delayms(300);
  LED_green=!LED_green;
  SendDatatowless_a();
 // sendtoPCa();
  delayms(10);
  uart2txd=0; RFC=1;
  sendRQ=0;ch=0;			    // reset send request flag
}
/////////////////////////////////////////////////////////////////////////////////////////
void Taking_overDataWelss(void)
{
 uchar i; 
// uchar xdata MTR_dat[60]={0}; 
 while(uart2read()!=0x06);
 ch=uart2read();
 for(i=0;i<ch;i++)ser_dat[i]=uart2read(); 
 LED_green=!LED_green;
 delayms(300);
 LED_green=!LED_green;
 sendtoPCa();
 delayms(10);
 uart2txd=0; RFC=1;
 sendRQ=0;ch=0;   
}
/////////////////////////////////////////////////////////////////////////////////////////
/*-------------------------------------------------------------------------------------*/
// main
/*-------------------------------------------------------------------------------------*/
main()
{  uchar ki1,ip=50;
  // uchar data MRD[2]={0};
  // uchar data MRD_T[3]={0};
   //uchar data MRD1[2]={0};
  // uchar data MRD1_T[3]={0};
   Init_cpuio();
   InitTimer();
   Init_Serial();
   RTC_Init();
   while(1){
            if(Int_System()==0x00)Wait_Code1();
            else {
                   Init_Serial();
                   LED_red=0;                   
                   LED_green=1;
                   uart2txd=0; RFC=1;
                   CTRL485=1;RI=0;
                   while(1)
                         { 
                           if(key1==0){Write_Datato_00E2RAM (16,0 );break;}
                           if (sendRQ)SendDatatowless_b();					// wait for command 'S'
                            while(--ip){
                                        if(uart2read()==0x55)ki1++;
		                                else ki1=0;
		                                if(ki1>5)break;
		                                }
		                   ip=50;
		                   if(ki1>5)Taking_overDataWelss();
                          }
                  }
             }
}
                       
                       

⌨️ 快捷键说明

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