野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19112|回复: 2

为什么我的DS18B20程序用LCD显示出来的时候总是显示4095.938

[复制链接]
发表于 2013-8-31 22:01:48 | 显示全部楼层 |阅读模式
本帖最后由 天狼星 于 2013-8-31 22:04 编辑

为什么我的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 "18b20.h"
#include "led.h"

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,"Temp  % 7.3f",temperature);               
                //        sprintf(Send,"Temp  % 7.3f",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 "SysTick.h"
#include "18b20.h"
#include "lcd.h"
/*------------------------------------------------
                    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 "stm32f10x.h"     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义


#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

回复

使用道具 举报

发表于 2013-9-1 00:56:34 | 显示全部楼层
既然你怀疑是 LCD 的问题,那就改成串口显示呗,排除法!!!
一大堆代码,保证没人看的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-1 23:03:50 | 显示全部楼层
小栋 发表于 2013-9-1 00:56
既然你怀疑是 LCD 的问题,那就改成串口显示呗,排除法!!!
一大堆代码,保证没人看的

LCD早就调好可以正常显示了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-6 09:44 , Processed in 0.027096 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表