为什么我的DS18B20程序用LCD显示出来的时候总是显示4095.938,这个是经过temperature=(float)temp*0.0625;才显示4095.938,如果是直接temp=ReadTemperature() ;的话显示的是65535,现在我把写的函数贴出来看看
主函数是
#include "stm32f10x.h"
#include "SysTick.h"
#include "usart1.h"
#include "lcd.h"
#include "sd_fs_app.h"
#include "Sd_bmp.h"
#include <stdio.h>
#include &quot;18b20.h&quot;
#include &quot;led.h&quot;
int temp;
float temperature;
uint16_t i,j;
uint32_t ticktime;
int main(void)
{
char displaytemp[16];
u8 displaytemp2[16];
/* USART1 config */
// USART1_Config();
SysTick_Init();
LED_GPIO_Config();
LCD_Init(); // LCD 初始化
// sd_fs_init();
Init_DS18B20();
LCD_Rectangle(0,0,320,240,WHITE);
while(1)
{
temp=ReadTemperature();
temperature=(float)temp*0.0625;
sprintf(displaytemp,&quot;Temp % 7.3f&quot;,temperature);
// sprintf(Send,&quot;Temp % 7.3f&quot;,temp);
// LCD_Char_O(20, 90,temp, BLACK);
for(i=0;i<16;i++)
{
displaytemp2=displaytemp;
}
LCD_Str_6x12_O(20, 90,displaytemp2, BLACK);
delay_ms(500);
LCD_Rectangle(20,90,100,20,WHITE);
}
}
18B20模块的源文件
#include &quot;SysTick.h&quot;
#include &quot;18b20.h&quot;
#include &quot;lcd.h&quot;
/*------------------------------------------------
18b20 GPIO初始化
------------------------------------------------*/
void DQ_GPIO_Out_Mode(void) //DQ
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void DQ_GPIO_In_Mode(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*------------------------------------------------
18b20初始化
------------------------------------------------*/
u8 Init_DS18B20(void)
{
u8 dat=0;
DQ_GPIO_Out_Mode();
// GPIO_SetBits(GPIOA,GPIO_Pin_1); //DQ复位
DQ(1);
Delay_us(10); //稍做延时
// GPIO_ResetBits(GPIOA,GPIO_Pin_1); //单片机将DQ拉低
DQ(0);
Delay_us(750); //精确延时 大于 480us 小于960us
// GPIO_SetBits(GPIOA,GPIO_Pin_1); //拉高总线
DQ(1);
DQ_GPIO_In_Mode();
Delay_us(100); //15~60us 后 接收60-240us的存在脉冲
//dat=DQ; //如果x=0则初始化成功, x=1则初始化失败
dat=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1);
Delay_us(50); //稍作延时返回
return dat;
}
/*------------------------------------------------
读取一个字节
------------------------------------------------*/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
DQ_GPIO_Out_Mode();
for (i=8;i>0;i--)
{
DQ(0);
dat>>=1;
DQ(1);
// GPIO_ResetBits(GPIOA,GPIO_Pin_1); // 给脉冲信号
// GPIO_SetBits(GPIOA,GPIO_Pin_1); // 给脉冲信号
Delay_us(7);
DQ_GPIO_In_Mode();
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==1)
dat|=0x80;
Delay_us(50);
// GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
DQ_GPIO_Out_Mode();
return(dat);
}
/*------------------------------------------------
写入一个字节
------------------------------------------------*/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
DQ_GPIO_Out_Mode();
for (i=8; i>0; i--)
{
//GPIO_ResetBits(GPIOA,GPIO_Pin_1);
DQ(0);
Delay_us(5);
GPIO_Write(GPIOA,dat&0x01);
Delay_us(60);
// GPIO_SetBits(GPIOA,GPIO_Pin_1);
DQ(1);
Delay_us(5);
dat>>=1;
}
Delay_us(60);
}
/*------------------------------------------------
读取温度
------------------------------------------------*/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay_ms(10);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
b<<=8;
// t=a+b;
t=a|b;
// t<<=8;
// t|=a;
// LCD_Str_6x12_O(20, 70,bb, BLACK);
return(t);
}
18B20的头文件
#ifndef __DS18B20_H__
#define __DS18B20_H__
#include &quot;stm32f10x.h&quot; //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define uchar unsigned char
#define uint unsigned int;
/*------------------------------------------------
端口定义
------------------------------------------------*/
//sbit DQ=P1^3;//ds18b20 端口
#define DQ(a) if (a)
GPIO_SetBits(GPIOA,GPIO_Pin_1);
else
GPIO_ResetBits(GPIOA,GPIO_Pin_1)
/*------------------------------------------------
函数声明
------------------------------------------------*/
void DQ_GPIO_Out_Mode(void);
void DQ_GPIO_In_Mode(void);
unsigned int ReadTemperature(void);
u8 Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
#endif |