二选一题,第一题:
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<<i); } 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; }