📄 发射._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();
// return(temp);
}
/*发射数据*/
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 + -