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

📄 main._c

📁 嵌入式单片机控制温度传感的无线收发方案!
💻 _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 + -