找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于proteus ds18b20的仿真

[复制链接]
跳转到指定楼层
楼主
ID:89221 发表于 2015-9-1 16:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  #include<reg51.h>

sbit  DQ=P1^2;

sbit  DQ1=P2^5;

sbit  DQ2=P2^7;
//sbit  DQ3=P1^3;  

#define uchar unsigned char

#define uint unsigned int

uchar temp_value,temp_value1,temp_value2;

uchar code table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X40};









void delay_18B20(uint i)

{

while(i--);

}







void Init_DS18B20(void)

{

  uchar x=0;

  DQ = 1;          //DQ复位

  delay_18B20(8);  //稍做延时

  DQ = 0;          //单片机将DQ拉低

  delay_18B20(60); //精确延时 大于 480us

  DQ = 1;          //拉高总线

  delay_18B20(14);

  x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

  delay_18B20(20);

}







uchar ReadOneChar(void)

{

uchar i=0;

uchar dat = 0;

for (i=8;i>0;i--)

  {     DQ = 0; // 给脉冲信号

    dat>>=1;

    DQ = 1; // 给脉冲信号

    if(DQ)

    dat|=0x80;

    delay_18B20(4);

  }

  return(dat);

}







void WriteOneChar(uchar dat)

{

  uchar i=0;





  for (i=8; i>0; i--)

  {

    DQ = 0;

   DQ = dat&0x01;

     delay_18B20(5);

   DQ = 1;

     dat>>=1;

}

}

void Init_DS18B201(void)

{

  uchar x=0;

  DQ1 = 1;          //DQ复位

  delay_18B20(8);  //稍做延时

  DQ1 = 0;          //单片机将DQ拉低

  delay_18B20(80); //精确延时 大于 480us

  DQ1 = 1;          //拉高总线

  delay_18B20(14);

  x=DQ1;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

  delay_18B20(20);

}







uchar ReadOneChar1(void)

{

uchar i=0;  uchar dat = 0;

for (i=8;i>0;i--)

  {

    DQ1 = 0; // 给脉冲信号

    dat>>=1;

    DQ1 = 1; // 给脉冲信号

    if(DQ1)

    dat|=0x80;

    delay_18B20(4);

  }

  return(dat);

}







void WriteOneChar1(uchar dat)

{

  uchar i=0;





  for (i=8; i>0; i--)

  {

    DQ1 = 0;

   DQ1 = dat&0x01;

     delay_18B20(5);

   DQ1 = 1;

     dat>>=1;

}

}

void Init_DS18B202(void)

{

  uchar x=0;

  DQ2 = 1;          //DQ复位

  delay_18B20(8);  //稍做延时

  DQ2 = 0;          //单片机将DQ拉低

  delay_18B20(80); //精确延时 大于 480us

  DQ2 = 1;          //拉高总线

  delay_18B20(14);

  //x=DQ1;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

  delay_18B20(20);

}





uchar ReadOneChar2(void)

{

uchar i=0;

uchar dat = 0;

for (i=8;i>0;i--)

  {

    DQ2 = 0; // 给脉冲信号

    dat>>=1;

    DQ2 = 1; // 给脉冲信号

    if(DQ2)

    dat|=0x80;

    delay_18B20(4);

  }

  return(dat);

}







void WriteOneChar2(uchar dat)

{

  uchar i=0;





  for (i=8; i>0; i--)

  {

    DQ2 = 0;

   DQ2 = dat&0x01;

     delay_18B20(5);

   DQ2 = 1;

     dat>>=1;

}

}  



void ReadTemp(void)

{

uchar a=0;

uchar b=0;

uchar t=0;

float tt=0;

Init_DS18B20();

WriteOneChar(0xCC);     // 跳过读序号列号的操作

WriteOneChar(0x44);  // 启动温度转换



delay_18B20(100);       // this message is wery important  

Init_DS18B20();

WriteOneChar(0xCC);  //跳过读序号列号的操作

WriteOneChar(0xBE);  //读取温度寄存器等共可读9个寄存器 前两个就是温度



delay_18B20(100);



a=ReadOneChar();     //读取温度值低位

b=ReadOneChar();     //读取温度值高位

temp_value=b<<4;

temp_value+=(a&0xf0)>>4;  



}

void ReadTemp1(void)

{

uchar c=0;

uchar d=0;

uchar t=0;



Init_DS18B201();

WriteOneChar1(0xCC);     // 跳过读序号列号的操作

WriteOneChar1(0x44);  // 启动温度转换



delay_18B20(100);       // this message is wery important



Init_DS18B201();

WriteOneChar1(0xCC);  //跳过读序号列号的操作

WriteOneChar1(0xBE);  //读取温度寄存器等共可读9个寄存器 前两个就是温度



delay_18B20(100);



c=ReadOneChar1();     //读取温度值低位

d=ReadOneChar1();     //读取温度值高位

temp_value1=d<<4;

temp_value1+=(c&0xf0)>>4;               



}

void ReadTemp2(void)

{

uchar e=0;

uchar f=0;

uchar t=0;



Init_DS18B202();  WriteOneChar2(0xCC);     // 跳过读序号列号的操作

WriteOneChar2(0x44);  // 启动温度转换



delay_18B20(100);       // this message is wery important



Init_DS18B202();

WriteOneChar2(0xCC);  //跳过读序号列号的操作

WriteOneChar2(0xBE);  //读取温度寄存器等共可读9个寄存器 前两个就是温度



delay_18B20(100);



e=ReadOneChar2();     //读取温度值低位

f=ReadOneChar2();     //读取温度值高位

temp_value2=f<<4;

temp_value2+=(e&0xf0)>>4;               

}

//显示延时 函数  

void delay(unsigned int z)

{

unsigned int x;

unsigned char y;

for(x=z;x>0;x--)

  for(y=200;y>0;y--);  

}

void display (uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5)

{ P2=0XFE;

  P0=0x00;

  P0=table[num1];

  delay(6);

  P2=0XFD;

P0=0x00;

  P0=table[num0];

delay(6);

P2=0XFB;

P0=0x00;

  P0=table[10];

  delay(6);

P2=0XF7;

P0=0x00;

  P0=table[num3];

  delay(6);

  P2=0XEF;

P0=0x00;

  P0=table[num2];  delay(6);

  P2=0XDF;

P0=0x00;

  P0=table[10];

delay(6);

  P2=0XBF;

P0=0x00;

  P0=table[num5];

  delay(6);

  P2=0X7F;

P0=0x00;

  P0=table[num4];

delay(6);

}



main()  

{ unsigned int i=0;

   uchar a ,b,c,d,e,f ;

     while(1)

   {   



    ReadTemp();

ReadTemp1();

ReadTemp2();

     b=temp_value/10;  //十位

     a=temp_value%10;  //个位



     d=temp_value1/10;  //十位

     c=temp_value1%10;  //个位

f=temp_value2/10;  //十位

     e=temp_value2%10;  //个位



display(b,a,d,c,f,e);





   }

}  

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

使用道具 举报

沙发
ID:60379 发表于 2015-9-2 20:32 | 只看该作者
已阅
回复

使用道具 举报

板凳
ID:77498 发表于 2017-5-3 19:15 | 只看该作者
这个论坛里有好多这种资料的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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