📄 main._c
字号:
/************************************
功能:nrf905接受函数主函数
时间:2008年8月30日
编写:陈锐
版本:1.2
************************************/
#include "confg.h"
//buf[0]:子机地址;buf[1]:命令参数0x03;
//buf[2]:数据长度,长度为7;buf[3]和buf[4]:温度数据
//buf[5]和buf[6]:子机电压数据;buf[7]和buf[8]:crc校检
unsigned char buf[9]={0};//向主机发送的数据
//crc校检函数
//*buf数据缓冲区,len数据缓冲区长度,CRC 返回的16位校检码
unsigned int Get_CRC16(unsigned char *buf,unsigned char len)
{
unsigned char high,low;
unsigned char i,j;
unsigned char check;
unsigned int crc;
crc=0xffff;
for(i=0;i<len;i++)
{
crc=crc^buf[i];
for(j=0;j<8;j++)
{
check=crc&1;
crc=crc>>1;
crc=crc&0x7fff;
if(check==1)
{
crc=crc^0xa001;
}
}
}
high=crc&0x00ff;
low=crc>>8;
crc=(high<<8)|low;
return crc;
}
//串口初始化
void port_init(void)
{
PORTB = 0xD7;
DDRB = 0x2C;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x1f;
DDRD = 0xe0;
}
//SPI initialize
void spi_init(void)
{uchar temp;
//SPCR = 0xD1; //SPI中断允许,SPI允许,主机模式,MSB,极性方式00,1/16系统时钟速率
SPCR = 0x51; //不使用SPI中断,其它同上
SPSR = 0x00; //setup SPI
temp = SPSR; //!!!
temp = SPDR; //清空SPI,和中断标志,使SPI空闲
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
spi_init();
uart_init();
MCUCR = 0x0c;
GICR|= 0x80;//enable INT1 interrupt
GIFR = 0xc0;// 清除INT0、INT1 中断标志位
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void rs485_send(void)//打开rs485发送,DE位为1
{
DDRC=0x01;
PORTC=0x01;
}
void rs485_rec(void)//打开rs485接收
{
DDRC=0x01;
PORTC=0x00;
}
void main(void)
{
uchar string;
int i=0;
init_devices();
delay_10ms(20);
Read_nrf905Add();//读取nrf905的接受发送地址
nrf905_Init(); //初始化nrf905
//delay_10ms(50);
//puts_hh("receive start!");//用来演示
// delay_10ms(2);
nrf905_RxOn();//enable nrf905接收
DDRC=0x01;
PORTC=0x00;
while(1) {
}
}
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
unsigned int crc;
RfRecvProc();//接收处理
//读出的数据Rx_Buf[0]是子机地址,Rx_Buf[2]和Rx_Buf[3]是温度数据,
//Rx_Buf[4]和Rx_Buf[5]是子机电源电压数据,Rx_Buf[1]是命令字
buf[0]=Rx_Buf[0];//子机地址
buf[1]=Rx_Buf[1];//命令字
buf[2]=0x07;//数据长度,包括子机地址、命令字和数据
buf[3]=Rx_Buf[2];//Rx_Buf[2]和Rx_Buf[3]是温度数据
buf[4]=Rx_Buf[3];
buf[5]=Rx_Buf[4];//Rx_Buf[4]和Rx_Buf[5]是子机电源电压数据
buf[6]=Rx_Buf[5];
crc=Get_CRC16(buf,7);//获得CRC校检
buf[7]=crc;
buf[8]=(crc<<8);
rs485_send();//置rs485为发送状态
//printf("%s",buf);//向485发送数据
printf("slave add is %d\r\n",Tx_Buf[0]);
printf("command is %x\r\n",Tx_Buf[1]);
//改变nrf905的发送地址
Change_TX_ADD(Rx_Buf[0]);
Tx_Buf[0]=0xFF;//发出确认收到命令
//发送测试
RfSendProc();
rs485_rec();//置rs485为接收状态
CLR(PORTB,AM);//清除中断标志
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -