AT89S52与DS18B20数字温度传感器测试结束

发布者:龙爱泉也最新更新时间:2015-07-14 来源: 51hei关键字:AT89S52  DS18B20  数字温度传感器 手机看文章 扫描二维码
随时随地手机看文章
/*********************************************************************** 
* 采用四位共阴极数码管琒R42056K,P1口接数码管段码。P0.0接第一位
* P0.1接第二位,p0.2接第三位,p0.3接第四位。
* 单片机AR89S52,晶振7.3728M
*  DS18B20接P2.0。 
*
***********************************************************************/  
#include
#include
#define uchar unsigned char
#define uint  unsigned int
/*********************************************************************** 
* DS18B20 数据口 DQ
* 共阴极数码管
*共阴极数码管带小数点
 ***********************************************************************/  
//#define DQ RC1
//#define DQ_HIGH() TRISC1=1
//#define DQ_LOW() TRISC1=0;DQ=0
//__CONFIG(0x3B31);
sbit DQ=P2^0;
//const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
 //                       0x07,0x7f,0x6f};
unsigned char code table[]={//共阴极0~f数码管编码
0x3f,0x06,0x5b,0x4f,     //0~3
0x66,0x6d,0x7d,0x07,    //4~7
0x7f,0x6f,0x77,0x7c,    //8~b
0x39,0x5e,0x79,0x71    //c~f
};
//const uchar table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
 //                       0x87,0xff,0xef};
const uchar table1[]={
0xbf,0x86,0xdb,0xcf,//0-3
0xe6,0xed,0xfd,0x87,//4-7
0xff,0xef//8-9
};
uint temper;//温度值缓存
uchar a1,a2,a3,a4;//数码管每个位上显示的数字
uchar time=0;//延时缓存
uchar TH;   //判断负值
void delay(uint x);
void delayus(uint,uchar);
void init();//初始化
void disp(uchar num1,uchar num2,uchar num3,uchar num4);//正值显示
void disp1(uchar num1,uchar num2,uchar num3);//负值显示
void write_byte(uchar date);
void delayms(uchar i);  //误差 -0.651041666667us
uchar read_byte();
void get_tem();//获取温度
void delay20us();
void delay30us();
void delay45us();
void delay70us();
void delay750us();
void delay500us();
void InitTimer0(void);
void delay20us(void)   //误差 -0.46875us
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=3;a>0;a--);
}
void delay30us(void)   //误差 -0.703125us
{
    unsigned char a,b;
    for(b=3;b>0;b--)
        for(a=1;a>0;a--);
}
void delay45us(void)   //误差 -1.0546875us
{
    unsigned char a;
    for(a=12;a>0;a--);
}
void delay70us(void)   //误差 -0.013020833333us
{
    unsigned char a;
    for(a=20;a>0;a--);
}
void delay750us(void)   //误差 -1.302083333333us
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=227;a>0;a--);
}
void delay500us(void)   //误差 -0.325520833333us
{
    unsigned char a;
    for(a=152;a>0;a--);
}
void InitTimer0()
{
    TMOD = 0x01;
    TH0 = 0x88;
    TL0 = 0x00;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}
void main()
{
 init();
    InitTimer0();
 while(1)
 {
  uchar num;
  for(num=100;num>0;num--)
  {
    if(TH<0X7F)
      disp(a1,a2,a3,a4);
      else
   disp1(a1,a2,a3);
  }
 } 
}
/***********************************************************************
*  复位18B20
 ***********************************************************************/
void reset()
{
 uchar st=1;
// DQ_HIGH();
    DQ=1;
// NOP();NOP();
   _nop_();
 while(st)
 {
 // DQ_LOW();
 DQ=0;
 // delayus(70,30);
 delay750us();
 // DQ_HIGH();
 DQ=1;
 // delayus(4,4);
 delay70us();
  if(DQ==1)
   st=1;
  else
   st=0;
  //delayus(50,10);
  delay500us();
 }
}
/***********************************************************************
* 写字节
 ***********************************************************************/
void write_byte(uchar date)
{
 uchar i,temp;
// DQ_HIGH();
DQ=1;
// NOP();NOP();
_nop_();
 for(i=8;i>0;i--)
 {
  temp=date&0x01;//01010101
 // DQ_LOW();
  DQ=0;
 // delayus(0,0);
 delay20us();
  if(temp==1)
  // DQ_HIGH();
   DQ=1;
 // delayus(2,2);
  delay45us();
 // DQ_HIGH();
 DQ=1;
  date=date>>1;//00101010
 }
}
/***********************************************************************
* 读字节
 ***********************************************************************/
uchar read_byte()
{
 uchar i,date;
 static bit j;
 for(i=8;i>0;i--)
 {
  date=date>>1;
 // DQ_HIGH();
 DQ=1;
 // NOP();NOP();
 _nop_();
 // DQ_LOW();
 DQ=0;
 // NOP();NOP();NOP();NOP();NOP();NOP();
 _nop_();_nop_();
 // DQ_HIGH();
 DQ=1;
 // NOP();NOP();NOP();NOP();
 _nop_();
  j=DQ;
  if(j==1)
   date=date|0x80;//1000 0000
 // delayus(1,1);
     delay30us();
 }
 return (date);
}[page]
/***********************************************************************
*  温度获取
 ***********************************************************************/
void get_tem()
{
 uchar tem1,tem2;
 float aaa;
 reset();  //复位
 write_byte(0xCC);//跳过ROM
 write_byte(0x44);//温度转换
    reset();
 write_byte(0xCC);
 write_byte(0xBE);
 tem1=read_byte();
 tem2=read_byte();
 TH=tem2;
    if(tem2>0x7f)
 tem2=~tem2;
 aaa=(tem2*256+tem1)*6.25;
 temper=(int)aaa;
 a1=temper/1000;
 a2=temper%1000/100;
 a3=temper%100/10;
 a4=temper%10;
}
/***********************************************************************
*  清屏
 ***********************************************************************/
void init()
{
P1=0x00;
P0=0xff;
}
/*********************************************************************** 
* 正温度时,显示
*
 ***********************************************************************/
void disp(uchar num1,uchar num2,uchar num3,uchar num4)
{
    P1=table[num1];
    P0=0xfe;
 delayms(2);

    P1=table1[num2];
 P0=0xfd;
 delayms(2);

    P1=table[num3];
    P0=0xfb;
 delayms(2);
    P1=table[num4];
    P0=0xf7;
 delayms(2);
}
/*********************************************************************** 
* 负温度时,显示
*
 ***********************************************************************/
void disp1(uchar num1,uchar num2,uchar num3)
{
    P1=0x40;//显示负号
    P0=0xfe;
 delayms(2);

    P1=table[num1];
 P0=0xfd;
 delayms(2);

    P1=table1[num2];
    P0=0xfb;
 delayms(2);
    P1=table[num3];
    P0=0xf7;
 delayms(2);
}
/*********************************************************************** 
* 毫秒级的延时
* 晶振7.3728M
 ***********************************************************************/  
void delayms(uchar i)   //误差 -0.651041666667us
{
    uchar a,b;
    for(;i>0;i--)
       for(b=47;b>0;b--)
          for(a=5;a>0;a--);
}
/*********************************************************************** 
* 定时器0中断服务程序, 设置20毫秒计时器。每1秒钟采集一次温度值
*
 ***********************************************************************/
void Timer0Interrupt(void) interrupt 1
{
    TH0 = 0x88;
    TL0 = 0x00;
    //add your code here!
 time++;
 if(time==20)
 {
  time=0;
     get_tem();
 }
}
关键字:AT89S52  DS18B20  数字温度传感器 引用地址:AT89S52与DS18B20数字温度传感器测试结束

上一篇:keilc51中如何看堆栈的分配情况
下一篇:单片机驱动H桥电路

推荐阅读最新更新时间:2024-03-16 14:25

基于AVR单片机和DS18B20的多点温度测量系统
1DS18B20和BASCOM-AVR简介   DS18B20是美国DALLAS公司生产的单总线数字温度传感器,从DS18B20读出或写入的信息仅需要一根口线。在单总线工作方式下,允许一条信号线上挂接多个DS18B20,特别适合于构成远距离多点温度测控系统,从而大大简化了系统布线,提高了可靠性,降低了成本,而实现这些的关键在于每片DS18B20都有唯一的ROM代码(64位产品序列号)。在多点温度测控系统中,ROM代码是识别和操作DS18B20的基础;无论读取还是选择对某一个传感器进行操作,主机必须发送64位ROM代码。   BASCOM-AVR是MSC Electronics公司推出的基于AVR系统的软件开发仿真平台。程序语
[单片机]
基于AVR单片机和<font color='red'>DS18B20</font>的多点温度测量系统
TMP03/04型数字温度传感器的工作原理
    摘要: 介绍美国模拟器件公司生产的TMP03和TMP04型串行比率输出式数字温度传感器的性能特点、工作原理、校验方法及使用要点。TMP03/04采用∑-Δ式A/D转换器,能滤除量化噪声并且达到高分辨力指标。     关键词: 数字温度传感器 ∑-Δ式A/D转换器 TMP03/04 TMP03和TMP04是美国模拟器件公司(AD)生产的串行比率输出式数字温度传感器,适配80C31、80C51型单片机(μC)或数字信号处理器(DSP)构成测温系统。二者主要区别是TMP03为集电极开路输出;而TMP04为互补型MOS场效应管输出,其输出电平与CMOS/TTL电路兼容。TMP03/04既可以检测温度,也可通过
[应用]
基于AT89S52的程控开关稳压电源设计方案
  开关电源是利用现代电力电子技术,控制开关管开通和关断的时间比率,维持稳定输出电压的一种电源。由于拥有较高的效率和较高的功率密度,开关电源在现代电子系统中的使用越来越普及。开关电源高频化、模块化和智能化是其发展方向。其中,步进可调、实时显示是开关电源智能化研究方向之一。现设计开关电源,技术指标为:输出电压30V至36V可调,最大输出电流2A,有过流保护功能,能对输出电压进行键盘设定和步进调整、步进值1V,并能实时显示输出电压和电流的开关 稳压电源 。   1 总体设计方案   采用 AT89S52 单片机为控制核心,对普通的开关电源控制部分进行优化设计,并通过软件编程实现了对开关电源的智能控制。设计中采用隔离变压器将市电变压
[单片机]
基于<font color='red'>AT89S52</font>的程控开关稳压电源设计方案
AT89S52与CF卡的接口设计
1 前言   随着计算机应用技术的飞速发展,移动存储设备得到了广泛的应用。其中CF(Compact Flash)卡以其价格低廉、体积小、存储容量大、高速等优点在众多移动存储设备中被广泛地应用于数码相机、PDA和笔记本电脑等当前十分热门的消费类电子产品中。并且CF卡在其他领域中也得到了广泛的应用。本文所述内容就是通过8051单片机对CF卡进行读写。 2.CF卡的操作方式   CF卡的操作方式与计算机的硬盘操作方式类似,其扇区的寻址也有两种方式:物理寻址(CHS)和逻辑寻址(LBA),物理寻址使用柱面、磁头和扇区号表示一个特定的扇区,起始扇区是0道、0头、1区,接下来是2区等等,逻辑寻址将整个CF卡统一寻址。逻辑块寻址和物理寻
[应用]
交换控制单片机电路设计方案解析
1、引言 小型会议系统或语音群聊系统是由多路音频电路组成的.为了使通话井然有序,需要通过音频交换电路来控制各路音频信号的输出。音频交换电路主要用于完成语音信号的切换。以实现同频终端的话音通信。经对可靠性、经济性、兼容性和供货情况进行多方面的综合考虑,该控制系统选用了AT89S52型单片机和交换控制矩阵器件MT8816AE。其中,AT89S52型单片机具有实用,价廉,功耗小,速度快,体积小,功能强等优点:MT8816AE是CMOS单片集成电路,具有功耗小,可靠性高等特点。 2、控制系统组成和电路设计 它由主控计算机、音频交换电路、终端设备等组成。其工作原理是:在主控计算机捕获终端的工作频率后。向交换控制单片机发出指令,交换矩阵
[单片机]
一种基于AT89S52的汽车组合开关检测装置的设计
  汽车组合开关是汽车中常用的一种开关(外形见图1所示),有近光、远光、小灯、大灯、超车、雨刮高速、雨刮低速、雨刮间歇、洗涤、左转、右转等挡位。目前许多生产厂家在检测组合开关时仍采用传统的模拟测试方式。这种方式容易造成个别挡位漏检和错检,检测效率也低。为此笔者制作了一种基于AT89S52的汽车组合开关检测装置,该装置可以对组合开关的所有挡位进行精确检测,设置有声、光报警功能,有效防止了模拟测试中的错检和个别挡位漏检现象。在此仅对该装置的电路部分剖析如下。 图1 常用开关 一、总体方案设计   组合开关检测是生产中非常重要的一个环节,一般采用模拟检测方式,即将组合开关所有的外围电路安装至测试台上,用指示灯模拟各个挡位的工
[汽车电子]
一种基于<font color='red'>AT89S52</font>的汽车组合开关检测装置的设计
DS18B20+PIC测温用1602显示温度C程序
//熟悉使用单片机运用DS18B20温度传感器测试温度,并用1602显示屏显示温度 //1、第一行显示:Temperature //2、第二行显示:实测温度值 //************************************************** //************************************************** //硬件设置: //1、SW2,SW4开关全部断开 //2、插上DS18B20温度传感器 //************************************************** //********************************
[单片机]
pic 单片机DS18B20采样 LCD1602显示
#include 1602.h #include 18b20.h #include main.h __CONFIG(0X0B31); main() { char msg = { Temperature: , .C }; delay_us2 (40, 40); delay_us2 (100, 200); initial(); while(1) { start_convert(); change_to_ascii (get_temp (), &msg ); display2(&msg ,&msg ); } } //------------------
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved