打印
[51单片机]

为什么DS18B20在51里仿真显示8.5

[复制链接]
1060|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ningshan|  楼主 | 2017-12-17 22:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp;
sbit smg1=P2^0;                //定义数码管第一位
sbit smg2=P2^1;                //定义数码管第二位
sbit smg3=P2^2;                //定义数码管第三位
sbit smg4=P2^3;               
sbit DQ=P2^4;
uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);       
}
void Delay_OneWire(unsigned int t)
{
        unsigned char i;
  while(t--)
  {
          for(i=0;i<8;i++);
  }
}

//DS18B20芯片初始化
bit Init_DS18B20(void)
{
        bit initflag = 0;
        DQ = 1;
        Delay_OneWire(12);
        DQ = 0;
        Delay_OneWire(80);
        DQ = 1;
        Delay_OneWire(10);
        initflag = DQ;   
        Delay_OneWire(5);
  
        return initflag;
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                DQ = 0;
                DQ = dat&0x01;
                Delay_OneWire(5);
                DQ = 1;
                dat >>= 1;
        }
        Delay_OneWire(5);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
        unsigned char i;
        unsigned char dat;
  
        for(i=0;i<8;i++)
        {
                DQ = 0;
                dat >>= 1;
                DQ = 1;
                if(DQ)
                {
                        dat |= 0x80;
                }            
                Delay_OneWire(5);
        }
        return dat;
}
uchar rd_temp()
{
        uchar high,low;
        Init_DS18B20();
        Write_DS18B20(0xcc);
        Write_DS18B20(0x44);
        Delay_OneWire(200);

        Init_DS18B20();
        Write_DS18B20(0xcc);
        Write_DS18B20(0xbe);
        /*摄氏度部分*/
        low=Read_DS18B20();
        high=Read_DS18B20();
        temp=high<<4;
        temp|=low>>4;
       
        return temp;  
}
void display()
{
        P0=duan[temp/10];
        smg3=1;               
        delay(10);
        smg3=0;
               
        P0=duan[temp%10];
        smg4=1;               
        delay(10);
        smg4=0;       
}
void main()
{
smg1=0;
smg2=0;
smg3=0;
smg4=0;
P0=0XFF;
while(1)
{       
        rd_temp();
        display();       
}                          
}

相关帖子

沙发
ningshan|  楼主 | 2017-12-17 22:19 | 只看该作者
这个是仿真图片

QQ图片20171217221834.png (537.81 KB )

QQ图片20171217221834.png

使用特权

评论回复
板凳
ningling_21| | 2017-12-18 09:13 | 只看该作者
18B20芯片内部初始化未完成

使用特权

评论回复
地板
qinlu123| | 2017-12-18 10:17 | 只看该作者
DS18B20内部存储的初始温度值是85℃

使用特权

评论回复
5
mcuzone| | 2017-12-18 11:21 | 只看该作者
你这是纯软仿啊

DS18B20有一个校验位,数据读完后建议校验一下,这样才能确保你读回来的数据是正确的

使用特权

评论回复
6
一路向北lm| | 2017-12-18 12:52 | 只看该作者
本帖最后由 一路向北lm 于 2017-12-18 12:53 编辑

你再调试调试,不行的话可以参考下我的这个代码 ds18b20.rar (89.22 KB)

使用特权

评论回复
7
zqx1000| | 2018-4-10 23:26 | 只看该作者
kankan

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝