|
本作品部分靈感和啟發來自以下貼子,在此表示感謝:
http://www.zg4o1577.cn/bbs/dpj-57255-1.html
本作品使用NTC熱敏電阻和nRF24L01實現無線測溫功能。使用前請仔細閱讀說明文字。
【測量部分】
平臺:STC15W408AS,頻率:22.1184MHz
測量部分使用NTC-MF52-103/3435熱敏電阻進行溫度采集,通過讀取單片機內部BandGap電壓得到準確的電源電壓和外部電壓,進而使用查表方法得到對應的最靠近的溫度值,處理并顯示。無線部分采用2.4G載波的nRF24L01模塊進行數據傳輸。
誤差分析:
設此采集過程中,影響采集精度的唯一因素為ADC對電壓的分辨率,若排除高精度分壓電阻的誤差,則在5V穩定電壓供電條件下,可得到能識別的NTC電阻變化跨度為97.7517106549(十倍歐姆),由于NTC電阻阻值是隨溫度非線性變化的,則固定分辨率下,不同溫度值附近精度不同,本次設計使用的單片機具有10位ADC,最小分辨率為4.8828mV,計算得到20℃定點溫度下的理論跨度誤差約為1.521190476%。
【接收顯示部分】
平臺:STM8S103F2P6,HSI:16MHz,CPUDIV:8
顯示使用雙數碼管顯示,分別使用一個595進行段選控制(別問我為什么用兩個595,設計的時候沒想太多...),位選使用一個138譯碼器解決。
可以顯示正負溫度,自動消零。
程序部分說明:
1.發送和接收部分的nRF24L01驅動函數均進行了精簡,發送部分僅有發送相關函數,接收部分只有接收部分的函數,移植需要注意。
2.無線報文數據格式見數據采集的程序,一共有14個字節,都是數字的形式,接收到之后直接判斷送顯即可。
【實物圖片】
數據采集部分
IMG_20190225_093052.jpg (3.11 MB, 下載次數: 136)
下載附件
2019-2-25 10:13 上傳
接收部分的實際效果1
IMG_20190225_092843.jpg (3.28 MB, 下載次數: 142)
下載附件
2019-2-25 10:13 上傳
接收部分的實際效果2
IMG_20190225_092940.jpg (2.86 MB, 下載次數: 141)
下載附件
2019-2-25 10:13 上傳
接收部分數碼管段選電路連接
IMG_20190225_100016.jpg (2.75 MB, 下載次數: 122)
下載附件
2019-2-25 10:13 上傳
數據采集部分重點電路
IMG_20190225_100326.jpg (2.77 MB, 下載次數: 121)
下載附件
2019-2-25 10:13 上傳
接收顯示部分單片機引腳定義(典型連接)
引腳定義.png (48.17 KB, 下載次數: 129)
下載附件
2019-2-25 10:13 上傳
【程序概要】
測量部分
接收部分主函數
- #include"iostm8s103f2.h"
- #include"Init.c" //系統初始化函數
- #include"nRF24L01.C"//提供nRF24L01驅動
- //運行數組
- unsigned char Display[8]={10,10,10,10,10,10,10,10};//用于顯示的每一位數值,對應段選數組中的相應位
- unsigned char duan[11]={0xeb,0x09,0xe5,0xad,0x0f,0xae,0xee,0x89,0xef,0xaf,0x04};//數碼管段選數組 數字0~9和符號"-"
- /*
- 段碼對應表,僅適用本電路
- 8 4 2 1 8 4 2 1
- 7 6 5 4 3 2 1 0
- A E D H C G F B
- 1 1 1 0 1 0 1 1 0
- 0 0 0 0 1 0 0 1 1
- 1 1 1 0 0 1 0 1 2
- 1 0 1 0 1 1 0 1 3
- 0 0 0 0 1 1 1 1 4
- 1 0 1 0 1 1 1 0 5
- 1 1 1 0 1 1 1 0 6
- 1 0 0 0 1 0 0 1 7
- 1 1 1 0 1 1 1 1 8
- 1 0 1 0 1 1 1 1 9
- 0 0 0 0 0 1 0 0 -
- */
- //運行變量
- unsigned char pointpositionA=3;//溫度顯示的小數點位置,從0到3
- unsigned char pointpositionB=4;//電壓顯示的小數點位置,從4到7
- //運行計數
- unsigned int TIM4_cnt=0;//TIM4定時器周期計數
- /************************************************************
- 名稱:基于NTC熱敏電阻和nRF24L01的無線溫度計(接收顯示部分)
- 平臺:STM8S103F2P6,HSI:16MHz,CPUDIV:8
- 資源:Flash:4K RAM:1K
- 簡介:測量部分使用NTC-MF52-103/3435熱敏電阻進行溫度采集,
- 通過讀取單片機內部BandGap電壓得到準確的電源電壓和外部電壓,
- 使用查表方法得到對應的最靠近的溫度值,處理并顯示。
- 無線部分采用2.4G載波的nRF24L01模塊進行數據傳輸。
- 程序編寫:凌凈清河
- 硬件制作:凌凈欣羽
- 文稿排版:凌凈欣羽
- 日期:2019年2月25日
- 聲明:制作參考龍順宇《深入淺出STM8單片機入門、進階與應用實例》
- 所屬:新礦城學習基地#2019
- 編寫中臨時記錄:
- 本程序欠缺段選數組,數碼管顯示函數
- 數碼管計劃使用138和雙595級聯的方式驅動2個4位數碼管
- 一個顯示溫度,一個顯示采集部分的供電電壓
- 還有配套的數據處理語句待編寫。
- ************************************************************/
- void delay(unsigned char i) //延時函數,調用此函數進行一段時間的非精準延時
- {
- while(i--);
- }
- void SPIsendB(unsigned char dat)//給級聯的第一個595寫字節
- {
- unsigned char a;
- unsigned int tmp=0;
- tmp=dat<<8;
- SN74HC595_SRCLK=0;
- SN74HC595_RCLK=0;
- for(a=0;a<16;a++)
- {
- if(tmp&0x8000)
- {
- SN74HC595_SER=1;
- }
- else
- {
- SN74HC595_SER=0;
- }
- tmp<<=1;
- SN74HC595_SRCLK=1;
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- SN74HC595_SRCLK=0;
- }
- SN74HC595_RCLK=1;
- asm("nop");
- asm("nop");
- SN74HC595_RCLK=0;
- }
- void SPIsendA(unsigned char dat)//給級聯的第二個595寫字節
- {
- unsigned char a;
- unsigned int tmp=0;
- tmp=tmp|dat;
- SN74HC595_SRCLK=0;
- SN74HC595_RCLK=0;
- for(a=0;a<16;a++)
- {
- if(tmp&0x8000)
- {
- SN74HC595_SER=1;
- }
- else
- {
- SN74HC595_SER=0;
- }
- tmp<<=1;
- SN74HC595_SRCLK=1;
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- SN74HC595_SRCLK=0;
- }
- SN74HC595_RCLK=1;
- asm("nop");
- asm("nop");
- SN74HC595_RCLK=0;
- }
- void smgNum(unsigned char num)//位選函數,配合顯示函數使用,選擇138譯碼輸出的位
- {
- switch(num)
- {
- case 0:SN74HC138_S3=1;SN74HC138_S2=1;SN74HC138_S1=1;break;
- case 1:SN74HC138_S3=1;SN74HC138_S2=1;SN74HC138_S1=0;break;
- case 2:SN74HC138_S3=1;SN74HC138_S2=0;SN74HC138_S1=1;break;
- case 3:SN74HC138_S3=1;SN74HC138_S2=0;SN74HC138_S1=0;break;
- case 4:SN74HC138_S3=0;SN74HC138_S2=1;SN74HC138_S1=1;break;
- case 5:SN74HC138_S3=0;SN74HC138_S2=1;SN74HC138_S1=0;break;
- case 6:SN74HC138_S3=0;SN74HC138_S2=0;SN74HC138_S1=1;break;
- case 7:SN74HC138_S3=0;SN74HC138_S2=0;SN74HC138_S1=0;break;
- default:SN74HC138_S3=0;SN74HC138_S2=0;SN74HC138_S1=0;break;
- }
- }
- /*
- 編者按:
- 在設計連接時,用于顯示溫度的74HC595的SN74HC595_SER端
- 接在用于顯示電壓的595 Q7'端,兩個74HC595級聯,
- 我也不知道當時怎么想的,選擇如此焊接,
- 但是既然電路這么做出來了,程序只好照著編了。
- */
- void smgdisplay()
- {
- unsigned char i;
- for(i=0;i<4;i++)//溫度數據顯示
- {
- if(pointpositionA==i)
- {
- SPIsendA((duan[Display[i]])|0x10);
- }
- else
- {
- SPIsendA(duan[Display[i]]);
- }
- smgNum(i);//選擇相應位
- delay(100);
- SPIsendA(0x00);//消隱
- delay(50);
- }
- for(i=4;i<8;i++)//電壓數據顯示
- {
- if(pointpositionB==i)
- {
- SPIsendB((duan[Display[i]])|0x10);
- }
- else
- {
- SPIsendB(duan[Display[i]]);
- }
- smgNum(i);//選擇相應位
- delay(100);
- SPIsendB(0x00);//消隱
- delay(50);
- }
- }
- void sys_init()//系統初始化
- {
- asm("sim");
- CLK_init(); //HSI初始化,更改分頻系數為1
- TIM4_init(); //TIM4初始化,定時1ms
- asm("rim");
- SN74HC595_IO_Define(); //SN74HC595接線定義
- SN74HC138_IO_Define(); //SN74HC138接線定義
- nRF24L01_IO_Define(); //nRF24L01接線定義
- nRF24L01_IO_init(); //nRF24L01通信線初始化
- nRF24L01_SetMode_Rx(); //nRF24L01功能初始化:接收模式
- }
- void main(void)
- {
- sys_init(); //系統初始化
- while(1)
- {
- if(nRF24L01_ReceiveData()) //如果接收到數據
- {
- TIM4_cnt=0;
- if(Received_Buff[0])//溫度為正
- {
- if(Received_Buff[1]==0)//如果百位為0
- {
- if(Received_Buff[2]==0)//如果十位為0
- {
- Display[0]=Received_Buff[3];
- Display[1]=Received_Buff[4];
- Display[2]=Received_Buff[5];
- Display[3]=Received_Buff[6];
- pointpositionA=0;
- }
- else
- {
- Display[0]=Received_Buff[2];
- Display[1]=Received_Buff[3];
- Display[2]=Received_Buff[4];
- Display[3]=Received_Buff[5];
- pointpositionA=1;
- }
- }
- else
- {
- Display[0]=Received_Buff[1];
- Display[1]=Received_Buff[2];
- Display[2]=Received_Buff[3];
- Display[3]=Received_Buff[4];
- pointpositionA=2;
- }
- }
- else
- {
- Display[0]=11;//負號
- if(Received_Buff[1]==0)//如果百位為0
- {
- if(Received_Buff[2]==0)//如果十位為0
- {
- Display[1]=Received_Buff[3];
- Display[2]=Received_Buff[4];
- Display[3]=Received_Buff[5];
- pointpositionA=1;
- }
- else
- {
- Display[1]=Received_Buff[2];
- Display[2]=Received_Buff[3];
- Display[3]=Received_Buff[4];
- pointpositionA=2;
- }
- }
- else
- {
- Display[1]=Received_Buff[1];
- Display[2]=Received_Buff[2];
- Display[3]=Received_Buff[3];
- pointpositionA=3;
- }
- }
- Display[4]=Received_Buff[8];
- Display[5]=Received_Buff[9];
- Display[6]=Received_Buff[10];
- Display[7]=Received_Buff[11];
- }
- smgdisplay();
- }
- }
- #pragma vector=0x19//定時器4中斷服務函數
- __interrupt void TIM4_UPD_OVF_IRQHandler(void)
- {
- TIM4_cnt++;
- TIM4_SR=0;
- if(TIM4_cnt==500)
- {
- unsigned char i;
- TIM4_cnt=0;
- for(i=0;i<8;i++)
- {
- Display[i]=10;
- }
- }
- }
復制代碼
歡迎進群:873434536,雖人數暫時較少,但群內氛圍很好,有任何關于51學習中的問題,來一起討論吧~!
程序源碼:
基于NTC熱敏電阻和nRF24L01的無線溫度計 發布版 凌凈清河.zip
(409.08 KB, 下載次數: 258)
2019-2-25 10:19 上傳
點擊文件名下載附件
閱讀權限: 10 下載積分: 黑幣 -5
請注意,為了方便黑幣較少的人也能夠下載附件,回復本帖,任何時候我看到,均會給出最高評分作為黑布補貼!
|
評分
-
查看全部評分
|