lanye 发表于 2013-4-24 11:40:28

再次请教各位大虾啊!DS18B20单总线挂八个,1602显示温度

我是一个新手,现在在做毕设,写程序老出问题(编译没问题,运行结果总不理想),但是总检查不出来。肯请各位大虾帮哈忙啊?
想在1602的第一排显示4个温度值,第二排显示4个(同时显示正负号)。但是我的结果是第一排总为0。第二排的温度值是正确的,但是符号位总为+。为什么呢,我检查了想应的地方没什么问题啊?
因为能显示部分温度,所以DS18B20和1602的驱动应该是没问题的,所以下面的程序省略了这些。

#include<reg52.h>
#include <Intrins.h>
#include "math.h"

#define uchar unsigned char
#define uint unsigned int

const uchar code ROMData0={0x28,0x30,0xC5,0xB8,0x00,0x00,0x00,0xD7};
const uchar code ROMData1={0x28,0x31,0xC5,0xB8,0x00,0x00,0x00,0x8E};
const uchar code ROMData2={0x28,0x32,0xC5,0xB8,0x00,0x00,0x00,0xB9};
const uchar code ROMData3={0x28,0x33,0xC5,0xB8,0x00,0x00,0x00,0xE0};
const uchar code ROMData4={0x28,0x34,0xC5,0xB8,0x00,0x00,0x00,0x52};
const uchar code ROMData5={0x28,0x35,0xC5,0xB8,0x00,0x00,0x00,0x65};
const uchar code ROMData6={0x28,0x36,0xC5,0xB8,0x00,0x00,0x00,0x3C};
const uchar code ROMData7={0x28,0x37,0xC5,0xB8,0x00,0x00,0x00,0x0B};

int table1;                                                //用于装每层楼1号温度值
//int table2;                                                //用于装每层楼2号温度值
bit Mark;                                                                //温度正负号标志位
uchar tempL,tempH;                                       //设置温度值高位和低位

sbit RS=P2^0;                                                                   //数据命令选择端
sbit RW=P2^1;                                                                   //读写选择端
sbit EN=P2^2;                                                                   //使能端
sbit DQ=P2^3;

void MatchROM(const uchar *pMatchData)                          //        匹配ROM子程序
{
        int i;
        Init18b20();
        WriteByte(0x55);
        for(i=0;i<8;i++)
        {
                WriteByte(*pMatchData);
                pMatchData++;
                Delay16us();
        }       
}
void ReadTemperature()
{                       
        float t;                                       
        int temperature,temp,i;                                         //存放温度数值
        Init18b20();
        WriteByte(0xcc);                                                          //跳过读ROM
        WriteByte(0x44);                                                                //温度转换
        Delay16us();
        Init18b20();
        for(i=0;i<8;i++)
        {                               
                switch(i)                                                                                          //匹配ROM
                {
                        case 0: MatchROM(ROMData0);break;
                        case 1: MatchROM(ROMData1);break;
                        case 2: MatchROM(ROMData2);break;
                        case 3: MatchROM(ROMData3);break;
                        case 4: MatchROM(ROMData4);break;
                        case 5: MatchROM(ROMData5);break;
                        case 6: MatchROM(ROMData6);break;
                        case 7: MatchROM(ROMData7);break;                       
                }               
                WriteByte(0xbe);                                                     //读温度寄存器(头两个值分别是温度低位和温度高位)
                tempL=ReadByte();                                               //读出温度低位值
                tempH=ReadByte();                                               //读出温度高位值
                temp=tempH;                                                               //char是8位的,所以要将其转成int型
                temp<<=8;                                       
                temp|=tempL;
                if(temp<0)                                                                         //如果是负数,求其原码
                {
                        temp=~temp;
                        temp++;
                        Mark=1;
                }
                else Mark=0;
            t=temp * 0.0625;                                             //算出温度值
                temperature=t*10+(t>0?0.5:-0.5);                           //将值扩大10倍,同时四舍五入
                table1=temperature;                          
        }       
}

void display()                                                                //每一个温度值的液晶显示
{
        int i;
        uchar wendu={0,0,0,0};
        uint num;       
        Write_com(0x80);                                                                                       
        for(i=0;i<4;i++)                                                                        //显示前四个传感器的温度
        {                                                                                               
                if(Mark==1)wendu=0x2d;                                                          //显示温度负号                                                                                       
            if(Mark==0)wendu=0x2b;                                                          //显示温度正号
                wendu=table1%1000/100+0x30;                                //温度值十位                               
                wendu=table1%100/10+0x30;                                //温度个位
                wendu='\0';
               for(num=0;num<4;num++)                                  //显示温度值
                {
                        Write_data(wendu);
                        delay(5);
                }
                }
        Write_com(0x80+0x40);
        for(i=4;i<8;i++)
        {
                if(Mark==1)wendu=0x2d;                                       //显示温度负号                                                                                       
                       if(Mark==0)wendu=0x2b;                                                      //显示温度正号
                wendu=table1%1000/100+0x30;                                //温度值十位                               
                wendu=table1%100/10+0x30;                                //温度个位
                wendu='\0';
                               for(num=0;num<4;num++)                                  //显示温度值
                {
                        Write_data(wendu);
                        delay(5);
                }       
        }                                                                                                  
}

void main()
{          
        init();                                                                  //液晶初始化
        Init18b20();                                                  //DQ1初始化
           while(1)
               {
                   ReadTemperature();                                          //读所有点的温度,并存储
                   display();                                          //显示每层楼的温度
                delay(5);
            }       
}


左边4个DS18B20的值在1602的第一排显示,右边的4个在第二排显示

lanye 发表于 2013-4-24 11:43:48

上面注释有点问题,所有的8个温度值都放在table1这个数组里了。table2这个数组没什么用
页: [1]
查看完整版本: 再次请教各位大虾啊!DS18B20单总线挂八个,1602显示温度