?? transmit.c
字號:
//**********************FileName:無線數據傳輸C代碼******************************
//*************************ICCAVR6.31A編譯**************************************
//******************************************************************************
#include <iom16v.h>
#include <macros.h>
#define SETBIT(x,y) (x|=(1<<y)) //set bit y in byte x
#define CLRBIT(x,y) (x&=(~(1<<y))) //clear bit y in byte x
#define CHKBIT(x,y) ((x&(1<<y))>>y) //check bit y in byte x
#define PWR_UP PD7
#define CE PD6
#define CS PD5
#define CLK1 PD4
#define DATA PD3
#define DR1 PD2
#define set_pwr_up() SETBIT(PORTD,PWR_UP)
#define clr_pwr_up() CLRBIT(PORTD,PWR_UP)
#define set_ce() SETBIT(PORTD,CE)
#define clr_ce() CLRBIT(PORTD,CE)
#define set_cs() SETBIT(PORTD,CS)
#define clr_cs() CLRBIT(PORTD,CS)
#define set_clk1() SETBIT(PORTD,CLK1)
#define clr_clk1() CLRBIT(PORTD,CLK1)
#define set_data() SETBIT(PORTD,DATA)
#define clr_data() CLRBIT(PORTD,DATA)
#define chk_dr1() CHKBIT(PIND,DR1)
#define chk_data() CHKBIT(PIND,DATA)
//-----------------------------------------------------------------------------
//*************************全局變量定義**************************************//
//-----------------------------------------------------------------------------
volatile unsigned char cnt=0;
unsigned char pw_data[11]={0xff,0xff,0xff,0xff,0x17,0x01,0x02,0x03,0x04,0x05,0x06}; //nRF2401a發送的數據
unsigned char data_cnt=11; //發送數據的字節數
//----------------------------------------------------------------------------
//*********************************延時子函數*********************************
//----------------------------------------------------------------------------
void delay_1ms(void) //1ms延時
{
unsigned int i;
for(i=0;i<(unsigned int)(1142);i++)//晶振為8MHz,1142=143*xtal-2 xtal為晶振
;
}
void delay(unsigned int n) //整數倍ms延時
{
unsigned int i=0;
for(i=0;i<n;i++)
delay_1ms();
}
void delay_us(unsigned int i)//8.000M晶振 延時i+2.5us i=0時為1.75us
{
if(i==0)
return;
while(i--)
{
NOP();
NOP();
}
}
;
void delay_2_5us()
{
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
};
void delay_2_375us()
{
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
};
void delay_1_875us()
{
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
};
void delay_1us()
{
NOP();
}
//------------------------------------------------------------------------------
//********************************RF寄存器配置**********************************
//------------------------------------------------------------------------------
unsigned char RFConf[2]=
{
0x07, //使能第二頻道(1位) 通信方式設置(1位) 發射數據速率(1位)
// 晶振頻率 3位 發射輸出電源功率 2位
0x64 //頻道設置 7位 接受或發射操作
};
void trans(unsigned char *p,unsigned char len,signed char ii)//發送len個字節的數據
{
signed char i;
unsigned char len1;
for(len1=0;len1<len;len1++)
{
for(i=ii;i>=0;i--)
{
if(CHKBIT(p[len1],i)!=0)
set_data();
else
clr_data();
NOP();
NOP(); // Ts 延時大于500ns
set_clk1();
NOP();
NOP(); //延時大約500ns
clr_clk1();
}
}
}
//------------------------------------------------------------------------------
//******************************初始化nRF2401a配置寄存器**************************
//------------------------------------------------------------------------------
void init_conf()
{
DDRD=0XF8;
clr_ce();
set_cs();
delay_us(5);
trans(RFConf,2,7);
clr_cs();
}
void transform(unsigned char *p,unsigned char len)
{
unsigned char i,j=5;
for(i=len;i>j; i--)
p[i]^=((p[i-1]<<7)|(p[i]>>1));
p[5]^=p[5]>>1;
}
void trans2(unsigned char *p,unsigned char len)//直接方式向nfr2401a發送len個字節的數據
{
signed char i;
unsigned char len1=0;
while(len1<len)
{
PORTD^=(p[len1]&0x80)>>4; //1.5
delay_2_375us();
PORTD^=(p[len1]&0x40)>>3; // 1.625
delay_2_5us();
PORTD^=(p[len1]&0x20)>>2; //1.5
delay_2_5us();
NOP();
PORTD^=(p[len1]&0x10)>>1; //1.375
delay_2_5us();
NOP();
NOP();
PORTD^=(p[len1]&0x08); //1.25
delay_2_5us();
NOP();
PORTD^=(p[len1]&0x04)<<1;
delay_2_5us();
PORTD^=(p[len1]&0x02)<<2;
delay_2_375us();
PORTD^=(p[len1]&0x01)<<3;
delay_1_875us(); /**/
len1++;
}
NOP();
delay_1us();
clr_data();
}
void transmit()
{
clr_data();
DDRD=0XF8;
set_ce();
delay_us(189);
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
trans2(pw_data,data_cnt);
clr_ce();
}
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x85; //setup
TCNT1L = 0xEE;
TCCR1B = 0x04; //start Timer
}
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0x85; //reload counter high value
TCNT1L = 0xEE; //reload counter low value
if(cnt<200)
{
transmit();
PORTB=~PORTB;
cnt++;
}
}
//**************************I/O口初始化**************************************//
void init_IO(void)
{
PORTA = 0x00;
DDRA = 0x0f;
PORTB = 0x00;
DDRB = 0x02;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0xfa;
}
//********************************主函數*************************************//
//1、MCU完成接收PC機數據(USART中斷接收),將接收到的數據發送給nRF2401a
// nRF2401a將從MCU接收到的數據發送出去
void main(void)
{
unsigned char FrameMark;
unsigned char FrameLength;
CLI(); //關中斷
init_IO(); //IO口初始化
TIMSK = 0x04; //timer interrupt sources
timer1_init();
set_pwr_up();
delay_us(3000);//延時3m
init_conf();//初始化NRF2401a配置寄存器
SEI(); //開中斷
//transmit();
transform(pw_data,data_cnt);
while(1) //完成MCU接收PC機數據(USART),MCU發送數據至nRF2401a,nRF2401a
//將接收至MCU的數據發送出去
{
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -