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

📄 接受.c

📁 利用MEGA8控制RF02无线芯片接收RF01发送的四路数据
💻 C
字号:
#include <iom8v.h>
#include <macros.h>
#include <stdio.h>
#define DDR_IN  0
#define DDR_OUT 1
#define PORT_SEL  PORTB
#define PIN_SEL   PINB
#define DDR_SEL   DDRB

#define PORT_SDI  PORTB
#define PIN_SDI   PINB
#define DDR_SDI   DDRB

#define PORT_SCK  PORTB
#define PIN_SCK   PINB
#define DDR_SCK   DDRB

#define PORT_SDO  PORTB
#define PIN_SDO   PINB
#define DDR_SDO   DDRB

#define PB7        7
#define PB6        6
#define RFXX_SCK   5
#define RFXX_SDO   4
#define RFXX_SDI   3
#define RFXX_SEL   2
#define RFXX_DATA  1
#define PB0	   0

#define SEL_OUTPUT()   DDR_SEL|=(1<<RFXX_SEL)
#define HI_SEL()       PORT_SEL|=(1<<RFXX_SEL)	
#define LOW_SEL()      PORT_SEL&=~(1<<RFXX_SEL)

#define SDI_OUTPUT()   DDR_SDI|=(1<<RFXX_SDI)
#define HI_SDI()       PORT_SDI|=(1<<RFXX_SDI)	
#define LOW_SDI()      PORT_SDI&=~(1<<RFXX_SDI)

#define SDO_INPUT()    DDR_SDO&=~(1<<RFXX_SDO)
#define SDO_HI()       PIN_SDO&=(1<<RFXX_SDO)	
#define SCK_OUTPUT()   DDR_SCK|=(1<<RFXX_SCK)
#define HI_SCK()       PORT_SCK|=(1<<RFXX_SCK)
#define LOW_SCK()      PORT_SCK&=~(1<<RFXX_SCK)

#define baud 19200
#define fosc 8000000

#define uchar	unsigned char
#define uint	unsigned int

uchar RF_RXBUF[4];
uchar ch0,ch1,ch2,ch3; //j,k,l,m;
uint count1=0,count2=0,speed=50;


/*接受芯片端口初始化*/
void RFXX_PORT_INIT(void)
{
  HI_SEL();
  HI_SDI();
  LOW_SCK();
  SEL_OUTPUT();
  SDI_OUTPUT();
  SDO_INPUT();
  SCK_OUTPUT();
}

//接受芯片命令写入
void RFXX_WRT_CMD(uint aCmd)
{
  uchar i;
  uint temp;
  LOW_SCK();
  LOW_SEL();
  for(i=0;i<16;i++)
  {
   temp<<=1;
   if(SDO_HI())
     { temp|=0x0001; }
   LOW_SCK();
   
   if(aCmd&0x8000)  HI_SDI();
   else  LOW_SDI();
   
   HI_SCK();
   aCmd<<=1;
  }
   LOW_SCK();
   HI_SEL();
   // return(temp);
 }

/*接受数据*/
uchar RF01_RDFIFO(void)
{
  uchar i,Result;
  LOW_SCK();
  LOW_SDI();
  LOW_SEL();
  for(i=0;i<16;i++)
  {
    HI_SCK();
    HI_SCK();
    LOW_SCK();
    LOW_SCK();
   }
   Result=0;
   for(i=0;i<8;i++)
   {
     Result<<=1;
     if(SDO_HI())
     { Result|=1; }
     HI_SCK();
     HI_SCK();
     LOW_SCK();
     LOW_SCK();
    }
    HI_SEL();
    return(Result);
}

/*字符输出函数*/
void Transmit(uchar Send_Data)
{
  while (!(UCSRA & (1<<UDRE)));//判断是否发送完成
    UDR=Send_Data;//发送数据
}

/*USART初始化*/
void uart_init(void)
{
 UCSRA=0x00;
 UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
 UCSRC=(1<<URSEL)|0x06;//8bit,1stop
 UBRRL=(fosc/baud/16-1)%256;//设置波特率寄存器低位字节
 UBRRH=(fosc/baud/16-1)/256;//设置波特率寄存器高位字节
}

/*系统初始化*/
void init_main(void)
{
  uart_init();
  DDRC|=0x30;  //PORTC4,PORTC5输出高电平
  PORTC|=0x30;
  DDRB|=0x03;  //PORTB0,PORTB1输出高电平
  PORTB|=0x03;
  DDRD|=0xE0;  //d
  RFXX_PORT_INIT();

  RFXX_WRT_CMD(0x0000);
  RFXX_WRT_CMD(0x998A); //915BAND,134KHZ,998A
  RFXX_WRT_CMD(0xA7D0); //915MHZ
  RFXX_WRT_CMD(0xC847); //4.8kbps,47
  RFXX_WRT_CMD(0xC69B); //AFC setting
  RFXX_WRT_CMD(0xC42C); //Clowck recovery manuel control,Digital filter,DQD=4
  RFXX_WRT_CMD(0xC240); //output 1.66MHz
  RFXX_WRT_CMD(0xC080);
  RFXX_WRT_CMD(0xCE88); //
  RFXX_WRT_CMD(0xCE8B); //use FIFO
  RFXX_WRT_CMD(0xC081); //open RX

  DDRB|=(1<<RFXX_DATA);
  DDRD&=~(1<<2);
  
  MCUCR=0x00;
  GICR=0x00;
}

/*延时*/
void Delay_ms(uchar amS)
{
  uchar i,p;
  for(i=0;i<amS;i++)
    for(p=0;p<200;p++)
	 ;
}

/*主程序*/
void main(void)
{
  uint i,p,q,counter=0,temp;
  
  for(p=0;p<10000;p++)
    for(q=0;q<123;q++)
	  ;
 
  init_main();
    
  i=0; 
  while(1)
  { 
    while(!(PIND&(1<<2)))
      RF_RXBUF[i++]=RF01_RDFIFO();//read FIFO data
      if(i==5)  //更新数据
      {
        i=0;
        RFXX_WRT_CMD(0xCE88);//reset FIFO for next frame recognition
        RFXX_WRT_CMD(0xCE8B);

        ch0=RF_RXBUF[0];
        ch1=RF_RXBUF[1];
        ch2=RF_RXBUF[2];
        ch3=RF_RXBUF[3];
		
        Transmit(ch0);
        Transmit(ch1);
        Transmit(ch2);
        Transmit(ch3);
		
		for(p=0;p<55;p++)
		  for(q=0;q<123;q++)
		    ;
      } 
	 count1++;
	 if(count1==6)
	 {
	   PORTB^=0x01;
	   count1=0;
	   count2++;
	   if(count2==760)  //20ms
	   {
	    PORTB^=0x02;
	    count2=0;
	   }
	   if(count2<38)  //1ms
	    { 
		  PORTD|=0xE0;
	    }
	   else
	    { 
		 temp=count2/3;
		 if(temp<ch0)  PORTD|=0x20;
		 else 		   PORTD&=~0x20;
		  
		 if(temp<ch1)  PORTD|=0x40;
		 else 		   PORTD&=~0x40;
		  
		 if(temp<ch3)  PORTD|=0x80;
		 else		   PORTD&=~0x80;
		}
	   speed++;
	   if(speed>255)
	   {
	    speed=0;
		PORTC&=~0x10;
	   }
	   else if(speed<ch2) 
	    { PORTC|=0x10;}
	   else
	   {   PORTC&=~0x10; }
	 }
	 
   }//while1
  }//main
    
    
    
    

⌨️ 快捷键说明

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