📄 main._c
字号:
//ICC-AVR application builder : 2009-2-18 11:55:58
// Target : M16
// Crystal: 8.0000Mhz
#include <iom16v.h>
#include <macros.h>
#define mclk 8000000
//=============================================================
// 函数名: void port_init(void)
// 功能: 端口初始化,所有端口都变为高阻态
// 参数: none
// 返回值: none
// 使用方法:port_init();
//=============================================================
void port_init(void)
{
DDRA = 0x00;
PORTA = 0x00;
DDRB = 0x00;
PORTB = 0x00;
DDRC = 0x00;
PORTC = 0x00;
DDRD = 0x00;
PORTD = 0x00;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//=============================================================
// 函数名: void motor_a(unsigned char fx,int speed)
// 功能: 控制电机A的旋转方向以及转速
// 参数: unsigned char fx,int speed fx为0或者1,speed为0-1023
// 返回值: none
// 使用方法:motor_a(0,1000);
//=============================================================
void motor_a(unsigned char fx,int speed)
{
if(fx)
{
PORTB |= BIT(2);
PORTB &= ~BIT(0);
}
else
{
PORTB |= BIT(0);
PORTB &= ~BIT(2);
}
OCR1A = speed;
}
//=============================================================
// 函数名: void motor_b(unsigned char fx,int speed)
// 功能: 控制电机A的旋转方向以及转速
// 参数: unsigned char fx,int speed fx为0或者1,speed为0-1023
// 返回值: none
// 使用方法:motor_b(0,1000);
//=============================================================
void motor_b(unsigned char fx,int speed)
{
if(fx)
{
PORTB |= BIT(4);
PORTB &= ~BIT(1);
}
else
{
PORTB |= BIT(1);
PORTB &= ~BIT(4);
}
OCR1B = speed;
}
//=============================================================
// 函数名: void motor_init(void)
// 功能: 电机控制初始化
// 参数: none
// 返回值: none
// 使用方法:motor_init();
//=============================================================
void motor_init(void)
{
DDRB |= 0x17;
PORTB &= ~0x03;
PORTB |= 0x14;
DDRD |= 0x30;
PORTD |= 0x30;
TCCR1A = 0xA3;
TCCR1B = 0x0A;
OCR1A = 0;
OCR1B = 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//=============================================================
// 函数名:void uart_init(unsigned int baud)
// 功能: 异步串行通信初始化
// 参数: unsigned int baud 设置通信波特率
// 返回值: none
// 使用方法:uart_init(19200);
//=============================================================
void uart_init(unsigned int baud)
{
UCSRB=0x00;
UCSRA=0x00; //控制寄存器清零
UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0); //选择UCSRC,异步模式,禁止校验,1位停止位,8位数据位
baud=mclk/16/baud-1 ; //波特率最大为65K
UBRRL=baud;
UBRRH=baud>>8; //设置波特率
UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE); //接收、发送使能,接收中断使能
DDRD|=0X02; //配置TX为输出(很重要)
}
//=============================================================
// 函数名:void uart_sendB(unsigned char data)
// 功能: 串口发送一个字节
// 参数: unsigned char data 写入要发送的数据
// 返回值: none
// 使用方法:uart_sendB('a');
//=============================================================
void uart_sendB(unsigned char data)
{
while(!(UCSRA&(BIT(UDRE)))) ;
UDR=data;
while(!(UCSRA&(BIT(TXC))));
UCSRA|=BIT(TXC);
}
//=============================================================
// 函数名:void uart_send(int data)
// 功能: 串口发送一个4位10进制数
// 参数: int data 写入要发送的数据
// 返回值: none
// 使用方法:uart_sendB(1234);
//=============================================================
void uart_send(int data)
{
unsigned char d[4];
d[3]=data/1000;
data=data%1000;
d[2]=data/100;
data=data%100;
d[1]=data/10;
d[0]=data%10;
uart_sendB(d[3]+'0');
uart_sendB(d[2]+'0');
uart_sendB(d[1]+'0');
uart_sendB(d[0]+'0');
uart_sendB(';');
}
//=============================================================
// 函数名:void uart_senddata(unsigned char *data)
// 功能: 通过串口发送字符串
// 参数: unsigned char *data 指针指向要发送的字符串
// 返回值: none
// 使用方法:uart_senddata(abc);
//=============================================================
void uart_senddata(unsigned char *data)
{
unsigned char *ptr;
ptr = data;
while(*ptr)
{
uart_sendB(*ptr);
ptr++;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//=============================================================
// 函数名:void adc_init(void)
// 功能: Adc0 初始化 内部2.56v比较电压
// 参数: none
// 返回值: none
// 使用方法:adc_init();
//=============================================================
void adc_init(void)
{
DDRA&=~BIT(PA0);
PORTA&=~BIT(PA0);
ADMUX=0xc0;
ADCSRA=0X80;
}
//=============================================================
// 函数名:unsigned int mega16_ad(void)
// 功能: 读取一次ADC0的值
// 参数: none
// 返回值: addata
// 使用方法:add = mega16_ad();
//=============================================================
unsigned int mega16_ad(void)
{
unsigned int addata;
ADCSRA|=BIT(ADSC);
while(!(ADCSRA&(BIT(ADIF))));
addata=ADCL;
addata=addata+ADCH*256;
return addata;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
#define BYTE_BIT0 0x01
#define BYTE_BIT1 0x02
#define BYTE_BIT2 0x04
#define BYTE_BIT3 0x08
#define BYTE_BIT4 0x10
#define BYTE_BIT5 0x20
#define BYTE_BIT6 0x40
#define BYTE_BIT7 0x80
//<nRF2401_Pins 对应引脚>
/*sbit PWR_UP = P1^6;
sbit CE = P1^2;
//sbit DR2 = P3^5; //暂时没有用到
//sbit CLK2 = P3^4;
//sbit OUT2 = P3^3;
sbit CS = P1^1;
sbit DR1 = P1^0;
sbit CLK1 = P3^7;
sbit DATA = P3^3;
sbit LED0 = P3^4;
sbit LED1 = P3^5;
sbit KEY0 = P3^0;
sbit KEY1 = P3^1;
*/
#define NRF_PORT PORTC
#define NRF_DDR DDRC
#define NRF_PIN PINC
#define PWR_UP PC0
#define CE PC1
#define CS PC4
#define DR1 PC2
#define CLK1 PC3
#define DATA PC5
#define PWR_UP_STATE (NRF_PIN&(1<<PWR_UP))==(1<<PWR_UP)
#define CE_STATE (NRF_PIN&(1<<CE))==(1<<CE)
#define CS_STATE (NRF_PIN&(1<<CS))==(1<<CS)
#define DR1_STATE (NRF_PIN&(1<<DR1))==(1<<DR1)
#define CLK1_STATE (NRF_PIN&(1<<CLK1))==(1<<CLK1)
#define DATA_STATE (NRF_PIN&(1<<DATA))==(1<<DATA)
#define PWR_UP_SET() {NRF_PORT|=1<<PWR_UP;}
#define PWR_UP_CLR() {NRF_PORT&=~(1<<PWR_UP);}
#define CE_SET() {NRF_PORT|=1<<CE;}
#define CE_CLR() {NRF_PORT&=~(1<<CE);}
#define CS_SET() {NRF_PORT|=1<<CS;}
#define CS_CLR() {NRF_PORT&=~(1<<CS);}
#define DR1_SET() {NRF_PORT|=1<<DR1;}
#define DR1_CLR() {NRF_PORT&=~(1<<DR1);}
#define CLK1_SET() {NRF_PORT|=1<<CLK1;}
#define CLK1_CLR() {NRF_PORT&=~(1<<CLK1);}
#define DATA_SET() {NRF_PORT|=1<<DATA;}
#define DATA_CLR() {NRF_PORT&=~(1<<DATA);}
/*
#define LED0_SET() {PORTC|=1<<PC0;DDRC|=1<<PC0;}
#define LED0_CLR() {PORTC&=~(1<<PC0);}
#define LED1_SET() {PORTC|=1<<PC1;DDRC|=1<<PC1;}
#define LED1_CLR() {PORTC&=~(1<<PC1);}
#define KEY0 (PINB&(1<<PB0))
#define KEY1 (PINB&(1<<PB1))
#define KEY_INIT() {PORTB|=((1<<PB0)|(1<<PB1));DDRB&=~((1<<PB0)|(1<<PB1));}
/*
*************************************************************
* nRF2401 Configuration *
* 保存2401 的配置信息 *
*************************************************************
*/
/*=====<RF-Configuration-Register 配置信息>=====*/
//芯片测试用,无需修改
#define TEST_2 0x8E //MSB D143~D136
#define TEST_1 0x08 // D135~D128
#define TEST_0 0x1C // D127~D120
/* 注意: DATAx_W + ADDRx_W + CRC 的值必须小于256 !
单个数据包的大小必须小于32 字节(256 位) */
#define DATA2_W 0x10 //0x10=2 字节 //频道2 发送/接收数据长度(单位:Bit)
#define DATA1_W 0xE0 //0x20=28 字节 //频道1 发送/接收数据长度(单位:Bit)
/* 注意:2401 忽略ADDR 中超过ADDR_W 设定宽度的那些位,同时地址不能全部设置为0 */
//频道2 接收地址 < - 频道2 未启用
#define ADDR2_4 0x00
#define ADDR2_3 0x1c
#define ADDR2_2 0xcc
#define ADDR2_1 0xcc
#define ADDR2_0 0xcc
//频道 1 接收地址 (当前模块地址) <- 只使用到频道 1
#define ADDR1_4 0x00
#define ADDR1_3 0xcc
#define ADDR1_2 0xcc
#define ADDR1_1 0xcc
#define ADDR1_0 0xcc
#define ADDR_W 0x10 //0x10=2 字节 //发送/接收地址宽度(单位:Bit)
#define CRC_L 0x1 //CRC 模式 0:8 位 1:16 位
#define CRC_EN 0x1 //CRC 校验 0:禁用 1:启用
#define RX2_EN 0x0 //双频道功能 0:禁用 1:启用
#define CM 0x1 //0:Direct mode 1:ShockBurst mode
#define RFDR_SB 0x0 //传输速率0:250kbps/1:1Mbps(250kbps比1Mbps传输距离更远)
#define XO_F 0x3 //16M //nRF2401 晶振频率(具体设置见下图)
#define RF_PWR 0x3 //信号发射功率(具体设置见下图)
#define RF_CH 0x2 //Channel RF 频率设置
//Channel = 2400MHz + RF_CH * 1.0MHz
#define RXEN_NRF 0x0 //0:Tx 1:Rx
//程序会通过 SetTxMode/SetRxMode 重新设置此项参数
//<将设置信息组合成每个字节的数据信息,此区域无需修改>
#define RFConfig_Bit0 TEST_2
#define RFConfig_Bit1 TEST_1
#define RFConfig_Bit2 TEST_0
#define RFConfig_Bit3 DATA2_W
#define RFConfig_Bit4 DATA1_W
#define RFConfig_Bit5 ADDR2_4
#define RFConfig_Bit6 ADDR2_3
#define RFConfig_Bit7 ADDR2_2
#define RFConfig_Bit8 ADDR2_1
#define RFConfig_Bit9 ADDR2_0
#define RFConfig_Bit10 ADDR1_4
#define RFConfig_Bit11 ADDR1_3
#define RFConfig_Bit12 ADDR1_2
#define RFConfig_Bit13 ADDR1_1
#define RFConfig_Bit14 ADDR1_0
#define RFConfig_Bit15 (ADDR_W<<2 | CRC_L<<1 | CRC_EN)
#define RFConfig_Bit16 (RX2_EN<<7 | CM<<6 | RFDR_SB<<5 | XO_F <<2 | RF_PWR)
#define RFConfig_Bit17 (RF_CH<<1 | RXEN_NRF)
//------------------------------------------------------
//通过宏定义将 18 字节的寄存器参数按照各个功能分解,以便于参数的调整
unsigned char /*code*/ nRF2401_Conf[18] =
{
RFConfig_Bit0, RFConfig_Bit1, RFConfig_Bit2, RFConfig_Bit3, RFConfig_Bit4,
RFConfig_Bit5, RFConfig_Bit6, RFConfig_Bit7, RFConfig_Bit8, RFConfig_Bit9,
RFConfig_Bit10, RFConfig_Bit11, RFConfig_Bit12, RFConfig_Bit13,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -