#include “ds18b20.h” #include “delay.h” //复位 DS18B20 void DS18B20_Rst(void) { DS18B20_IO_OUT(); //SET PA0 OUTPUT DS18B20_DQ_OUT=0; //拉低 DQ delay_us(750); //拉低 750us DS18B20_DQ_OUT=1; //DQ=1 delay_us(15); //15US } //等待 DS18B20 的回应 //返回 1:未检测到 DS18B20 的存在 //返回 0:存在 u8 DS18B20_Check(void) { u8 retry=0; DS18B20_IO_IN();//SET PA0 INPUT while (DS18B20_DQ_IN&&retry<200) { retry ; delay_us(1); }; if(retry>=200)return 1; else retry=0; while (!DS18B20_DQ_IN&&retry<240) { retry ; delay_us(1); }; if(retry>=240)return 1; return 0; } //从 DS18B20 读取一个位 //返回值:1/0 u8 DS18B20_Read_Bit(void) // read one bit { u8 data; DS18B20_IO_OUT();//SET PA0 OUTPUT DS18B20_DQ_OUT=0; delay_us(2); DS18B20_DQ_OUT=1; DS18B20_IO_IN();//SET PA0 INPUT delay_us(12); if(DS18B20_DQ_IN)data=1; else data=0; delay_us(50); return data; } //从 DS18B20 读一个字节 ///返回值:读取的数据 u8 DS18B20_Read_Byte(void) // read one byte { u8 i,j,dat; dat=0; for (i=1;i<=8;i ) { j=DS18B20_Read_Bit(); dat=(j<<7)|(dat>>1); } return dat; } //写一个字节到 DS18B20 //dat:要写的字节 void DS18B20_Write_Byte(u8 dat) { u8 j; u8 testb; DS18B20_IO_OUT();//SET PA0 OUTPUT; for (j=1;j<=8;j ) { testb=dat&0x01; dat=dat>>1; if (testb) { DS18B20_DQ_OUT=0;// Write 1 delay_us(2); DS18B20_DQ_OUT=1; delay_us(60); } else { DS18B20_DQ_OUT=0;// Write 0 delay_us(60); DS18B20_DQ_OUT=1; delay_us(2); } } } //开始温度转换 void DS18B20_Start(void)// ds1820 start convert { DS18B20_Rst(); DS18B20_Check(); DS18B20_Write_Byte(0xcc);// skip rom DS18B20_Write_Byte(0x44);// convert } //初始化 DS18B20 的 IO 口 DQ 同时检测 DS 的存在 //返回 1:不存在 //返回 0:存在 u8 DS18B20_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); //使能 PG 口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PORTG.11 推挽输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOG, &GPIO_InitStructure); //初始化 GPIO GPIO_SetBits(GPIOG,GPIO_Pin_11); //输出 1 DS18B20_Rst(); return DS18B20_Check(); } //从 ds18b20 得到温度值 //精度:0.1C //返回值:温度值 (-550~1250) short DS18B20_Get_Temp(void) { u8 temp; u8 TL,TH; short tem; DS18B20_Start (); // ds1820 start convert DS18B20_Rst(); DS18B20_Check(); DS18B20_Write_Byte(0xcc);// skip rom DS18B20_Write_Byte(0xbe);// convert TL=DS18B20_Read_Byte(); // LSB TH=DS18B20_Read_Byte(); // MSB if(TH>7) { TH=~TH; TL=~TL; temp=0; ///温度为负 }else temp=1; ///温度为正 tem=TH; //获得高八位 tem<<=8; tem =TL; //获得底八位 tem=(float)tem*0.625; //转换 if(temp)return tem; //回到温度值 else return -tem; } int main(void) { u8 t=0; short temperature; delay_init(); //延迟函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)//设置中断优先级分组 2 uart_init(115200); //串口初始化为 115200 LED_Init(); ///初始化和 LED 连接的硬件接口 LCD_Init(); //初始化 LCD POINT_COLOR=RED; //设置红色字体 LCD_ShowString(30、50、200、16、16)WarShip STM32”); LCD_ShowString(30、70、200、16、16)DS18B20 TEST”); LCD_ShowString(30、90、200、16、16)ATOM@ALIENTEK”); LCD_ShowString(30、110、200、16、16、2015/1/16) while(DS18B20_Init()) //DS18B20 初始化 { LCD_ShowString(30,130,200,16,16,16DS18B20 Error”); delay_ms(200); LCD_Fill(30,130,239,130 16,WHITE); delay_ms(200); } LCD_ShowString(30,130,200,16,16,16DS18B20 OK”); POINT_COLOR=BLUE;//设置蓝色字体 LCD_ShowString(30、150、200、16、16、16)Temp: . C”); while(1) { if(t0) //每 100ms 读取一次 { temperature=DS18B20_Get_Temp(); if(temperature<0) { LCD_ShowChar(30 40,150,’-,16,0); //显示负号 temperature=-temperature; //转为正数 }else LCD_ShowChar(30 40,150,’ ',16,0); //去掉负号 LCD_ShowNum(30 40 8,150,temperature/10,2,16); //显示正数部分 LCD_ShowNum(30 40 32,150,temperature,1,16); //显示小数部分 } delay_ms(10); t ; if(t20) { t=0; LED0=!LED0; } } }