课堂上老师已经给了我们DS18B20使用的代码,即当用手触摸温度传感器,串口助手那里就可以读出当前温度,所以将这个代码与之前LED灯颜色改变的代码整合起来
view plaincopy to clipboardprint?
- #include "stdio.h"
- #include "stm32f10x.h"
- int fputc(int ch,FILE *f);
- /********************RCC配置*********************/
- void RCC_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- ErrorStatus HSEStartUpStatus;
- RCC_DeInit();
- RCC_HSEConfig(RCC_HSE_ON);
- HSEStartUpStatus = RCC_WaitForHSEStartUp();
- if(HSEStartUpStatus==SUCCESS)
- {
- RCC_HCLKConfig(RCC_SYSCLK_Div1);
- RCC_PCLK1Config(RCC_HCLK_Div2);
- RCC_PCLK2Config(RCC_HCLK_Div1);
- RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//*设置PLL输入时钟源8x9=72M
- RCC_PLLCmd(ENABLE);//*打开PLL:
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//*等待PLL工作:
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//*设置系统时钟
- while(RCC_GetSYSCLKSource() != 0x08);
- }
- GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
- /**蜂鸣器*/
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //#管脚号 关闭蜂鸣器
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //#输出速度
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //#输入输出模式(推挽输出)
- GPIO_Init(GPIOD, &GPIO_InitStructure); //#初始化
- GPIO_ResetBits(GPIOD,GPIO_Pin_2);
- }
- void delay_us(u32 n) //延时函数
- {
- u8 j;
- while(n--)
- for(j=0;j<10;j++);
- }
- void delay_ms(u32 n) //延时函数
- {
- while(n--)
- delay_us(1000);
- }
- /*****************************GPIO初始********************************/
- void GPIO_Inits(void)
- { /*结构体初始化及开启外设时钟*/
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
- /*GPIOA--RGB初始化*/
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOA,&GPIO_InitStructure);
- GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3)
- }
- /**************************DS18B20**********************/
- uint8_t DS18B20_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- Set_B20();
- DS18B20_Rst();
- return DS18B20_Presence ();
- }
- static void DS18B20_Mode_IPU(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- }
- static void DS18B20_Mode_Out_PP(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- }
- static void DS18B20_Rst(void)
- {
- /* 主机设置为输出 */
- DS18B20_Mode_Out_PP();
- Reset_B20() ;
- delay_us(700);
- Set_B20() ;
- delay_us(15);
- }
- static uint8_t DS18B20_Presence(void)
- {
- uint8_t pulse_time = 0;
- /* 主机设置为上拉输入 */
- DS18B20_Mode_IPU();
- while( Read_B20() && pulse_time<100 )
- {
- pulse_time++;
- delay_us(1);
- }
- /* 经过100us后,存在脉冲都还没有到来*/
- if( pulse_time >=100 )
- return 1;
- else
- pulse_time = 0;
- /* 存在脉冲到来,且存在的时间不能超过240us */
- while( !Read_B20() && pulse_time<240 )
- {
- pulse_time++;
- delay_us(1);
- }
- if( pulse_time >=240 )
- return 1;
- else
- return 0;
- }
- static uint8_t DS18B20_ReadBit(void)
- {
- uint8_t dat;
- /* 读0和读1的时间至少要大于60us */
- DS18B20_Mode_Out_PP();
- Reset_B20();
- delay_us(10);
- DS18B20_Mode_IPU();
- //Delay_us(2);
- if( Read_B20() == SET )
- dat = 1;
- else
- dat = 0;
- delay_us(45);
- return dat;
- }
- static uint8_t DS18B20_ReadByte(void)
- {
- uint8_t i, j, dat = 0;
- for(i=0; i<8; i++)
- {
- j = DS18B20_ReadBit();
- dat = (dat) | (j<
- }
- return dat;
- }
- static void DS18B20_WriteByte(uint8_t dat)
- {
- uint8_t i, testb;
- DS18B20_Mode_Out_PP();
- for( i=0; i<8; i++ )
- {
- testb = dat&0x01;
- dat = dat>>1;
- /* 写0和写1的时间至少要大于60us */
- if (testb)
- {
- Reset_B20();
- /* 1us < 这个延时 < 15us */
- delay_us(8);
- Set_B20();
- delay_us(58);
- }
- else
- {
- Reset_B20();
- /* 60us < Tx 0 < 120us */
- delay_us(70);
- Set_B20();
- delay_us(2);
- }
- }
- }
- static void DS18B20_SkipRom ( void )
- {
- DS18B20_Rst();
- DS18B20_Presence();
- DS18B20_WriteByte(0XCC); /* 跳过 ROM */
- }
- static void DS18B20_MatchRom ( void )
- {
- DS18B20_Rst();
- DS18B20_Presence();
- DS18B20_WriteByte(0X55); /* 匹配 ROM */
- }
- float DS18B20_GetTemp_SkipRom ( void )
- {
- uint8_t tpmsb, tplsb;
- short s_tem;
- float f_tem;
- DS18B20_SkipRom ();
- DS18B20_WriteByte(0X44); /* 开始转换 */
- DS18B20_SkipRom ();
- DS18B20_WriteByte(0XBE); /* 读温度值 */
- tplsb = DS18B20_ReadByte();
- tpmsb = DS18B20_ReadByte();
- s_tem = tpmsb<<8;
- s_tem = s_tem | tplsb;
- if( s_tem < 0 ) /* 负温度 */
- f_tem = (~s_tem+1) * 0.0625;
- else
- f_tem = s_tem * 0.0625;
- return f_tem;
- }
- void DS18B20_ReadId ( uint8_t * ds18b20_id )
- {
- uint8_t uc;
- DS18B20_WriteByte(0x33); //读取序列号
- for ( uc = 0; uc < 8; uc ++ )
- ds18b20_id [ uc ] = DS18B20_ReadByte();
- }
- float DS18B20_GetTemp_MatchRom ( uint8_t * ds18b20_id )
- {
- uint8_t tpmsb, tplsb, i;
- short s_tem;
- float f_tem;
- DS18B20_MatchRom (); //匹配ROM
- for(i=0;i<8;i++)
- DS18B20_WriteByte ( ds18b20_id [ i ] );
- DS18B20_WriteByte(0X44); /* 开始转换 */
- DS18B20_MatchRom (); //匹配ROM
- for(i=0;i<8;i++)
- DS18B20_WriteByte ( ds18b20_id [ i ] );
- DS18B20_WriteByte(0XBE); /* 读温度值 */
- tplsb = DS18B20_ReadByte();
- tpmsb = DS18B20_ReadByte();
- s_tem = tpmsb<<8;
- s_tem = s_tem | tplsb;
- if( s_tem < 0 ) /* 负温度 */
- f_tem = (~s_tem+1) * 0.0625;
- else
- f_tem = s_tem * 0.0625;
- return f_tem;
- }
- int main()
- {
- uint8_t uc, ucDs18b20Id [ 8 ];
- RCC_Configuration();
- GPIO_Inits();
- USART_int(9600);
- while( DS18B20_Init() )
- printf("\r\n no ds18b20 exit \r\n");
- printf("\r\n Yes ds18b20 \r\n");
- DS18B20_ReadId ( ucDs18b20Id ); // 读取 DS18B20 的序列号
- printf("\r\nDS18B20的序列号是: 0x");
- for ( uc = 0; uc < 8; uc ++ ) // 打印 DS18B20 的序列号
- printf ( "%.2x", ucDs18b20Id [ uc ] );
- for(;;)
- {
- static unsigned int i=0;
- float a,b;
- if(i==10)
- {
- printf ( "\r\n第10秒:温度: %.1f\r\n", DS18B20_GetTemp_MatchRom ( ucDs18b20Id ) ); // 打印通过 DS18B20 序列号获取的温度值
- a=DS18B20_GetTemp_MatchRom ( ucDs18b20Id );
- delay_ms(1000); /* 1s 读取一次温度值 */
- i++;
- }
- else{}
- if(i<10)
- {
- printf ( "\r\n温度: %.1f\r\n", DS18B20_GetTemp_MatchRom ( ucDs18b20Id ) ); // 打印通过 DS18B20 序列号获取的温度值
- delay_ms(1000); /* 1s 读取一次温度值 */
- i++;
- }
- if(i>10)
- {
- printf ( "\r\n10秒后:温度: %.1f\r\n", DS18B20_GetTemp_MatchRom ( ucDs18b20Id ) ); // 打印通过 DS18B20 序列号获取的温度值
- b=DS18B20_GetTemp_MatchRom ( ucDs18b20Id );
- delay_ms(1000); /* 1s 读取一次温度值 */
- i++;
- if((b-a)>0.9)
- {GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
- }
- else{}
- if((b-a)<0.9)
- {
- GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
- }
- else{}
- }
- else{}
- }
- }
- int fputc(int ch,FILE *f)
- {
- USART_SendData(USART1, (uint8_t) ch);
- while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
- {}
- return ch;
- }