用AT89c51与DS18B20做数字温度计proteus怎么连接仿真图和C语言编程?

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-02
基于DS18B20和AT89C51使用PROTEUS制作的仿真,使用LCD1602显示的温度监控系统.

看书:51单片机工程师是怎么炼成的
最后一章:温度自动控制系统

DS18B20有3个脚,VCC接电源,GND接地,DQ接数据口,是AT89C51的一个引脚就可以了,硬件电路非常简单,这也是DS18B20的巨大优点。重点是C语言编程,这个程序你可以网上搜,肯定有的。

1、PROTEUS安装好后,默认不会在桌面上产生快捷方式。先打开开始菜单,依次点击“程序、Proteus 7 Professional、ISIS 7 Professional”打开PROTEUS。

2、单击图中的P,添加单片机等元件。

3、用关键字搜索,89C51,再加几个LED,因为是仿真就不用加限流电阻和晶振复位的元件了。

4、把元件排列放好,再放一个电源。

5、连好导线,只要把鼠标放在管脚上就会自动变成连线图标,十分方便。

6、右键点击单片机,在菜单中选择“EDIT PROPERTIES”。

7、点选图中红框,然后选中要装载的HEX文件。

8、在编译器KEIL中写程序,然后编译成HEX文件。

9、点左下角的三角形开始按钮,可以看到仿真结果。



在Proteus中有DS18b20这个元件库,可以直接调用如图所示。

上图就是用LED显示检测问题的的仿真图,A表示正,温度检测的程序如下,

//饮水槽温控系统控制程序

//版本号:V1.0;2015.6.19

//温度传感器:DS18B20

//显示方式:LED

#include <reg51.h>

#define uchar unsigned char

sbit keyup=P1^0;

sbit keydn=P1^1;

sbit keymd=P1^2;

sbit out=P3^7; //接控制继电器

sbit DQ = P3^4; //接温度传感器18B20

uchar t[2],number=0,*pt; //温度值

uchar  TempBuffer1[4]={0,0,0,0};

uchar Tmax=18,Tmin=8;

uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xfe,0xf7};

uchar dismod=0,xiaodou1=0,xiaodou2=0,currtemp;

bit flag;

void t0isr() interrupt 1

{

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

switch(number)

{

case 0:

   P2=0x08;

     P0=distab[TempBuffer1[0]];

     break;

case 1:

   P2=0x04;

     P0=distab[TempBuffer1[1]];

     break;

case 2:

   P2=0x02;

     P0=distab[TempBuffer1[2]]&0x7f;

     break;

case 3:

   P2=0x01;

     P0=distab[TempBuffer1[3]];

     break;

default:

   break;

}

number++;

if(number>3)number=0;

}


void delay_18B20(unsigned int i)

{

while(i--);

}


/**********ds18b20初始化函数**********************/


void Init_DS18B20(void) 

{

bit x=0;

do{

DQ=1;

delay_18B20(8);

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

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

DQ = 1;          //拉高总线

delay_18B20(14);

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

}while(x);

delay_18B20(20);

}


/***********ds18b20读一个字节**************/  


unsigned char ReadOneChar(void)

{

unsigned char i=0;

unsigned char dat = 0;

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

{

 DQ = 0; // 给脉冲信号

 dat>>=1;

 DQ = 1; // 给脉冲信号

 if(DQ)

 dat|=0x80;

 delay_18B20(4);

}

  return(dat);

}


/*************ds18b20写一个字节****************/  


void WriteOneChar(unsigned char dat)

{

  unsigned char i=0;

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

  {

  DQ = 0;

  DQ = dat&0x01;

    delay_18B20(5);

  DQ = 1;

    dat>>=1;

}

}


/**************读取ds18b20当前温度************/


unsigned char *ReadTemperature(unsigned char rs)

{

unsigned char tt[2];

  delay_18B20(80);  

Init_DS18B20();

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

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

  delay_18B20(80);  

Init_DS18B20();

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

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

tt[0]=ReadOneChar();  //读取温度值低位

tt[1]=ReadOneChar();  //读取温度值高位

return(tt);

}


void covert1(void) //将温度转换为LED显示的数据

{

   uchar x=0x00,y=0x00;

   t[0]=*pt;

   pt++;

   t[1]=*pt;

   if(t[1]&0x080)      //判断正负温度

   {

    TempBuffer1[0]=0x0c;     //c代表负

t[1]=~t[1]; /*下面几句把负数的补码*/

t[0]=~t[0]; /*换算成绝对值*********/

x=t[0]+1;

t[0]=x;

if(x==0x00)t[1]++;

   }

  else TempBuffer1[0]=0x0a; //A代表正

  t[1]<<=4; //将高字节左移4位

  t[1]=t[1]&0xf0;

  x=t[0]; //将t[0]暂存到X,因为取小数部分还要用到它

  x>>=4; //右移4位

  x=x&0x0f; //和前面两句就是取出t[0]的高四位

  y=t[1]|x; //将高低字节的有效值的整数部分拼成一个字节

  TempBuffer1[1]=(y%100)/10;

  TempBuffer1[2]=(y%100)%10;

  t[0]=t[0]&0x0f; //小数部分

  TempBuffer1[3]=t[0]*10/16;

//以下程序段消去随机误检查造成的误判,只有连续12次检测到温度超出限制才切换加热装置

if(currtemp>Tmin)xiaodou1=0;

if(y<Tmin)

{

xiaodou1++;

currtemp=y;

xiaodou2=0;

}

if(xiaodou1>12)

{

out=0;

flag=1;

xiaodou1=0;

}

if(currtemp<Tmax)xiaodou2=0;

if(y>Tmax)

{

xiaodou2++;

currtemp=y;

xiaodou1=0;

}

if(xiaodou2>12)

{

out=1;

flag=0;

xiaodou2=0;

}

out=flag;

}

void convert(char tmp)

{

uchar a;

if(tmp<0)

{

TempBuffer1[0]=0x0c;

a=~tmp+1;

}

else 

{

TempBuffer1[0]=0x0a;

a=tmp;

}

TempBuffer1[1]=(a%100)/10;

TempBuffer1[2]=(a%100)%10;

}

void keyscan( )

{

uchar keyin;

keyin=P1&0x07;

if(keyin==0x07)return;

else if(keymd==0)

{

dismod++;

dismod%=3;

while(keymd==0);

switch(dismod)

{

case 1:

   convert(Tmax);

     TempBuffer1[3]=0x11;

     break;

case 2:

   convert(Tmin);

     TempBuffer1[3]=0x12;

     break;

default:

   break;

}

}

else if((keyup==0)&&(dismod==1))

{

Tmax++;

convert(Tmax);

while(keyup==0);

}

else if((keydn==0)&&(dismod==1))

{

Tmax--;

convert(Tmax);

while(keydn==0);

}

else if((keyup==0)&&(dismod==2))

{

Tmin++;

convert(Tmin);

while(keyup==0);

}

else if((keydn==0)&&(dismod==2))

{

Tmin--;

convert(Tmin);

while(keydn==0);

}

xiaodou1=0;

xiaodou2=0;

}

main()

{

TMOD=0x01;

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

TR0=1;

ET0=1;

EA=1;

out=1;

flag=0;

ReadTemperature(0x3f);

  delay_18B20(50000); //延时等待18B20数据稳定  

 while(1)

{

pt=ReadTemperature(0x7f); //读取温度,温度值存放在一个两个字节的数组中

if(dismod==0)covert1();

keyscan();

delay_18B20(30000);

}

}



DS18B20有3个脚,VCC接电源,GND接地,DQ接数据口,是AT89C51的一个引脚就可以了,硬件电路非常简单,这也是DS18B20的巨大优点。重点是C语言编程,这个程序你可以网上搜,肯定有的。

  • 用AT89C51,5个DS18B20传感器,数码管显示电路,按键控制电路,温度上下 ...
    答:define uint unsigned int sbit DQ=P1^4; //ds18b20与单片机连接口 unsigned char code str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40} ; //共阴数码管字码表 unsigned char code str1[]={0x0bf,0x86,0x0db,0x0cf,0x0e6,0x0ed,0x0fd,0x87,0x0ff,...
  • 用AT89c51与DS18B20做数字温度计proteus怎么连接仿真图和C语言编程?
    答:1、PROTEUS安装好后,默认不会在桌面上产生快捷方式。先打开开始菜单,依次点击“程序、Proteus 7 Professional、ISIS 7 Professional”打开PROTEUS。2、单击图中的P,添加单片机等元件。3、用关键字搜索,89C51,再加几个LED,因为是仿真就不用加限流电阻和晶振复位的元件了。4、把元件排列放好,再放一...
  • 以AT89C51单片机和DS18B20实现温度检测显示并报警的程序和电路图,显示...
    答:RS BIT P1.7 ;LCD1602控制线定义 RW BIT P1.6 E BIT P1.5 SkipDs18b20 EQU 0CCH ;DS18B20跳过ROM命令 StartDs18b20 EQU 44H ;DS18B20温度变换命令 ReadDs EQU 0BEH ;DS18B20读暂存器命令 ORG 0000H SJMP MAIN ORG 0040H MAIN:MOV SP,#60...
  • 用AT89C51单片机和温度传感器DS18B20S设计数字式温度计
    答:DS18B20的性能特点如下:独特的单线接口仅需要一个端口引脚进行通信;多个DS18B20可以并联在惟一的三线上,实现多点组网功能;无须外部器件;可通过数据线供电,电压范围为3.0~5.5v;零待机功耗;温度以9或12位二进制数字表示;用户可定义报警设置;报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;负电压特性,电源...
  • 求用AT89C51单片机和DS18B20做温度报警器,报警器用蜂鸣器,温度显示用...
    答:include < reg51.h > include < intrins.h > define uchar unsigned char define uint unsigned int define temp_high 60 //温度报警限设置 uchar data temph;uchar data templ;uchar data dat;uchar temp_buzzer,b,fuhao;uchar code tab[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,...
  • 基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温...
    答:void Init_DS18B20(void){ unsigned char x=0;DQ = 1; //DQ复位 delay_18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay_18B20(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay_18B20(4);x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败...
  • 求基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数...
    答:您可参考如下例程,DS18B20与申矽凌微电子的CT1820一样,都是单总线通讯的结构,但CT1820的读取速度要比之快20倍。uchar CT1820Init(){ uchar i;DSPORT = 0;//将总线拉低480us~960us delay600us();//450us to 700us DSPORT = 1;//然后拉高总线,如果CT1820做出反应会将在15us~60us后总线...
  • 温度传感器DS18B20和单片机AT89C51,怎么焊接啊,电路图也看不太懂,求...
    答:给你一个连接图,只要你焊接的时候,能够按图连上,就能工作,程序用中断 18B20的1脚接电源,2脚接51的第12脚(P3。2中断0),3脚接地
  • 求AT89C51单片机和DS18B20温度程序,用四位共阳数码管显示
    答://DS18B20的读写程序,数据脚P3.3 // //温度传感器18B20汇编程序,采用器件默认的12位转化 // //最大转化时间750微秒,显示温度-55到+125度,显示精度 // //为0.1度,显示采用4位LED共阳显示测温值 // //P0口为段码输入,P24~P27为位选 // /***/ include "reg51.h"include...
  • 单片机AT89C51连接DS18B20然后将采集到的两个字节通过RS232发送到PC ...
    答:好编写啊,1.DS18B20采样 2.提取数据 3.UART传输。给你点代码,自己参考下。include<reg52.h> define uint unsigned int define uchar unsigned char sbit dq=P1^5;void sdelay(unsigned int i){ while(i--);} ds18b20on(void)//ds18b20初始化 { uchar x=0;dq=1;sdelay(8);dq=0;sdelay...