//数传发送2007/8/1 AT89C2051 11.0592MHz//Module nRF905_TX#include <reg51.H>#include <intrins.h>//_nop_()typedef unsigned char uchar;typedef unsigned int uint; //配置口定义//sbit TXEN = P1^7;sbit TRX_CE = P1^6;sbit PWR = P1^5;//SPI口定义//sbit MISO = P1^1;sbit MOSI = P1^0;sbit SCK = P3^7;sbit CSN = P3^3;//状态输出口//sbit CD = P1^4;sbit AM = P1^3;sbit DR = P3^2;sbit LED1 = P3^4;sbit LED2 = P3^5;//控制按钮sbit AN2 = P3^1;//传感器sbit DQ =P3^0; //DS18B20接在P30//-------------------------------------------------//RF寄存器配置//unsigned char idata RFConf[11]={ 0x00, //配置命令// 0x6C, //CH_NO,配置频段在433.2MHZ 0x0C, //输出功率为10db,不重发,节电为正常模式 0x44, //地址宽度设置,为4字节 0x04,0x04, //接收发送有效数据长度为4字节 0xE7,0xE7,0xE7,0xE7, //接收地址 0xDE, //CRC充许,16位CRC校验,外部时钟信号使能,16M晶振};uchar dis_buf[4]; //温度传感器发射数据缓存//--------------------------------------void DelayMs(uint n) //j=115@F=11.0592MHz{ uchar j; while(n--) {for(j=0;j<115;j++);}}//---------------------------void delayUs(uchar us)//15us延时{ for(;us>0;us--);}//---------------------------uchar reset(void)//DS18B20复位{ uchar yes; DQ = 0; delayUs(29); //延时 480us DQ = 1; delayUs(3); yes = DQ; delayUs(25); return(yes); //yes=0有芯片,} //---------------------------uchar read_byte(void)//从单总线上读一个字节{ uchar i; uchar value = 0; for (i=8;i>0;i--) { value>>=1; DQ = 0; DQ = 1; delayUs(1); //延时15us if(DQ)value|=0x80; delayUs(6); } return(value);}//---------------------------void write_byte(uchar val)//向单总线上写一个字节{ uchar i; for (i=8; i>0; i--) { DQ = 0; DQ = val&0x01; delayUs(5); DQ = 1; val=val/2; } delayUs(5);}//---------------------------uint Read_Temp(void)//读取温度{ union{ uchar tc[2]; uint tx; }temp; reset(); write_byte(0xCC); // Skip ROM write_byte(0xBE); // Read Scratch Pad temp.tc[1]=read_byte(); temp.tc[0]=read_byte(); reset(); write_byte(0xCC); //Skip ROM write_byte(0x44); //Start Conversion return temp.tx;}void Do_Temp(void) //温度数据处理{ uint tx; tx=Read_Temp(); if (tx>=0x0800) //温度为负值 { tx=~(tx)+1; dis_buf[3]=(tx&0x000f)*625/1000;//小数部分 tx=tx>>=4; //负值符号和整数部分 dis_buf[0]=0x13; dis_buf[1]=tx/10; dis_buf[2]=tx%10; } else { dis_buf[3]=(tx&0x000f)*625/1000;//小数部分 tx=tx>>=4; //正值整数部分 dis_buf[0]=tx/100; dis_buf[1]=(tx%100)/10; dis_buf[2]=(tx%100)%10; } }//延时void Delay(uint x){ uint i; for(i=0;i<x;i++){ _nop_(); }}//用SPI口写数据至NRF905void SpiWrite(uchar b){ uchar i=8; while (i--) { Delay(10); SCK=0; MOSI=(bit)(b&0x80); b<<=1 ; Delay(10); SCK=1; Delay(10); SCK=0; } SCK=0;}/*;写发射数据命令:20H;读发射数据命令:21H;写发射地址命令:22H;读发射地址命令:23H;读接收数据命令:24H*/void TxPacket(void){ TXEN=1; CSN=0; SpiWrite(0x22); //写发送地址,后面跟4字节地址// SpiWrite(0xE7); SpiWrite(0xE7); SpiWrite(0xE7); SpiWrite(0xE7); CSN=1; _nop_();_nop_(); CSN=0; SpiWrite(0x20); //写发送数据命令 SpiWrite(dis_buf[0]); //四字节数据,符号位或百位 SpiWrite(dis_buf[1]); //十位 SpiWrite(dis_buf[2]); //个位 SpiWrite(dis_buf[3]); //小数位 CSN=1; _nop_();_nop_(); TRX_CE=1; //使能发射模式// Delay(50); //等待发送完成 TRX_CE=0; while(!DR); LED1=0; //发送完成LED亮一秒 Delay(10000); LED1=1;}//初始化配置寄存器void Ini_System(void){ uchar i; CSN=1; SCK=0; PWR=1; TRX_CE=0; TXEN=0; _nop_(); CSN=0; for(i=0;i<11;i++){ SpiWrite(RFConf); } CSN=1; PWR=1; Delay(1000);}//----------------------------------------------- void main(void){ DelayMs(100); LED1=0; DelayMs(1000); LED1=1; Do_Temp(); LED2=0; DelayMs(1000); LED2=1; Ini_System(); while(1) { Do_Temp(); TxPacket(); DelayMs(10000);//10秒定时发送数据 } }
导读:目前正在解读《无线模块nrf905的发送模块》的相关信息,《无线模块nrf905的发送模块》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《无线模块nrf905的发送模块》的详细说明。
简介:本文介绍的主要是无线模块nrf905的发送模块
提醒:《无线模块nrf905的发送模块》最后刷新时间 2024-03-14 01:20:13,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《无线模块nrf905的发送模块》该内容的真实性请自行鉴别。