嵌入式系統(tǒng)課程設(shè)計(溫度檢測報警系統(tǒng))_第1頁
嵌入式系統(tǒng)課程設(shè)計(溫度檢測報警系統(tǒng))_第2頁
嵌入式系統(tǒng)課程設(shè)計(溫度檢測報警系統(tǒng))_第3頁
嵌入式系統(tǒng)課程設(shè)計(溫度檢測報警系統(tǒng))_第4頁
嵌入式系統(tǒng)課程設(shè)計(溫度檢測報警系統(tǒng))_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 嵌入式系統(tǒng)課程設(shè)計 姓名: 班級: 學(xué)號: 目錄:1 系統(tǒng)要求2 設(shè)計方案三程序流程圖四軟件設(shè)計五課程總結(jié)與個人體會一、系統(tǒng)要求 使用STM32F103作為主控CPU設(shè)計一個溫度綜合測控系統(tǒng),具體要求: 1、使用熱敏電阻或者內(nèi)部集成的溫度傳感器檢測環(huán)境溫度,每0.1秒檢測一次溫度,對檢測到的溫度進行數(shù)字濾波(可以使用平均法)。記錄當(dāng)前的溫度值和時間。 2、使用計算機,通過串行通信獲取STM32F103檢測到的溫度和所對應(yīng)的時間。 3、使用計算機進行時間的設(shè)定。 4、使用計算機進行溫度上限值和下限值的設(shè)定。 5、若超過上限值或者低于下限值,則STM32進行報警提示。2、 設(shè)計方案本次課程設(shè)計的

2、要求是使用STM32F103設(shè)計一個溫度測控系統(tǒng),這款單片機集成了很多的片上資源,功能十分強大,我使用了以下部分來完成課程設(shè)計的要求:1、 STM32F103內(nèi)置了3個12位A/D轉(zhuǎn)換模塊,最快轉(zhuǎn)換時間為1us。本次課程設(shè)計要求進行溫度測定,于是使用了其中一個ADC對片上溫度傳感器的內(nèi)部信號源進行轉(zhuǎn)換。當(dāng)有多個通道需要采集信號時,可以把ADC配置為按一定的順序來對各個通道進行掃描轉(zhuǎn)換,本設(shè)計只采集一個通道的信號,所以不使用掃描轉(zhuǎn)換模式。 本設(shè)計需要循環(huán)采集電壓值,所以使用連續(xù)轉(zhuǎn)換模式。 2、 本次課程設(shè)計還使用到了DMA。DMA是一種高速的數(shù)據(jù)傳輸操作,允許在外部設(shè)備和儲存器之間利用系統(tǒng)總線直

3、接讀寫數(shù)據(jù),不需要微處理器干預(yù)。使能ADC的DMA接口后,DMA控制器把轉(zhuǎn)換值從ADC數(shù)據(jù)寄存器(ADC_DR)中轉(zhuǎn)移到變量ADC_ConvertedValue中,當(dāng)DMA傳輸完成后,在main函數(shù)中使用的ADC_ConvertedValue的內(nèi)容就是ADC轉(zhuǎn)換值了。 3、 STM32內(nèi)部的溫度傳感器和ADCx_IN16輸入通道相連接,此通道把傳感器輸出的電壓值轉(zhuǎn)換成數(shù)字值。STM內(nèi)部的溫度傳感器支持的溫度范圍:-40到125攝氏度。利用下列公式得出溫度 溫度(°C) = (V25 - VSENSE) / Avg_Slope + 25 式中V25是 VSENSE在25攝氏度時的數(shù)值(

4、典型值為1.42V) Avg_Slope是溫度與VSENSE曲線的平均斜率(典型值為4.3mV/C) 利用均值法對轉(zhuǎn)換后的溫度進行濾波,將得到的溫度通過串口輸出。4、 本設(shè)計采用了USART1作為串行通信接口,來進行時間、溫度的傳輸,以及進行時間和溫度上下限的設(shè)定。5、 當(dāng)溫度超過上下限時,開發(fā)板上的燈會相應(yīng)亮起作為警報,使用了GPIO配置引腳。6、 時間計時使用了systick時鐘,并配置其中斷,由此進行一秒定時,實現(xiàn)時鐘的實時顯示。7、 時間設(shè)定部分參考了一個兩位數(shù)字讀取的函數(shù),在進入主循環(huán)前設(shè)定參數(shù),從而避免了在串口中斷中輸入只能一次性輸入所有參數(shù)的弊端。3、 程序流程圖開始各模塊初始化

5、設(shè)定溫度顯示當(dāng)前時間溫度計時一秒是對應(yīng)警告燈亮判斷當(dāng)前溫度是否超過設(shè)定范圍否警告燈全滅4、 軟件設(shè)計用到的庫文件:stm32f10x_adc.h,stm32f10x_dma.h,stm32f10x_flash.h,stm32f10x_gpio.h,stm32f10x_rcc.h,stm32f10x_usart.h,misc.h自己編寫的文件:main.c,stm32f10x_it.c,stm32f10x_it.hmain文件:#include "stm32f10x.h"#include "stdarg.h"#include "stdio.h&q

6、uot;#define ADC1_DR_Address (uint32_t)0x4001244C)extern _IO u16 ADC_ConvertedValue;extern _IO u16 calculated_temp;_IO u16 Current_Temp;unsigned char sec=0,min=0,hour=0;typedef struct int tm_sec; int tm_min; int tm_hour;rtc_time;rtc_time systmtime;_IO u16 upper_bound;_IO u16 lower_bound;/static uint8

7、_t USART_Scanf(uint32_t value);void Time_Regulate(rtc_time *tm);unsigned int TimingDelay=0;unsigned int KEY_ON;unsigned int KEY_OFF;void Delay(u32 count)u32 i=0;for(;i<count;i+);void LED_GPIO_Config()GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); / 使能PD端

8、口時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; /LED0->PD.8端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /IO 速度 50MHzGPIO_Init(GPIOD, &GPIO_InitStructure); /根據(jù)設(shè)定參數(shù)初始化 GPIOB.5void SysTick_Init()if (Sy

9、sTick_Config(SystemCoreClock / 1000)while(1);SysTick->CTRL &= SysTick_CTRL_ENABLE_Msk;/關(guān)閉滴答定時器/SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;/開啟滴答定時器void Delay_ms(_IO u32 nTime)TimingDelay=nTime;SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;/打開while(TimingDelay != 0);void RCC_Config(void)/配置時鐘RCC

10、_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);/DMARCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);/ADC1 and GPIOCRCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);/USARTRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); / 使能PD端口時鐘 LEDvoid GPI

11、O_Config(void)GPIO_InitTypeDef GPIO_InitStructure;/*Config PA.01 (ADC1)*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOC, &GPIO_InitStructure);/*Config LED */GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽輸出GPIO_InitStructure.GPIO_Speed

12、= GPIO_Speed_50MHz; /IO 速度 50MHzGPIO_Init(GPIOD, &GPIO_InitStructure); /根據(jù)設(shè)定參數(shù)初始化 GPIOB.5/*Config USART */* Configure USART1 Tx (PA.09) as alternate function push-pull */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_S

13、peed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* Configure USART1 Rx (PA.10) as input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);void DMA_Config(void)/* DMA channel1 configuration */DMA_In

14、itTypeDef DMA_InitStructure;DMA_DeInit(DMA1_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; /*ADC?*/DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = 16;DMA_InitStructure.DMA_

15、PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStruc

16、ture.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* Enable DMA channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE);void ADC1_Config(void) ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_In

17、itStructure.ADC_ScanConvMode = ENABLE ;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC_InitStructure);/* ADC1 regu

18、lar channel16 configuration */ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_55Cycles5);ADC_TempSensorVrefintCmd(ENABLE);ADC_DMACmd(ADC1, ENABLE);ADC_Cmd(ADC1, ENABLE);ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1);ADC_StartCalibration(ADC1);while(ADC_GetCalib

19、rationStatus(ADC1);ADC_SoftwareStartConvCmd(ADC1, ENABLE);void USART1_Config(void)USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = 9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART

20、_Parity = USART_Parity_No ;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);/ USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);/接收使能/ USART_ITConfig(USART1,USART_IT_TX

21、E,ENABLE);/發(fā)送使能USART_Cmd(USART1,ENABLE); /啟動串口static uint8_t USART_Scanf(uint32_t value)/字符串讀取函數(shù) uint32_t index = 0; uint32_t tmp2 = 0, 0; while (index < 2) /* Loop until RXNE = 1 */while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) =RESET)tmpindex+ = (USART_ReceiveData(USART1);if (tmpindex - 1

22、< 0x30) | (tmpindex -1 > 0x39) printf("nr請輸入有效數(shù)字 0 到 9 ->: ");index-; index = (tmp1 - 0x30) + (tmp0 - 0x30) * 10); /* Checks */ if (index > value) printf("nr請輸入有效數(shù)字 0 到 %d", value);return 0xFF; return index;void Time_Regulate(rtc_time *tm)/時間設(shè)定函數(shù) uint32_t Tmp_HH =0xFF

23、, Tmp_MI = 0xFF, Tmp_SS = 0xFF; uint32_t Tmp_up = 0xff,Tmp_low = 0xff; printf("rn 設(shè)定溫度范圍"); printf("rn 輸入溫度上限: "); while (Tmp_up = 0xFF) Tmp_up = USART_Scanf(99); printf("nr 溫度上限為 %0.2d Cnr", Tmp_up);upper_bound = Tmp_up;/-printf("rn 輸入溫度下限: ");while (Tmp_low

24、= 0xFF)Tmp_low = USART_Scanf(99);printf("nr 溫度下限為 %0.2d Cnr", Tmp_low);lower_bound = Tmp_low;printf("rn 設(shè)定時間 "); Tmp_HH = 0xFF; printf("rn 設(shè)定小時: "); while (Tmp_HH = 0xFF) Tmp_HH = USART_Scanf(23); printf("nr 設(shè)定小時為 %dnr", Tmp_HH ); tm->tm_hour= Tmp_HH; Tmp_M

25、I = 0xFF; printf("rn 設(shè)定分鐘: "); while (Tmp_MI = 0xFF) Tmp_MI = USART_Scanf(59); printf("nr 設(shè)定分鐘為 %dnr", Tmp_MI); tm->tm_min= Tmp_MI; Tmp_SS = 0xFF; printf("rn 設(shè)定秒: "); while (Tmp_SS = 0xFF) Tmp_SS = USART_Scanf(59); printf("nr 設(shè)定秒為 %dnr", Tmp_SS); tm->tm_

26、sec= Tmp_SS;int fputc(int ch, FILE *f)/重定向函數(shù)USART_SendData(USART1, (unsigned char) ch);/ while (!(USART1->SR & USART_FLAG_TXE);while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);return (ch);/*主函數(shù)*/int main(void)#ifdef DEBUG#endifSysTick_Init();LED_GPIO_Config();RCC_Config();GPIO_Config()

27、;DMA_Config();ADC1_Config();USART1_Config();Delay(5000);Time_Regulate(&systmtime);GPIO_SetBits(GPIOD, GPIO_Pin_8);GPIO_SetBits(GPIOD, GPIO_Pin_9);GPIO_SetBits(GPIOD, GPIO_Pin_10);GPIO_SetBits(GPIOD, GPIO_Pin_11);sec=systmtime.tm_sec;min=systmtime.tm_min;hour=systmtime.tm_hour;while(1) sec+;if(se

28、c=60) sec=0;min+;if(min=60)min=0;hour+;if(hour=24)hour=0;printf("rn 當(dāng)前時間: %d :%d :%d rn", hour,min,sec);printf("rn 當(dāng)前溫度: %02d C 溫度上限:%02d C 溫度下限:%02d C rn",Average_Temp,upper_bound,lower_bound);GPIO_SetBits(GPIOD, GPIO_Pin_8);GPIO_SetBits(GPIOD, GPIO_Pin_9);GPIO_SetBits(GPIOD, GP

29、IO_Pin_10);GPIO_SetBits(GPIOD, GPIO_Pin_11); if(int)Current_Temp) > (int)upper_bound)GPIO_ResetBits(GPIOD, GPIO_Pin_8);else if(int)Current_Temp) < (int)lower_bound)GPIO_ResetBits(GPIOD, GPIO_Pin_11);elseGPIO_SetBits(GPIOD, GPIO_Pin_8);GPIO_SetBits(GPIOD, GPIO_Pin_9);GPIO_SetBits(GPIOD, GPIO_Pi

30、n_10);GPIO_SetBits(GPIOD, GPIO_Pin_11);Delay_ms(1000);stm32f10x_it.c文件:/* Includes -*/#include "stm32f10x_it.h"/* Private functions -*/void display(void)unsigned char ad_data,ad_value_max,ad_value_min;ad_data=Current_Temp;if(ad_sample_cnt=0)ad_value_max=ad_data;ad_value_min=ad_data; else i

31、f(ad_data<ad_value_min)ad_value_min=ad_data;else if(ad_data>ad_value_max)ad_value_max=ad_data;ad_value_sum+=ad_data;ad_sample_cnt+;if(ad_sample_cnt=10)ad_value_sum-=ad_value_min;ad_value_sum-=ad_value_max;ad_value_sum/=8;calculated_temp=ad_value_sum;ad_sample_cnt=0;ad_value_min=0;ad_value_max=0;void SysTick_Handler(void)TimingDelay-;ADC_tempValueLocal = ADC_ConvertedValue;/printf("n %02d n, ADC_ConvertedValue");Current_Temp=(V25-ADC_tempValueLocal)/Avg_Slope+25; temp_sum+=Current_Temp;temp_cnt+;if(temp_cnt>=10)temp_c

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論