温度数据采集与无线传输系统设计.docx
《温度数据采集与无线传输系统设计.docx》由会员分享,可在线阅读,更多相关《温度数据采集与无线传输系统设计.docx(21页珍藏版)》请在冰点文库上搜索。
温度数据采集与无线传输系统设计
1.硬件连接原理图
2.源程序
(1)DS18B20
#include"ds18b20.h"
ucharcodeid[DS18B20_NUM][8]={
{0x28,0xfe,0xb3,0x82,0x02,0x00,0x00,0xef},
/*保存有18b20ID*/
{0x28,0x95,0x78,0x82,0x02,0x00,0x00,0x86}
};
voidwriteBit0(void);
voidwriteBit1(void);
ucharreadBit(void);
voidwriteByte(ucharwbyte)
{
bitwbit;
uchari;
for(i=0;i<8;i++)
{
wbit=wbyte&0x01;
wbyte=wbyte>>1;
if(wbit)
writeBit1();
else
writeBit0();
}
}
ucharreadByte(void)
{
ucharrbyte=0;
chari,j;
for(i=0;i<8;i++)
{
j=readBit();
rbyte=(j<<7)|(rbyte>>1);
}
returnrbyte;
}
voidselectedDq(ucharselect)
{
uchari;
if(select>3)
writeByte(0xcc);
else
{
writeByte(0x55);
for(i=0;i<8;i++)
{
writeByte(id[select][i]);
}
}
}
uintreadTemp(ucharselected)
{
uinttemp;
uchardatatempdata[2]={0x00,0x00};
resetDQ();
_nop_();
_nop_();
_nop_();
selectedDq(selected);
writeByte(0x44);
resetDQ();
_nop_();
_nop_();
_nop_();
_nop_();
selectedDq(selected);
writeByte(0xbe);
tempdata[0]=readByte();
tempdata[1]=readByte();
temp=tempdata[1];
temp<<=8;
temp=temp|tempdata[0];
returntemp;
}
(
)nRF905
#include"nRF905.h"
#ifdefSET_TX_MODE
uchardataTxBuf[DATA_LONG];
#else
uchardataRxBuf[DATA_LONG];
#endif
ucharcodeRxTxConf[10]=
{
0x4c,
0x0c,
ADDR_LONG*0x11,
DATA_LONG,
DATA_LONG,
RXADDR,
RXADDR,
RXADDR,
RXADDR,
0x58
};
ucharbdataSPI_BUF;
sbitspi_buf0=SPI_BUF^0;
sbitspi_buf7=SPI_BUF^7;
voidspiWrite(ucharwrByte)
{
uchari;
SPI_BUF=wrByte;
for(i=0;i<8;i++)
{
if(spi_buf7)
MOSI=1;
else
MOSI=0;
_nop_();
SCK=1;
_nop_();
_nop_();
_nop_();
SPI_BUF=SPI_BUF<<1;
_nop_();
SCK=0;
}
MOSI=0;
}
ucharspiRead(void)
{
uchari;
for(i=0;i<8;i++)
{
SPI_BUF=SPI_BUF<<1;
SCK=1;
if(MISO)
spi_buf0=1;
else
spi_buf0=0;
_nop_();
_nop_();
_nop_();
SCK=0;
}
returnSPI_BUF;
}
voidenSPI(void)
{
CSN=0;
}
voiduenSPI(void)
{
CSN=1;
}
voidinit905(void)
{
LED=0;
uenSPI();
SCK=0;
DR=1;
AM=1;
PWR_UP=1;
TRX_CE=0;
TX_EN=0;
delay_11us(200);
LED=1;
}
voidconfig905(void)
{
uchari;
LED=0;
enSPI();
spiWrite(WC);
for(i=0;i<10;i++)
{
spiWrite(RxTxConf[i]);
}
uenSPI();
delay_11us(200);
LED=1;
}
#ifdefSET_TX_MODE
voidsetTxMode(void)
{
TX_EN=1;
TRX_CE=0;
delay_11us(60);
}
voidTxPacket(void)
{
uchari;
LED=0;
enSPI();
spiWrite(WTP);
_nop_();
_nop_();
for(i=0;i{
spiWrite(TxBuf[i]);
}
uenSPI();
delay_11us
(1);
enSPI();
spiWrite(WTA);
_nop_();
_nop_();
for(i=0;i{
spiWrite(TXADDR);
}
uenSPI();
TRX_CE=1;
delay_11us(200);
TRX_CE=0;
while(!
DR);
LED=1;
}
#else
voidsetRxMode(void)
{
TX_EN=0;
TRX_CE=1;
delay_11us(60);
}
voidRxPacket(void)
{
uchari;
LED=0;
while(!
DR);
enSPI();
spiWrite(RRP);
for(i=0;i{
RxBuf[i]=spiRead();
}
uenSPI();
delay_11us(10);
LED=1;
}
#endif
(
)LCD
#include"lcd1602.h"
#ifndef_CODE_LINE0_
uchardatamyLine0[DISPLONG0];
#else
#defineDISPLONG04
ucharcodemyLine0[]={'T','E','M','P'};
#endif
#ifndef_CODE_LINE1_
uchardatamyLine1[DISPLONG1];
#else
#defineDISPLONG13
ucharcodemyLine1[]={'z','z','z'};
#endif
#ifdef_MAKE_CHAR_
uchardatamyChar[]={0,0,0,0,0,0,0,0};
#endif
voidwrLCDCmd(ucharcmd)
{
while(isLCDBusy());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
LCD_DB=cmd;
delay_11us
(1);
LCD_EN=1;
delay_11us
(2);
LCD_EN=0;
}
voidwrLCDDat(uchardat)
{
while(isLCDBusy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
LCD_DB=dat;
delay_11us
(1);
LCD_EN=1;
delay_11us
(2);
LCD_EN=0;
}
bitisLCDBusy(void)
{
bitisBusy;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delay_11us
(1);
isBusy=LCD_BF;
LCD_EN=0;
returnisBusy;
}
voidinitLCD1602(void)
{
wrLCDCmd(CLEAR);
delay_11us(200);
wrLCDCmd(FUNC);
delay_11us(5);
wrLCDCmd(DISP);
delay_11us(5);
wrLCDCmd(MODE);
delay_11us(5);
wrLCDCmd(CLEAR);
delay_11us(200);
}
voidsetAddrLCD(ucharpos)
{
wrLCDCmd(pos|0x80);
delay_11us(5);
}
#ifdef_MAKE_CHAR_
voidwrCGRAM(ucharpos)
{
uchari;
wrLCDCmd(0x40||(pos<<3));
delay_11us(5);
for(i=0;i<8;i++)
wrLCDDat(myChar[i]);
}
#endif
voiddispLCD(void)
{
ucharm;
setAddrLCD(0x00);
for(m=0;m{
wrLCDDat(myLine0[m]);
}
setAddrLCD(0x40);
for(m=0;m{
wrLCDDat(myLine1[m]);
}
}
(
)发送主函数
#include"src\nRF905\nRF905.h"
#include"src\DS18B20\ds18b20.h"
#include"src\lcd1602\lcd1602.h"
uchardatabuffer[]={0,0,0,0,0};
ucharcodepoint[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
voidsaveTemp(uint,uchar);
voidshowTemp(void);
voidinitLCDdata(void);
voidmain()
{
uchari;
uinttemp;
initLCD1602();
initLCDdata();
init905();
config905();
while
(1)
{
for(i=0;i{
temp=readTemp(i);
saveTemp(temp,i);
showTemp();
dispLCD();
setTxMode();
TxPacket();
delay_11us(50000);
}
}
}
voidsaveTemp(uinttemp,ucharid)
{
uchari;
buffer[0]=id;
if(temp>6348)
{
temp=65536-temp;
buffer[1]=1;
}
else
buffer[1]=0;
buffer[4]=point[(temp&0x0f)];
buffer[2]=temp>>4;
buffer[3]=buffer[2]%10;
buffer[2]=buffer[2]/10;
for(i=0;i<5;i++)
{
TxBuf[i]=buffer[i];
}
}
voidinitLCDdata(void)
{
myLine1[0]='N';
myLine1[1]='O';
myLine1[2]='.';
myLine1[3]='3';
myLine1[4]=':
';
myLine1[5]=0x20;
myLine1[6]='-';
myLine1[7]='1';
myLine1[8]='9';
myLine1[9]='.';
myLine1[10]='5';
myLine1[11]=0xdf;
myLine1[12]='C';
}
voidshowTemp(void)
{
myLine1[3]=TxBuf[0]+0x30;
if(TxBuf[1])
myLine1[6]=0x2d;
else
myLine1[6]=0x20;
if(TxBuf[2])
myLine1[7]=TxBuf[2]+0x30;
else
myLine1[7]=0x20;
myLine1[8]=TxBuf[3]+0x30;
myLine1[10]=TxBuf[4]+0x30;
}
(
)接收主函数
#include"src\lcd1602\lcd1602.h"
#include"src\nRF905\nRF905.h"
voidsaveTemp(void);
voidinitLCDdata(void);
voidmain()
{
init905();
config905();
initLCD1602();
initUART();
while
(1)
{
setRxMode();
RxPacket();
initLCDdata();
delay_11us(5000);
saveTemp();
dispLCD();
delay_11us(5000);
/*for(i=0;i{
SBUF=RxBuf[i];
while(TI==0);
TI=0;
}*/
delay_11us(50000);
delay_11us(50000);
delay_11us(50000);
}
}
voidsaveTemp(void)
{
myLine1[3]=RxBuf[0]+0x30;
if(RxBuf[1])
myLine1[6]=0x2d;
else
myLine1[6]=0x20;
if(RxBuf[2])
myLine1[7]=RxBuf[2]+0x30;
else
myLine1[7]=0x20;
myLine1[8]=RxBuf[3]+0x30;
myLine1[10]=RxBuf[4]+0x30;
}
voidinitLCDdata(void)
{
myLine1[0]='N';
myLine1[1]='O';
myLine1[2]='.';
myLine1[3]='3';
myLine1[4]=':
';
myLine1[5]=0x20;
myLine1[6]='-';
myLine1[7]='1';
myLine1[8]='9';
myLine1[9]='.';
myLine1[10]='5';
myLine1[11]=0xdf;
myLine1[12]='C';
}
(
)延时子函数和串口调试
#include"config.h"
voiddelay_11us(uintt)
{for(;t>0;t--);}
voidinitUART(void)
{
SCON=0x40;
PCON=0;
REN=1;
TMOD=0x20;
TH1=0xe8;
TL1=0xe8;
TR1=1;
}
(7)配置
#ifndef_nRF905_H_
#define_nRF905_H_
#include"..\config.h"
#ifndef_CONFIG_RF905_
#define_CONFIG_RF905_
#defineSET_TX_MODE
#ifdefSET_TX_MODE
#defineRXADDR0xcc
#defineTXADDR0xcc
#else
#defineRXADDR0xcc
#defineTXADDR0xcc
#endif
#defineDATA_LONG32
#defineADDR_LONG4
sbitTX_EN=P0^0;
sbitTRX_CE=P0^1;
sbitPWR_UP=P1^1;
sbitAM=P0^2;
sbitDR=P1^2;
sbitMISO=P0^3;
sbitMOSI=P0^4;
sbitSCK=P0^5;
sbitCSN=P0^6;
//sbitCD=P2^3;
sbitLED=P0^7;
#defineWC0x00
#defineRC0X10
#defineWTP0x20
#defineRTP0x21
#defineWTA0x22
#defineRTA0x23
#defineRRP0x24
voidenSPI(void);
voiduenSPI(void);
voidspiWrite(uchar);
ucharspiRead(void);
voidinit905(void);
voidconfig905(void);
#ifdefSET_TX_MODE
externucharTxBuf[DATA_LONG];
voidsetTxMode(void);
voidTxPacket(void);
#else
externucharRxBuf[DATA_LONG];
voidsetRxMode(void);
voidRxPacket(void);
#endif
#endif