




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、溫度無線傳輸南陽理工 周渴望 本次所做是基于2.4GNRF24L01+芯片的溫度的無線傳輸,甲機作為發(fā)射機有DS18B20溫度傳感器、LCD1602液晶和NRE24L01+2.4G無線傳輸芯片。乙機作為接收端有LCD1602液晶和NRE24L01+2.4G無線傳輸芯片。甲機和乙機在硬件上是完全分開的。工作過程:甲機將溫度檢測出來并顯示在液晶上,然后通過NRF24L01將溫度數(shù)據(jù)發(fā)送出去,然后乙機通過本機上的NRF24L01芯片將甲機發(fā)射的程序接手過來通過單片機處理顯示在本機液晶上面。實物圖引腳圖程序:注:本次程序基于之前所做“1602LCD液晶顯示DS18B20溫度”程序。發(fā)射端#includ
2、e #include #define uchar unsigned char#define uint unsigned int/* sbit ds18b20=P23; /定義DS18B20的數(shù)據(jù)引腳 bit crrent=1; /定義DS18B20初始化返回值,表示初始化是否成功sbit BEE=P35; sbit AD=P25;sbit DC=P27;sbit lcdrs=P20; /定義LCD引腳sbit lcdrw=P21;sbit lcden=P22; sbit LED=P10;uint HT=340;uint value=0;uchar code str=Tempe:;uchar c
3、ode str1=DS18B20 Error!;uchar code str2=Please Check;uchar tflag; / 是否正負uchar data disdat6;uchar data setdat4;void writelcdcmd(uchar);void writelcddat(uchar);/*#define TX_ADR_WIDTH 5 / 發(fā)射地址的字節(jié)個數(shù)#define TX_PLOAD_WIDTH 2 /發(fā)射字節(jié)uchar const TX_ADDRESSTX_ADR_WIDTH=0x34,0x55,0x10,0x10,0x01; uchar rx_bufTX_
4、PLOAD_WIDTH;uchar tx_bufTX_PLOAD_WIDTH;uchar distance_data2;uchar flag;/標志sbit CE=P10;/發(fā)射高電平大于10MS 接收高電平 sbit CSN=P11;/低電平ISP使能sbit SCK=P12; /下降沿sbit MOSI=P13;/MCU出sbit MISO=P14;/MCU入sbit IRQ=P15;/中斷uchar bdata sta;sbitRX_DR=sta6; /接收數(shù)據(jù)準備就緒sbitTX_DS=sta5; /已發(fā)送數(shù)據(jù)sbitMAX_RT=sta4;sbit DQ=P23;unsigned c
5、har time; /設(shè)置全局變量,專門用于嚴格延時/*NRF24L01*/*NRF24L01寄存器指令*#define READ_REG 0x00 / 讀寄存器指令#define WRITE_REG 0x20 / 寫寄存器指令#define RD_RX_PLOAD 0x61 / 讀取接收數(shù)據(jù)指令#define WR_TX_PLOAD 0xA0 / 寫待發(fā)數(shù)據(jù)指令#define FLUSH_TX 0xE1 / 沖洗發(fā)送 FIFO指令#define FLUSH_RX 0xE2 / 沖洗接收 FIFO指令#define REUSE_TX_PL 0xE3 / 定義重復(fù)裝載數(shù)據(jù)指令#define NO
6、P 0xFF / 保留/*SPI(nRF24L01)寄存器地址*#define CONFIG 0x00 / 配置收發(fā)狀態(tài),CRC校驗?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方式#define EN_AA 0x01 / 自動應(yīng)答功能設(shè)置#define EN_RXADDR 0x02 / 可用信道設(shè)置#define SETUP_AW 0x03 / 收發(fā)地址寬度設(shè)置#define SETUP_RETR 0x04 / 自動重發(fā)功能設(shè)置#define RF_CH 0x05 / 工作頻率設(shè)置#define RF_SETUP 0x06 / 發(fā)射速率、功耗功能設(shè)置#define STATUS 0x07 / 狀態(tài)寄存器#define
7、 OBSERVE_TX 0x08 / 發(fā)送監(jiān)測功能#define CD 0x09 / 地址檢測 #define RX_ADDR_P0 0x0A / 頻道0接收數(shù)據(jù)地址#define RX_ADDR_P1 0x0B / 頻道1接收數(shù)據(jù)地址#define RX_ADDR_P2 0x0C / 頻道2接收數(shù)據(jù)地址#define RX_ADDR_P3 0x0D / 頻道3接收數(shù)據(jù)地址#define RX_ADDR_P4 0x0E / 頻道4接收數(shù)據(jù)地址#define RX_ADDR_P5 0x0F / 頻道5接收數(shù)據(jù)地址#define TX_ADDR 0x10 / 發(fā)送地址寄存器#define RX_P
8、W_P0 0x11 / 接收頻道0接收數(shù)據(jù)長度#define RX_PW_P1 0x12 / 接收頻道0接收數(shù)據(jù)長度#define RX_PW_P2 0x13 / 接收頻道0接收數(shù)據(jù)長度#define RX_PW_P3 0x14 / 接收頻道0接收數(shù)據(jù)長度#define RX_PW_P4 0x15 / 接收頻道0接收數(shù)據(jù)長度#define RX_PW_P5 0x16 / 接收頻道0接收數(shù)據(jù)長度#define FIFO_STATUS 0x17 / FIFO棧入棧出狀態(tài)寄存器設(shè)置/*void init_io(void)CE=0;CSN=1;SCK=0;void delay_ms(unsigned
9、int x) unsigned int i,j; for(i=0;ix;i+) j=108; while(j-); uchar SPI_RW(uchar byte)/發(fā)送指令,接受狀態(tài) ,返回值為狀態(tài)值uchar bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) MOSI = (byte&0x80); byte = (byte1); SCK = 1; byte|=MISO; SCK=0; return(byte); uchar SPI_RW_Reg(uchar reg, uchar value)uchar status; CSN = 0; status = S
10、PI_RW(reg); SPI_RW(value); CSN = 1; return(status); uchar SPI_Read(uchar reg)uchar reg_val; CSN = 0; SPI_RW(reg); /寫指令 reg_val = SPI_RW(0); /讀reg的內(nèi)容 CSN = 1; return(reg_val); uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)uchar status,byte_ctr; CSN = 0; status = SPI_RW(reg); for(byte_ctr=0;
11、 byte_ctrbytes; byte_ctr+) SPI_RW(*pBuf+); CSN = 1; return(status); void TX_Mode(void)CE=0; SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); /*接收模塊的地址*/ SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); /*通道0 接收數(shù)據(jù)地址*/ SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); /*
12、寫待發(fā)數(shù)據(jù)指令a0*/ SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); /數(shù)據(jù)通道0應(yīng)答允許 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); /接收數(shù)據(jù)通道0允許 SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);/等待 500+86us 自動重發(fā)10次 SPI_RW_Reg(WRITE_REG + RF_CH,40); SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); /數(shù)據(jù)傳輸率1Mbps ,發(fā)射功率0dBm SPI_RW_Reg(WRITE_REG + CONFIG,
13、 0x0e); /配置寄存器CE=1;void checkflag() sta=SPI_Read(STATUS);/讀狀態(tài)寄存器 if(MAX_RT) SPI_RW_Reg(FLUSH_TX,0); /*沖洗發(fā)送FIFO指令*/ SPI_RW_Reg(WRITE_REG+STATUS,sta);/清除中斷/以下是DS18B20的操作程序/*/ void delay_18B20(unsigned int i)/延時1微秒 while(i-); set18b20()/*ds1820復(fù)位*/ EA=0;ds18b20= 1; /復(fù)位delay_18B20(4); /延時ds18b20 = 0; /拉
14、低delay_18B20(100); /精確延時大于480usds18b20 = 1; /拉高delay_18B20(10);crrent=ds18b20;while(!ds18b20);EA=1;return(crrent); /返回值 uchar read18b20() /*讀數(shù)據(jù)*/ uchar i; uchar dat = 0; EA=0;for(i=0x01; i!=0; i0; i-) ds18b20 = 0; _nop_(); _nop_(); ds18b20=wdata&0x01; delay_18B20(10); ds18b20 = 1; wdata=1; EA=1;/*LC
15、D1602*void delayms(uint z) /不精確延時uchar x;uint y;for(x=z;x0;x-)for(y=125;y0;y-); void LCD_BUSY() /LCD忙檢測uchar sta; P0=0xff;lcdrs=0;lcdrw=1; dolcden=1;sta=P0;lcden=0;while(sta & 0x80);void writelcdcmd(uchar cmd) /LCD寫命令LCD_BUSY();delayms(1);lcdrs=0;lcdrw=0;lcden=0;P0=cmd;delayms(1);lcden=1;delayms(1);
16、lcden=0;void writelcddat(uchar dat) /LCD寫數(shù)據(jù)LCD_BUSY();delayms(1);lcdrs=1;lcdrw=0;lcden=0;P0=dat;delayms(1);lcden=1;delayms(1);lcden=0;void inilcd() /LCD初始化 delayms(15);writelcdcmd(0x38);delayms(5);writelcdcmd(0x0c);delayms(5);writelcdcmd(0x06);delayms(5);writelcdcmd(0x01);delayms(5);void play(unsign
17、ed char *p)/顯示/while(*p!=0)writelcddat(*p);p+;delayms(1);/*void readtemperature(void) uchar TL; /儲存暫存器的溫度低位 uchar TH; /儲存暫存器的溫度高位 set18b20(); write18b20(0xcc); write18b20(0x44); set18b20(); write18b20(0xcc); write18b20(0xbe); TL=read18b20(); /先讀的是溫度值低位TH=read18b20(); /接著讀的是溫度值高位 distance_data0=TH ;
18、/測量結(jié)果的高8位 distance_data1=TL; /放入16位的高8位 value=TH; value=8; value=value|TL; /*溫度顯示*/void disp18b20() /液晶顯示溫度 uint i,t; if(valueHT)&(crrent=0) /這里設(shè)置溫度上限值,來控制繼電器,需加crrent=0,不然DS18B20在拔掉后會出錯 while(t-) while(i-) /這里是繼電器導(dǎo)通為3分鐘左右,中間不讀取溫度 set18b20(); LED=0; if(valueHT)&(crrent=0) LED=0; /*改變設(shè)定溫度*/DC=1;AD=1;
19、if(AD=0) /設(shè)定溫度加HT+;while(!AD);if(DC=0) /設(shè)定溫度減HT-;while(!DC); /*/ /*讀取上限值溫度*/ setdat0=HT/100+0; /十位 setdat1=HT%100/10+0x30;/個位 setdat2=HT%10+0; /*/ /*讀取當前溫度*/ disdat0=value/1000+0x30;/百位數(shù) disdat1=value%1000/100+0x30;/十位數(shù) disdat2=value%100/10+0x30;/個位數(shù) disdat3=value%10+0x30;/小數(shù)位 if(tflag=0) disdat4=0x
20、20; else disdat4=0x2d; /當最高位為0時,最高位不顯示 if(disdat0=0x30) disdat0=0x20;if(disdat1=0x30)disdat1=0x20; /*顯示當前溫度*/ writelcdcmd(0x86); writelcddat(disdat4); /符號位 writelcdcmd(0x87); writelcddat(disdat0); writelcdcmd(0x88); writelcddat(disdat1); writelcdcmd(0x89); writelcddat(disdat2); writelcdcmd(0x8a); wr
21、itelcddat(0x2e); /小數(shù)點 writelcdcmd(0x8b); writelcddat(disdat3); writelcdcmd(0x8d); /單位 writelcddat(0xdf); writelcdcmd(0x8e); writelcddat(C); /*顯示設(shè)定溫度溫度*/ writelcdcmd(0xc0); writelcddat(H); writelcdcmd(0xc1); writelcddat(T); writelcdcmd(0xc2); writelcddat(:); writelcdcmd(0xc3); writelcddat(setdat0); w
22、ritelcdcmd(0xc4); writelcddat(setdat1); writelcdcmd(0xc5); writelcddat(.); writelcdcmd(0xc6); writelcddat(setdat2); /*主函數(shù)*void main(void)uchar xx;init_io();inilcd();while(1) readtemperature();/實時更新溫度 writelcdcmd(0x01); /每次數(shù)據(jù)變化清屏顯示 do readtemperature(); checkflag();for(xx=0;xx2;xx+)tx_bufxx= distance
23、_dataxx;/發(fā)數(shù)據(jù)之前必須把要發(fā)送的數(shù)據(jù)裝入它TX_Mode();/必須啟動發(fā)送模塊delay_ms(5); writelcdcmd(0x80); play(str); disp18b20(); while(!crrent); /檢測DS18B20存在,顯示溫度 do readtemperature();writelcdcmd(0x80); play(str1); writelcdcmd(0x80+0x40); play(str2);BEE=1;while(crrent);接收端:#include #include #define uchar unsigned char#define u
24、int unsigned intsbit lcdrs=P20; /定義LCD引腳sbit lcdrw=P21;sbit lcden=P22;uint value=0;uchar code str=Tempe:;uchar code str1=No signal;uchar code str2=Please Check;uchar tflag; / 是否正負uchar data disdat6;uchar data setdat4;void writelcdcmd(uchar);void writelcddat(uchar); /*uchar tm2;#define TX_ADR_WIDTH 5
25、 #define TX_PLOAD_WIDTH 2 uchar const TX_ADDRESSTX_ADR_WIDTH=0x34,0x55,0x10,0x10,0x01; uchar rx_bufTX_PLOAD_WIDTH;uchar tx_bufTX_PLOAD_WIDTH;uchar flag;/標志int cout;sbit CE=P10;/發(fā)射高電平大于10MS 接收高電平 sbit CSN=P11;/低電平ISP使能sbit SCK=P12; /下降沿sbit MOSI=P13;/MCU出sbit MISO=P14;/MCU入sbit IRQ=P15;/中斷uchar bdata
26、 sta;sbitRX_DR=sta6; /接收數(shù)據(jù)準備就緒sbitTX_DS=sta5; /已發(fā)送數(shù)據(jù)sbitMAX_RT=sta4;sbit RS=P20; /寄存器選擇位,將RS位定義為P2.0引腳sbit RW=P21; /讀寫選擇位,將RW位定義為P2.1引腳sbit E=P22; /使能信號位,將E位定義為P2.2引腳sbit BF=P07; /忙碌標志位,將BF位定義為P0.7引腳/*NRF24L01寄存器指令*#define READ_REG 0x00 / 讀寄存器指令#define WRITE_REG 0x20 / 寫寄存器指令#define RD_RX_PLOAD 0x61
27、 / 讀取接收數(shù)據(jù)指令#define WR_TX_PLOAD 0xA0 / 寫待發(fā)數(shù)據(jù)指令#define FLUSH_TX 0xE1 / 沖洗發(fā)送 FIFO指令#define FLUSH_RX 0xE2 / 沖洗接收 FIFO指令#define REUSE_TX_PL 0xE3 / 定義重復(fù)裝載數(shù)據(jù)指令#define NOP 0xFF / 保留/*SPI(nRF24L01)寄存器地址*#define CONFIG 0x00 / 配置收發(fā)狀態(tài),CRC校驗?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方式#define EN_AA 0x01 / 自動應(yīng)答功能設(shè)置#define EN_RXADDR 0x02 / 可用信道設(shè)置
28、#define SETUP_AW 0x03 / 收發(fā)地址寬度設(shè)置#define SETUP_RETR 0x04 / 自動重發(fā)功能設(shè)置#define RF_CH 0x05 / 工作頻率設(shè)置#define RF_SETUP 0x06 / 發(fā)射速率、功耗功能設(shè)置#define STATUS 0x07 / 狀態(tài)寄存器#define OBSERVE_TX 0x08 / 發(fā)送監(jiān)測功能#define CD 0x09 / 地址檢測 #define RX_ADDR_P0 0x0A / 頻道0接收數(shù)據(jù)地址#define RX_ADDR_P1 0x0B / 頻道1接收數(shù)據(jù)地址#define RX_ADDR_P2 0
29、x0C / 頻道2接收數(shù)據(jù)地址#define RX_ADDR_P3 0x0D / 頻道3接收數(shù)據(jù)地址#define RX_ADDR_P4 0x0E / 頻道4接收數(shù)據(jù)地址#define RX_ADDR_P5 0x0F / 頻道5接收數(shù)據(jù)地址#define TX_ADDR 0x10 / 發(fā)送地址寄存器#define RX_PW_P0 0x11 / 接收頻道0接收數(shù)據(jù)長度#define RX_PW_P1 0x12 / 接收頻道0接收數(shù)據(jù)長度#define RX_PW_P2 0x13 / 接收頻道0接收數(shù)據(jù)長度#define RX_PW_P3 0x14 / 接收頻道0接收數(shù)據(jù)長度#define RX
30、_PW_P4 0x15 / 接收頻道0接收數(shù)據(jù)長度#define RX_PW_P5 0x16 / 接收頻道0接收數(shù)據(jù)長度#define FIFO_STATUS 0x17 / FIFO棧入棧出狀態(tài)寄存器設(shè)置/*void init_io(void)CE=0;CSN=1;SCK=0; void delay_ms(unsigned int x) unsigned int i,j; for(i=0;ix;i+) j=108; while(j-); uchar SPI_RW(uchar byte)uchar bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) MOSI =
31、(byte&0x80); byte = (byte1); SCK = 1; byte|=MISO; SCK=0; return(byte); uchar SPI_RW_Reg(uchar reg, uchar value)uchar status; CSN = 0; status = SPI_RW(reg); SPI_RW(value); CSN = 1; return(status); uchar SPI_Read(uchar reg)uchar reg_val; CSN = 0; SPI_RW(reg); reg_val = SPI_RW(0); CSN = 1; return(reg_v
32、al); uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)uchar status,byte_ctr; CSN = 0; status = SPI_RW(reg); for(byte_ctr=0;byte_ctrbytes;byte_ctr+) pBufbyte_ctr = SPI_RW(0); CSN = 1; return(status); uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)uchar status,byte_ctr; CSN = 0; status
33、= SPI_RW(reg); for(byte_ctr=0; byte_ctr0;x-)for(y=125;y0;y-); void LCD_BUSY() /LCD忙檢測uchar sta; P0=0xff;lcdrs=0;lcdrw=1; dolcden=1;sta=P0;lcden=0;while(sta & 0x80);void writelcdcmd(uchar cmd) /LCD寫命令LCD_BUSY();delayms(1);lcdrs=0;lcdrw=0;lcden=0;P0=cmd;delayms(1);lcden=1;delayms(1);lcden=0;void write
34、lcddat(uchar dat) /LCD寫數(shù)據(jù)LCD_BUSY();delayms(1);lcdrs=1;lcdrw=0;lcden=0;P0=dat;delayms(1);lcden=1;delayms(1);lcden=0;void inilcd() /LCD初始化 delayms(15);writelcdcmd(0x38);delayms(5);writelcdcmd(0x0c);delayms(5);writelcdcmd(0x06);delayms(5);writelcdcmd(0x01);delayms(5);void play(unsigned char *p)/顯示/while(*p!=0)writelcddat(*p);p+;delayms(1);void xianshi(void) uchar TL; /儲存暫存器的溫度低位 uchar TH; /儲存暫存器的溫度高位 TH=tm0 ; TL=tm1; /這樣得到的是溫度小數(shù)部分的第一位數(shù)字(保留1位小數(shù)) value=TH; value=8; value=value|T
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 玫瑰花購銷合同
- 工業(yè)設(shè)備維修保養(yǎng)服務(wù)合同
- 出售房屋委托代理合同書
- 固體廢物處理處置服務(wù)合同
- 水電接入合同協(xié)議書
- 承包建造船舶合同
- 電子政務(wù)系統(tǒng)合同
- 內(nèi)蒙古北方職業(yè)技術(shù)學(xué)院《美容外科學(xué)醫(yī)學(xué)美容》2023-2024學(xué)年第二學(xué)期期末試卷
- 遼寧稅務(wù)高等??茖W(xué)?!峨姎鈧鲃幼詣涌刂葡到y(tǒng)綜合課程設(shè)計》2023-2024學(xué)年第二學(xué)期期末試卷
- 大連裝備制造職業(yè)技術(shù)學(xué)院《智慧教學(xué)與微課制作》2023-2024學(xué)年第二學(xué)期期末試卷
- 《和大人一起讀》試題及答案共4套
- 第一課 踏上強國之路 復(fù)習(xí)課件 統(tǒng)編版道德與法治九年級上冊
- 陳赫賈玲小品《歡喜密探》臺詞劇本
- 雨污水管道施工工藝
- 2023智能低壓配電箱技術(shù)條件
- 加油站地罐交接及容積表關(guān)系
- 新教材人教版高中數(shù)學(xué)必修第二冊全冊教案
- 班(組)戰(zhàn)斗動作訓(xùn)練教案
- 農(nóng)產(chǎn)品電商運營-完整全套課件
- 唐河縣泌陽凹陷郭橋天然堿礦產(chǎn)資源開采與生態(tài)修復(fù)方案
- 科研項目匯報ppt
評論
0/150
提交評論