微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 室温为20几度可是显示的是-30几度

室温为20几度可是显示的是-30几度

时间:10-02 整理:3721RD 点击:
用手捏住可以升温   ,,,,,到底是什么问题啊

/*************************************
ds18b20测温
晶振 ;11.0592M
**************************************/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
READTEMPERATURE(void);
sbit DQ=P2^2;  
sbit du=P2^6;
sbit we=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms()
{
        int x,y;
        for(x=1;x>0;x--)
                for(y=20;y>0;y--);
}

/****************************
                精确延时函数
****************************/
void delay (uint i)
{
while(i--);
}
/****************************
初始化18B20函数
*****************************/
void init_DS18B20(void)
{
uchar x=0;
  DQ=1;
  delay(2);           //稍作延时
  DQ=0;
  delay(80);//做测试出来的函数 需要测试
  DQ=1;
  delay(14);// 复位脉冲和存在脉冲之间的间隔+存在脉冲出现的时间
  x=DQ;                   //为0时复位成功。
  delay(20);// 随便延时下,为下一步做准备
}
/***************************************
            读一个字节DS18b20
*****************************************/
READONECHAR(void)
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0;
//不用延时了 12兆的晶振处理一次查不多要1us
dat=dat>>1;
DQ=1;
if(DQ==1) //假如是0  就直接右移
{
dat=dat|0x80; //如果是1 就在DAT的最高位 或 一个1
}                 //循环8次
delay(2);
}
return (dat);
}
/***************************************
            写一个字节DS18b20
*****************************************/
void WRITEONECHAR(uchar dat)
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0;   //控制器拉低
DQ=dat&0x01;//  取最低位    从最低位写起
delay(5);//测试过了,要保持多余60us         66us
DQ=1;
dat=dat>>1;    //右移一位
}
delay(4);// 每个命令有个间隔
}
/***************************************
            读取温度值函数DS18b20
*****************************************/
READTEMPERATURE(void)
{
uchar a=0; //  a b 和成一个温度
uchar b=0; //
uchar t=0;
init_DS18B20();
WRITEONECHAR(0xCC);//跳过命令  因为只有一个18B20
WRITEONECHAR(0x44); //开始温度转化
delay(20);
//可以不加延时        因为初始化里面有延时了
//完成第一步
init_DS18B20();
WRITEONECHAR(0xCC);
WRITEONECHAR(0xBE); //读取暂存器数据
a=READONECHAR();// 温度地位  lsb
b=READONECHAR();// 温度高位  msb
//舍弃小数点后的数字
//h还可以继续读 READONECHAR()  下面的温度上下限
t=(b<<4)|(a>>4);//b去高四位   a去低四位  这样 或 上就是一个温度
        if(t>128)
        {
        t=-t+1;       
        }
        delay(14);
return(t); //把t返回出去
}
/**********************************
数码管函数
************************************/
void display(uchar shi,uchar ge)
{

    we=1;
        P0=0xfe;
        we=0;
        P0=0xff;
        du=1;
        P0=shi;
        du=0;
        delayms();
        we=1;
        P0=0xfd;
        we=0;
        P0=0xff;
        du=1;
        P0=ge;
        du=0;
        delayms();
          
}
/***************************
  主函数部分
***************************/
void main ()
{
  uchar t0,t1 ,t,T_GE,T_SHIWEI;
  init_DS18B20();
  delay(20);

while(1)
{
t=READTEMPERATURE();
T_GE=t%10; // 去高四位
T_SHIWEI=t/10;//去低四位

        t0=T_SHIWEI;
                t1=T_GE;
       display(table[t0],table[t1]);                 
        }
}

你好好研究研究18B20读出数据的转换方法。还有重要的一点就是18B20的读写时序时间要求挺严格的。最好用示波器捕获一下时序时间是不是合适。

帮忙看下这个程序有问题吗

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top