基于STM32F107開發(fā)板的萬年歷和溫度測量系統(tǒng)設(shè)計_第1頁
基于STM32F107開發(fā)板的萬年歷和溫度測量系統(tǒng)設(shè)計_第2頁
基于STM32F107開發(fā)板的萬年歷和溫度測量系統(tǒng)設(shè)計_第3頁
基于STM32F107開發(fā)板的萬年歷和溫度測量系統(tǒng)設(shè)計_第4頁
基于STM32F107開發(fā)板的萬年歷和溫度測量系統(tǒng)設(shè)計_第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上生產(chǎn)實習設(shè)計報告設(shè)計題目:基于STM32F107開發(fā)板的萬年歷和溫度測量系統(tǒng)設(shè)計生產(chǎn)組長姓名:xx設(shè)計組長姓名:xx設(shè)計小組成員:xx、xx、xx、xx、xx、xx、xx、xx 2013年9月12日目錄一、概述本設(shè)計基于STM32F107開發(fā)板,利用板上的單片機在OLED顯示屏上顯示年月日、時間、星期和溫度;利用核心板上的STM32控制基板上的溫度傳感器DS18B20實現(xiàn)溫度測量,然后STM32對DS18B20轉(zhuǎn)換后的數(shù)據(jù)進行讀取和處理,當晃動板子時,轉(zhuǎn)換成實際溫度值后得到溫度顯示碼,最后在OLED顯示測得的溫度(顯示出溫度值的符號位和整數(shù)位,以及兩位小數(shù),并以攝氏溫

2、度和華氏溫度兩種形式同時顯示),再次晃動板子時再次顯示年月日星期和時間。該多功能溫度計除具備測溫功能外,還有如下附加功能:可手動切換顯示溫度、日期、星期和時間;手動校時、調(diào)整日期。二、總體設(shè)計1總體系統(tǒng)結(jié)構(gòu)DS18B20PCF856按鍵開關(guān)設(shè)置加速度傳感器OLED顯示MCU圖 1 系統(tǒng)框圖2模塊劃分測溫模塊OLED顯示模塊按鍵開關(guān)模塊三軸加速度傳感器模塊3人員分工三、 關(guān)鍵模塊設(shè)計1.測溫模塊DS18B20是由DALLAS半導體公司推出的一種“一線總線”接口的溫度傳感器。DS18B20工作在3V5.5V 的電壓范圍,可以程序設(shè)定912位的分辨,測溫范圍55125,在-10+85時精為±

3、;0.5。本設(shè)計中,DS18B20通過程序?qū)⑵浞直媛试O(shè)為12位(溫度分辨為0.0625)。圖 2 DS18B20與STM32的連接電路2.OLED顯示模塊OLED使用的控制器為SSD1305,可通過寫入不同的命令字來設(shè)置對比度、顯示開關(guān)、電荷泵、頁地址等。圖 3 OLED與STM32連接電路OLED被配置為使用I2C的方式。I2C的地址二進制位為X,16進制為0x78(寫地址),0x79(讀地址)。OLED的Reset平時應該拉高,在初始化的時候,應該有一個從低電平到高電平的跳變。使用的MCU端口為:l PB6 CLK I2Cl PB7 SDA I2Cl PE6 RESET (低電平有效)3.

4、按鍵開關(guān)模塊基板一共有4個按鍵,分別為KEY1,KEY2,KEY3,KEY4。其中,按鍵未按下,對應的GPIO口為高電平,按鍵按下后變?yōu)榈碗娖健D 4 按鍵電路圖使用的MCU端口為l PE2 KEY4 GPIOl PE3 KEY3 GPIOl PE4 KEY2 GPIOl PE5 KEY1 GPIO4.加速度傳感器模塊RS232的電平轉(zhuǎn)換芯片為MAX232CE。外部接口為DB9。有兩個LED指示燈,TXD用來顯示接受到數(shù)據(jù),RXD用來顯示正在發(fā)送數(shù)據(jù)。對外接口為DB9接口,定義為:2RXD,3TXD,5GND。因此,基板可以通過串口線直接連接到PC機,和PC機進行通信。使用的MCU端口為:l

5、PD5 UART2_TX(Remap)l PD6 UART2_RX(remap)四、測試結(jié)果1. 開機上電后顯示年月日、時間和星期;2. 在日歷時鐘顯示時,搖晃板子之后,OLED顯示當前所測溫度(攝氏+華氏);3. 在溫度顯示時,搖晃板子之后,OLED顯示日歷時鐘;4. 在日歷時鐘顯示模式時,按下KEY1進入校時模式,此時可通過KEY1選擇校準年、月、日、小時、分鐘、秒和星期;按下KEY3則對應項+1,按下KEY4則對應項-1;按下KEY1鍵確認,返回日期、星期和時間正常顯示模式。五、總結(jié)本設(shè)計完全基于STM32F107開發(fā)板,利用開發(fā)板上的DS18B20、OLED、PCF8563日歷時鐘芯片

6、、按鍵開關(guān)、三軸加速度芯片LIS35DE等資源實現(xiàn)了測溫,顯示溫度(攝氏+華氏);顯示日期、星期、時間,手動校時、調(diào)整日期;搖晃實驗板實現(xiàn)溫度和日歷時鐘之間的切換。六、附錄1.關(guān)鍵程序代碼/main.c#include "include.h"#include "DS18B20.h"#include "temperature.h"#include "realtime.h"#include "MEMS.h"u8 DisplayBuff20;time RealTime;date RealDate;sc

7、8 WeekdayStr716 = "Sun.", "Mon.", "Tue.", "Wed.", "Thur.", "Fri. ", "Sat.", ;int main(void) int dir1=0,dir2=0,dir3=0; int dir11=0,dir22=0,dir33=0; acc_3d mems,flag; flag.x=flag.y=flag.z=0; u8 select = 0; SystemInit();/設(shè)置系x統(tǒng)時鐘 USAR

8、T2_Init(); USART2_Configuration(9600); I2C_GPIOInit(); OLED_Init(); RealTime_Init(); MEMS_Init();/*-時間-*/ while(1) while(1) PrintStringLocate("Calendar" , 16 , 0x00, 0x00); PrintStringLocate("Date:" , 16 , 0x02, 0x00); PrintStringLocate("Weekday:" ,16 , 0x06, 0x00); Pri

9、ntStringLocate("Time:" , 16 , 0x04, 0x00); GetTime(&RealTime); GetDate(&RealDate); sprintf(char *)DisplayBuff, "%4d-%02d-%02d",RealDate.year, (u8)RealDate.month, RealDate.day); PrintStringLocate(DisplayBuff, 16,0x02,0x05); sprintf(char *)DisplayBuff, "%4s", Week

10、DayStrRealDate.weekday); PrintStringLocate(DisplayBuff, 16,0x06,0x08); sprintf(char *)DisplayBuff, "%02d:%02d:%02d",RealTime.hour,RealTime.minute,RealTime.second); PrintStringLocate(DisplayBuff, 16,0x04,0x05); if(KEY1PressDown() select + ; /DelayMs(200); if(select>7) select=0; / switch(

11、select) case 0: PrintStringLocate("Date: CHANGE" , 16 , 0x00, 0x00); /設(shè)置日期 break; case 1: while(1) PrintStringLocate("CHANGE: YEAR " , 16 , 0x00, 0x00); /設(shè)置年 if(KEY3Read() RealDate.year +; if(KEY4Read() RealDate.year -; SetDate(&RealDate); sprintf(char *)DisplayBuff, "%4

12、d-%02d-%02d",RealDate.year, (u8)RealDate.month, RealDate.day); PrintStringLocate(DisplayBuff, 16,0x02,0x05); if(KEY2PressDown() break; break; case 2: while(1) PrintStringLocate("CHANGE: MON " , 16 , 0x00, 0x00);/設(shè)置月 if(KEY3Read() RealDate.month +; if(KEY4Read() RealDate.month -; if(Re

13、alDate.month > 12) RealDate.month = January; SetDate(&RealDate); sprintf(char *)DisplayBuff, "%4d-%02d-%02d",RealDate.year, (u8)RealDate.month, RealDate.day); PrintStringLocate(DisplayBuff, 16,0x02,0x05); if(KEY2PressDown() break; break; case 3: while(1) PrintStringLocate("CHAN

14、GE: DAY " , 16 , 0x00, 0x00); /設(shè)置日 if(KEY3Read() RealDate.day +; if(RealDate.month=1|RealDate.month=3|RealDate.month=5|RealDate.month=7|RealDate.month=8|RealDate.month=10|RealDate.month=12) if(RealDate.day>31) RealDate.day=1; if(RealDate.month=4|RealDate.month=6|RealDate.month=9|RealDate.mon

15、th=11) if(RealDate.day>30) RealDate.day=1; if(RealDate.year%400=0)|(RealDate.year%4=0&&RealDate.year%100!=0) if(RealDate.month=2) if(RealDate.day>29) RealDate.day=1; else if(RealDate.month=2) if(RealDate.day>28) RealDate.day=1; if(KEY4Read() RealDate.day -; if(RealDate.month=1|RealD

16、ate.month=3|RealDate.month=5|RealDate.month=7|RealDate.month=8|RealDate.month=10|RealDate.month=12) if(RealDate.day<1) RealDate.day=31; if(RealDate.month=4|RealDate.month=6|RealDate.month=9|RealDate.month=11) if(RealDate.day<1) RealDate.day=30; if(RealDate.year%400=0)|(RealDate.year%4=0&&a

17、mp;RealDate.year%100!=0) if(RealDate.month=2) if(RealDate.day<1) RealDate.day=29; else if(RealDate.month=2) if(RealDate.day<1) RealDate.day=28; SetDate(&RealDate); sprintf(char *)DisplayBuff, "%4d-%02d-%02d",RealDate.year, (u8)RealDate.month, RealDate.day); PrintStringLocate(Disp

18、layBuff, 16,0x02,0x05); if(KEY2PressDown() break; break; case 4: while(1) PrintStringLocate("CHANGE: HOUR " , 16 , 0x00, 0x00); /設(shè)置時 if(KEY3Read() RealTime.hour +; if(KEY4Read() RealTime.hour -; if(RealTime.hour > 23) RealTime.hour = 1; SetTime(&RealTime); sprintf(char *)DisplayBuff

19、, "%02d:%02d:%02d",RealTime.hour,RealTime.minute,RealTime.second); PrintStringLocate(DisplayBuff, 16,0x04,0x05); if(KEY2PressDown() break; break; case 5: while(1) PrintStringLocate("CHANGE: MIN " , 16 , 0x00, 0x00); /分 if(KEY3Read() RealTime.minute +; if(KEY4Read() RealTime.minut

20、e -; if(RealTime.minute > 59) RealTime.minute = 1; SetTime(&RealTime); sprintf(char *)DisplayBuff, "%02d:%02d:%02d",RealTime.hour,RealTime.minute,RealTime.second); PrintStringLocate(DisplayBuff, 16,0x04,0x05); if(KEY2PressDown() break; break; case 6: while(1) PrintStringLocate("

21、;CHANGE: SEC " , 16 , 0x00, 0x00); /秒 if(KEY3Read() RealTime.second = 0; if(KEY4Read() RealTime.second = 0; SetTime(&RealTime); sprintf(char *)DisplayBuff, "%02d:%02d:%02d",RealTime.hour,RealTime.minute,RealTime.second); PrintStringLocate(DisplayBuff, 16,0x04,0x05); if(KEY2PressDo

22、wn() break; break; default: break; if(KEY1PressDown()&&KEY1PressDown()/確定鍵 WriteData(0,0,132,0,8,0); / break; MEMS_Get(&mems); /DelayMs(80); switch(flag.x)/加速度x坐標 case 0:if(mems.x>85&&mems.x<195) flag.x=1;dir1+; else if(mems.x>195&&(255-mems.x)>85) flag.x=2;di

23、r1+; else flag.x=0;break; case 1:if(mems.x>195&&(255-mems.x)>85) flag.x=2;dir1+; else flag.x=0;break; case 2:if(mems.x>85&&mems.x<195) dir1+;break; default:break; switch(flag.y)/加速度y坐標 case 0:if(mems.y>83&&mems.y<195) flag.y=1;dir2+; else if(mems.y>195&am

24、p;&(255-mems.y)>83) flag.y=2;dir2+; else flag.y=0;break; case 1:if(mems.y>195&&(255-mems.y)>83) flag.y=2;dir2+; else flag.y=0;break; case 2:if(mems.y>83&&mems.y<195) dir2+;break; default:break; switch(flag.z)/加速度z坐標 case 0:if(mems.z>113&&mems.z<177) f

25、lag.z=1;dir3+; else if(mems.z>177&&(255-mems.z)>113) flag.z=2;dir3+; else flag.z=0;break; case 1:if(mems.z>177&&(255-mems.z)>113) flag.z=2;dir3+; else flag.z=0;break; case 2:if(mems.z>113&&mems.z<177) dir3+;break; default:break; if(dir1=2|dir2=2|dir3=2) / /B

26、uzzOn(); /DelayMs(500); /BuzzOff(); dir1=dir2=dir3=0; /DelayMs(20000); full_clr(0x00); break; /DelayMs(8000); /*-溫度-*/ while(1) while(DS18B20_Init()/初始化DS18B20,兼檢測18B20 printf("DS18B20 Failed!rn"); /DelayMs(5000); printf("Please Check!rn"); /DelayMs(5000);/printf("DS18B20 Re

27、ady!"); /DelayMs(2000); temperature(); MEMS_Get(&mems); /DelayMs(80); switch(flag.x)/加速度x坐標 case 0:if(mems.x>85&&mems.x<195) flag.x=1;dir11+; else if(mems.x>195&&(255-mems.x)>85) flag.x=2;dir11+; else flag.x=0;break; case 1:if(mems.x>195&&(255-mems.x)&

28、gt;85) flag.x=2;dir11+; else flag.x=0;break; case 2:if(mems.x>85&&mems.x<195) dir11+;break; default:break; switch(flag.y)/加速度y坐標 case 0:if(mems.y>83&&mems.y<195) flag.y=1;dir22+; else if(mems.y>195&&(255-mems.y)>83) flag.y=2;dir22+; else flag.y=0;break; case

29、 1:if(mems.y>195&&(255-mems.y)>83) flag.y=2;dir22+; else flag.y=0;break; case 2:if(mems.y>83&&mems.y<195) dir22+;break; default:break; switch(flag.z)/加速度z坐標 case 0:if(mems.z>113&&mems.z<177) flag.z=1;dir33+; else if(mems.z>177&&(255-mems.z)>113

30、) flag.z=2;dir33+; else flag.z=0;break; case 1:if(mems.z>177&&(255-mems.z)>113) flag.z=2;dir33+; else flag.z=0;break; case 2:if(mems.z>113&&mems.z<177) dir33+;break; default:break; if(dir11=2|dir22=2|dir33=2) / /BuzzOn(); /DelayMs(500); /BuzzOff(); dir11=dir22=dir33=0; /D

31、elayMs(20000); full_clr(0x00); break; /*函數(shù)名: putchar*功能說明:重定義putc函數(shù),這樣可以使用printf函數(shù)從串口3打印輸出*/int putchar(int c) u8 s2 = 0x00, 0x00; s0 = (u8)c; /*OLED輸出*/ PrintString(s,16); return c; #ifdef USE_FULL_ASSERT/* * 函數(shù)名稱assert_failed * 函數(shù)說明 報告在檢查參數(shù)發(fā)生錯誤時的源文件名和錯誤行數(shù) * 輸入?yún)?shù) file: 源文件名 line: 錯誤所在行數(shù) * 輸出參數(shù) 無 *

32、返回參數(shù) 無 */void assert_failed(uint8_t* file, uint32_t line) /* 用戶可以增加自己的代碼用于報告錯誤的文件名和所在行數(shù), 例如:printf("錯誤參數(shù)值: 文件名 %s 在 %d行rn", file, line) */ /* 無限循環(huán) */ while (1) #endif/*文件結(jié)束*/temperature.c#include "include.h"#include "OLED.h"#include "DS18B20.h"#include <str

33、ing.h>unsigned char symbol_1=0x06,0x09,0x09,0xE6,0xF8,0x0C,0x04,0x02,0x02,0x02,0x02,0x02,0x04,0x1E,0x00,0x00,0x00,0x00,0x00,0x07,0x1F,0x30,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10,0x00,0x00;/unsigned char symbol_2=0x00,0x00,0x18,0x24,0x24,0x18,0x02,0xFE,0x82,0x82,0x82,0xE2,0x06,0x1E,0x00,0x00,0x00

34、,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x03,0x00,0x00,0x00,0x00;/float temper = 0.0;float temper_2=0.0;void USART2_Init(void) GPIO_InitTypeDef GPIO_InitStructure; /* 開啟相應部件的時鐘 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOD, ENABLE); /* 將USART Tx的GPIO配置為推挽復用模式 */ GPIO

35、_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); /* 將USART Rx的GPIO配置為浮空輸入模式*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATI

36、NG; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_PinRemapConfig (GPIO_Remap_USART2 ,ENABLE);void USART2_Configuration(u32 BaudRate) USART_InitTypeDef USART_InitStructure; /* 開啟相應部件的時鐘 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); /* 第4步:配置USART參數(shù) - BaudRate - Word Length = 8 Bits - On

37、e Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitStructure.USART_BaudRate = BaudRate; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_

38、Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, &USART_InitStructure); /* 第5步:使能 USART, 配置完畢 */ USART_Cmd(USART2, ENABLE); /* CPU的小缺陷:串口配置好,如果直接Send,則第1個字節(jié)發(fā)送不出去 如下語句解決第1個字節(jié)無法正確發(fā)送出去的問題 */ USART_ClearFlag(USART2, USART_FLAG_TC); /* 清發(fā)送外城標志,Transmission Complete flag */void temperature(void) int i=0; u8 str16; /temper = DS18B20_Get_Temp(); /temper_2=temper*9.0/5.0+32.0; PrintStringLocate("Temperature : ",Asci

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論