找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2893|回复: 11
收起左侧

温度传感器,改了一天了,求大神帮助

[复制链接]
ID:227857 发表于 2017-8-16 09:59 | 显示全部楼层 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit datacon=P3^7;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar data1[8];

void Delay1ms(uint y)
{
        uint x;
        for( ; y>0; y--)
        {
                for(x=110; x>0; x--);
        }
}
uchar Initial1()
{
    uint a,i;
        datacon=0;
        a=70;
        while(a--);
        datacon=1;
        i=0;
        while(datacon)        //等待DS18B20拉低总线
        {
                Delay1ms(1);
                i++;
                if(i>5)//等待>5MS
                {
                        return 0;//初始化失败
                }
       
        }
        return 1;//初始化成功
}

void Writing1(uchar data_)
{
        uint i,j;
        for(i=0;i<8;i++)
        {
                datacon=0;
                j++;
                j++;
                datacon=data_&0x01;
                data_>>=1;
                j=6;
                while(j--)                  ;
                datacon=1;
                data_>>=1;
        }
}
uchar reading1(void)
{
        uint i,j;
        uchar data_,bit_;
        {
                for(i=7;i>=0;i--)
                {
                datacon=0;
                j++;
                datacon=1;
                j++;
                j++;
        bit_=datacon;
                data_=(data_ >> 1) | (bit_ << 7);  
                j=4;
                while(j--);
                }
        }
        return data_;
}
void DS18B20initial1()
{
        Initial1() ;
        Delay1ms(1);
        Writing1(0xcc);                                 
        Writing1(0x44);
        Delay1ms(100);
}
void DS18B20reading1()
{
        Initial1() ;
        Delay1ms(1);
        Writing1(0xcc);                                 
        Writing1(0xbe);       
}
int Ds18b20ReadTemp1()
{
        int temp = 0;
        uchar tmh, tml;
        DS18B20initial1();                                
        DS18B20reading1();                       
        tml = reading1();               
        tmh = reading1();               
        temp = tmh;
        temp <<= 8;
        temp |= tml;
        return temp;
}

void delay(uint i)
{
        while(i--);       
}


void datadeal(int data2)
{
        float a;
        if(data2<0)
        {
        data1[0]=0x40;
        data2=data2-1;
        data2=~data2;         //data2*=(-1);
        a=data2;
        data2=a*0.0625*100;
        }
        else
        {
        data1[0]=0x00;
        a=data2;
        data2=a*0.0625*100;
        }
        data1[1]=smgduan[data2/10000];
        data1[2]=smgduan[data2%10000/1000];
        data1[3]=smgduan[data2%1000/100]|0x80;
        data1[4]=smgduan[data2%100/10];
        data1[5]=smgduan[data2%10];
}
void DigDisplay()
{
        uchar i;
        for(i=0;i<6;i++)
        {
                switch(i)       
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;
                        case(1):
                                LSA=1;LSB=0;LSC=0; break ;
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;       
                }
                P0=data1[5-i];
                delay(100);
                P0=0x00;
        }               
}
void main()
{        while(1)
        {
                datadeal(Ds18b20ReadTemp1())        ;
                DigDisplay();
        }
}

回复

使用道具 举报

ID:227864 发表于 2017-8-16 10:52 | 显示全部楼层
延时函数好像不对吧?
回复

使用道具 举报

ID:82765 发表于 2017-8-16 10:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:227857 发表于 2017-8-16 11:48 | 显示全部楼层
怪怪爱玩 发表于 2017-8-16 10:52
延时函数好像不对吧?

应该是对的
回复

使用道具 举报

ID:227857 发表于 2017-8-16 12:14 | 显示全部楼层
cjjcjj1 发表于 2017-8-16 10:54
你好!具体是什么现象?你要实现的总体功能是什么?可以加我

就是让数码管显示温度,但是数码管就是不显示

回复

使用道具 举报

ID:190832 发表于 2017-8-16 12:50 | 显示全部楼层
在DigDisplay()函数中,P0=data[5-i];这句是错的。应该是P0=smgduan[data[i]];
回复

使用道具 举报

ID:190832 发表于 2017-8-16 12:56 | 显示全部楼层
你的datadeal(int data2)和DigDisplay()函数根本不对,在好好看看怎么写显示函数;应该是把数据放到数组data,之后通过数码管smgduan显示数字。好好缕一缕吧。
回复

使用道具 举报

ID:227857 发表于 2017-8-16 16:06 | 显示全部楼层
hange_v 发表于 2017-8-16 12:56
你的datadeal(int data2)和DigDisplay()函数根本不对,在好好看看怎么写显示函数;应该是把数据放到数组dat ...

这个是对的,例程就是这么写的,
回复

使用道具 举报

ID:190832 发表于 2017-8-16 16:45 | 显示全部楼层
纠结123 发表于 2017-8-16 16:06
这个是对的,例程就是这么写的,

这是我以前的代码,你看看,另外看看你的跳线帽插上了没有。。。
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define nop() _nop_()
bit flag;
sbit SDA=P3^7;
sbit DA=P2^2;sbit DB=P2^3;sbit DC=P2^4;
void delay(ms)
{
        uchar i,j;
        for(i=0;i<ms;i++)
          for(j=0;j<110;j++);
}
uchar code table[]={
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71,0x80,0x40};
uchar initDS13B20()
{
        uchar i;
        SDA=0;i=70;
        while(i--);
        SDA=1;i=0;
        while(SDA)
        {
                i++;
                delay(1);
                if(i>50)
                        return 0;
    }
        return 1;
}
void DS13B20write(uchar com)
{
        uchar i,j;
        for(i=0;i<8;i++)
        {
                SDA=0;j++;
                SDA=(com&0x01);
                j=6;while(j--);
                SDA=1;
                com=(com>>1);
        }
}
uchar DS13B20read()
{
        uchar i,j,di=0,dat=0;
        for(i=0;i<8;i++)
        {
                SDA=0;j++;
                SDA=1;j++;j++;
                di=SDA;
                dat=((dat>>1)|(di<<7));
                j=4;
                while(j--);
    }
        return dat;
}
void change()
{
        initDS13B20();
        delay(1);
        DS13B20write(0xcc);
        DS13B20write(0x44);
}
void getvalue()
{
        initDS13B20();
        delay(1);
        DS13B20write(0xcc);
        DS13B20write(0xbe);
}
int read()
{
        uchar dal=0,dah=0;
        int dat=0;
        change();
        getvalue();
        dal=DS13B20read();
        dah=DS13B20read();
        dat=((dah<<8)|dal);
        return dat;
}
float changeC()
{
        int a;
        float value;
        a=read();
        if(a>=0)
        {
            flag=1;
                value=a*0.0625;
        }
        else
        {
                flag=0;
                value=(~(a-1))*0.625;
        }
        return value;
}
void disp1(float num)
{
        uchar a,i,j;
        for(i=0;i<6;i++)
        {
                switch(i)
                {
            case 0:DA=0;DB=0;DC=0;a=(int)num/10;    break;               
            case 1:DA=1;DB=0;DC=0;a=(int)num%10;    break;
            case 2:DA=0;DB=1;DC=0;a=16;             break;
                        case 3:DA=1;DB=1;DC=0;a=(int)(num*10)%10; break;
                        case 4:DA=0;DB=0;DC=1;a=(int)(num*100)%10;  break;       
                        case 5:DA=1;DB=0;DC=1;a=(int)(num*1000)%10;   break;
                        case 6:DA=0;DB=1;DC=1;a=(int)(num*10000)%10;      break;               
        }
                P0=table[a];
                j=50;
                while(j--);
                P0=0x00;
    }
}
void disp0(float num1)
{
        uchar a,i,j;
        float num;
        num=0-num1;
        for(i=0;i<7;i++)
        {
                switch(i)
                {
            case 0:DA=0;DB=0;DC=0;a=17;      break;
                        case 1:DA=1;DB=0;DC=0;a=(int)num/10;  break;               
            case 2:DA=0;DB=1;DC=0;a=(int)num%10;break;
            case 3:DA=1;DB=1;DC=0;a=16;          break;
                        case 4:DA=0;DB=0;DC=1;a=(int)(num*10)%10; break;
                        case 5:DA=1;DB=0;DC=1;a=(int)(num*100)%10;  break;       
                        case 6:DA=0;DB=1;DC=1;a=(int)(num*1000)%10;   break;
                        case 7:DA=1;DB=1;DC=1;a=(int)(num*10000)%10;      break;               
        }
                P0=table[a];
                j=50;
                while(j--);
                P0=0x00;
    }
}
void main()
{
        float value;
        while(1)
        {
                value=changeC();
                if(flag==1)
                  disp1(value);
                else disp0(value);
    }
}
回复

使用道具 举报

ID:123289 发表于 2017-8-16 20:53 | 显示全部楼层
多看传感器手册,理解了就好写了。
回复

使用道具 举报

ID:227857 发表于 2017-8-16 21:45 | 显示全部楼层
还是不对呀,我拔掉DS18B20后,数码管没有变化
回复

使用道具 举报

ID:95277 发表于 2017-8-17 08:35 | 显示全部楼层
网上有实例,下个实例试试。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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