基于AT89C51和DS18B20制作的温度报警器原理图和单片机内部程序?

如上所述,希望那位大哥大姐能解答解答,发送到641157117@qq.com邮箱,非常感谢!

  #include <reg52.h>
  #include <stdio.h>
  #define uchar unsigned char
  #define uint unsigned int
  sbit ds=P2^2; //温度传感器信号线
  sbit dula=P2^6; //数码管段选线
  sbit wela=P2^7; //数码管位选线
  sbit beep=P2^3; //蜂鸣器

  uint temp;
  float f_temp;
  uint warn_l1=260;
  uint warn_l2=250;
  uint warn_h1=300;
  uint warn_h2=320;

  sbit led0=P1^0;
  sbit led1=P1^1;
  sbit led2=P1^2;
  sbit led3=P1^3;

  unsigned char code table[]={
  0x3f,0x06,0x5b,0x4f,
  0x66,0x6d,0x7d,0x07,
  0x7f,0x6f,0xbf,0x86,
  0xdb,0xcf,0xe6,0xed,
  0xfd,0x87,0xff,0xef}; //不带小数点的编码

  void delay(uint z)//延时函数
  {
  uint x,y;
  for(x=z;x>0;x--)
  for(y=110;y>0;y--);
  }

  void dsreset(void) //18B20复位,初始化函数
  {
  uint i;
  ds=0;
  i=103;
  while(i>0)i--;
  ds=1;
  i=4;
  while(i>0)i--;
  }

  bit tempreadbit(void) //读1位函数
  {
  uint i;
  bit dat;
  ds=0;i++; //i++ 起延时作用
  ds=1;i++;i++;
  dat=ds;
  i=8;while(i>0)i--;
  return (dat);
  }

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

  void tempwritebyte(uchar dat) //向18B20写一个字节数据
  {
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
  testb=dat&0x01;
  dat=dat>>1;
  if(testb) //写 1
  {
  ds=0;
  i++;i++;
  ds=1;
  i=8;while(i>0)i--;
  }
  else
  {
  ds=0; //写 0
  i=8;while(i>0)i--;
  ds=1;
  i++;i++;
  }

  }
  }

  void tempchange(void) //DS18B20 开始获取温度并转换
  {
  dsreset();
  delay(1);
  tempwritebyte(0xcc); // 写跳过读ROM指令
  tempwritebyte(0x44); // 写温度转换指令
  }

  uint get_temp() //读取寄存器中存储的温度数据
  {
  uchar a,b;

  dsreset();
  delay(1);
  tempwritebyte(0xcc);
  tempwritebyte(0xbe);
  a=tempread(); //读低8位
  b=tempread(); //读高8位
  temp=b;
  temp<<=8; //两个字节组合为1个字
  temp=temp|a;
  f_temp=temp*0.0625; //温度在寄存器中为12位 分辨率位0.0625°
  temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入
  f_temp=f_temp+0.05;
  return temp; //temp是整型
  }

  ////////////////////显示程序//////////////////////////
  void display(uchar num,uchar dat)
  {
  uchar i;
  dula=0;
  P0=table[dat];
  dula=1;
  dula=0;

  wela=0;
  i=0XFF;
  i=i&(~((0X01)<<(num)));
  P0=i;
  wela=1;
  wela=0;
  delay(1);
  }

  void dis_temp(uint t)
  {
  uchar i;
  i=t/100;
  display(0,i);
  i=t%100/10;
  display(1,i+10);
  i=t%100%10;
  display(2,i);
  }
  //////////////////////////////////////////////
  void warn(uint s,uchar led) //蜂鸣器报警声音 ,s控制音调
  {
  uchar i;i=s;
  dula=0;
  wela=0;

  beep=0;
  P1=~(led);
  while(i--)
  {
  dis_temp(get_temp());
  }
  beep=1;
  P1=0XFF;
  i=s;
  while(i--)
  {
  dis_temp(get_temp());
  }
  }
  void deal(uint t)
  {
  uchar i;
  if((t>warn_l2)&&(t<=warn_l1)) //大于25度小于27度
  {
  warn(40,0x01);

  }
  else if(t<=warn_l2) //小于25度
  {
  warn(10,0x03);
  }
  else if((t<warn_h2)&&(t>=warn_h1)) //小于32度大于30度
  {
  warn(40,0x04);
  }
  else if(t>=warn_h2) //大于32度
  {
  warn(10,0x0c);
  }
  else
  {
  i=40;
  while(i--)
  {
  dis_temp(get_temp());
  }
  }
  }

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

  void comm(char *parr)
  {
  do
  {
  SBUF = *parr++; //发送数据
  while(!TI); //等待发送完成标志为1
  TI =0; //标志清零
  }while(*parr); //保持循环直到字符为'\0'
  }

  void main()
  {
  uchar buff[4],i;
  dula=0;
  wela=0;
  init_com();
  while(1)
  {
  tempchange();
  for(i=10;i>0;i--)
  {
  dis_temp(get_temp());}
  deal(temp);

  sprintf(buff,"%f",f_temp);

  for(i=10;i>0;i--)
  {
  dis_temp(get_temp());}

  comm(buff);

  for(i=10;i>0;i--)
  {
  dis_temp(get_temp());}

  }
  }
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-06-12
这个我有,程序及论文+硬件

用AT89c51与DS18B20做数字温度计proteus怎么连接仿真图和C语言编程?
1、PROTEUS安装好后,默认不会在桌面上产生快捷方式。先打开开始菜单,依次点击“程序、Proteus7Professional、ISIS7Professional”打开PROTEUS。2、单击图中的P,添加单片机等元件。3、用关键字搜索,89C51,再加几个LED,因为是仿真就不用加限流电阻和晶振复位的元件了。4、把元件排列放好,再放一个电源。

基于AT89C51和DS18B20制作的温度报警器原理图和单片机内部程序?
include <reg52.h> include <stdio.h> define uchar unsigned char define uint unsigned int sbit ds=P2^2; \/\/温度传感器信号线 sbit dula=P2^6; \/\/数码管段选线 sbit wela=P2^7; \/\/数码管位选线 sbit beep=P2^3; \/\/蜂鸣器 uint temp;float f_temp;uint warn_l1=26...

用AT89C51单片机和温度传感器DS18B20S设计数字式温度计
本次设计采用的AT89S52是一种flash型单片机,可以直接在线编程,向单片机中写程序变得更加容易。本次设计的数字温度计采用的是DS18B20数字温度传感器,DS18B20是一种可组网的高精度数字式温度传感器,由于其具有单总线的独特优点,可以使用户轻松地组建起传感器网络,并可使多点温度测量电路变得简单、可靠。本设计根据设计要求,首...

基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温...
delay_18B20(100); \/\/ this message is wery important Init_DS18B20();WriteOneChar(0xCC); \/\/跳过读序号列号的操作 WriteOneChar(0xBE); \/\/读取温度寄存器等(共可读9个寄存器) 前两个就是温度 delay_18B20(100);a=ReadOneChar(); \/\/读取温度值低位 b=ReadOneChar(); \/\/读取...

基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的数字温度计...
只是LCD1602的代码 ;多功能51单片机开发板 ;LCD1602测试程序 RS EQU P2.0 RW EQU P2.1 E EQU P2.2 LDATA EQU P1 ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV R0,#00H ;R0:每行显示字符的个数 MOV R1,#80H ;寄存器地址 MOV A,#38H ;设置显示(16×2)ACALL WIR MOV A...

求基于AT89C51单片机的DS18B20温度检测程序(用C语言)
\/\/DS18B20的读写程序,数据脚P3.3 \/\/ \/\/温度传感器18B20汇编程序,采用器件默认的12位转化 \/\/ \/\/最大转化时间750微秒,显示温度-55到+125度,显示精度 \/\/ \/\/为0.1度,显示采用4位LED共阳显示测温值 \/\/ \/\/P0口为段码输入,P24~P27为位选 \/\/ \/***\/ include "reg51.h"include...

急需:AT89C51单片机的DS18B20温度检测电路及程序。
DISPLAY:MOV A,29H MOV B,#10 ;10进制\/10=10进制 DIV AB MOV B_BIT,A ;十位在A MOV A_BIT,B ;个位在B MOV R0,#4 CLR C;多加的 DPL1: MOV R1,#250 ;显示1000次 DPLOP:MOV DPTR,#NUMTAB MOV A,TD MOVC A,@A+DPTR ;查通道的7段代码 MOV P0,A ;送出十位的7段代码 CLR...

基于51单片机的火灾报警器设计
本文介绍基于51单片机的火灾报警器设计。此系统集成了MQ-2烟雾传感器、DS18B20温度传感器以及AT89C51单片机作为核心。该报警器能实时检测烟雾和温度,并通过声光电一体化方式报警,同时显示浓度和温度值。系统构成包括:MQ-2烟雾信号采集电路、ADC0832模数转换电路、DS18B20温度信号采集电路、单片机控制电路、LCD显示...

温度传感器DS18B20和单片机AT89C51,怎么焊接啊,电路图也看不太懂,求...
给你一个连接图,只要你焊接的时候,能够按图连上,就能工作,程序用中断 18B20的1脚接电源,2脚接51的第12脚(P3。2中断0),3脚接地

单片机AT89C51和DS18B20温度检测并在数码管上显示出来,程序和现象如 ...
1、针对你的程序,先屏蔽掉1820,直接给数据,显示正常,说明显示程序部分可用,如下:include<reg51.h> define uchar unsigned char define uint unsigned int sbit DQ= P1^0;sbit smg0=P3^0 ;sbit smg1=P3^1 ;sbit smg2=P3^2 ;sbit smg3=P3^3;int temp ;unsigned char code smg_du...

相似回答