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

📄 f211.#1

📁 采用无线收发模块at86rf211的一个程序开发包,单片机采用Cygnal 8051F015,希望能对您有所帮助
💻 #1
📖 第 1 页 / 共 3 页
字号:
/*
   //=========================================================================//
   //                                                                         //
   //            F O R E N T E K     P R O P R I E T A R Y                    //
   //                                                                         //
   //           COPYRIGHT (c)   2003 BY FORENTEK  CHONGQING                   //
   //                     --  ALL RIGHTS RESERVED  --                         //
   //                                                                         //
   // File Name:        ATF211.H                                              //
   // Created:          20 Nov 2003                                           //
   // AUTHOR:                                                                 //
   // Revision: 		V1.0                                                  //
   //                                                                         //
   //=========================================================================//
*/

#include <c8051f000.h>                                                        // SFR 定义
#include <atf211.h>
#include <stdio.h>
#include <INTRINS.H>

unsigned int  xdata WDT_Reset_Counts=0;                             
bit                 SCK_FLAG=0;
unsigned int  xdata nRX_INDEX=0;                                             // 接收缓冲区索引
unsigned int  xdata nTx_Index=0;                                             // 发送缓冲区索引

unsigned char xdata INPUT_BUF[nLEN_INPUT];			                         // 接收缓冲区
unsigned char xdata OUTPUT_BUF[100];                                 // 发送缓冲区

unsigned char       nFlag_RXSUCCESS=0;                                       // 接收数据完毕标志   
unsigned int  xdata nLen_Rx_Data=0;                                          // 接收数据的长度
unsigned int  xdata nLen_Tx_Data=0;                                          // 发送数据的长度

unsigned char       level_count=0;

bit                 RFLAG=0;                                                 //开始接收数据标志
bit                 SendEndflag=0;                                           //传输结束标志
unsigned int        timer0_count=0;                                          //定时器0计数
unsigned int        timer2_count=0;                                          //定时器2计数

void          port_init();
void          SYSCLK_INIT();
void          rf211_init();
void          rf211Trx_Register_Wr(unsigned char trx_addr,unsigned long trx_code,unsigned char trx_bits);
void          rf211Send_Trx_Addr(unsigned char trx_addr); 

void          rf211Send_Trx_Data(unsigned long  trx_code,unsigned char trx_bits);
void          rf211Send_Trx_High();
void          rf211Send_Trx_Low();
unsigned long rf211Read_Trx_Data(unsigned char trx_bits);
unsigned long rf211Trx_Register_Rd(unsigned char trx_addr,unsigned char trx_bits);

void          systems_init();
void          Uart_init();
void          timer2_init();
void          Make_Transmit_Mode();
void          Make_Receive_Mode();
void          Make_Wakeup_Mode();
void          Transmit_Data_Dispose(char *In_Buf,unsigned int nLen);
bit           Receive_Data_CheckProcess();
void          Receiver_data_Process();
void          Transmit_data_Process();
bit           Wait_Answer_Message();
void          Read_Wakeup_Data();
void          bit_delay();
void  		  timer0_init();
void		  wait_time_millisecond();
void          Transmit_Information_Package();
void          Transmit_Information_Process();
unsigned char Receive_Information_Package();
void          Transmit_Direct_Message(unsigned int  msg_code,unsigned char msg_bits);
void          wait_time_100us();

void main()
{ 
    unsigned int inde=0xffff;
  	WDTCN = 0xDE;						                                       //禁止看门狗定时器			
	WDTCN = 0xAD;  
    SYSCLK_INIT();
	port_init();                                                               //分配端口
    timer2_init();
	Uart_init();
    systems_init();
    while(inde--);
	inde=0xffff;
    while(inde--);
	inde=0xffff;   

    rf211_init();                                                              //配置rf211各控制寄存器
    timer0_init();

    Make_Receive_Mode();                                                       //进入接收模式
    Read_Wakeup_Data();                                                        //读wakeup数据寄存器
    Make_Wakeup_Mode();                                                        //进入唤醒模式
    //while(inde--);
    //inde=0xffff;	
    //Transmit_Data_Dispose(Tx_Data,10);
	while(1)
	{       

       // Transmit_Information_Process();

 		if(RFLAG) Receive_Information_Package();
   
        //while(inde--);
	    //inde=0xffff;

	    while(inde--);
	    inde=0xffff;
	    for(inde=0;inde<100;inde++)
	    INPUT_BUF[inde]=0;
	}
}

//-----------------------------------------------------------------------------//
//            Receiver_data_Process接收数据过程                                //
//-----------------------------------------------------------------------------//
void   Receiver_data_Process()
{
     Read_Wakeup_Data();      										    	   //读wakeup数据寄存器
     if(RFLAG)
	 {
    	 Make_Receive_Mode();                                                  //进入接收模式
         RFLAG=0;                                                              //清准备接收标志
         RI=1;                                                                 //UART接收标志
     }
     if (nFlag_RXSUCCESS==0x55)                                                 //表示接收数据正确
	 {
	     nFlag_RXSUCCESS=0;                                                    //清接收正确标志,为下一次接收数据做好准备
	  	 if (Receive_Data_CheckProcess())                                        //接收数据校验和正确,这回执正确接收数据
		    Transmit_Data_Dispose(Ok_Message,10);
		 else                                                                  //否则,返回接收数据出错的消息
		    Transmit_Data_Dispose(Fail_Message,12);

	     Make_Transmit_Mode();                                                 //进入传输模式
		 TI=1;                                                                 //UART进入数据传输  
         while(SendEndflag==0)
		 {
		    SendEndflag=0;
		 };                                                                    //等待发送数据完毕
        
		 Make_Receive_Mode();                                                  //进入接收模式
         Make_Wakeup_Mode();                                                   //进入唤醒模式
	 }
}


//-----------------------------------------------------------------------------//
//       Transmit_data_Process()传输数据过程                                   //      
//-----------------------------------------------------------------------------//
void  Transmit_data_Process()
{
    unsigned char inde=0;
	 for (inde=0;inde<3;inde++)
	 {    
		Make_Transmit_Mode();                                                 //进入传输模式 
		//Transmit_Data_Dispose(Tx_Data,65);                                  //装载指定数据
		TI=1;     
		SBUF =Tx_Data[0];                                                                      //UART进入数据传输  
        while(SendEndflag==0){SendEndflag=0;};                                //等待发送数据完毕        
        
        //Make_Receive_Mode();                                                //进入接收模式
        //if (Wait_Answer_Message()) break;                                   //应答信息为ok,退出,否者重发,连续发送3遍
	  }
	Make_Wakeup_Mode();                                                       //进入唤醒模式	
}


bit   Wait_Answer_Message()
{
    if(RFLAG)
	 {
    	 Make_Receive_Mode();                                                  //进入接收模式
         RFLAG=0;                                                              //清准备接收标志
         RI=1;                                                                 //UART接收标志
     }
     if (nFlag_RXSUCCESS==0x55)                                                //表示接收数据正确
	 {
	     nFlag_RXSUCCESS=0;                                                    //清接收正确标志,为下一次接收数据做好准备
	  	 if (Receive_Data_CheckProcess())                                      //接收数据校验和正确,这回执正确接收数据
		    Transmit_Data_Dispose(Ok_Message,10);
		 else                                                                  //否则,返回接收数据出错的消息
		    Transmit_Data_Dispose(Fail_Message,12);

	     Make_Transmit_Mode();                                                 //进入传输模式
		 TI=1;                                                                 //UART进入数据传输  
         while(SendEndflag==0){SendEndflag=0;};                                //等待发送数据完毕
      }

     if (nLen_Rx_Data>0)
	 {
	    if ((INPUT_BUF[0]='m')&&(INPUT_BUF[6]='e')&&(INPUT_BUF[9]='k'))  return(1);    //接收到message ok消息,表示从端接收信息正确         
		else if ((INPUT_BUF[0]='m')&&(INPUT_BUF[6]='e')&&(INPUT_BUF[9]='a')) return(0);//接收到message fail消息,表示从端接收信息错误
	 }
	 else return(0);
}


//------------------------------------------------------------------------------//
//				 时钟初始化例程                                                 //
//------------------------------------------------------------------------------//
void    SYSCLK_INIT()
{
	int  i=255;
   	OSCXCN = 0x67;                                     			               // 开始外部震荡器,20MHz 
	while(i--);
    	while (!(OSCXCN & 0x80));                          		               // 等待     
    	OSCICN = 0x88;                                  			           // 选择外部震荡器作为 SYSCLK 源,并使能时钟遗失检测功能
}


//-----------------------------------------------------------------------------//
//                        定时器2初始化              						   //
//-----------------------------------------------------------------------------//
void  timer2_init()
{    
                                                                               //选用16位定时器/计数器。RCLK=0,TCLK=0,CP/RL2=0,TR2=1 
	//  T2CON    |= 0x04;                                                      //定时器2允许,定时器
    //  CKCON    |= 0X20;                                                      //定时器2使用系统时钟
	      
	//  TL2       = 0X00;
    //  TH2       = 0X00;
	 
    //  RCAP2L    = 0X00; 	  
	//  RCAP2H    = 0X00;
	 
}

//----------------------------------------------------------------------------//
//                         定时器0初始化									  //
//----------------------------------------------------------------------------//
void  timer0_init()
{
      TCON   |= 0x10;                                                          //定时器0允许
      TMOD   |= 0X01;                                                          //定时器0使用方式1,即16位定时器
      CKCON  |= 0X08;                                                          //定时器0使用系统时钟
      TH0     = 0XF8;                                                          //定时100us
	  TL0     = 0X43;        
}


void  Uart_init()
{
      TMOD  |= 0X20;                                                           //设置定时器1方式2,8位重载方式
  	  CKCON |= 0X10;                                                 	       //定时器使用系统时钟作为时基		
	  PCON  |= 0x80;                                                           //电源控制寄存器,SMOD波特率加倍,为1时加倍
      SCON   = 0x50;                                                           //SCON工作于方式1,8位UART,使能RX
	  TH1    = -UART_TIME_COUNT;	      
      TL1    = -UART_TIME_COUNT;
      TR1    = 1;                                                              //启动定时器1   
}


void    systems_init()
{
     unsigned char inde=0;
	 unsigned char i=0;
	  EA=1;   													 		   	   //允许所有中断
      ES=1;                                                                    //串口中断允许
      EX0=1;                                                                   //外部中断0允许
      ET2=1;                                                                   //定时器2中断允许
	  ET0=1;                                                                   //定时器0中断允许

	  IT0=1;                                                                   //外部中断配置位边沿触发
	  timer0_count=0;
	  i = 0;
	  for(inde=0;inde<10;inde++)
      {
	 	  Tx_Data[i++]=0xAA;
		  Tx_Data[i++]=0x00;
      }
	  nLen_Tx_Data=10;
	  for(inde=0;inde<100;inde++)
	  INPUT_BUF[inde]=0;
}


//------------------------------------------------------------------------------//
// 			   	端口初始化例程                                                  //
//------------------------------------------------------------------------------//
void port_init()
{
    XBR0 = 0x04;								                               //P0.0分配为TX,P0.1分配为RX.										                                                    
    XBR1 = 0x04;                                                               //P0.2分配为INT0 
	XBR2 = 0x40; 							     	                           //交叉译码功能使能
	//PRT0CF =0xFF;								                               //SPI(SCK,MOSI,NSS) set to push-pull output mode  	   							                                                      
    PRT1CF =0XFF;                                                              //将P1口配置成为推挽输出方式
	PRT2CF =0XFF;  
}


//-----------------------------------------------------------------------------//
//               初始化rf211各控制寄存器									   //
//-----------------------------------------------------------------------------//

⌨️ 快捷键说明

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