真心被ds18b20虐了!
时间:10-02
整理:3721RD
点击:
我知道ds18b20很简单,但是不知道为什么我调时序调了3天竟然还是读不出来温度。自己用51单片机可以读出来,但是换成stm32l152就一直读出温度为0,每个延时函数我都使用示波器看过了。
代码很乱... ...因为刚开始使用的是一个基于stm32f1xx系列芯片的驱动,没有调试好我就按照自己写的51程序调,导致现在程序不伦不类,谁能给指点一下吗?
- #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); //?ù?Yéè?¨2?êy3?ê??ˉGPIOE.7
- if(NewState==LOW)
- GPIO_ResetBits(GPIOE,GPIO_Pin_0); //PE.7 ê?3???
- 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); //?ù?Yéè?¨2?êy3?ê??ˉ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程序调,导致现在程序不伦不类,谁能给指点一下吗?
问题太简单了吗... ...有人能给我发一份驱动文件吗,刚学stm32没几天,不好上手。
能给一份单片机的ds18b20,吗
把扫描程序放定时器中断中就可以了!