我知道ds18b20很简单,但是不知道为什么我调时序调了3天竟然还是读不出来温度。自己用51
单片机可以读出来,但是换成
STM32l152就一直读出温度为0,每个延时函数我都使用示波器看过了。
- #include "ds18b20.h"
- #include "delay.h"
- //¸´Î»DS18B20
- uint8_t DS18B20_Rst(void) //2015.1.5 OK
- {
- uint8_t Countlook;
- DS18B20_IO_OUT(HIGH);
- delay2us();
- DS18B20_IO_OUT(LOW);
- delayx100us(6);
- DS18B20_IO_OUT(HIGH);
- delay15us();delay15us();delay15us();
- DS18B20_IO_IN();
- Countlook=GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0);
- delayx100us(2);delay2us();
- return Countlook;
- // while(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0));
- }
- uint8_t DS18B20_Check(void)
- {
- uint8_t retry=0;
- DS18B20_IO_IN();
- // while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0));
- // while(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0));
- while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0)&&retry<120)
- {
- retry++;
- delay2us();
- }
- if(retry>=120)
- return 1;
- else
- retry=0;
- while(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0)&&retry<240)
- {
- retry++;
- delay2us();
- }
- if(retry>=240)
- return 1;
- return 0;
- }
- void DS18B20_Init(void)
- {
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE,ENABLE);
- GPIO_DeInit(GPIOE);
- DS18B20_IO_OUT(HIGH);
- }
- void DS18B20_Start(void)
- {
- DS18B20_Rst();
- DS18B20_Check();
- DS18B20_Write_Byte(0xcc);
- DS18B20_Write_Byte(0x44);
- }
- void DS18B20_Write_Byte(uint8_t dat)
- {
- uint8_t j,testb;
- DS18B20_IO_OUT(HIGH);
- //need to set PE0 output
- for(j=0;j<8;j++)
- {
- DS18B20_IO_OUT(HIGH);
- testb=dat&0x01;
- dat>>=1;
- if(0x01==testb)
- {
- DS18B20_IO_OUT(LOW);
- delay2us();
- DS18B20_IO_OUT(HIGH);
- delay60us();
- }
- else
- {
- DS18B20_IO_OUT(LOW);
- delay60us();
- DS18B20_IO_OUT(HIGH);
- delay2us();
- }
- }
- }
- uint8_t DS18B20_Read_Bit(void)
- {
- uint8_t dat;
- DS18B20_IO_OUT(HIGH);
- DS18B20_IO_OUT(LOW);
- delay2us();
- DS18B20_IO_OUT(HIGH);
- delay2us();
- DS18B20_IO_IN();
- delay2us();
- if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0))
- dat=1;
- else
- dat=0;
- delay50us();
- return dat;
- }
- uint8_t DS18B20_Read_Byte(void)
- {
- uint8_t i,j,TEMP_dat;
- TEMP_dat=0;
- for(i=0;i<8;i++)
- {
- j=DS18B20_Read_Bit();
- TEMP_dat=(j<<7)|(TEMP_dat>>1);
- }
- return TEMP_dat;
- }
- void DS18B20_IO_OUT(IO_State NewState)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE,ENABLE);
- GPIO_DeInit(GPIOE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //LED0-->PE.7 ¶Ë¿ÚÅäÖÃ
- GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT;
- GPIO_InitStructure.GPIO_Speed =GPIO_Speed_40MHz;
- GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
- GPIO_Init(GPIOE, &GPIO_InitStructure); //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOE.7
- if(NewState==LOW)
- GPIO_ResetBits(GPIOE,GPIO_Pin_0); //PE.7 Êä³ö¸ß
- else
- GPIO_SetBits(GPIOE,GPIO_Pin_0);
- }
- void DS18B20_IO_IN()
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE,ENABLE);
- GPIO_DeInit(GPIOE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //LED0-->PE.7 ¶Ë¿ÚÅäÖÃ
- GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN;
- GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;
- GPIO_InitStructure.GPIO_Speed =GPIO_Speed_40MHz;
- GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
- GPIO_Init(GPIOE, &GPIO_InitStructure); //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOE.7
- }
- uint16_t DS18B20_Get_Temp(void)
- {
- uint8_t temp;
- uint8_t TL,TH;
- uint16_t tem;
- DS18B20_Rst();
- delayx100us(8);
- DS18B20_Write_Byte(0xcc);
- DS18B20_Write_Byte(0x44);
- DS18B20_IO_IN();
- while(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0));
- DS18B20_Rst();
- delayx100us(8);
- DS18B20_Write_Byte(0xcc);
- DS18B20_Write_Byte(0xbe);
- TL=DS18B20_Read_Byte();
- TH=DS18B20_Read_Byte();
- if(TH>7)
- {
- TH=~TH;
- TL=~TL;
- temp=0;
- }
- else
- temp=1;
- tem=TH;
- tem<<=8;
- tem|=TL;
- tem=tem*0.0625;
- return tem;
- if(temp)
- return tem;
- else
- return -tem;
- }
复制代码
代码很乱... ...因为刚开始使用的是一个基于stm32f1xx系列
芯片的驱动,没有调试好我就按照自己写的51程序调,导致现在程序不伦不类,谁能给指点一下吗?
一周热门 更多>