DS18B20仿真出现问题 求教

2019-07-18 11:43发布

先贴程序 楼下上图#include<reg52.h>                                                  //no result
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;

uchar tempL=0;                 //设全局变量
uchar tempH=0;
uint z;                        //测量到的温度的整数部分
uchar p1;                //小数第一位
uchar p2;                //小数第二位
uchar p;                //两位小数
bit flag=1;                                //温度正负标志
bit DS18B20_IS_OK = 1;
uchar code number[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//IO
sbit c1=P2^0;
sbit c2=P2^1;
sbit en_139=P2^2;
sbit DQ=P2^3;//ds18b20与单片机连接口
sbit en_573=P2^4;

void delay0(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=80;y>0;y--);
}
void select(uchar i)
{
        switch(i)
        {
                case 1:c1=0,c2=0;break;
                case 2:c1=1,c2=0;break;
                case 3:c1=0,c2=1;break;
                default:c1=1,c2=1;break;
        }
}
void display(uchar dat,uchar i)
{
        select(i);
        P3=number[dat];
        delay0(1);
}
void Delay(uint x)
{
        while(--x);
}

/*void Init_DS18B20(void)
{
        uchar x=0;
        DQ=1;                                         //DQ先置高
        delay0(8);                                 //稍延时
        DQ=0;                                         //发送复位脉冲
        delay0(80);                                 //延时(>480us)
        DQ=1;                                         //拉高数据线
        delay0(5);                                 //等待(15~60us)
        x=DQ;                                         //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
        delay0(20);
}*/
uchar Init_DS18B20(void)
{
        uchar status;
        DQ = 1;
        Delay(8);
        DQ = 0;
        Delay(90);
        DQ = 1;
        Delay(8);
        DQ = 1;
        return status;
}


//读一个字节
/*uchar ReadOneChar(void)                          //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{
        uchar i=0;                 //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
        uchar dat=0;
        for (i=8;i>0;i--)                 //一个字节有8位
        {
                DQ=1;
                delay0(1);
                DQ=0;
                dat>>=1;
                DQ=1;
                if(DQ)
                dat|=0x80;
                delay0(4);
        }
        return(dat);
}*/
uchar ReadOneByte()
{
        uchar i,dat=0;
        DQ = 1;
        _nop_();
        for(i=0;i<8;i++)
        {
                 DQ = 0;
                dat >>= 1;
                DQ = 1;
                _nop_();
                _nop_();
                if(DQ)
                dat |= 0X80;
                Delay(30);
                DQ = 1;
        }
        return dat;
}

//写一个字节
/*void WriteOneChar(uchar dat)
{
        uchar i=0;                 //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
        for(i=8;i>0;i--)                 //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。
        {
                DQ=0;                                 //在开始另一个写周期前必须有1us以上的高电平恢复期。
                DQ=dat&0x01;
                delay0(5);
                DQ=1;
                dat>>=1;
        }
        delay0(4);
}*/
void WriteOneByte(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {
                 DQ = 0;
                DQ = dat& 0x01;
                Delay(5);
                DQ = 1;
                dat >>= 1;
        }
}

//读温度值(低位放tempL;高位放tempH;)
void ReadTemperature(void)
{
        if(Init_DS18B20()==1)
                DS18B20_IS_OK=0;
        else
        {
                WriteOneByte(0xcc);
                WriteOneByte(0x44);
                Init_DS18B20();
                WriteOneByte(0xcc);
                WriteOneByte(0xbe);
                tempL=ReadOneByte();
                tempH=ReadOneByte();
                DS18B20_IS_OK=1;
                if(tempH>0x7f)                                      //最高位为1时温度是负
                {
                        tempL=~tempL;                                        //补码转换,取反加一
                        tempH=~tempH+1;      
                        flag=0;                                                      //读取温度为负时flag=0
                }
                //z=tempL/16+tempH*16;              //整数部分
                z=((tempL&0xf0)>>4)|((tempH&0x07)<<4);
                p1=(tempL&0x0f)*10/16;                 //小数第一位
                p2=(tempL&0x0f)*100/16%10;        //小数第二位
                p=p1*10+p2;                 //小数两位
                DS18B20_IS_OK=1;       
        }               
}

//显示函数
void display_0()
{
        display(z/10,1);
        display(z%10,2);
        display(p1,3);
        display(p2,4);
}
void sys_init()
{
        en_139=0;
}
void main()
{
        sys_init();
        ReadTemperature();
        Delay(5000);
        Delay(5000);
        while(1)
        {
                if(DS18B20_IS_OK)
                        display_0();
                delay0(1);               
               
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。