DS18B20和ADC0832共同使用

发布者:哈哈哈33最新更新时间:2015-05-19 来源: 51hei关键字:DS18B20  ADC0832  共同使用 手机看文章 扫描二维码
随时随地手机看文章
#include
#define  uchar  unsigned char
sbit DQ=P1^4;
uchar data    temp_data[2]={0x00,0x00};
uchar data    display[5]={0x00,0x00,0x00,0x00,0x00};
unsigned char code  ditab[16] ={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                                                          0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
//共阴数码管
uchar code table[11] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};// 0,1,2,3,4,5 ,6,7,8,9,百位或当最高位十位为0时不显示
uchar code table1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};// 0.,1.,2.,3.,4.,5.,6.,7.,8.,9.各位带有小数点的显示

    //以下为水位显示区域
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define _rrca_()          CY   = ACC & 0x01           //产生RRC A指令
#define _rlca_()          CY   = ACC & 0x80           //产生RLC A指令
sbit bADcs=P1^7;
sbit bADcl=P1^6;
sbit bADda=P1^5;
sbit flag=P1^3;
//sbit str=P2^7;
//sbit d=P2^6;
//sbit clk=P2^5;
bit choose=0;
unsigned char data1;
unsigned char count;
unsigned char cycle;
uint ge,xiao1,xiao2;
unsigned long data2;
unsigned char  code tablewe[]=
{
 0xFE,0xFD,0xFB,0xF7,
 0xEF,0xDF,0xBF,0x7F
};//自己写的
void delay_18b20(unsigned int i)
{
while(i--);
}
//函数区域水位
void Delayus(uchar i)
 {
  while(--i);
 }
void ad(void)
{    uchar i;
     //data1=0;
     bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用.
  bADcl=0;
  bADda=1;
  bADcl=1;
  bADcl=0;//i down
  bADda=1;
  bADcl=1;
  bADcl=0; //   2 down
  bADda=0;
  bADcl=1;
  bADcl=0; //   3 down
  bADda=1;
  bADcl=1;
  bADcl=0; //   4 down

  for(i=8;i>0;i--)
   {
  
   data1<<=1;
   bADcl=0;
  bADcl=1;
  if(bADda==1) data1|=0x01;
      bADda=1;
   }
   bADcs=1;
 
}
void cal()
{
data2=((ulong)data1*493)/252.5;
ge=data2/100;
xiao1=(data2%100)/10;
xiao2=data2%10;

}

display2()
{
      P2=tablewe[4];                     //P2口低四位位选
      P0=0x00;        //P0口数码管段选第五个数码管不用
   delay_18b20(50);

           P2=tablewe[5];
      P0=table1[ge];
   delay_18b20(50);
           P2=tablewe[6];
      P0=table[xiao1];
      delay_18b20(50);
           P2=tablewe[7];
     P0=table[xiao2];

 

}

//以上为水位函数

 


//初始化函数
Init_DS18B20(void)
{
unsigned char x=0;
DQ=1;     //DQ复位
delay_18b20(8);   //稍做延时
DQ=0;     //单片机将DQ拉低
delay_18b20(80);  //精确延时 大于 480us
DQ=1;     //拉高总线
delay_18b20(14);
x=DQ;       //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_18b20(20);
}

 


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) ;
}

 [page]

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;
    }
}

 

Read_Temperature(void)
{
       Init_DS18B20() ;
 
       WriteOneChar(0xCC) ;    // 跳过读序号列号的操作
       WriteOneChar(0x44) ;    // 启动温度转换

       Init_DS18B20() ;
       WriteOneChar(0xCC) ;    //跳过读序号列号的操作
       WriteOneChar(0xBE) ;    //读取温度寄存器
       temp_data[0] = ReadOneChar();     //温度低8位
       temp_data[1] = ReadOneChar();     //温度高8位
}

 


Disp_Temperature()
{
    display[4]=temp_data[0]&0x0f;
    display[0]=ditab[display[4]];       //查表得小数位的值
 
    display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
    display[3]=display[4]/100 ;
    display[1]=display[4]%100 ;
    display[2]=display[1]/10;
    display[1]=display[1]%10;

     if(display[3]==0)          //高位为0,不显示
     {
       display[3]=10 ;            
       if(display[2]==0)        //次高位为0,不显示
       display[2]=10 ;
     }
}

display1()
{

      P2=tablewe[0];                     //P2口低四位位选
      P0=table[display[3]];        //P0口数码管段选
   delay_18b20(50);

           P2=tablewe[1];
      P0=table[display[2]];
   delay_18b20(50);
           P2=tablewe[2];
      P0=table1[display[1]];
      delay_18b20(50);
           P2=tablewe[3];
     P0=table[display[0]];

}

void main()
{
   while(1)
    { Read_Temperature();
   Disp_Temperature();
 display1();
       ad();
          cal();
  display2();
   
    }
}

这个程序可以使用,但是就是没有办法显示低温零度以下的,求修改!
关键字:DS18B20  ADC0832  共同使用 引用地址:DS18B20和ADC0832共同使用

上一篇:单片机用一位数码管循环显示0-9,A-f
下一篇:基于C8051F的DS1302程序

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

多LED共同使用时的连接方式
多LED共同使用时的连接方式 LED是基于电致发光原理的固体半导体光源,具有色彩丰富、体积小巧、高亮度、寿命长、工作电压低、使用安全、响应速度快、0~100%可调光输出、耐冲击防震动、无紫外线和红外线辐射等许多优点。因此应用范围在逐渐的扩大,具有良好的应用前景。 单颗封装的大功率高亮度LED的造价高,并且主要是点光源,因此距离大范围实用化尚有时日。目前进人实用化的单只高亮度LED的功率很小,而在实际使用的场合大部分需要平面发光,因此必须是将多个LED按照要求排列组合起来,一方面能够满足较大范围、较高亮度、动态显示、色彩变幻等应用的要求,另一方面能够满足与LED相配套的驱动器的驱动匹配要求。 常见的连接形式 在应用中,由多个
[电源管理]
PIC+DS18B20+LCD设计及程序过程中的问题
1、mcu:pic18f25k22 2、由于ds18b20的程序前面文章已经写过,所以暂不概述; 3、液晶显示采用sms太阳人的液晶显示屏; 4、实物图如下: 5、使用xc编译完成,调试过程中,当使用static bit 的时候不能进行函数传参,一直很头疼,最后使用强制类型转换;给变量定义绝对地址使用@这个特殊符号,具体写法:unsigned char a @ 0x40;当然这只是个简单的。在定义bit类型时,注意bit的类型只有全局和静态两种 否则会报错 6、使用pickit3烧写的程序,使用时注意打开项目属性,把power的对钩打上 电源3.3-5.5v自己订喽,其实都可以 当然越低越好, 7、程序就不留了 73
[单片机]
PIC+DS18B20+LCD设计及程序过程中的问题
数字温度传感器DS18B20在卫星电源系统中的应用
0 引言 卫星电源系统主要用来为整个卫星的正常运行提供稳定的电源。它是卫星电能产生、储存、变换、调节、传输分配和管理的重要分系统。其基本功能是通过物理和化学过程将太阳的光能、核能或化学能转化为电能,并根据需要对电能进行存储、调节和变换,然后向卫星其它各分系统不间断供电。我国的卫星大都采用太阳能/蓄电池供电系统。蓄电池充电终压控制采用电压-温度补偿法,即V-T曲线控制。蓄电池温度传感器传统上一般选用热电耦或铂电阻。模拟电路硬件控制是温度补偿的常用方法,已经在我国各种型号的卫星上获得成功应用。 为加快我国卫星电源分系统的数字化设计。充分体现数字电路体积小、重量轻、功耗低、适应性强和可靠性高等优点,提高电源分系统的电能重量比,本文以
[应用]
基于CC2430和DS18B20的无线测温系统设计
  目前,很多场合的测温系统采用的还是有线测温设备,由温度传感器、分线器、测温机和监控机等组成,各部件之间采用电缆连接进行数据传输。这种系统布线复杂、维护困难、成本高,可采用无线方案解决这些问题。无线测温系统是一种集温度信号采集、大容量存储、无线射频发送、LED(或LCD)动态显示、控制与通信等功能于一体的新型系统。   本文从低功耗、小体积、使用简单等方面考虑,基于射频SoC CC2430和数字温度传感器DS18B20设计了一个无线测温系统,整个系统由多个无线节点和1个基站组成。无线节点工作在各个测温地点,进行温度数据采集和无线发送。基站与多个节点进行无线通信,并通过数码管将数据显示出来,同时可以通过RS-232串口将数据发送
[模拟电子]
基于单片机DS18B20温度报警系统 无线蓝牙显示
一、系统方案 随着科学技术的不断发展带动着电子行业的地位越来越重,现在电子产品几乎在社会的各个领域都可以见到。这些技术的发展有效的带动着社会生产力的发展和信息化的提高,同时电子产品也越来越智能。 本设计采用AT89C51单片机为主控芯片,采用数字型防水温度传感器DS18B20制作温度检测报警器,通过四位数码管显示温度值,系统设立几个按键,可以通过按键进行设置温度的上、下限值,当所采集温度超过设定值时,系统会控制蜂鸣器和对应LED发出声光报警。这个设计简单、成本低、具有实用性。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是串口初始化: void Uart_init() { TMOD=0x20;//定时器0工作
[单片机]
基于单片机<font color='red'>DS18B20</font>温度报警系统 无线蓝牙显示
单片机+ADC0832差分与单通道程序和注解
ADC0832差分仿真原理图如下 单片机源程序如下(带详细的注释): #include reg52.h #include intrins.h #include 1602.h #define uchar unsigned char #define uint unsigned int #define ulong unsigned long uchar code num ={ 0123456789*# }; sbit ADC_DI=P1^2; //通道端CH0,CH1 sbit ADC_DO=P1^2; //数据端 sbit ADC_CLK=P1^1; //时钟端 sbit ADC
[单片机]
单片机+<font color='red'>ADC0832</font>差分与单通道程序和注解
51单片机学习:DS18B20温度传感器实验
实验名称:DS18B20温度传感器实验 接线说明: 实验现象:下载程序后,插上DS18B20温度传感器,数码管显示检测的温度值 注意事项:注意温度传感器的方向,在接口处我们已经用丝印画了一个凸起, 所以只需要将温度传感器对应插入即可 ***************************************************************************************/ #include public.h #include smg.h #include ds18b20.h /***********************************************************
[单片机]
51单片机DS18B20温度传感器详解
DS18B20是一种单总线数字温度传感器,测试温度范围-55℃-125℃,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。单总线,意味着没有时钟线,只有一根通信线。单总线读写数据是靠控制起始时间和采样时间来完成,所以时序要求很严格,这也是DS18B20驱动编程的难点。 一.DS18B20温度传感器 1.引脚图 2.DS18B20内部结构图 主要由2部分组成:64位ROM、9字节暂存器,如图所示。 (1) 64 位ROM。它的内容是64 位序列号,它可以被看作是该DS18B20 的地址序列码,其作用是使每个DS18B20 都各不相同,这样就可以实现一根总线上挂接多个DS18B20 的目的。 (2) 9字节暂存器包含:温
[单片机]
51单片机<font color='red'>DS18B20</font>温度传感器详解
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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