找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2713|回复: 8
打印 上一主题 下一主题
收起左侧

关于DS18B20仿真问题求助。

[复制链接]
跳转到指定楼层
楼主
本帖最后由 素还真 于 2017-9-11 12:06 编辑

#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DS=P1^6;
uint temp;

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

void delay(uint count)     
{
  uint i;
  while(count)
  {
    i=200;
    while(i>0)
            i--;
    count--;
  }
}

void delayms(uchar x)
{
        uint i,j;
        for(i=x;i>0;i--)
                for(j=120;j>0;j--);
}

void delay10us(uchar t)
{
        do
        {
                _nop_();_nop_();_nop_();_nop_();
                _nop_();_nop_();_nop_();_nop_();
        }
        while(--t);
}

void Init_Com(void)
{
     TMOD = 0x20;
     PCON = 0x00;
     SCON = 0x50;
     TH1 = 0xFd;
     TL1 = 0xFd;
     TR1 = 1;
}

bit drst(void)
{
        bit ask;
        EA=0;
        DS=0;
        delay10us(65);
        DS=1;
        delay10us(6);
        ask=DS;
        while(!DS);
        return ask;
        EA=1;
}

bit readbit(void)
{
        bit dat;
        EA=0;
        DS=0;_nop_();        
        DS=1;_nop_();_nop_();
        dat=DS;
        delay10us(6);
        return (dat);
        EA=1;
}
uchar read(void)
{
        uchar i,j,dat;
        dat=0;
        EA=0;
        for(i=1;i<=8;i++)
        {
                j=readbit();
                dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
        }
        return(dat);
        EA=1;
}

void write(uchar dat)
{  
  uchar j;
  bit testb;
  EA=0;
  for(j=1;j<=8;j++)
  {
        testb=dat&0x01;
        dat=dat>>1;
        if(testb)   
        {
                DS=0;
                _nop_();_nop_();
                DS=1;
                delay10us(6);
        }
        else
        {
                DS=0;       //write 0
                delay10us(6);
                DS=1;
                _nop_();_nop_();
        }

  }EA=1;
}

void DSrun(void)
{
        bit ask;
        EA=0;
        drst();
        delay(1);
        if(ask==0)
        {
                write(0xcc);
                write(0x44);
        }
        EA=1;
}

uint tmp()
{
        float tt;
        uchar a,b;
        EA=0;
        DSrun();
        a=read();
        b=read();
        temp=b;
        temp<<=8;
        temp=temp|a;
        tt=temp*0.0625;
        temp=tt*10+0.5;
        return temp;
        EA=1;
}

void display(uint temp)
{
        uchar A1,A2,A3,A4,A2s,A3s,ser;
        ser=temp/10;
        ser=SBUF;
        A1=temp/1000;            //这里是为了显示正负,目前没有实现。
        A2s=temp%1000;
        A2=A2s/100;
        A3s=A2s%100;
        A3=A3s/10;
        A4=A3s%10;
       
        P0=table[A1];
        P2=0x01;
        delayms(1);
       
        P0=table[A2];
        P2=0x02;
        delayms(1);
       
        P0=table1[A3];
        P2=0x04;
        delayms(1);
       
        P0=table[A4];
        P2=0x08;
        delayms(1);
       
}

void main()
{
uchar a;
  do
  {
    DSrun();
    //delay(200);

for(a=100;a>0;a--)
  {   display(tmp());
  }
  }                while(1);
}
这个程序仿真结果是这样的:

求大神指点一下是哪里出错了。

QQ图片2.png (21.05 KB, 下载次数: 69)

一段时间后结果

一段时间后结果

QQ图片1.png (28.61 KB, 下载次数: 88)

开始仿真

开始仿真

xxx.png (209.57 KB, 下载次数: 70)

电路图

电路图
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:82765 发表于 2017-9-11 14:17 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

板凳
ID:89515 发表于 2017-9-11 15:02 | 只看该作者
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DS=P1^6;
uint temp;

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

void delay(uint count)     
{
   uint i;
   while(count)
   {
     i=200;
     while(i>0)
             i--;
     count--;
   }
}

void delayms(uchar x)
{
         uint i,j;
         for(i=x;i>0;i--)
                 for(j=120;j>0;j--);
}

void delay10us(uchar t)
{
         do
         {
                 _nop_();_nop_();_nop_();_nop_();
                 _nop_();_nop_();_nop_();_nop_();
         }
         while(--t);
}

void Init_Com(void)
{
      TMOD = 0x20;
      PCON = 0x00;
      SCON = 0x50;
      TH1 = 0xFd;
      TL1 = 0xFd;
      TR1 = 1;
}

bit drst(void)
{
         bit ask;
         EA=0;
         DS=0;
         delay10us(65);
         DS=1;
         delay10us(6);
         ask=DS;
         while(!DS);
         return ask;
         EA=1;
}

bit readbit(void)
{
         bit dat;
         EA=0;
         DS=0;_nop_();        
         DS=1;_nop_();_nop_();
         dat=DS;
         delay10us(6);
         return (dat);
         EA=1;
}
uchar read(void)
{
         uchar i,j,dat;
         dat=0;
         EA=0;
         for(i=1;i<=8;i++)
         {
                 j=readbit();
                 dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
        }
         return(dat);
         EA=1;
}

void write(uchar dat)
{  
   uchar j;
   bit testb;
   EA=0;
   for(j=1;j<=8;j++)
   {
         testb=dat&0x01;
         dat=dat>>1;
         if(testb)   
         {
                 DS=0;
                 _nop_();_nop_();
                 DS=1;
                 delay10us(6);
         }
         else
         {
                 DS=0;       //write 0
                 delay10us(6);
                 DS=1;
                 _nop_();_nop_();
         }

   }EA=1;
}

void DSrun(void)
{
         bit ask;
         EA=0;
         drst();
         delay(1);
         if(ask==0)
         {
                 write(0xcc);
                 write(0x44);
         }
         EA=1;
}

uint tmp()
{
         float tt;
         uchar a,b;
         EA=0;
         DSrun();
         a=read();
         b=read();
         temp=b;
         temp<<=8;
         temp=temp|a;
         tt=temp*0.0625;
         temp=tt*10+0.5;
         return temp;
        EA=1;
}

void display(uint temp)
{
         uchar A1,A2,A3,A4,A2s,A3s,ser;
         ser=temp/10;
         ser=SBUF;
         A1=temp/1000;            //这里是为了显示正负,目前没有实现。
        A2s=temp%1000;
         A2=A2s/100;
         A3s=A2s%100;
         A3=A3s/10;
         A4=A3s%10;
         
         P0=table[A1];
         P2=0x01;
         delayms(1);
         
         P0=table[A2];
         P2=0x02;
         delayms(1);
         
         P0=table1[A3];
         P2=0x04;
         delayms(1);
         
         P0=table[A4];
         P2=0x08;
         delayms(1);
         
}

void main()
{
          Init_Com();
   while(1)
   {   
                   display(tmp());
   }            
}

评分

参与人数 1黑币 +10 收起 理由
素还真 + 10 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:89515 发表于 2017-9-11 15:06 | 只看该作者
如果还是不行,你可以先把数码管程序搞定,再调试18b20.仿真和硬件在时间上还是有很大差别的
回复

使用道具 举报

5#
ID:209584 发表于 2017-9-11 19:27 | 只看该作者
        我下午仔细研究了一下,主要是两个问题。
void DSrun(void)
{
        bit ask;
        EA=0;
        drst();
        delay(1);
        if(ask==0)
        {
                write(0xcc);
                write(0x44);
        }
        EA=1;
}
进行温度转换之后还要读取RAM中存储的数据。就是在write(0x04)后再进行一次初始化,然后用0xbe指令读取数据。

P0=table[A1];
         P2=0x01;
         delayms(1);
         
         P0=table[A2];
         P2=0x02;
         delayms(1);
这个数码管显示程序中P2口位选使能写错了,因为不熟练犯得低级错误。
回复

使用道具 举报

6#
ID:209584 发表于 2017-9-11 19:29 | 只看该作者
另外代码要写在return前,不过这个仿真其实没有用到中断,所以没什么影响。谢谢大家的帮助。
回复

使用道具 举报

7#
ID:111634 发表于 2017-9-11 21:32 | 只看该作者
本帖最后由 zl2168 于 2017-9-11 21:33 编辑

给你介绍一个18b20的案例,自己对照查错吧!
Proteus仿真一下,确认有效。
实例97 DS18B20测温.rar (51.78 KB, 下载次数: 8)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。
回复

使用道具 举报

8#
ID:232612 发表于 2017-9-12 12:34 | 只看该作者
你好,这个应该是程序出了问题,看数码管的代码有没问题
回复

使用道具 举报

9#
ID:194451 发表于 2017-9-12 16:42 | 只看该作者
DS18B20采集温度的时候不能有中断程序
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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