久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9469|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

STM32+DS18B20溫度監(jiān)測實(shí)驗(yàn)設(shè)計(jì)方案思路+程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:524418 發(fā)表于 2019-4-29 14:12 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
  • 設(shè)計(jì)方案
    •    基本要求:
    采用DS18B20作為溫度傳感器實(shí)時(shí)采集溫度信息,利用A/D轉(zhuǎn)換器采集當(dāng)前模擬電壓信息,同時(shí)訪問DS1302(或者RTC)獲取當(dāng)前時(shí)鐘,將以上信息在屏幕上加以顯示,并將數(shù)據(jù)存儲在EEPROM中,如有需要,可以根據(jù)時(shí)間調(diào)出相應(yīng)歷史記錄。


    •    設(shè)計(jì)思路:
   采用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)電路圖

  • AD-DA轉(zhuǎn)換電路圖

    • 18b20電路圖




    • 24C02電路圖
  • 程序框圖


  • 附錄(電路接線方式,源程序)
    •    電路接線方式

連線方式:PA0接AD轉(zhuǎn)換AO,PB8接第一個按鍵,PB9接第二個按鍵


    •    程序運(yùn)行結(jié)果


單片機(jī)源程序如下:
  1. /*******************************************************************************
  2. *  標(biāo)題:                  試驗(yàn)數(shù)碼管上顯示溫度                                  *
  3. *                                                                                                                                                            *
  4. *********************************************************************************
  5. * 目的: 1.通過本例程了解 DLASS18b20的基本原理和使用 ,理解并掌握18B20驅(qū)動程序的編寫        *
  6. *        2.了解掌握“一線”總線接口的工作原理及一般編程方法。                                         *
  7. * 現(xiàn)象:   插上18B20 觀察數(shù)碼管的實(shí)際溫度顯示
  8. * 連接: 用排線將JP8(P0口) 與 J12 連接在數(shù)碼管上可以看溫度顯示                                        *
  9. *                                                                                                                                                                 *
  10. * 建議: 不要延時(shí)等待,用定時(shí)中斷實(shí)現(xiàn)時(shí)序,來提高程序處理速度                   *
  11. * 請學(xué)員認(rèn)真消化本例程,懂DLASS18b20在C語言中的操作                                   *
  12. ********************************************************************************/
  13. #include "stm32f10x_lib.h"

  14. /******************************** 宏定義 ------------------------------------*/
  15. #define ADC1_DR_Address    ((u32)0x4001244C)
  16. #define ADC3_DR_Address    ((u32)0x40013C4C)
  17. #define    LCD_RS(x)  x ? GPIO_SetBits(GPIOB, RS): GPIO_ResetBits(GPIOB, RS)
  18. #define    LCD_RW(x)  x ? GPIO_SetBits(GPIOB, RW): GPIO_ResetBits(GPIOB, RW)
  19. #define    LCD_EN(x)  x ? GPIO_SetBits(GPIOB, EN): GPIO_ResetBits(GPIOB, EN)
  20. #define  GPIOx                      GPIOA
  21. #define  RCC_APB2Periph_GPIOx       RCC_APB2Periph_GPIOA
  22. #define  GPIO_RxPin                 GPIO_Pin_10
  23. #define  GPIO_TxPin                 GPIO_Pin_9
  24. #define  USARTx                     USART1
  25. /********************************硬件接口定義*********************************/
  26. #define    LS138A  GPIO_Pin_5 //=P2^2;       //管腳定義
  27. #define    LS138B  GPIO_Pin_4 //=P2^3;
  28. #define    LS138C  GPIO_Pin_3 //=P2^4;
  29. #define RS  GPIO_Pin_1 //P2^6;            
  30. #define RW  GPIO_Pin_2 //P2^5;
  31. #define EN  GPIO_Pin_0 //P2^7;
  32. #define    Save      GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_8)//P1^0;         //保存
  33. #define    Read      GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_9)//P1^1;         //讀取
  34. #define    LS138a(x)  x ? GPIO_SetBits(GPIOB, LS138A): GPIO_ResetBits(GPIOB, LS138A)
  35. #define    LS138b(x)  x ? GPIO_SetBits(GPIOB, LS138B): GPIO_ResetBits(GPIOB, LS138B)
  36. #define    LS138c(x)  x ? GPIO_SetBits(GPIOB, LS138C): GPIO_ResetBits(GPIOB, LS138C)

  37. #define  AT24C02 0xa0  //AT24C02 地址


  38. /******************************** 變量定義 ---------------------------------------------------------*/
  39. GPIO_InitTypeDef GPIO_InitStructure;
  40. TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  41. ErrorStatus HSEStartUpStatus;
  42. ADC_InitTypeDef ADC_InitStructure;
  43. DMA_InitTypeDef DMA_InitStructure;
  44. USART_InitTypeDef USART_InitStructure;
  45. EXTI_InitTypeDef EXTI_InitStructure;
  46. //此表為 LED 的字模, 共陰數(shù)碼管 0-9  -
  47. unsigned char  Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
  48. u32  LedOut[7],LedNumVal,LedNumVall;
  49. u8 Count;
  50. static vu32 TimingDelay;
  51. vu16 ADC1ConvertedValue = 0, ADC3ConvertedValue = 0;
  52. unsigned int jj = 0;
  53. unsigned char str1[]={0,0};
  54. u32 Uart1_PutChar(u8 ch);
  55. void Uart1_PutString(u8* buf , u8 len);
  56. typedef unsigned char BYTE;
  57. typedef unsigned char BOOL;
  58. vu32 TimeDisplay = 0;
  59. vu16 ADC2ConvertedValue;
  60. unsigned char Count1 , Count2 , save_flag = 1 , read_flag = 1;
  61. unsigned long D[16],str2[8],NumVal;
  62. unsigned long NumVall;
  63. unsigned int  USEC;
  64. /*********************************聲明函數(shù) -----------------------------------------------*/
  65. void RCC_Configuration(void);
  66. void NVIC_Configuration(void);
  67. void SysTick_Configuration(void);
  68. void HC595SendData(unsigned char SendVal);
  69. void NOP(void);
  70. extern GetTemp(void);                                                      //聲明引用外部函數(shù)
  71. extern unsigned int   Temperature;                      // 聲明引用外部變量
  72. void delay(vu32 nCount);
  73. void Tim_Setting(void);
  74. void Delay_us(u32 nTime);
  75. void RTC_Configuration(void);
  76. void Time_Display(u32 TimeVar);
  77. u32 Time_Regulate(void);
  78. void Time_Adjust(void);
  79. void Time_Show(void);
  80. u32 THHH = 0, THHL = 0, TMMH = 0, TMML = 0, TSSH = 0, TSSL = 0;


  81. /*******************************************延時(shí)函數(shù)**********************************/
  82. void delay(vu32 nCount)
  83. {
  84. int i = 0;
  85.   for(; nCount != 0; nCount--);
  86.   //for(;i < 1000;i++);
  87. }

  88. main()
  89. {   
  90.         unsigned char i;         
  91.         unsigned char pDat[8];
  92.         unsigned char pDat1[8];
  93.         #ifdef DEBUG
  94.         debug();  //在線調(diào)試使用
  95.         #endif
  96.         
  97.         RCC_Configuration();      //系統(tǒng)時(shí)鐘配置函數(shù)
  98.         
  99.         NVIC_Configuration();     //NVIC配置函數(shù)
  100.         
  101.     SysTick_Configuration();   //Systick配置函數(shù)
  102.         
  103.         Tim_Setting();          //調(diào)用事件設(shè)定函數(shù)

  104.         //啟動GPIO模塊時(shí)鐘
  105.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB1Periph_TIM2 | RCC_APB2Periph_AFIO, ENABLE);
  106.         //把調(diào)試設(shè)置普通IO口
  107.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);  
  108.                                 
  109.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //所有GPIO為同一類型端口
  110.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽輸出
  111.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //輸出的最大頻率為50HZ
  112.         GPIO_Init(GPIOA, &GPIO_InitStructure);   //初始化GPIOA端口
  113.         GPIO_Init(GPIOB, &GPIO_InitStructure);   //初始化GPIOB端口
  114.         
  115.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  116.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  117.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  118.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //將DS18B20設(shè)為16腳
  119.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  //開漏輸出         
  120.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //輸出的最大頻率為50HZ
  121.         GPIO_Init(GPIOA, &GPIO_InitStructure);   //初始化GPIOA端口

  122.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7  ;
  123.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  //開漏輸出         
  124.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //輸出的最大頻率為50HZ
  125.         GPIO_Init(GPIOB, &GPIO_InitStructure);   //初始化GPIOA端口

  126.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 |GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; //所有GPIO為同一類型端口
  127.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;         //推挽輸出
  128.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //輸出的最大頻率為50HZ
  129.         GPIO_Init(GPIOB, &GPIO_InitStructure);   //初始化GPIOB端口

  130.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
  131.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空輸入         
  132.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //輸出的最大頻率為50HZ
  133.         GPIO_Init(GPIOB, &GPIO_InitStructure);   //初始化GPIOA端口

  134.           //配置USARTx_Tx為復(fù)合推挽輸出
  135.     GPIO_InitStructure.GPIO_Pin = GPIO_TxPin;
  136.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  137.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  138.           GPIO_Init(GPIOx, &GPIO_InitStructure);

  139.   //配置 USARTx_Rx 為浮空輸入
  140.         GPIO_InitStructure.GPIO_Pin = GPIO_RxPin;
  141.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  142.           GPIO_Init(GPIOx, &GPIO_InitStructure);

  143.         
  144.         GPIO_Write(GPIOA,0xffff);  //將GPIOA 16個端口全部置為高電平
  145.         GPIO_Write(GPIOB,0xffff);  //將GPIOB 16個端口全部置為高電
  146.      
  147.          if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
  148.   {
  149.     //配置RTC
  150.     RTC_Configuration();

  151.     /* Adjust time by values entred by the user on the hyperterminal */
  152.     Time_Adjust();

  153.      BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
  154.   }
  155.    else
  156.   {
  157.     /* Check if the Power On Reset flag is set */
  158.     if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
  159.    // {
  160.        /* Wait for RTC registers synchronization */
  161.        RTC_WaitForSynchro();

  162.     /* Enable the RTC Second */
  163.     RTC_ITConfig(RTC_IT_SEC, ENABLE);
  164.     /* Wait until last write operation on RTC registers has finished */
  165.     RTC_WaitForLastTask();
  166.   }

  167. #ifdef RTCClockOutput_Enable
  168.   /* Enable PWR and BKP clocks */
  169.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  170.   /* Allow access to BKP Domain */
  171.   PWR_BackupAccessCmd(ENABLE);

  172.   /* Disable the Tamper Pin */
  173.   BKP_TamperPinCmd(DISABLE); /* To output RTCCLK/64 on Tamper pin, the tamper
  174.                                  functionality must be disabled */

  175.   /* Enable RTC Clock Output on Tamper Pin */
  176.   BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);
  177. #endif

  178.   //清除復(fù)位標(biāo)志
  179.   RCC_ClearFlag();


  180.   //串口配置: 波特率 115200 數(shù)據(jù)位 8 停止位 1  奇偶位 NONE  
  181.   USART_InitStructure.USART_BaudRate = 115200;
  182.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  183.   USART_InitStructure.USART_StopBits = USART_StopBits_1;
  184.   USART_InitStructure.USART_Parity =  USART_Parity_No ;
  185.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  186.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  187.     //初始化串口
  188.   USART_Init(USARTx, &USART_InitStructure);
  189.   //啟動串口
  190.   USART_Cmd(USARTx, ENABLE);

  191.   
  192.    //DMA1 通道配置
  193.   DMA_DeInit(DMA1_Channel1); //設(shè)置成CH1 DMA中包含了7個通道(CH1-CH7)
  194.   DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //給DMA起始地址
  195.   DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC1ConvertedValue;//DMA連接在內(nèi)存中的變量地址
  196.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //設(shè)置DMA傳輸方向 單向傳輸
  197.   DMA_InitStructure.DMA_BufferSize = 1; //設(shè)置DMA在傳輸時(shí)緩沖區(qū)的長度
  198.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //設(shè)置DMA的外設(shè)遞增模式
  199.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//設(shè)置DMA的內(nèi)存遞增模式
  200.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//DMA在訪問時(shí)每次操作的數(shù)據(jù)長度
  201.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  202.   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA的傳輸模式,連續(xù)不斷的循環(huán)模式
  203.   DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA的優(yōu)先級別:可以分為4級
  204.   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//DMA的2個memory中的變量互相訪問的
  205.   DMA_Init(DMA1_Channel1, &DMA_InitStructure); //DMA整個模塊初始化
  206.   //開啟DMA通道1
  207.   DMA_Cmd(DMA1_Channel1, ENABLE);

  208.    // ADC1 配置
  209.   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1工作在獨(dú)立模式
  210.   ADC_InitStructure.ADC_ScanConvMode = ENABLE;//使能掃描
  211.   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;;//ADC轉(zhuǎn)換工作在連續(xù)模式
  212.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//由軟件控制轉(zhuǎn)換
  213.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//轉(zhuǎn)換數(shù)據(jù)右對齊
  214.   ADC_InitStructure.ADC_NbrOfChannel = 14;//轉(zhuǎn)換通道為通道1
  215.   ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC

  216.   //ADC1選擇信道14,音序器等級1,采樣時(shí)間239.5個周期
  217.   ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_28Cycles5);   
  218.   //使能ADC1模塊DMA
  219.   ADC_DMACmd(ADC1, ENABLE);
  220.     //打開ADC1
  221.   ADC_Cmd(ADC1, ENABLE);

  222. //重置ADC1校準(zhǔn)寄存器
  223.   ADC_ResetCalibration(ADC1);
  224. //等待ADC1校準(zhǔn)重置完成
  225.   while(ADC_GetResetCalibrationStatus(ADC1));  

  226.   //開始ADC1校準(zhǔn)
  227.   ADC_StartCalibration(ADC1);

  228. //等待ADC1校準(zhǔn)完成
  229.   while(ADC_GetCalibrationStatus(ADC1));

  230. //使能ADC1軟件開始轉(zhuǎn)換
  231.   ADC_SoftwareStartConvCmd(ADC1, ENABLE);

  232.    while(1)
  233.    {

  234.           GetTemp();
  235.           Time_Display(RTC_GetCounter());
  236.              /********以下將讀18b20的數(shù)據(jù)送到LED數(shù)碼管顯示*************/
  237.       LedNumVal=Temperature;      //把實(shí)際溫度送到LedNumVal變量中
  238.           LedNumVall=(u16)ADC1ConvertedValue*3300/4096;
  239.          
  240.       str1[0]=LedNumVal%100/10+'0';
  241.       str1[1]=LedNumVal%10+'0';
  242.         if(Save == 0 && save_flag)
  243.         {
  244.           Uart1_PutString("\r\n當(dāng)前時(shí)間為:" ,10 );
  245.           Uart1_PutChar(THHH);
  246.           delay(0x0fffff);
  247.           Uart1_PutChar(THHL);
  248.           delay(0xfffff);               
  249.           Uart1_PutChar(58);
  250.           delay(0xfffff);
  251.           Uart1_PutChar(TMMH);
  252.           delay(0xfffff);
  253.           Uart1_PutChar(TMML);
  254.           delay(0xfffff);
  255.           Uart1_PutChar(58);
  256.           delay(0xfffff);
  257.           Uart1_PutChar(TSSH);
  258.           delay(0xfffff);
  259.           Uart1_PutChar(TSSL);
  260.           delay(0xfffff);
  261.           Uart1_PutString("\r\n當(dāng)前溫度值為:" ,10 );
  262.     for(i=0; i<2; i++)
  263.           {               
  264.                 Uart1_PutChar(str1[i]);
  265.                   delay(0xfffff);                                             
  266.           }
  267.             Uart1_PutString("\r\n當(dāng)前電壓值為:" ,10 );
  268.                 Uart1_PutChar(LedNumVall%10000/1000+48);
  269.                 delay(0x00fff);        
  270.                 Uart1_PutChar(46);
  271.                 delay(0x00fff);
  272.             Uart1_PutChar(LedNumVall%1000/100+48);
  273.               delay(0x00fff);        
  274.                  pDat[0]=THHH;
  275.                  pDat[1]=THHL;
  276.                  pDat[2]=58;
  277.                  pDat[3]=TMMH;
  278.                  pDat[4]=TMML;
  279.                  pDat[5]=58;
  280.                  pDat[6]=TSSH;
  281.                  pDat[7]=TSSL;

  282.         //         pDat1[8]=str1[0];
  283.         //         pDat1[9]=str1[1];
  284.         //         pDat1[10]=LedNumVall%10000/1000+48;
  285.         //         pDat1[11]=46;
  286.         //         pDat1[12]=LedNumVall%1000/100+48;
  287.                  
  288.                  ISendStr(AT24C02, 0 , &pDat[0], 8);
  289.                  read_flag = 1;
  290.                  save_flag = 0;         
  291.      }
  292.         if(Read  == 0 && read_flag)
  293.         {
  294.                 IRcvStr(AT24C02, 0 , &pDat, 8);
  295.                 Uart1_PutString(pDat ,8 );
  296.                  read_flag = 0;
  297.                 save_flag = 1;
  298.         }
  299.           }

  300.    
  301. }
  302. void Uart1_PutString(u8* buf , u8 len)
  303. {   u8 i;
  304.     for(i=0;i<len;i++)
  305.     {
  306.         Uart1_PutChar(*buf++);
  307.     }
  308. }


  309. //發(fā)送一個字符
  310. /*******************************************************************************
  311. * Name  : Uart1_PutChar
  312. * Deion : printf a char to the uart.
  313. *******************************************************************************/
  314. u32 Uart1_PutChar(u8 ch)
  315. {
  316.     /* Write a character to the USART */
  317.     USART_SendData(USART1, (u8) ch);
  318.         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
  319.    {
  320.    }
  321.         return ch;
  322.    
  323. }

  324. void RTC_Configuration(void)
  325. {
  326.   //啟用PWR和BKP的時(shí)鐘(from APB1)
  327.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  328.     //后備域解鎖
  329.   PWR_BackupAccessCmd(ENABLE);

  330. //備份寄存器模塊復(fù)位
  331.   BKP_DeInit();

  332.   /* Enable LSE */
  333.   RCC_LSEConfig(RCC_LSE_ON);

  334.   //等待穩(wěn)定
  335.   while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  336.   {}
  337.   //RTC時(shí)鐘源配置成LSE(外部32.768K)
  338.   RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

  339.   //RTC開啟
  340.   RCC_RTCCLKCmd(ENABLE);

  341.   //開啟后需要等待APB1時(shí)鐘與RTC時(shí)鐘同步,才能讀寫寄存器
  342.   RTC_WaitForSynchro();

  343.   //讀寫寄存器前,要確定上一個操作已經(jīng)結(jié)束
  344.   RTC_WaitForLastTask();
  345.   
  346.     //使能秒中斷
  347.   RTC_ITConfig(RTC_IT_SEC, ENABLE);   

  348.   //讀寫寄存器前,要確定上一個操作已經(jīng)結(jié)束
  349.   RTC_WaitForLastTask();

  350.   //設(shè)置RTC分頻器,使RTC時(shí)鐘為1Hz
  351.   //RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)
  352.   RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */

  353.   //等待寄存器寫入完成
  354.   RTC_WaitForLastTask();

  355.     //等待寫入完成
  356.   RTC_WaitForLastTask();

  357. }
  358. /*******************************************************************************
  359. * Function Name  : Time_Display
  360. * Description    : Displays the current time.
  361. * Input          : - TimeVar: RTC counter value.
  362. * Output         : None
  363. * Return         : None
  364. *******************************************************************************/
  365. void Time_Display(u32 TimeVar)
  366. {

  367.   /* Compute  hours */
  368.   THHH = (TimeVar / 3600)/10+48;                                                                                                                                   
  369.   THHL = (TimeVar / 3600)%10+48;
  370.   /* Compute minutes */
  371.   TMMH = ((TimeVar % 3600) / 60)/10+48;
  372.   TMML = ((TimeVar % 3600) / 60)%10+48;
  373.   /* Compute seconds */
  374.   TSSH = ((TimeVar % 3600) % 60)/10+48;
  375.   TSSL = ((TimeVar % 3600) % 60)%10+48;
  376. }
  377. void Time_Adjust(void)
  378. {
  379.   /* Wait until last write operation on RTC registers has finished */
  380.   RTC_WaitForLastTask();
  381.   /* Change the current time */
  382.   RTC_SetCounter(12*3600 + 2*60 + 0);
  383.   /* Wait until last write operation on RTC registers has finished */
  384.   RTC_WaitForLastTask();
  385. }
  386. void Tim_Setting(void)
  387. {
  388.           /*-----------------------------------------------------------------------------*/

  389.   /***772M下定時(shí)值的計(jì)算((1+預(yù)分頻TIM_Prescaler)/72*(1+定時(shí)周期TIM_Period))*/

  390.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //配置RCC,使能TIMx

  391.   /* Time Base configuration */
  392.   TIM_TimeBaseStructure.TIM_Prescaler = 7199;  //時(shí)鐘預(yù)分頻數(shù) 例如:時(shí)鐘頻率=72/(時(shí)鐘預(yù)分頻+1)  
  393.   
  394.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; ////定時(shí)器模式 向上計(jì)數(shù)  

  395.   TIM_TimeBaseStructure.TIM_Period = 9999;//自動重裝載寄存器周期的值(定時(shí)時(shí)間)累計(jì) 0xFFFF個頻率后產(chǎn)生個更新或者中斷(也是說定時(shí)時(shí)間到)

  396.   TIM_TimeBaseStructure.TIM_ClockDivision = 0; ////時(shí)間分割值  

  397.   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  398.   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //初始化定時(shí)器2

  399.   TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打開中斷 溢出中斷  


  400.   TIM_Cmd(TIM2, ENABLE);  //打開定時(shí)器

  401.   /* Main Output Enable */
  402.   TIM_CtrlPWMOutputs(TIM1, ENABLE);


  403. }

  404. /******************************************************************************
  405. *
  406. *                         精準(zhǔn)延時(shí)函數(shù)
  407. *
  408. **********************************************************************************/
  409. void Delay_us(u32 nTime)
  410. {
  411.   /* Enable the SysTick Counter */
  412.   SysTick_CounterCmd(SysTick_Counter_Enable);
  413.   
  414.   TimingDelay = nTime;

  415.   while(TimingDelay != 0);

  416.   /* Disable SysTick Counter */
  417.   SysTick_CounterCmd(SysTick_Counter_Disable);
  418.   /* Clear SysTick Counter */
  419.   SysTick_CounterCmd(SysTick_Counter_Clear);
  420. }

  421. /*******************************************************************************
  422. *
  423. *                        定時(shí)中斷處理函數(shù)
  424. *
  425. *******************************************************************************/
  426. void TIM2_IRQHandler(void)
  427. {
  428.   
  429.   if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)  //檢測制定的中斷是否發(fā)生

  430.   {

  431.      TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  //清除中斷處理位。

  432.      Count++ ;
  433.          

  434.    }
  435. }

  436. /*******************************************************************************
  437. *
  438. *                         系統(tǒng)Systick 中斷處理函數(shù)
  439. *
  440. *******************************************************************************/
  441. void SysTick_Handler(void)   
  442. {   
  443.    if (TimingDelay != 0x00)
  444.   {
  445.     TimingDelay--;
  446.         
  447.   }
  448.    if(USEC++ == 1000000)
  449.   {         USEC = 0;
  450.          Count1++;
  451.    }
  452. }


  453. /*******************************************************************************
  454. *                           配置RCC
  455. *******************************************************************************/
  456. void RCC_Configuration(void)
  457. {   
  458. //復(fù)位RCC外部設(shè)備寄存器到默認(rèn)值
  459.   RCC_DeInit();

  460.   //打開外部高速晶振
  461.   RCC_HSEConfig(RCC_HSE_ON);

  462.    //等待外部高速時(shí)鐘準(zhǔn)備好
  463.   HSEStartUpStatus = RCC_WaitForHSEStartUp();

  464.   if(HSEStartUpStatus == SUCCESS)   //外部高速時(shí)鐘已經(jīng)準(zhǔn)別好
  465.   {                                                                    
  466.     //開啟FLASH的預(yù)取功能
  467.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  468.     //FLASH延遲2個周期
  469.     FLASH_SetLatency(FLASH_Latency_2);
  470.          
  471.   //配置AHB(HCLK)時(shí)鐘=SYSCLK
  472.     RCC_HCLKConfig(RCC_SYSCLK_Div1);  
  473.   
  474.    //配置APB2(PCLK2)鐘=AHB時(shí)鐘
  475.     RCC_PCLK2Config(RCC_HCLK_Div1);

  476.     //配置APB1(PCLK1)鐘=AHB 1/2時(shí)鐘
  477.     RCC_PCLK1Config(RCC_HCLK_Div2);

  478.             //配置ADC時(shí)鐘=PCLK2 1/4
  479.     RCC_ADCCLKConfig(RCC_PCLK2_Div4);

  480.      //配置PLL時(shí)鐘 == 外部高速晶體時(shí)鐘*9  PLLCLK = 8MHz * 9 = 72 MHz
  481.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

  482.                 //配置ADC時(shí)鐘= PCLK2/4
  483.     RCC_ADCCLKConfig(RCC_PCLK2_Div4);

  484.     //使能PLL時(shí)鐘
  485.     RCC_PLLCmd(ENABLE);

  486.    //等待PLL時(shí)鐘就緒
  487.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  488.     {
  489.     }

  490.   //配置系統(tǒng)時(shí)鐘 = PLL時(shí)鐘
  491.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  492.    //檢查PLL時(shí)鐘是否作為系統(tǒng)時(shí)鐘
  493.     while(RCC_GetSYSCLKSource() != 0x08)
  494.     {
  495.     }
  496.   }
  497.     // 開啟DMA1時(shí)鐘 Enable
  498.    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);

  499.   //開啟ADC1時(shí)鐘
  500.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1   , ENABLE);
  501.        //下面是給各模塊開啟時(shí)鐘
  502.     //啟動GPIO
  503.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB ,ENABLE);
  504.     //啟動AFIO
  505.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  506.     //啟動DMA時(shí)鐘
  507.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  508.     //啟動ADC1時(shí)鐘
  509.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  510.          //開啟串口時(shí)鐘
  511.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  512. }


  513. void SysTick_Configuration(void)   
  514. {   
  515.   /*  設(shè)置AHB時(shí)鐘為SysTick時(shí)鐘*/  
  516.   SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);  //采用8分頻
  517.   
  518.   /* 設(shè)置SysTicks中斷搶占優(yōu)先級 3, 從優(yōu)先級0*/  
  519.   NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 3, 0);   
  520.       
  521.   /* 每1ms發(fā)生一次SysTick中斷 在72M的時(shí)鐘下*/  
  522.   SysTick_SetReload(9);     //該參數(shù)取值必須在1和0x00FFFFFF之間         9/(72000 000/8)= 1us  1微秒計(jì)數(shù)   
  523.   
  524.   /* 開啟SysTick中斷 */  
  525.   SysTick_ITConfig(ENABLE);   
  526. }  

  527. void ADC1_2_IRQHandler(void)
  528. {
  529.           ADC1ConvertedValue = ADC_GetConversionValue(ADC1);
  530. }
  531. /*******************************************************************************
  532. *                             NVIC配置函數(shù)
  533. *******************************************************************************/
  534. void NVIC_Configuration(void)
  535. {
  536. NVIC_InitTypeDef NVIC_InitStructure;
  537. #ifdef  VECT_TAB_RAM  
  538.   /* Set the Vector Table base location at 0x20000000 */
  539.   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  540. #else  /* VECT_TAB_FLASH  */
  541.   /* Set the Vector Table base location at 0x08000000 */
  542.   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
  543. #endif

  544.   
  545.        /* 開啟定時(shí)器2 */
  546.   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
  547.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  548.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  549.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  550.   NVIC_Init(&NVIC_InitStructure);
  551.     /* Configure and enable ADC interrupt */
  552.   NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQChannel;
  553.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  554.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  555.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  556.   NVIC_Init(&NVIC_InitStructure);

  557.   NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQChannel;
  558.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  559.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  560. ……………………

  561. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
DS18B20 溫度檢測.7z (3.55 MB, 下載次數(shù): 207)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏13 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:549279 發(fā)表于 2019-5-28 14:44 | 只看該作者
想知道,如何添加溫度傳感器,如果溫度過高,蜂鳴器 發(fā)出警告,該如何添加這一功能?
回復(fù)

使用道具 舉報(bào)

板凳
ID:647274 發(fā)表于 2019-11-29 14:11 | 只看該作者
感謝分享~~~~~~~~~~~
回復(fù)

使用道具 舉報(bào)

地板
ID:63317 發(fā)表于 2019-12-2 16:37 | 只看該作者

感謝分享 下載了
回復(fù)

使用道具 舉報(bào)

5#
ID:651423 發(fā)表于 2019-12-3 13:49 | 只看該作者
感謝分享 下載了
回復(fù)

使用道具 舉報(bào)

6#
ID:57810 發(fā)表于 2019-12-3 19:58 | 只看該作者
太感謝!好資料
回復(fù)

使用道具 舉報(bào)

7#
ID:773427 發(fā)表于 2020-6-10 14:00 | 只看該作者
感謝樓主
回復(fù)

使用道具 舉報(bào)

8#
ID:711352 發(fā)表于 2020-6-11 15:58 | 只看該作者
資料很全,下載了
回復(fù)

使用道具 舉報(bào)

9#
ID:747344 發(fā)表于 2020-8-21 22:21 | 只看該作者
ykr8695 發(fā)表于 2019-5-28 14:44
想知道,如何添加溫度傳感器,如果溫度過高,蜂鳴器 發(fā)出警告,該如何添加這一功能?

對溫度做出判斷  然后用IO口控制beep就可以了
回復(fù)

使用道具 舉報(bào)

10#
ID:861880 發(fā)表于 2020-12-23 19:21 | 只看該作者
ykr8695 發(fā)表于 2019-5-28 14:44
想知道,如何添加溫度傳感器,如果溫度過高,蜂鳴器 發(fā)出警告,該如何添加這一功能?

樓主 同問?
回復(fù)

使用道具 舉報(bào)

11#
ID:867586 發(fā)表于 2020-12-25 14:06 來自手機(jī) | 只看該作者
哪位大佬能畫一個仿真圖啊?
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: www.一级片 | 久久精品91久久久久久再现 | 欧美一区二区免费电影 | 久久夜色精品国产 | 国产日屁 | 久久在线| 精品伦精品一区二区三区视频 | 国产成人高清视频 | www.youjizz.com日韩| 在线免费观看成人 | 久久69精品久久久久久久电影好 | 一区二区三区四区在线 | 成人在线观看免费视频 | 久久久精品 | 91在线视频| 久久91 | 99日韩| 91精品国产乱码久久久久久久久 | 99国产视频| 日本精品视频一区二区 | 91亚洲国产 | 国产精品资源在线 | 成人福利视频网站 | 91久久伊人| 欧美色欧美亚洲另类七区 | 欧美日韩综合 | 91在线资源 | 亚洲国产一区在线 | 亚洲精品免费在线观看 | 国产伦一区二区三区四区 | 亚洲视频www | 伊人性伊人情综合网 | 欧美日韩一 | 国产美女一区二区 | 精品久久久久久亚洲国产800 | 日本福利视频免费观看 | 久久蜜桃精品 | 欧美成人一级视频 | 中文字幕 国产精品 | 久久99国产精一区二区三区 | 欧美中文字幕一区二区 |