新手上路
- 积分
- 28
- 金钱
- 28
- 注册时间
- 2020-2-25
- 在线时间
- 7 小时
|
10金钱
#include<DS18B20.h>
#include<delay.h>
u8 DS18B20_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStrue;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOG,&GPIO_InitStrue);
GPIO_SetBits(GPIOG,GPIO_Pin_11);
DS18B20_RESET();
return DS18B20_WAIT_ACT();
}
void DS18B20_CON(void)
{
DS18B20_IO_OUT;
DS18B20_WRITE_BYTE(0xcc);//Skip ROM
DS18B20_WRITE_BYTE(0x4e);//写命令
DS18B20_WRITE_BYTE(0x75);
DS18B20_WRITE_BYTE(0x00);
DS18B20_WRITE_BYTE(0x7f);
DS18B20_RESET();
DS18B20_WAIT_ACT();
}
void DS18B20_RESET(void)
{
DS18B20_IO_OUT;
DS18B20_DQ_OUT=0;
delay_us(750);
DS18B20_DQ_OUT=1;
delay_us(15);
}
u8 DS18B20_WAIT_ACT(void) //返回值 1:成功,0:失败
{
u8 i=0;
DS18B20_IO_IN;
while(DS18B20_DQ_IN&&i<200)
{
i++;
delay_us(1);
}
if(i>=200) return 0;
i=0;
while(!DS18B20_DQ_IN&&i<240)
{
i++;
delay_us(1);
}
if(i>=240) return 0;
return 1;
}
u8 DS18B20_READ_BIT(void)
{
u8 bit;
DS18B20_IO_OUT;
DS18B20_DQ_OUT=0;
delay_us(2);
DS18B20_DQ_OUT=1;
DS18B20_IO_IN;
delay_us(12);
if(DS18B20_DQ_IN) bit=1;
else bit=0;
delay_us(50);
return bit;
}
void DS18B20_WRITE_BYTE(u8 dat)
{
u8 i;
DS18B20_IO_OUT;
for(i=0;i<8;i++)
{
if((dat&0x01)==0x01)
{
DS18B20_DQ_OUT=0;
delay_us(2);
DS18B20_DQ_OUT=1;
delay_us(60);
}
else
{
DS18B20_DQ_OUT=0;
delay_us(60);
DS18B20_DQ_OUT=1;
delay_us(2);
}
dat>>=1;
}
}
u8 DS18B20_READ_BYTE(void)
{
u8 i,j=0,temp=0;
for(i=0;i<8;i++)
{
j=DS18B20_READ_BIT();
temp=(temp>>1)|(j<<7);
}
return temp;
}
float DS18B20_GET_Tempture(void)
{
u8 TL,TH;
short tem;
float temp;
DS18B20_START();
DS18B20_RESET();
DS18B20_WAIT_ACT();
DS18B20_WRITE_BYTE(Skip_ROM);
DS18B20_WRITE_BYTE(Read_Scratchpad);
TL=DS18B20_READ_BYTE();
TH=DS18B20_READ_BYTE();
DS18B20_RESET();
tem=TH;
tem<<=8;
tem+=TL;
if(tem<0)
{
tem=~tem;
tem++;
temp=tem*0.0625;
temp=-temp;
}
else
{
temp=tem*0.0625;
}
return temp;
}
void DS18B20_START(void)
{
DS18B20_RESET();
DS18B20_WAIT_ACT();
DS18B20_WRITE_BYTE(Skip_ROM); //跳过ROM
DS18B20_WRITE_BYTE(Convert_T); //温度转换
}
主函数:
#include<stm32f10x.h>
#include<sys.h>
#include<led.h>
#include<usart.h>
#include<delay.h>
#include<DS18B20.h>
int main()
{
u8 i=0;
float temp;
delay_init();
LED_init();
uart_init(115200);
while(!DS18B20_INIT());
while(1)
{
if(i==15)
{
temp=DS18B20_GET_Tempture();
if(temp>=0)
{
printf("%.4f\r\n",temp);
}
else
{
temp=-temp;
printf("-%.4f\r\n",temp);
}
}
i++;
delay_ms(50);
if(i>=20)
{
i=0;
LED0=!LED0;
}
}
}
|
|