采用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系统电路图

连线方式:PA0接AD转换AO,PB8接第一个按键,PB9接第二个按键
单片机源程序如下:
- /*******************************************************************************
- * 标题: 试验数码管上显示温度 *
- * *
- *********************************************************************************
- * 目的: 1.通过本例程了解 DLASS18b20的基本原理和使用 ,理解并掌握18B20驱动程序的编写 *
- * 2.了解掌握“一线”总线接口的工作原理及一般编程方法。 *
- * 现象: 插上18B20 观察数码管的实际温度显示
- * 连接: 用排线将JP8(P0口) 与 J12 连接在数码管上可以看温度显示 *
- * *
- * 建议: 不要延时等待,用定时中断实现时序,来提高程序处理速度 *
- * 请学员认真消化本例程,懂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 的字模, 共阴数码管 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;
- /*********************************声明函数 -----------------------------------------------*/
- void RCC_Configuration(void);
- void NVIC_Configuration(void);
- void SysTick_Configuration(void);
- void HC595SendData(unsigned char SendVal);
- void NOP(void);
- extern GetTemp(void); //声明引用外部函数
- 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;
- /*******************************************延时函数**********************************/
- 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(); //在线调试使用
- #endif
-
- RCC_Configuration(); //系统时钟配置函数
-
- NVIC_Configuration(); //NVIC配置函数
-
- SysTick_Configuration(); //Systick配置函数
-
- Tim_Setting(); //调用事件设定函数
- //启动GPIO模块时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB1Periph_TIM2 | RCC_APB2Periph_AFIO, ENABLE);
- //把调试设置普通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设为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为复合推挽输出
- 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
- //清除复位标志
- RCC_ClearFlag();
- //串口配置: 波特率 115200 数据位 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); //设置成CH1 DMA中包含了7个通道(CH1-CH7)
- DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //给DMA起始地址
- DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC1ConvertedValue;//DMA连接在内存中的变量地址
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //设置DMA传输方向 单向传输
- DMA_InitStructure.DMA_BufferSize = 1; //设置DMA在传输时缓冲区的长度
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //设置DMA的外设递增模式
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//设置DMA的内存递增模式
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//DMA在访问时每次操作的数据长度
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
- DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA的传输模式,连续不断的循环模式
- DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA的优先级别:可以分为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工作在独立模式
- ADC_InitStructure.ADC_ScanConvMode = ENABLE;//使能扫描
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;;//ADC转换工作在连续模式
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//由软件控制转换
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐
- ADC_InitStructure.ADC_NbrOfChannel = 14;//转换通道为通道1
- ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC
- //ADC1选择信道14,音序器等级1,采样时间239.5个周期
- ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_28Cycles5);
- //使能ADC1模块DMA
- ADC_DMACmd(ADC1, ENABLE);
- //打开ADC1
- ADC_Cmd(ADC1, ENABLE);
- //重置ADC1校准寄存器
- ADC_ResetCalibration(ADC1);
- //等待ADC1校准重置完成
- while(ADC_GetResetCalibrationStatus(ADC1));
- //开始ADC1校准
- ADC_StartCalibration(ADC1);
- //等待ADC1校准完成
- while(ADC_GetCalibrationStatus(ADC1));
- //使能ADC1软件开始转换
- ADC_SoftwareStartConvCmd(ADC1, ENABLE);
- while(1)
- {
-
- GetTemp();
- Time_Display(RTC_GetCounter());
- /********以下将读18b20的数据送到LED数码管显示*************/
- LedNumVal=Temperature; //把实际温度送到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当前时间为:" ,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当前温度值为:" ,10 );
- for(i=0; i<2; i++)
- {
- Uart1_PutChar(str1[i]);
- delay(0xfffff);
- }
- Uart1_PutString("\r\n当前电压值为:" ,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++);
- }
- }
- //发送一个字符
- /*******************************************************************************
- * 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的时钟(from APB1)
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
- //后备域解锁
- PWR_BackupAccessCmd(ENABLE);
- //备份寄存器模块复位
- BKP_DeInit();
- /* Enable LSE */
- RCC_LSEConfig(RCC_LSE_ON);
-
- //等待稳定
- while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
- {}
- //RTC时钟源配置成LSE(外部32.768K)
- RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
- //RTC开启
- RCC_RTCCLKCmd(ENABLE);
- //开启后需要等待APB1时钟与RTC时钟同步,才能读写寄存器
- RTC_WaitForSynchro();
- //读写寄存器前,要确定上一个操作已经结束
- RTC_WaitForLastTask();
-
- //使能秒中断
- RTC_ITConfig(RTC_IT_SEC, ENABLE);
- //读写寄存器前,要确定上一个操作已经结束
- RTC_WaitForLastTask();
- //设置RTC分频器,使RTC时钟为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下定时值的计算((1+预分频TIM_Prescaler)/72*(1+定时周期TIM_Period))*/
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //配置RCC,使能TIMx
- /* Time Base configuration */
- TIM_TimeBaseStructure.TIM_Prescaler = 7199; //时钟预分频数 例如:时钟频率=72/(时钟预分频+1)
-
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; ////定时器模式 向上计数
- TIM_TimeBaseStructure.TIM_Period = 9999;//自动重装载寄存器周期的值(定时时间)累计 0xFFFF个频率后产生个更新或者中断(也是说定时时间到)
- TIM_TimeBaseStructure.TIM_ClockDivision = 0; ////时间分割值
- TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //初始化定时器2
- TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断 溢出中断
- TIM_Cmd(TIM2, ENABLE); //打开定时器
- /* Main Output Enable */
- TIM_CtrlPWMOutputs(TIM1, ENABLE);
- }
- /******************************************************************************
- *
- * 精准延时函数
- *
- **********************************************************************************/
- 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);
- }
- /*******************************************************************************
- *
- * 定时中断处理函数
- *
- *******************************************************************************/
- void TIM2_IRQHandler(void)
- {
-
- if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) //检测制定的中断是否发生
- {
- TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断处理位。
- Count++ ;
-
- }
- }
- /*******************************************************************************
- *
- * 系统Systick 中断处理函数
- *
- *******************************************************************************/
- void SysTick_Handler(void)
- {
- if (TimingDelay != 0x00)
- {
- TimingDelay--;
-
- }
- if(USEC++ == 1000000)
- { USEC = 0;
- Count1++;
- }
- }
- /*******************************************************************************
- * 配置RCC
- *******************************************************************************/
- void RCC_Configuration(void)
- {
- //复位RCC外部设备寄存器到默认值
- RCC_DeInit();
- //打开外部高速晶振
- RCC_HSEConfig(RCC_HSE_ON);
- //等待外部高速时钟准备好
- HSEStartUpStatus = RCC_WaitForHSEStartUp();
- if(HSEStartUpStatus == SUCCESS) //外部高速时钟已经准别好
- {
- //开启FLASH的预取功能
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
- //FLASH延迟2个周期
- FLASH_SetLatency(FLASH_Latency_2);
-
- //配置AHB(HCLK)时钟=SYSCLK
- RCC_HCLKConfig(RCC_SYSCLK_Div1);
-
- //配置APB2(PCLK2)钟=AHB时钟
- RCC_PCLK2Config(RCC_HCLK_Div1);
- //配置APB1(PCLK1)钟=AHB 1/2时钟
- RCC_PCLK1Config(RCC_HCLK_Div2);
- //配置ADC时钟=PCLK2 1/4
- RCC_ADCCLKConfig(RCC_PCLK2_Div4);
- //配置PLL时钟 == 外部高速晶体时钟*9 PLLCLK = 8MHz * 9 = 72 MHz
- RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
- //配置ADC时钟= PCLK2/4
- RCC_ADCCLKConfig(RCC_PCLK2_Div4);
- //使能PLL时钟
- RCC_PLLCmd(ENABLE);
- //等待PLL时钟就绪
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
- {
- }
- //配置系统时钟 = PLL时钟
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
- //检查PLL时钟是否作为系统时钟
- while(RCC_GetSYSCLKSource() != 0x08)
- {
- }
- }
- // 开启DMA1时钟 Enable
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
- //开启ADC1时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);
- //下面是给各模块开启时钟
- //启动GPIO
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB ,ENABLE);
- //启动AFIO
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
- //启动DMA时钟
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
- //启动ADC1时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
- //开启串口时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
- }
- void SysTick_Configuration(void)
- {
- /* 设置AHB时钟为SysTick时钟*/
- SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //采用8分频
-
- /* 设置SysTicks中断抢占优先级 3, 从优先级0*/
- NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 3, 0);
-
- /* 每1ms发生一次SysTick中断 在72M的时钟下*/
- SysTick_SetReload(9); //该参数取值必须在1和0x00FFFFFF之间 9/(72000 000/8)= 1us 1微秒计数
-
- /* 开启SysTick中断 */
- SysTick_ITConfig(ENABLE);
- }
- void ADC1_2_IRQHandler(void)
- {
- ADC1ConvertedValue = ADC_GetConversionValue(ADC1);
- }
- /*******************************************************************************
- * NVIC配置函数
- *******************************************************************************/
- 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
-
- /* 开启定时器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黑下载附件…………
复制代码
所有资料51hei提供下载:
DS18B20 温度检测.7z
(3.55 MB, 下载次数: 207)
|