找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7698|回复: 11
收起左侧

STM32+DS18B20温度监测实验设计方案思路+程序

  [复制链接]
ID:524418 发表于 2019-4-29 14:12 | 显示全部楼层 |阅读模式
  • 设计方案
    •    基本要求:
    采用DS18B20作为温度传感器实时采集温度信息,利用A/D转换器采集当前模拟电压信息,同时访问DS1302(或者RTC)获取当前时钟,将以上信息在屏幕上加以显示,并将数据存储在EEPROM中,如有需要,可以根据时间调出相应历史记录。


    •    设计思路:
   采用stm32f103x作为核心控制元件,采用 DS18B20作为温度传感器实时采集温度信息,用手加热三极管即可监测到温度的变化,其次利用AD读取当前模拟输入电压量,旋转按钮即可检测到电压的变化;同时利用RTC获取到时钟信号,并利用串口进行显示,上述功能均已实现。其中EEPROM数据存储部分,因时间有限仅将时间信息(8位)作存读功能,两个按键交替按,按下第一个按键可实现一次存储, 按下第二个按键可实现一次读取。
此次试验需要存读的数据共13位,使用 16 位子地址时要在程序开头定义条件汇编符号 SUBA16 ,还要定义一个变量 SUBA1 ,因此 SUBA1、SUBA 就构成了 16 位子址址。其中 SUBA1 为高 8 位,在用户程序开头定义$SET (SUBA16)即可使用 16 位子地址,若没有此定义则只使用 8 位子地址。
  • 电路原理图
    •    stm32f103x系统电路图

  • AD-DA转换电路图

    • 18b20电路图




    • 24C02电路图
  • 程序框图


  • 附录(电路接线方式,源程序)
    •    电路接线方式

连线方式:PA0接AD转换AO,PB8接第一个按键,PB9接第二个按键


    •    程序运行结果


单片机源程序如下:
  1. /*******************************************************************************
  2. *  标题:                  试验数码管上显示温度                                  *
  3. *                                                                                                                                                            *
  4. *********************************************************************************
  5. * 目的: 1.通过本例程了解 DLASS18b20的基本原理和使用 ,理解并掌握18B20驱动程序的编写        *
  6. *        2.了解掌握“一线”总线接口的工作原理及一般编程方法。                                         *
  7. * 现象:   插上18B20 观察数码管的实际温度显示
  8. * 连接: 用排线将JP8(P0口) 与 J12 连接在数码管上可以看温度显示                                        *
  9. *                                                                                                                                                                 *
  10. * 建议: 不要延时等待,用定时中断实现时序,来提高程序处理速度                   *
  11. * 请学员认真消化本例程,懂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 的字模, 共阴数码管 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. /*********************************声明函数 -----------------------------------------------*/
  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);                                                      //声明引用外部函数
  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. /*******************************************延时函数**********************************/
  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();  //在线调试使用
  95.         #endif
  96.         
  97.         RCC_Configuration();      //系统时钟配置函数
  98.         
  99.         NVIC_Configuration();     //NVIC配置函数
  100.         
  101.     SysTick_Configuration();   //Systick配置函数
  102.         
  103.         Tim_Setting();          //调用事件设定函数

  104.         //启动GPIO模块时钟
  105.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB1Periph_TIM2 | RCC_APB2Periph_AFIO, ENABLE);
  106.         //把调试设置普通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设为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为复合推挽输出
  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.   //清除复位标志
  179.   RCC_ClearFlag();


  180.   //串口配置: 波特率 115200 数据位 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); //设置成CH1 DMA中包含了7个通道(CH1-CH7)
  194.   DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //给DMA起始地址
  195.   DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC1ConvertedValue;//DMA连接在内存中的变量地址
  196.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //设置DMA传输方向 单向传输
  197.   DMA_InitStructure.DMA_BufferSize = 1; //设置DMA在传输时缓冲区的长度
  198.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //设置DMA的外设递增模式
  199.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//设置DMA的内存递增模式
  200.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//DMA在访问时每次操作的数据长度
  201.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  202.   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA的传输模式,连续不断的循环模式
  203.   DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA的优先级别:可以分为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工作在独立模式
  210.   ADC_InitStructure.ADC_ScanConvMode = ENABLE;//使能扫描
  211.   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;;//ADC转换工作在连续模式
  212.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//由软件控制转换
  213.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐
  214.   ADC_InitStructure.ADC_NbrOfChannel = 14;//转换通道为通道1
  215.   ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC

  216.   //ADC1选择信道14,音序器等级1,采样时间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校准寄存器
  223.   ADC_ResetCalibration(ADC1);
  224. //等待ADC1校准重置完成
  225.   while(ADC_GetResetCalibrationStatus(ADC1));  

  226.   //开始ADC1校准
  227.   ADC_StartCalibration(ADC1);

  228. //等待ADC1校准完成
  229.   while(ADC_GetCalibrationStatus(ADC1));

  230. //使能ADC1软件开始转换
  231.   ADC_SoftwareStartConvCmd(ADC1, ENABLE);

  232.    while(1)
  233.    {

  234.           GetTemp();
  235.           Time_Display(RTC_GetCounter());
  236.              /********以下将读18b20的数据送到LED数码管显示*************/
  237.       LedNumVal=Temperature;      //把实际温度送到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当前时间为:" ,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当前温度值为:" ,10 );
  262.     for(i=0; i<2; i++)
  263.           {               
  264.                 Uart1_PutChar(str1[i]);
  265.                   delay(0xfffff);                                             
  266.           }
  267.             Uart1_PutString("\r\n当前电压值为:" ,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. //发送一个字符
  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的时钟(from APB1)
  327.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  328.     //后备域解锁
  329.   PWR_BackupAccessCmd(ENABLE);

  330. //备份寄存器模块复位
  331.   BKP_DeInit();

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

  334.   //等待稳定
  335.   while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  336.   {}
  337.   //RTC时钟源配置成LSE(外部32.768K)
  338.   RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

  339.   //RTC开启
  340.   RCC_RTCCLKCmd(ENABLE);

  341.   //开启后需要等待APB1时钟与RTC时钟同步,才能读写寄存器
  342.   RTC_WaitForSynchro();

  343.   //读写寄存器前,要确定上一个操作已经结束
  344.   RTC_WaitForLastTask();
  345.   
  346.     //使能秒中断
  347.   RTC_ITConfig(RTC_IT_SEC, ENABLE);   

  348.   //读写寄存器前,要确定上一个操作已经结束
  349.   RTC_WaitForLastTask();

  350.   //设置RTC分频器,使RTC时钟为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下定时值的计算((1+预分频TIM_Prescaler)/72*(1+定时周期TIM_Period))*/

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

  391.   /* Time Base configuration */
  392.   TIM_TimeBaseStructure.TIM_Prescaler = 7199;  //时钟预分频数 例如:时钟频率=72/(时钟预分频+1)  
  393.   
  394.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; ////定时器模式 向上计数  

  395.   TIM_TimeBaseStructure.TIM_Period = 9999;//自动重装载寄存器周期的值(定时时间)累计 0xFFFF个频率后产生个更新或者中断(也是说定时时间到)

  396.   TIM_TimeBaseStructure.TIM_ClockDivision = 0; ////时间分割值  

  397.   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

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

  399.   TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断 溢出中断  


  400.   TIM_Cmd(TIM2, ENABLE);  //打开定时器

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


  403. }

  404. /******************************************************************************
  405. *
  406. *                         精准延时函数
  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. *                        定时中断处理函数
  424. *
  425. *******************************************************************************/
  426. void TIM2_IRQHandler(void)
  427. {
  428.   
  429.   if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)  //检测制定的中断是否发生

  430.   {

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

  432.      Count++ ;
  433.          

  434.    }
  435. }

  436. /*******************************************************************************
  437. *
  438. *                         系统Systick 中断处理函数
  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. //复位RCC外部设备寄存器到默认值
  459.   RCC_DeInit();

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

  462.    //等待外部高速时钟准备好
  463.   HSEStartUpStatus = RCC_WaitForHSEStartUp();

  464.   if(HSEStartUpStatus == SUCCESS)   //外部高速时钟已经准别好
  465.   {                                                                    
  466.     //开启FLASH的预取功能
  467.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  468.     //FLASH延迟2个周期
  469.     FLASH_SetLatency(FLASH_Latency_2);
  470.          
  471.   //配置AHB(HCLK)时钟=SYSCLK
  472.     RCC_HCLKConfig(RCC_SYSCLK_Div1);  
  473.   
  474.    //配置APB2(PCLK2)钟=AHB时钟
  475.     RCC_PCLK2Config(RCC_HCLK_Div1);

  476.     //配置APB1(PCLK1)钟=AHB 1/2时钟
  477.     RCC_PCLK1Config(RCC_HCLK_Div2);

  478.             //配置ADC时钟=PCLK2 1/4
  479.     RCC_ADCCLKConfig(RCC_PCLK2_Div4);

  480.      //配置PLL时钟 == 外部高速晶体时钟*9  PLLCLK = 8MHz * 9 = 72 MHz
  481.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

  482.                 //配置ADC时钟= PCLK2/4
  483.     RCC_ADCCLKConfig(RCC_PCLK2_Div4);

  484.     //使能PLL时钟
  485.     RCC_PLLCmd(ENABLE);

  486.    //等待PLL时钟就绪
  487.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  488.     {
  489.     }

  490.   //配置系统时钟 = PLL时钟
  491.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  492.    //检查PLL时钟是否作为系统时钟
  493.     while(RCC_GetSYSCLKSource() != 0x08)
  494.     {
  495.     }
  496.   }
  497.     // 开启DMA1时钟 Enable
  498.    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);

  499.   //开启ADC1时钟
  500.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1   , ENABLE);
  501.        //下面是给各模块开启时钟
  502.     //启动GPIO
  503.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB ,ENABLE);
  504.     //启动AFIO
  505.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  506.     //启动DMA时钟
  507.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  508.     //启动ADC1时钟
  509.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  510.          //开启串口时钟
  511.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  512. }


  513. void SysTick_Configuration(void)   
  514. {   
  515.   /*  设置AHB时钟为SysTick时钟*/  
  516.   SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);  //采用8分频
  517.   
  518.   /* 设置SysTicks中断抢占优先级 3, 从优先级0*/  
  519.   NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 3, 0);   
  520.       
  521.   /* 每1ms发生一次SysTick中断 在72M的时钟下*/  
  522.   SysTick_SetReload(9);     //该参数取值必须在1和0x00FFFFFF之间         9/(72000 000/8)= 1us  1微秒计数   
  523.   
  524.   /* 开启SysTick中断 */  
  525.   SysTick_ITConfig(ENABLE);   
  526. }  

  527. void ADC1_2_IRQHandler(void)
  528. {
  529.           ADC1ConvertedValue = ADC_GetConversionValue(ADC1);
  530. }
  531. /*******************************************************************************
  532. *                             NVIC配置函数
  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.        /* 开启定时器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黑下载附件…………
复制代码

所有资料51hei提供下载:
DS18B20 温度检测.7z (3.55 MB, 下载次数: 204)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:549279 发表于 2019-5-28 14:44 | 显示全部楼层
想知道,如何添加温度传感器,如果温度过高,蜂鸣器 发出警告,该如何添加这一功能?
回复

使用道具 举报

ID:647274 发表于 2019-11-29 14:11 | 显示全部楼层
感谢分享~~~~~~~~~~~
回复

使用道具 举报

ID:63317 发表于 2019-12-2 16:37 | 显示全部楼层

感谢分享 下载了
回复

使用道具 举报

ID:651423 发表于 2019-12-3 13:49 | 显示全部楼层
感谢分享 下载了
回复

使用道具 举报

ID:57810 发表于 2019-12-3 19:58 | 显示全部楼层
太感谢!好资料
回复

使用道具 举报

ID:773427 发表于 2020-6-10 14:00 | 显示全部楼层
感谢楼主
回复

使用道具 举报

ID:711352 发表于 2020-6-11 15:58 | 显示全部楼层
资料很全,下载了
回复

使用道具 举报

ID:747344 发表于 2020-8-21 22:21 | 显示全部楼层
ykr8695 发表于 2019-5-28 14:44
想知道,如何添加温度传感器,如果温度过高,蜂鸣器 发出警告,该如何添加这一功能?

对温度做出判断  然后用IO口控制beep就可以了
回复

使用道具 举报

ID:861880 发表于 2020-12-23 19:21 | 显示全部楼层
ykr8695 发表于 2019-5-28 14:44
想知道,如何添加温度传感器,如果温度过高,蜂鸣器 发出警告,该如何添加这一功能?

楼主 同问?
回复

使用道具 举报

ID:867586 发表于 2020-12-25 14:06 来自手机 | 显示全部楼层
哪位大佬能画一个仿真图啊?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表