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

📄 发射.c

📁 使用MEGA8控制RF01芯片,用射频915MHz发送四路AD采样的信号
💻 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)

#pragma interrupt_handler TIM0_ovf:10

#define baud 19200
#define fosc 8000000

#define uchar	unsigned char
#define uint	unsigned int

uint n=0;
uchar ch0,ch1,ch2,ch3; //j,k,l,m;
uchar adc_mux;  //AD通道

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

/*获取AD值*/
uchar get_ad(void)
{
 uchar ad_value;
 while(!(ADCSRA & (1 << ADIF)));	//等待
  ad_value = ADCH;
  ADCSRA &= ~(1 << ADIF);	//清标志
  return ad_value;
}

/*AD变换开始*/
void start_AD(void)
{
  adc_mux=0; //AD通道0
  ADMUX = (1<<REFS0)|(1<<ADLAR)|(adc_mux&0x0f);   //取VCC为参考值,AD0模拟变量输入 
  ADCSRA|=0xC0;           //AD转换启动
  ch0=get_ad();
 
 adc_mux=1; //AD通道1
 ADMUX = (1<<REFS0)|(1<<ADLAR)|(adc_mux&0x0f);
 ADCSRA|=0xC0;           //AD转换启动
 ch1=get_ad();
 
 adc_mux=2; //AD通道2
 ADMUX = (1<<REFS0)|(1<<ADLAR)|(adc_mux&0x0f);
 ADCSRA|=0xC0;           //AD转换启动
 ch2=get_ad();
 
 adc_mux=3; //AD通道3
 ADMUX = (1<<REFS0)|(1<<ADLAR)|(adc_mux&0x0f);
 ADCSRA|=0xC0;           //AD转换启动
 ch3=get_ad();
 }

/*发射数据写入*/
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();
 }
  
/*发射数据*/
void RF02_SEND(uchar aByte)
{ 
  uchar i;
  for(i=0;i<8;i++)
  {
    while(PINB&(1<<RFXX_SDO));
    while(!(PINB&(1<<RFXX_SDO)));
    if(aByte&0x80) PORTB|=(1<<RFXX_DATA);
    else  PORTB&=~(1<<RFXX_DATA);
    aByte<<=1;
  }
}

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

/*T0初始化*/
void TIM0_init(void)
{
 _CLI();//关全局中断
 TCCR0=0x00;
 TCNT0=0xE0; //4us定时
 TCCR0|=0x01;//开定时器,无预分频
 TIMSK|=0x01;//T0中断
 SREG|=0x80;//开全局中断
}

/*T020ms中断程序*/
void TIM0_ovf(void)
{
 TCCR0=0x00;//关定时器
 TCNT0=0xE0;
 if(++n==5000)
   {
    n=0;
    RFXX_WRT_CMD(0xC039);//启动发射
    
    RF02_SEND(0xAA);//PREAMBLE
    RF02_SEND(0xAA);//PREAMBLE
    RF02_SEND(0xAA);//PREAMBLE
    RF02_SEND(0x2D);//SYNC HI BYTE
    RF02_SEND(0xD4);//SYNC LOW BYTE
	
    RF02_SEND(ch0);//DATA BYTE 0
    RF02_SEND(ch1);//DATA BYTE 1
    RF02_SEND(ch2);//DATA BYTE 2
    RF02_SEND(ch3);//DATA BYTE 3
    
    RF02_SEND(0xAA);//Dummpy byte
    
    RFXX_WRT_CMD(0xC001);
	
	Transmit(ch0);
	Transmit(ch1);
	Transmit(ch2);
	Transmit(ch3);
    
    start_AD();
   }
 TCCR0|=0x01;//开定时器
}
 
/*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; // 设置波特率寄存器高位字节
}

/*AD变换初始化*/
void adc_init(void)           
{ 
  DDRC=0x00;//PORTC INPUT
  adc_mux=0;
  ADCSRA=0x00;      //关ad
  ACSR = (1<<ACD);  //关模拟比较器
  ADCSRA|=0x06;    //预分频1
  
  ADMUX = (1<<REFS0)|(1<<ADLAR)|(adc_mux&0x0f);   //取VCC为参考值,AD0模拟变量输入 
  ADCSRA|=0xC0;           //AD转换启动
  ch0=get_ad();
}

/*系统初始化*/
void init_main(void)
{
 uart_init();
 adc_init();
 start_AD();
  
 MCUCR=0x00;
 GICR=0x00;
}

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

/*主程序*/
void main(void)
{
  init_main();
  RFXX_PORT_INIT();
  
  RFXX_WRT_CMD(0xCC00); //执行状态寄存器命令
  RFXX_WRT_CMD(0x9B61); //915频段
  RFXX_WRT_CMD(0xA7D0); //A640=434MHz
  RFXX_WRT_CMD(0xD040); //RATE/2
  RFXX_WRT_CMD(0xC823); //9.6kbps 23
  RFXX_WRT_CMD(0xC220); //使用位同步时钟
  RFXX_WRT_CMD(0xC001); //初始化完毕,关闭所有功能模块
  PORTB|=(1<<RFXX_DATA);
  DDRB|=(1<<RFXX_DATA);//将PB1置为输出
  
  TIM0_init();
  
  while(1);
 }
    
    
    
    

⌨️ 快捷键说明

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