采用DS18B20作為溫度傳感器實(shí)時(shí)采集溫度信息,利用A/D轉(zhuǎn)換器采集當(dāng)前模擬電壓信息,同時(shí)訪問DS1302(或者RTC)獲取當(dāng)前時(shí)鐘,將以上信息在屏幕上加以顯示,并將數(shù)據(jù)存儲在EEPROM中,如有需要,可以根據(jù)時(shí)間調(diào)出相應(yīng)歷史記錄。
采用stm32f103x作為核心控制元件,采用 DS18B20作為溫度傳感器實(shí)時(shí)采集溫度信息,用手加熱三極管即可監(jiān)測到溫度的變化,其次利用AD讀取當(dāng)前模擬輸入電壓量,旋轉(zhuǎn)按鈕即可檢測到電壓的變化;同時(shí)利用RTC獲取到時(shí)鐘信號,并利用串口進(jìn)行顯示,上述功能均已實(shí)現(xiàn)。其中EEPROM數(shù)據(jù)存儲部分,因時(shí)間有限僅將時(shí)間信息(8位)作存讀功能,兩個按鍵交替按,按下第一個按鍵可實(shí)現(xiàn)一次存儲, 按下第二個按鍵可實(shí)現(xiàn)一次讀取。 此次試驗(yàn)需要存讀的數(shù)據(jù)共13位,使用 16 位子地址時(shí)要在程序開頭定義條件匯編符號 SUBA16 ,還要定義一個變量 SUBA1 ,因此 SUBA1、SUBA 就構(gòu)成了 16 位子址址。其中 SUBA1 為高 8 位,在用戶程序開頭定義$SET (SUBA16)即可使用 16 位子地址,若沒有此定義則只使用 8 位子地址。 - 電路原理圖
- stm32f103x系統(tǒng)電路圖

連線方式:PA0接AD轉(zhuǎn)換AO,PB8接第一個按鍵,PB9接第二個按鍵
單片機(jī)源程序如下:
- /*******************************************************************************
- * 標(biāo)題: 試驗(yàn)數(shù)碼管上顯示溫度 *
- * *
- *********************************************************************************
- * 目的: 1.通過本例程了解 DLASS18b20的基本原理和使用 ,理解并掌握18B20驅(qū)動程序的編寫 *
- * 2.了解掌握“一線”總線接口的工作原理及一般編程方法。 *
- * 現(xiàn)象: 插上18B20 觀察數(shù)碼管的實(shí)際溫度顯示
- * 連接: 用排線將JP8(P0口) 與 J12 連接在數(shù)碼管上可以看溫度顯示 *
- * *
- * 建議: 不要延時(shí)等待,用定時(shí)中斷實(shí)現(xiàn)時(shí)序,來提高程序處理速度 *
- * 請學(xué)員認(rèn)真消化本例程,懂DLASS18b20在C語言中的操作 *
- ********************************************************************************/
- #include "stm32f10x_lib.h"
- /******************************** 宏定義 ------------------------------------*/
- #define ADC1_DR_Address ((u32)0x4001244C)
- #define ADC3_DR_Address ((u32)0x40013C4C)
- #define LCD_RS(x) x ? GPIO_SetBits(GPIOB, RS): GPIO_ResetBits(GPIOB, RS)
- #define LCD_RW(x) x ? GPIO_SetBits(GPIOB, RW): GPIO_ResetBits(GPIOB, RW)
- #define LCD_EN(x) x ? GPIO_SetBits(GPIOB, EN): GPIO_ResetBits(GPIOB, EN)
- #define GPIOx GPIOA
- #define RCC_APB2Periph_GPIOx RCC_APB2Periph_GPIOA
- #define GPIO_RxPin GPIO_Pin_10
- #define GPIO_TxPin GPIO_Pin_9
- #define USARTx USART1
- /********************************硬件接口定義*********************************/
- #define LS138A GPIO_Pin_5 //=P2^2; //管腳定義
- #define LS138B GPIO_Pin_4 //=P2^3;
- #define LS138C GPIO_Pin_3 //=P2^4;
- #define RS GPIO_Pin_1 //P2^6;
- #define RW GPIO_Pin_2 //P2^5;
- #define EN GPIO_Pin_0 //P2^7;
- #define Save GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_8)//P1^0; //保存
- #define Read GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_9)//P1^1; //讀取
- #define LS138a(x) x ? GPIO_SetBits(GPIOB, LS138A): GPIO_ResetBits(GPIOB, LS138A)
- #define LS138b(x) x ? GPIO_SetBits(GPIOB, LS138B): GPIO_ResetBits(GPIOB, LS138B)
- #define LS138c(x) x ? GPIO_SetBits(GPIOB, LS138C): GPIO_ResetBits(GPIOB, LS138C)
- #define AT24C02 0xa0 //AT24C02 地址
- /******************************** 變量定義 ---------------------------------------------------------*/
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- ErrorStatus HSEStartUpStatus;
- ADC_InitTypeDef ADC_InitStructure;
- DMA_InitTypeDef DMA_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- EXTI_InitTypeDef EXTI_InitStructure;
- //此表為 LED 的字模, 共陰數(shù)碼管 0-9 -
- unsigned char Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
- u32 LedOut[7],LedNumVal,LedNumVall;
- u8 Count;
- static vu32 TimingDelay;
- vu16 ADC1ConvertedValue = 0, ADC3ConvertedValue = 0;
- unsigned int jj = 0;
- unsigned char str1[]={0,0};
- u32 Uart1_PutChar(u8 ch);
- void Uart1_PutString(u8* buf , u8 len);
- typedef unsigned char BYTE;
- typedef unsigned char BOOL;
- vu32 TimeDisplay = 0;
- vu16 ADC2ConvertedValue;
- unsigned char Count1 , Count2 , save_flag = 1 , read_flag = 1;
- unsigned long D[16],str2[8],NumVal;
- unsigned long NumVall;
- unsigned int USEC;
- /*********************************聲明函數(shù) -----------------------------------------------*/
- void RCC_Configuration(void);
- void NVIC_Configuration(void);
- void SysTick_Configuration(void);
- void HC595SendData(unsigned char SendVal);
- void NOP(void);
- extern GetTemp(void); //聲明引用外部函數(shù)
- extern unsigned int Temperature; // 聲明引用外部變量
- void delay(vu32 nCount);
- void Tim_Setting(void);
- void Delay_us(u32 nTime);
- void RTC_Configuration(void);
- void Time_Display(u32 TimeVar);
- u32 Time_Regulate(void);
- void Time_Adjust(void);
- void Time_Show(void);
- u32 THHH = 0, THHL = 0, TMMH = 0, TMML = 0, TSSH = 0, TSSL = 0;
- /*******************************************延時(shí)函數(shù)**********************************/
- void delay(vu32 nCount)
- {
- int i = 0;
- for(; nCount != 0; nCount--);
- //for(;i < 1000;i++);
- }
- main()
- {
- unsigned char i;
- unsigned char pDat[8];
- unsigned char pDat1[8];
- #ifdef DEBUG
- debug(); //在線調(diào)試使用
- #endif
-
- RCC_Configuration(); //系統(tǒng)時(shí)鐘配置函數(shù)
-
- NVIC_Configuration(); //NVIC配置函數(shù)
-
- SysTick_Configuration(); //Systick配置函數(shù)
-
- Tim_Setting(); //調(diào)用事件設(shè)定函數(shù)
- //啟動GPIO模塊時(shí)鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB1Periph_TIM2 | RCC_APB2Periph_AFIO, ENABLE);
- //把調(diào)試設(shè)置普通IO口
- GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //所有GPIO為同一類型端口
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //輸出的最大頻率為50HZ
- GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA端口
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB端口
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //將DS18B20設(shè)為16腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //開漏輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //輸出的最大頻率為50HZ
- GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA端口
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 ;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //開漏輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //輸出的最大頻率為50HZ
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOA端口
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 |GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; //所有GPIO為同一類型端口
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //輸出的最大頻率為50HZ
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB端口
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //輸出的最大頻率為50HZ
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOA端口
- //配置USARTx_Tx為復(fù)合推挽輸出
- GPIO_InitStructure.GPIO_Pin = GPIO_TxPin;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOx, &GPIO_InitStructure);
- //配置 USARTx_Rx 為浮空輸入
- GPIO_InitStructure.GPIO_Pin = GPIO_RxPin;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOx, &GPIO_InitStructure);
-
- GPIO_Write(GPIOA,0xffff); //將GPIOA 16個端口全部置為高電平
- GPIO_Write(GPIOB,0xffff); //將GPIOB 16個端口全部置為高電
-
- if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
- {
- //配置RTC
- RTC_Configuration();
- /* Adjust time by values entred by the user on the hyperterminal */
- Time_Adjust();
- BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
- }
- else
- {
- /* Check if the Power On Reset flag is set */
- if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
- // {
- /* Wait for RTC registers synchronization */
- RTC_WaitForSynchro();
- /* Enable the RTC Second */
- RTC_ITConfig(RTC_IT_SEC, ENABLE);
- /* Wait until last write operation on RTC registers has finished */
- RTC_WaitForLastTask();
- }
- #ifdef RTCClockOutput_Enable
- /* Enable PWR and BKP clocks */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
- /* Allow access to BKP Domain */
- PWR_BackupAccessCmd(ENABLE);
- /* Disable the Tamper Pin */
- BKP_TamperPinCmd(DISABLE); /* To output RTCCLK/64 on Tamper pin, the tamper
- functionality must be disabled */
- /* Enable RTC Clock Output on Tamper Pin */
- BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);
- #endif
- //清除復(fù)位標(biāo)志
- RCC_ClearFlag();
- //串口配置: 波特率 115200 數(shù)據(jù)位 8 停止位 1 奇偶位 NONE
- USART_InitStructure.USART_BaudRate = 115200;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- USART_InitStructure.USART_Parity = USART_Parity_No ;
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
- //初始化串口
- USART_Init(USARTx, &USART_InitStructure);
- //啟動串口
- USART_Cmd(USARTx, ENABLE);
-
- //DMA1 通道配置
- DMA_DeInit(DMA1_Channel1); //設(shè)置成CH1 DMA中包含了7個通道(CH1-CH7)
- DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //給DMA起始地址
- DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC1ConvertedValue;//DMA連接在內(nèi)存中的變量地址
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //設(shè)置DMA傳輸方向 單向傳輸
- DMA_InitStructure.DMA_BufferSize = 1; //設(shè)置DMA在傳輸時(shí)緩沖區(qū)的長度
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //設(shè)置DMA的外設(shè)遞增模式
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//設(shè)置DMA的內(nèi)存遞增模式
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//DMA在訪問時(shí)每次操作的數(shù)據(jù)長度
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
- DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA的傳輸模式,連續(xù)不斷的循環(huán)模式
- DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA的優(yōu)先級別:可以分為4級
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//DMA的2個memory中的變量互相訪問的
- DMA_Init(DMA1_Channel1, &DMA_InitStructure); //DMA整個模塊初始化
- //開啟DMA通道1
- DMA_Cmd(DMA1_Channel1, ENABLE);
- // ADC1 配置
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1工作在獨(dú)立模式
- ADC_InitStructure.ADC_ScanConvMode = ENABLE;//使能掃描
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;;//ADC轉(zhuǎn)換工作在連續(xù)模式
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//由軟件控制轉(zhuǎn)換
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//轉(zhuǎn)換數(shù)據(jù)右對齊
- ADC_InitStructure.ADC_NbrOfChannel = 14;//轉(zhuǎn)換通道為通道1
- ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC
- //ADC1選擇信道14,音序器等級1,采樣時(shí)間239.5個周期
- ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_28Cycles5);
- //使能ADC1模塊DMA
- ADC_DMACmd(ADC1, ENABLE);
- //打開ADC1
- ADC_Cmd(ADC1, ENABLE);
- //重置ADC1校準(zhǔn)寄存器
- ADC_ResetCalibration(ADC1);
- //等待ADC1校準(zhǔn)重置完成
- while(ADC_GetResetCalibrationStatus(ADC1));
- //開始ADC1校準(zhǔn)
- ADC_StartCalibration(ADC1);
- //等待ADC1校準(zhǔn)完成
- while(ADC_GetCalibrationStatus(ADC1));
- //使能ADC1軟件開始轉(zhuǎn)換
- ADC_SoftwareStartConvCmd(ADC1, ENABLE);
- while(1)
- {
-
- GetTemp();
- Time_Display(RTC_GetCounter());
- /********以下將讀18b20的數(shù)據(jù)送到LED數(shù)碼管顯示*************/
- LedNumVal=Temperature; //把實(shí)際溫度送到LedNumVal變量中
- LedNumVall=(u16)ADC1ConvertedValue*3300/4096;
-
- str1[0]=LedNumVal%100/10+'0';
- str1[1]=LedNumVal%10+'0';
- if(Save == 0 && save_flag)
- {
- Uart1_PutString("\r\n當(dāng)前時(shí)間為:" ,10 );
- Uart1_PutChar(THHH);
- delay(0x0fffff);
- Uart1_PutChar(THHL);
- delay(0xfffff);
- Uart1_PutChar(58);
- delay(0xfffff);
- Uart1_PutChar(TMMH);
- delay(0xfffff);
- Uart1_PutChar(TMML);
- delay(0xfffff);
- Uart1_PutChar(58);
- delay(0xfffff);
- Uart1_PutChar(TSSH);
- delay(0xfffff);
- Uart1_PutChar(TSSL);
- delay(0xfffff);
- Uart1_PutString("\r\n當(dāng)前溫度值為:" ,10 );
- for(i=0; i<2; i++)
- {
- Uart1_PutChar(str1[i]);
- delay(0xfffff);
- }
- Uart1_PutString("\r\n當(dāng)前電壓值為:" ,10 );
- Uart1_PutChar(LedNumVall%10000/1000+48);
- delay(0x00fff);
- Uart1_PutChar(46);
- delay(0x00fff);
- Uart1_PutChar(LedNumVall%1000/100+48);
- delay(0x00fff);
- pDat[0]=THHH;
- pDat[1]=THHL;
- pDat[2]=58;
- pDat[3]=TMMH;
- pDat[4]=TMML;
- pDat[5]=58;
- pDat[6]=TSSH;
- pDat[7]=TSSL;
- // pDat1[8]=str1[0];
- // pDat1[9]=str1[1];
- // pDat1[10]=LedNumVall%10000/1000+48;
- // pDat1[11]=46;
- // pDat1[12]=LedNumVall%1000/100+48;
-
- ISendStr(AT24C02, 0 , &pDat[0], 8);
- read_flag = 1;
- save_flag = 0;
- }
- if(Read == 0 && read_flag)
- {
- IRcvStr(AT24C02, 0 , &pDat, 8);
- Uart1_PutString(pDat ,8 );
- read_flag = 0;
- save_flag = 1;
- }
- }
-
- }
- void Uart1_PutString(u8* buf , u8 len)
- { u8 i;
- for(i=0;i<len;i++)
- {
- Uart1_PutChar(*buf++);
- }
- }
- //發(fā)送一個字符
- /*******************************************************************************
- * Name : Uart1_PutChar
- * Deion : printf a char to the uart.
- *******************************************************************************/
- u32 Uart1_PutChar(u8 ch)
- {
- /* Write a character to the USART */
- USART_SendData(USART1, (u8) ch);
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
- {
- }
- return ch;
-
- }
- void RTC_Configuration(void)
- {
- //啟用PWR和BKP的時(shí)鐘(from APB1)
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
- //后備域解鎖
- PWR_BackupAccessCmd(ENABLE);
- //備份寄存器模塊復(fù)位
- BKP_DeInit();
- /* Enable LSE */
- RCC_LSEConfig(RCC_LSE_ON);
-
- //等待穩(wěn)定
- while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
- {}
- //RTC時(shí)鐘源配置成LSE(外部32.768K)
- RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
- //RTC開啟
- RCC_RTCCLKCmd(ENABLE);
- //開啟后需要等待APB1時(shí)鐘與RTC時(shí)鐘同步,才能讀寫寄存器
- RTC_WaitForSynchro();
- //讀寫寄存器前,要確定上一個操作已經(jīng)結(jié)束
- RTC_WaitForLastTask();
-
- //使能秒中斷
- RTC_ITConfig(RTC_IT_SEC, ENABLE);
- //讀寫寄存器前,要確定上一個操作已經(jīng)結(jié)束
- RTC_WaitForLastTask();
- //設(shè)置RTC分頻器,使RTC時(shí)鐘為1Hz
- //RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)
- RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
- //等待寄存器寫入完成
- RTC_WaitForLastTask();
- //等待寫入完成
- RTC_WaitForLastTask();
- }
- /*******************************************************************************
- * Function Name : Time_Display
- * Description : Displays the current time.
- * Input : - TimeVar: RTC counter value.
- * Output : None
- * Return : None
- *******************************************************************************/
- void Time_Display(u32 TimeVar)
- {
- /* Compute hours */
- THHH = (TimeVar / 3600)/10+48;
- THHL = (TimeVar / 3600)%10+48;
- /* Compute minutes */
- TMMH = ((TimeVar % 3600) / 60)/10+48;
- TMML = ((TimeVar % 3600) / 60)%10+48;
- /* Compute seconds */
- TSSH = ((TimeVar % 3600) % 60)/10+48;
- TSSL = ((TimeVar % 3600) % 60)%10+48;
- }
- void Time_Adjust(void)
- {
- /* Wait until last write operation on RTC registers has finished */
- RTC_WaitForLastTask();
- /* Change the current time */
- RTC_SetCounter(12*3600 + 2*60 + 0);
- /* Wait until last write operation on RTC registers has finished */
- RTC_WaitForLastTask();
- }
- void Tim_Setting(void)
- {
- /*-----------------------------------------------------------------------------*/
- /***772M下定時(shí)值的計(jì)算((1+預(yù)分頻TIM_Prescaler)/72*(1+定時(shí)周期TIM_Period))*/
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //配置RCC,使能TIMx
- /* Time Base configuration */
- TIM_TimeBaseStructure.TIM_Prescaler = 7199; //時(shí)鐘預(yù)分頻數(shù) 例如:時(shí)鐘頻率=72/(時(shí)鐘預(yù)分頻+1)
-
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; ////定時(shí)器模式 向上計(jì)數(shù)
- TIM_TimeBaseStructure.TIM_Period = 9999;//自動重裝載寄存器周期的值(定時(shí)時(shí)間)累計(jì) 0xFFFF個頻率后產(chǎn)生個更新或者中斷(也是說定時(shí)時(shí)間到)
- TIM_TimeBaseStructure.TIM_ClockDivision = 0; ////時(shí)間分割值
- TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //初始化定時(shí)器2
- TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打開中斷 溢出中斷
- TIM_Cmd(TIM2, ENABLE); //打開定時(shí)器
- /* Main Output Enable */
- TIM_CtrlPWMOutputs(TIM1, ENABLE);
- }
- /******************************************************************************
- *
- * 精準(zhǔn)延時(shí)函數(shù)
- *
- **********************************************************************************/
- void Delay_us(u32 nTime)
- {
- /* Enable the SysTick Counter */
- SysTick_CounterCmd(SysTick_Counter_Enable);
-
- TimingDelay = nTime;
- while(TimingDelay != 0);
- /* Disable SysTick Counter */
- SysTick_CounterCmd(SysTick_Counter_Disable);
- /* Clear SysTick Counter */
- SysTick_CounterCmd(SysTick_Counter_Clear);
- }
- /*******************************************************************************
- *
- * 定時(shí)中斷處理函數(shù)
- *
- *******************************************************************************/
- void TIM2_IRQHandler(void)
- {
-
- if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) //檢測制定的中斷是否發(fā)生
- {
- TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中斷處理位。
- Count++ ;
-
- }
- }
- /*******************************************************************************
- *
- * 系統(tǒng)Systick 中斷處理函數(shù)
- *
- *******************************************************************************/
- void SysTick_Handler(void)
- {
- if (TimingDelay != 0x00)
- {
- TimingDelay--;
-
- }
- if(USEC++ == 1000000)
- { USEC = 0;
- Count1++;
- }
- }
- /*******************************************************************************
- * 配置RCC
- *******************************************************************************/
- void RCC_Configuration(void)
- {
- //復(fù)位RCC外部設(shè)備寄存器到默認(rèn)值
- RCC_DeInit();
- //打開外部高速晶振
- RCC_HSEConfig(RCC_HSE_ON);
- //等待外部高速時(shí)鐘準(zhǔn)備好
- HSEStartUpStatus = RCC_WaitForHSEStartUp();
- if(HSEStartUpStatus == SUCCESS) //外部高速時(shí)鐘已經(jīng)準(zhǔn)別好
- {
- //開啟FLASH的預(yù)取功能
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
- //FLASH延遲2個周期
- FLASH_SetLatency(FLASH_Latency_2);
-
- //配置AHB(HCLK)時(shí)鐘=SYSCLK
- RCC_HCLKConfig(RCC_SYSCLK_Div1);
-
- //配置APB2(PCLK2)鐘=AHB時(shí)鐘
- RCC_PCLK2Config(RCC_HCLK_Div1);
- //配置APB1(PCLK1)鐘=AHB 1/2時(shí)鐘
- RCC_PCLK1Config(RCC_HCLK_Div2);
- //配置ADC時(shí)鐘=PCLK2 1/4
- RCC_ADCCLKConfig(RCC_PCLK2_Div4);
- //配置PLL時(shí)鐘 == 外部高速晶體時(shí)鐘*9 PLLCLK = 8MHz * 9 = 72 MHz
- RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
- //配置ADC時(shí)鐘= PCLK2/4
- RCC_ADCCLKConfig(RCC_PCLK2_Div4);
- //使能PLL時(shí)鐘
- RCC_PLLCmd(ENABLE);
- //等待PLL時(shí)鐘就緒
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
- {
- }
- //配置系統(tǒng)時(shí)鐘 = PLL時(shí)鐘
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
- //檢查PLL時(shí)鐘是否作為系統(tǒng)時(shí)鐘
- while(RCC_GetSYSCLKSource() != 0x08)
- {
- }
- }
- // 開啟DMA1時(shí)鐘 Enable
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
- //開啟ADC1時(shí)鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);
- //下面是給各模塊開啟時(shí)鐘
- //啟動GPIO
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB ,ENABLE);
- //啟動AFIO
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
- //啟動DMA時(shí)鐘
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
- //啟動ADC1時(shí)鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
- //開啟串口時(shí)鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
- }
- void SysTick_Configuration(void)
- {
- /* 設(shè)置AHB時(shí)鐘為SysTick時(shí)鐘*/
- SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //采用8分頻
-
- /* 設(shè)置SysTicks中斷搶占優(yōu)先級 3, 從優(yōu)先級0*/
- NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 3, 0);
-
- /* 每1ms發(fā)生一次SysTick中斷 在72M的時(shí)鐘下*/
- SysTick_SetReload(9); //該參數(shù)取值必須在1和0x00FFFFFF之間 9/(72000 000/8)= 1us 1微秒計(jì)數(shù)
-
- /* 開啟SysTick中斷 */
- SysTick_ITConfig(ENABLE);
- }
- void ADC1_2_IRQHandler(void)
- {
- ADC1ConvertedValue = ADC_GetConversionValue(ADC1);
- }
- /*******************************************************************************
- * NVIC配置函數(shù)
- *******************************************************************************/
- void NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- #ifdef VECT_TAB_RAM
- /* Set the Vector Table base location at 0x20000000 */
- NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
- #else /* VECT_TAB_FLASH */
- /* Set the Vector Table base location at 0x08000000 */
- NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
- #endif
-
- /* 開啟定時(shí)器2 */
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- /* Configure and enable ADC interrupt */
- NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQChannel;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQChannel;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
DS18B20 溫度檢測.7z
(3.55 MB, 下載次數(shù): 207)
2019-4-29 18:25 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|