搜索
bottom↓
回复: 1

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

[复制链接]

出0入0汤圆

发表于 2013-4-24 11:40:28 | 显示全部楼层 |阅读模式
我是一个新手,现在在做毕设,写程序老出问题(编译没问题,运行结果总不理想),但是总检查不出来。肯请各位大虾帮哈忙啊?
想在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[8]={0x28,0x30,0xC5,0xB8,0x00,0x00,0x00,0xD7};
const uchar code ROMData1[8]={0x28,0x31,0xC5,0xB8,0x00,0x00,0x00,0x8E};
const uchar code ROMData2[8]={0x28,0x32,0xC5,0xB8,0x00,0x00,0x00,0xB9};
const uchar code ROMData3[8]={0x28,0x33,0xC5,0xB8,0x00,0x00,0x00,0xE0};
const uchar code ROMData4[8]={0x28,0x34,0xC5,0xB8,0x00,0x00,0x00,0x52};
const uchar code ROMData5[8]={0x28,0x35,0xC5,0xB8,0x00,0x00,0x00,0x65};
const uchar code ROMData6[8]={0x28,0x36,0xC5,0xB8,0x00,0x00,0x00,0x3C};
const uchar code ROMData7[8]={0x28,0x37,0xC5,0xB8,0x00,0x00,0x00,0x0B};

int table1[8];                                                //用于装每层楼1号温度值
//int table2[4];                                                //用于装每层楼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[i]=temperature;                          
        }         
}

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

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


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-4-24 11:43:48 | 显示全部楼层
上面注释有点问题,所有的8个温度值都放在table1[8]这个数组里了。table2[4]这个数组没什么用
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 18:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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