單片機測溫UI版
閑來無事,在沒有暖氣的家裡凍得瑟瑟發抖,封印在被窩裡,於是動手擼個單片機程序,用DS18B20溫度感測器,測一下室內的溫度,並用LCD屏顯示出溫度變化曲線。
1. DS18B20介紹
DS18B20 單線數字溫度感測器,即「一線器件」,其具有獨特的優點:
( 1 )採用單匯流排的介面方式 與微處理器連接時僅需要一條口線即可實現微處理器與
DS18B20 的雙向通訊。單匯流排具有經濟性好,抗干擾能力強,適合於惡劣環境的現場溫度測量,使用方便等優點,使用戶可輕鬆地組建感測器網路,為測量系統的構建引入全新概念。( 2 )測量溫度範圍寬,測量精度高 DS18B20 的測量範圍為 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C範圍內,精度為 ± 0.5°C 。
( 3 )在使用中不需要任何外圍元件。
( 4 )持多點組網功能 多個 DS18B20 可以並聯在惟一的單線上,實現多點測溫。
( 5 )供電方式靈活 DS18B20 可以通過內部寄生電路從數據線上獲取電源。因此,當數據線上的時序滿足一定的要求時,可以不接外部電源,從而使系統結構更趨簡單,可靠性更高。
( 6 )測量參數可配置 DS18B20 的測量解析度可通過程序設定 9~12 位。
( 7 ) 負壓特性電源極性接反時,溫度計不會因發熱而燒毀,但不能正常工作。
( 8 )掉電保護功能 DS18B20 內部含有 EEPROM ,在系統掉電以後,它仍可保存解析度及報警溫度的設定值。
DS18B20 具有體積更小、適用電壓更寬、更經濟、可選更小的封裝方式,更寬的電壓適用範圍,適合於構建自己的經濟的測溫系統,因此也就被設計者們所青睞。
2. 元器件
1) STM32F103開發板一塊。
2) TFTLCD一塊。
3) DS18B20溫度感測器一個。
4) 杜邦線三根。
3. 程序設計
一般在某寶上購買元器件,賣家都會贈送模塊的驅動代碼,這也就大大方便了咱們的使用,只需要將DS18B20和LCD的驅動代碼整合進自己的程序框架中,調試好整體的功能,也就完成啦。
我使用STM32的官方庫函數來完成程序的設計,這也能大大地加快程序的設計,當然也有很多技術高超的人直接控制寄存器~
附上DS18B20部分程序:
#include "ds18b20.h"void DS18B20_Rst(void) { DS18B20_IO_OUT(); //SET PA0 OUTPUT DS18B20_DQ_OUT=0; //à-μíDQ delay_us(750); //à-μí750us DS18B20_DQ_OUT=1; //DQ=1 delay_us(15); //15US}u8 DS18B20_Check(void) { u8 retry=0; DS18B20_IO_IN();//SET PA0 INPUT while (DS18B20_DQ_IN&&retry<200) { retry++; delay_us(1); } if(retry>=200) return 1; else retry=0; while(!DS18B20_DQ_IN&&retry<240) { retry++; delay_us(1); } if(retry>=240) return 1; return 0;}u8 DS18B20_Read_Bit(void) // read one bit{ u8 data; DS18B20_IO_OUT();//SET PA0 OUTPUT DS18B20_DQ_OUT=0; delay_us(2); DS18B20_DQ_OUT=1; DS18B20_IO_IN();//SET PA0 INPUT delay_us(12); if(DS18B20_DQ_IN) data=1; else data=0; delay_us(50); return data;}u8 DS18B20_Read_Byte(void) // read one byte{ u8 i,j,dat; dat=0; for (i=1;i<=8;i++) { j=DS18B20_Read_Bit(); dat=(j<<7)|(dat>>1); } return dat;}void DS18B20_Write_Byte(u8 dat) { u8 j; u8 testb; DS18B20_IO_OUT();//SET PA0 OUTPUT; for (j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if (testb) { DS18B20_DQ_OUT=0;// Write 1 delay_us(2); DS18B20_DQ_OUT=1; delay_us(60); } else { DS18B20_DQ_OUT=0;// Write 0 delay_us(60); DS18B20_DQ_OUT=1; delay_us(2); } }}void DS18B20_Start(void)// ds1820 start convert{ DS18B20_Rst(); DS18B20_Check(); DS18B20_Write_Byte(0xcc);// skip rom DS18B20_Write_Byte(0x44);// convert} u8 DS18B20_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PORTA0 í?íìê?3? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_0); //ê?3?1 DS18B20_Rst(); return DS18B20_Check();} short DS18B20_Get_Temp(void){ u8 temp; u8 TL,TH; short tem; DS18B20_Start (); // ds1820 start convert DS18B20_Rst(); DS18B20_Check(); DS18B20_Write_Byte(0xcc);// skip rom DS18B20_Write_Byte(0xbe);// convert TL=DS18B20_Read_Byte(); // LSB TH=DS18B20_Read_Byte(); // MSB if(TH>7) { TH=~TH; TL=~TL; temp=0;//???è?a?o } else temp=1;// tem=TH; tem<<=8; tem+=TL; tem=(float)tem*0.625; if(temp) return tem; // else return -tem; }
4. 實現效果
在屏幕上實現類似坐標系的UI界面,為了快速呈現出程序的效果,我選取5秒作為一個測量點,一個周期測試12個點,所以一個周期也就是1分鐘,當然也可以通過修改程序,將測量周期改成12分鐘、一小時、12小時等等,全憑喜好~
這是室內的實時溫度變化,也就6°的樣子,變化不大,可見測量的效果比較平穩。
為了顯示出動態變化的效果,我用手捂住感測器,溫度變化散點如下:
5. 進一步改進的點
有興趣的話,可以增加多個溫度感測器,放在不同的地點,同時顯示多個區域的溫度變化情況。如果有更大的LCD屏幕,UI也可以進一步美化以及增加顯示的精度等等~
6.後續
歡迎點贊、關注~
推薦閱讀:
※如何系統地入門學習stm32?
※參加了智能車信標組,請大神科普一下,如何入門到準備參賽?
※電子設計(硬體、軟體)有那麼多細分,如何能在面試時找到合適(能力強)的人選?
※數模美賽O,F獎 ,美一美二的含金量怎麼樣?
※利用FPGA可以設計出哪些有趣的東西?