精华内容
下载资源
问答
  • 2021/4/14 周三 下午 距蓝桥杯仅四天 为复习各模块的使用,防止在比赛时脑子抽住 首先是资源数据包里的底层代码驱动 驱动代码说明 1-本文件夹中提供的驱动代码供参赛...DS18B20 驱动文件 onewire.c //单总线延时函数

    2021/4/14 周三 下午 距蓝桥杯仅四天

    为复习各模块的使用,防止在比赛时脑子抽住

    首先是资源数据包里的底层代码驱动

    驱动代码说明
    1-本文件夹中提供的驱动代码供参赛选手完成程序设计参考之用。
    2-选手可以自行编写相关代码或以该代码为基础,根据试题中的时钟频率要求,调整延时间隔。
    3-提供驱动代码的测试环境:IAP15F2K61S2单片机 @12MHz。

    驱动并不是拿来就能直接用的
    需要添加及修改一些语句及延时参数

    温度传感器

    DS18B20

    驱动文件 onewire.c

    //单总线延时函数
    void Delay_OneWire(unsigned int t)  //STC89C52RC
    {
    	t *= 7;//此处需要增加延时
    	//盲猜是因为15系列的单片机比51处理速度快
    	while(t--);
    }
    

    因为单总线对时序的要求较严格,所以操作时需要关闭中断,避免影响

    例如

    //通过单总线向DS18B20写一个字节
    void Write_DS18B20(unsigned char dat)
    {
    	unsigned char i;
    	EA = 0;//关闭中断
    	for(i=0;i<8;i++)
    	{
    		DQ = 0;
    		DQ = dat&0x01;
    		Delay_OneWire(5);
    		DQ = 1;
    		dat >>= 1;
    	}
    	Delay_OneWire(5);
    	EA = 1;//打开中断
    }
    

    添加两个函数
    在这里插入图片描述

    在这里插入图片描述

    uint temp;
    
    void start_ds18b20()
    {
    	bit ack;
    	ack = init_ds18b20();
    	if(~ack)
    	{
    		//Master issues Skip ROM command.
    		//跳过ROM指令
    		Write_DS18B20(0xcc);
    		//Master issues Convert T command.
    		//启动一次温度转换
    		Write_DS18B20(0x44);
    	}
    }
    
    void temp_get()
    {
    	bit ack;
    	uchar LSB,MSB;
    	ack = init_ds18b20();
    	if(~ack)
    	{
    		//Master issues Skip ROM command.
    		//跳过ROM指令
    		Write_DS18B20(0xcc);
    		//Master issues Read Scratchpad command.
    		//读取暂存器指令
    		Write_DS18B20(0xBE);
    		
    		LSB = Read_DS18B20();//低八位先读取
    		MSB = Read_DS18B20();//读取高八位
    		
    		temp = ((uint)MSB << 8) + LSB;//数据组合
    		//此时得到的temp是16位无符号整形数,
    		//而是实际上后四位是实际温度的小数部分,
    		//需要对数据处理过才能使用
    	}
    }
    

    保留一位小数

    seg_buff[4] = seg_code[(temp >> 4) / 10];
    seg_buff[5] = seg_code[(temp >> 4) % 10] - 128;
    seg_buff[6] = seg_code[(temp & 0xF) * 10 >> 4];
    

    取整

    temp = temp >> 4;
    seg_buff[5] = seg_code[temp / 10];
    seg_buff[6] = seg_code[temp % 10];
    

    数码管显示函数略

    IIC

    增加延时

    #define DELAY_TIME 30  //此处将 5 改为 30
    

    PCF8591

    在这里插入图片描述

    写指令 0x90
    读指令 0x91

    在这里插入图片描述

    adc

    void adc_read()
    {
    	//假写入
    	IIC_Start();
    	IIC_SendByte(0x90);//写指令
    	IIC_WaitAck();
    	IIC_SendByte(0x43);//允许dac,选择通道三
    	IIC_WaitAck();
    	IIC_Stop();
    	
    	IIC_Start();
    	IIC_SendByte(0x91);//读指令
    	IIC_WaitAck();
    	vol_r = IIC_RecByte(); //读取电压值 0-255
    	IIC_SendAck(1);
    	IIC_Stop();
    }
    

    电压值转换

     vol_rel = vol_r * 100 / 51;  //保留两位小数
    	//vol_rel = vol_r * 500 / 255;
    

    据实测
    将 adc读取 放入中断中执行会毛病较少

    以及

    本人认为这个模块是最搞人的

    因为读取到的值实际是上一次转换得到的值
    //不知道这样说对不对】
    例如,

    a = adc_read();  //读一次通道一
    b = adc_read();  //读一次通道三
    c = adc_read();  //读一次通道一
    

    那么 b 实际是通道一的值
    而 c 实际是通道三的值

    解决

    while()
    {
    	vol_1 = adc_read();  //读一次通道三
    	vol_3 = adc_read();  //读一次通道一
    }
    

    这样vol_?放的就是通道?的值了

    也可

    	adc_read();  //读一次通道三
    	vol_3 = adc_read();  //再读一次通道三
    

    如此,vol_3 放的也是通道三的值了
    此处曾经搞过我好久

    dac

    void dac(uint vol_s)
    {
    	IIC_Start();
    	IIC_SendByte(0x90);
    	IIC_WaitAck();
    	IIC_SendByte(0x43);
    	IIC_WaitAck();
    	IIC_SendByte(vol_s);  //0-255
    	IIC_WaitAck();
    	IIC_Stop();
    }
    

    E2_PROM

    同样以 iic 通信

    读取

    uchar e2_read(uchar addr)
    {
    	uchar dat;
    	
    	IIC_Start();
    	IIC_SendByte(0xA0);   //写数据指令
    	IIC_WaitAck();
    	IIC_SendByte(addr);   //写入数据地址
    	IIC_WaitAck();
    	IIC_Stop();
    	
    	IIC_Start();
    	IIC_SendByte(0xA1);   //读数据指令
    	IIC_WaitAck();
    	dat = IIC_RecByte(); //读取数据
    	IIC_SendAck(1);      //发送非应答,单次读取
    	IIC_Stop();
    	
    	return dat;
    }
    
    void e2_write(uchar addr, uchar dat)
    {
    	IIC_Start();
    	IIC_SendByte(0xA0);   //写数据指令
    	IIC_WaitAck();
    	IIC_SendByte(addr);   //写入数据地址
    	IIC_WaitAck();
    	IIC_SendByte(dat);    //写入数据
    	IIC_WaitAck();
    	IIC_Stop();
    }
    

    据学长
    实测确实有用

    写入一次后需要延时最多5ms

    延时函数由 STC 软件生成软件延时
    在这里插入图片描述

    DS1302

    需要注意 BCD 码
    以 BCD 码写入,读出的数据为 BCD 码

    封装好 BCD 码的转换函数会方便许多

    uchar BCD_to_D(uchar dat)
    {
    	uchar out;
    	out = (dat>>4)*10 + (dat&0x0f);
    	return out;
    }
    
    uchar D_to_BCD(uchar dat)
    {
    	uchar out;
    	out = ((dat/10)<<4) | (dat%10);
    	return out;
    }
    

    读取时间,放入数组

    void ds1302_time_get()
    {
    	uchar i;
    	for(i=0; i<7; i++)
    	{
    		time[i] = BCD_to_D(Read_Ds1302_Byte(read_ds1302_addr[i]));
    	}
    }
    

    至此
    应该没了
    祝自己拿回300报名费
    好像省2学校才给报销报名费
    也祝诸位,,

    展开全文
  • DS18B20

    千次阅读 2018-06-26 00:07:21
     DS18B20硬件设计DS18B20供电的范围为3.0V~5.0V,也可以通过数据线供电;其分辨率可以被使用者选择为9~12位,分辨率越高,转换需要时间越长。根据供电方式不同,DS18B20有两种典型的硬件电路接法,分别为寄生电源...

    DS18B20

    1.     DS18B20硬件设计

    DS18B20供电的范围为3.0V~5.0V,也可以通过数据线供电;其分辨率可以被使用者选择为9~12位,分辨率越高,转换需要时间越长。

    根据供电方式不同,DS18B20有两种典型的硬件电路接法,分别为寄生电源模式和外部电源供电模式。寄生电源的控制回路中,当总线为高电平时,电源由单总线通过VDD引脚,部分能量存储在寄生电源储能电容C内,当数据总线处于低电平时释放能量以提供给器件能量。但是,当DS18B20正在执行温度转换或从高速暂存器向EEPROM传送数据时,工作电流可能达到1.5Ma;该电流可能会引起连接单总线的弱上拉电路的不可能接受的压降,这需要更大的电流,而此时储能电容无法提供。为了保存此时DS18B20有足够的供电,当进行温度转换或者拷贝数据到EEPROM操作时,必须给单总线提供一个强上拉。


    图1 寄生电源供电模式


    图2 外部电源供电模式

    每个DS18B20都有一个独特的64为序列号,从而允许多只DS18B20同时链接在一根单线总线上,因此可以用一个微控制器覆盖在一大片区域的DS18B20。

    2.      DS18B20时序

    DS18B20工作协议流程一般为:初始化àROM操作指令à存储器操作指令à数据传输;其工作时序包括:初始化时序、写时序和读时序。

    1)      初始化时序

    微控制器首先发出一个480~960us的低电平脉冲,然后释放总线变为高电平,并在随后的480us时间内对总线进行监测,如果有低电平出现说明总线上有器件已经做出应答,如无低电平出现一直都是高电平说明总线上无期间应答。

    而作为器件的DS18B20在一上电后就一直在监测总线上是否有480~960us的低电平出现,如果有,在总线转为高电平后等待15~60us将总线点平拉低60~240us做出响应存在脉冲,高度主机本器件已经做好准备,否则就一直检测等待。


    图3 复位时序

    void DS18B20_Reset(void)

    {

           DS18B20_IO_OUT();//输出

           DS18B20_DQ_Low;

           delay_us(480);//延时480微妙   

           DS18B20_DQ_High;

           delay_us(480);//延时480微妙   

    }

    2)      写时序

    写周期最少为60us,最长不超过120us,写周期一开始作为主机先将总线拉低15us表示写周期开始,随后若干主机想写0,则继续拉低低电平最少60us直至写周期结束,然后释放总线为高电平;若主机想写1,在一开始拉低总线点平1us后就释放总线为高电平,一直到写周期结束。

    而作为从机的DS18B20则在检测到总线被拉低后等待15us然后从15us到45us开始对总线采样,在采样期间内总线为高电平则为1,若采样期间总线为低电平则为0。


    图4 写时序

    void DS18B20_Write_Byte(u8 dat)

    {

           u8 i=0;

           DS18B20_IO_OUT();//输出

           for(i=0;i<8;i++)

           {

                  DS18B20_DQ_Low;       //拉低

                  delay_us(15);//延时15微妙

                  if((dat&0x01)==1)

                  {

                         DS18B20_DQ_High;

                  }

                  else

                  {

                         DS18B20_DQ_Low;

                  }

                  delay_us(60);//延时60微妙

                  DS18B20_DQ_High;

                 

                  dat>>=1;//准备下一位数据的发送   

           }

    }

    3)      读时序

    对于读数据操作时序也可分为读0和读1时序两个过程,读时序是从主机把单总线拉低之后,在1us之后就得释放单总线为高电平,以让DS18B20将数据传输到单总线上。DS18B20在检测到总线被拉低1us后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束;若是送出1则释放总线为高电平。

    主机在一开始拉低总线1us后释放总线,然后在包括前面的拉低总线点平1us在内的15us时间内完成对总线进行采样检测,采样期内为低电平在确认为0,采样期间总线为高电平则确认为1,完成一个读时序,至少需要60us才能完成。


    图5 读时序

    u8 DS18B20_Read_Byte(void)

    {

           u8i=0,TempData=0;

           for(i=0;i<8;i++)

           {

                  TempData>>=1;

                  DS18B20_IO_OUT();//输出

                  DS18B20_DQ_Low;       //拉低

                  delay_us(4);//延时4微妙

                  DS18B20_DQ_High;

                  delay_us(10);//延时10微妙

                  DS18B20_IO_IN();

                  if(GPIO_ReadInputDataBit(GPIO_DS18B20,IO_DS18B20)==1)

                  {

                     TempData|=0x80;//读数据 从低位开始

                  }

                  delay_us(45);//延时45微妙

           }

           returnTempData;

    }

    3.      DS18B20的操作方法

    DS18B20单线通信功能是通过分时完成的,有严格的时序概念。系统对于DS18B20的各种操作必须按照协议进行,根据DS18B20的协议规定,微控制器控制DS18B20完成温度转换必须要经过如下四个步骤:

    1)      每次读写前对DS18B20进行复位初始化;

    2)      发送一条ROM指令;

    3)      发送存储器指令;

    一般程序中对单个DS18B20进行温度转换和温度读取的流程如下:

    1)      主机复位;

    2)      主机写跳过ROM操作命令(CCH);

    3)      主机写转换温度的操作指令,然后释放总线至少1s,让DS18B20完成转换操作。再此,需要注意的是每个命令字节在写的时候都是低字节先写。

    4)      主机发送复位操作并接受DS18B20的应答脉冲;

    5)      主机写跳过ROM操作命令(CCH);

    6)      主机发出读取RAM的命令(BEH),随后依次读取DS18B20发出的从第0到第8共9个字节。如果只想读取温度数据,可以在读取前两个数据后不再理会后面DS18B20发出的数据即可,同样读取的数据也是地位在前。


    图6 DS18B20存储器图,上电状态取决于该EEPROM中的参数值

    double DS18B20_Get_wd(void)

    {

           u8TL=0,TH=0;

           u16temp=0;

           doublewd=0;

     

           DS18B20_Reset();//复位

           DS18B20_Write_Byte(0xCC);//跳过ROM命令

           DS18B20_Write_Byte(0x44);//温度转换命令

           delay_ms(800);//延时800毫秒

           DS18B20_Reset();//复位

           DS18B20_Write_Byte(0xCC);//跳过ROM命令

           DS18B20_Write_Byte(0xBE);//读温度命令

     

           TL=DS18B20_Read_Byte();//LSB

           TH=DS18B20_Read_Byte();//MSB

     

           temp=TH;

           temp=(temp<<8)+TL;

     

           if((temp&0xF800)==0xF800)//负温度判断

           {

                  temp=~temp;

                  temp=temp+1;

                  wd=temp*(-0.0625);

           }

           else

           {

                  wd=temp*0.0625;

           }

           return wd;

    }

    4.      高低温报警和测量精度的读取

    void DS18B20_return_TH_TL_CONF( void ) 

        chardata,data_TH,data_TL,CONF; 

        DS18B20_Reset(); 

        DS18B20_write_byte(0xcc);       //忽略rom指令 

        DS18B20_write_byte(0xbe);   //读取温度转换值 

        data = DS18B20_read_byte(); 

        data = DS18B20_read_byte(); 

        data_TH = DS18B20_read_byte(); 

        data_TL = DS18B20_read_byte(); 

        CONF =DS18B20_read_byte(); 

       printf("过温报警的温度为:%d℃\r\n",data_TH); 

       printf("低温报警的温度为:%d℃\r\n",-(data_TL-128)); 

        CONF&=0x60 ; 

        CONF=CONF>>5; 

        switch(CONF) { 

            case0: 

               printf("DS18B20的测量精度为9位,精度为0.5℃\r\n"); 

               break; 

            case1: 

               printf("DS18B20的测量精度为10位,精度为0.25℃\r\n"); 

               break; 

            case2: 

               printf("DS18B20的测量精度为11位,精度为0.125℃\r\n"); 

               break; 

            case3: 

               printf("DS18B20的测量精度为12位,精度为0.0625℃\r\n"); 

               break; 

           default: 

               printf("error!!\r\n"); 

               break; 

        } 

    void DS18B20_write_TH_TL_CONF(u8 TH,u8 TL,u8mode) 

        u8 dat; 

        switch(mode){ 

            case0: 

               dat=31; 

               break; 

            case1: 

               dat=63; 

               break; 

            case2: 

               dat=95; 

               break; 

            case3: 

               dat=127; 

               break; 

           default: 

                printf("mode error!!\r\n"); 

               dat=127; 

               break; 

        } 

       TL=TL+128; 

        DS18B20_Reset(); 

        DS18B20_write_byte(0xcc);       //忽略rom指令 

        DS18B20_write_byte(0x4e);   //写入暂存寄存器 ,过温和低温报警值 

        DS18B20_write_byte(TH);//写入20°为过温报警值 

        DS18B20_write_byte(TL);//写入-20°为低温报警值 

        DS18B20_write_byte(dat);    //写入精度 

        DS18B20_Reset(); 

        DS18B20_write_byte(0xcc);       //忽略rom指令 

        DS18B20_write_byte(0x48);   //将写入的暂存寄存器拷入EEPROM 


    展开全文
  • 本课题利用单片机I/O端口号和DS18B20的温度报警触发器(TH和TL),作为在外部存储器中的存储地址和DS18B20的物理地址,实现了DS18B20和ROM序列号的自动更新,和温度数据的准确定位。并给出了软、硬件设计。
  • <p>ds18b20温度传感器怎么存储上三次的测量数值,</p>
  • 每个ds18b20传感器的ROM都在/sys/bus/devices/28-xxxx路径下, 其中的w1_slave文件存储着温度信息。如下图 所有的树莓派ds18b20传感器温度相关信息都在/sys/bus/devices/28-xxxx路径下,我们编程只需在/sys/bus/...
  • DS18B20详解

    千次阅读 2019-12-10 14:58:25
    DS18B20采用单总线协议进行传输。 单总线器件 通常把挂在单总线上的器件称之为单总线器件,单总线器件内一般都具有控制、收发、存储等电路。为了区分不同的单总线器件,厂家生产单总线器件时都要烧录一个64位的二...

    DS18B20采用单总线协议进行传输。
    单总线器件
    通常把挂在单总线上的器件称之为单总线器件,单总线器件内一般都具有控制、收发、存储等电路。为了区分不同的单总线器件,厂家生产单总线器件时都要烧录一个64位的二进制ROM代码(单总线器件序列号),以标志其ID号。目前,单总线器件主要有数字温度传感器(如DS18B20)、DHT11、A/D转换器(如DS2450)、门标、身份识别器(如DS1990A)、单总线控制器(如DS1WM)等。
    (一)DS18B20性能特点

    在这里插入图片描述
    DS18B20是DALLAS公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读取。可分别在93.75 ms和750 ms内完成9位和12位的温度数字量转换,从DS18B20读出信息或写入信息仅需要一根数据线。读写温度、变换功率可来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。因而使用DS18B20可使系统结构更趋简单,可靠性更高。

    (1)GND为电源端;

    (2)DQ为数字信号输入输出端;

    (3)V DD 为外接供电电源输入端(在寄生电源接线方式时接地)。

    (二)DS18B20的内部结构及主要功能部件

    DS18B20的总体结构如图12-7所示,由64位光刻ROM及串行接口、高低温度传感器、高低温触发器、配置寄存器、8位CRC发生器、电源检测和寄生电容等各部分组成。

    (1)64位ROM

    64位光刻ROM是出厂前被光刻好的,它由8位产品系列号,48位产品序号和8位CRC编码组成,DS18B20的产品系列号均为28H,每个器件的48位产品序号各不相同,利用产品序号可以识别一线上的挂载的不同DS18B20器件。
    在这里插入图片描述
    图12-7 DS18B20内部结构框图
    (2)配置寄存器

    展开全文
  • 现有的方法是在一根I/O线上连接多个DS18B20的数据采集方法,而在DS18B20接入系统之前,需要人工将DS18B20的64位ROM序列号逐一读出,并进行存储。这种方法在确定DS18B20的物理位置上有很大困难,特别是当更换出现故障...
  • 文章目录1、DS18B20的基本概述2、DS18B20内部结构3、DS18B20的内部存储结构4、DS18B20的数据处理5、DS18B20的复位时序6、DS18B20的写时序(低位先发)7、DS18B20的读时序(低位先读)8、DS18B20的温度转换与读取流程...

    1、DS18B20的基本概述

    工作电压:3.0V~5.5V。
    测量范围:-55摄氏度~+125摄氏度。
    通信方式:单总线,数据线接上拉电阻,使总线空闲时处于高电平。
    转换精度:9~12位分辨率可调,默认为12位,即分辨率是0.0625。
    转换时间:典型值200ms。

    2、DS18B20内部结构

      主要由4部分组成:64 位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的排的循环冗余校验码(CRC=X8+X5+X^4+1)。 ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。

    在这里插入图片描述

    3、DS18B20的内部存储结构

    DS18B20的内部有64位的ROM单元和9字节的高速暂存器。64位ROM单元包含了DS18B20唯一的序列号。

    在这里插入图片描述

    第0字节:温度数据的低8位。
    第1字节:温度数据的高8位。
    第3字节:TH用户字节,设置报警温度最高值。
    第4字节:TL用户字节,设置报警温度最低值。
    第5字节:配置寄存器,设置转换精度,默认12位。
    第6字节和第7字节:保留,不用管。
    第8字节:CRC码。
    注:上电后,第2字节、第3字节和第4字节的状态值为EEPROM中的数据。

    4、DS18B20的数据处理

      DS18B20以16位带符号位扩展的二进制补码形式读出。低4位为小数部分,中间7位为整数部分,高5位为符号位。
    在这里插入图片描述

      DS18B20的分辨率为0.0625。读出数据为正温度时,将LSB和MSB整合成的16位整数,直接乘以0.0625即可。读出数据为负温度时,则需要将LSB和MSB整合成的16位整数,取反加1后,再乘以0.0625。
      例如:
      读出结果为00A2H,温度值 = 162×0.0625 = 10.125 摄氏度。
      读出结果为FF5EH,取反加1就是00A2H,温度值则为 -10.125 摄氏度。

      注意:在上电复位的时候,温度寄存器中的值为0x0550,即+85摄氏度。

    5、DS18B20的复位时序

    在这里插入图片描述
    【1】微处理器首先将总线拉低480us以上,然后释放总线。
    【2】总线释放后,上拉电阻会将其拉至高电平。
    【3】DS18B20发现总线有上升沿,等待15~60us后,拉低总线,表示应答。
    【4】微处理器在DS18B20应答期间,读取总线上的电平,如果是低电平则表示复位成功。
    【5】DS18B20在产生60~240us的应答信号后,会释放总线。

    bit Init_DS18B20(void)
    {
    	bit initflag = 0;
    	DQ = 0;
    	Delay_OneWire(50);   //拉低总线480us以上 		
    	DQ = 1;		         //释放总线							
    	Delay_OneWire(5); 	 //等待15~60us		
    	initflag = DQ;       //读取18B20的复位应答信号		
    	Delay_OneWire(10);	 //等待60~240us		
      	return initflag;	 //应答信号为低电平,表示复位成功			
    }
    

    6、DS18B20的写时序(低位先发)

    在这里插入图片描述
    【1】微处理器将总线拉低10~15us。
    【2】在接下来的15~45us直接,根据逻辑1或逻辑0,控制总线的高低电平。
    【3】释放总线。

    void Write_DS18B20(unsigned char dat)
    {
    	unsigned char i;
    	for(i=0;i<8;i++)             
    	{
    		DQ = 0;		         //先拉低总线电平10~15us						
    		DQ = dat&0x01;	     //向总线写入一个位数据			
    		Delay_OneWire(5);    //维持状态20~45us
    		DQ = 1;	             //释放总线			
    		dat >>= 1;           //准备发送下一个数据位			
    	}
    }
    

    7、DS18B20的读时序(低位先读)

    在这里插入图片描述
    【1】微处理器先将总线拉低1us,然后释放总线。
    【2】微处理器读取总线上的电平。
    【3】微处理器读取电平后,延时约45us。

    unsigned char Read_DS18B20(void)
    {
    	unsigned char i;
    	unsigned char dat;
    	for(i=0;i<8;i++)
    	{
    		DQ = 0;              //先将总线电平拉低10~15us
    		dat >>= 1;	     					
    		DQ = 1;		     	 //然后释放总线						
    		if(DQ)		     	 //读取总线上的电平状态						
    		{
    		    dat |= 0x80;
    		}	    
    		Delay_OneWire(5);    //延时45us左右,再度下一个数据位		
    	}
    	return dat;
    }
    

    8、DS18B20的温度转换与读取流程

    [1] DS18B20复位。
    [2]写入字节0xCC,跳过ROM指令。
    [3]写入字节0x44,开始温度转换。
    [4]延时700~900ms。
    [5] DS18B20复位。
    [6]写入字节0xCC,跳过ROM指令。
    [7]写入字节0xBE,读取高速暂存器。
    [8]读取暂存器的第0字节,即温度数据的LSB.
    [9]读取暂存器的第1字节,即温度数据的MSB.
    [10] DS18B20复位。 表示读取数据结束。
    [11]将LSB和MSB整合成为一个16位数据。
    [12]判断读取结果的符号,进行正负温度的数据处理。

    9、DS18B20温度采集完整代码

    硬件说明: IAP15F2K61S2
    在这里插入图片描述

    程序代码:

    1、main.c

    #include "reg52.h"  //定义51单片机特殊功能寄存器
    #include "temp.h"  
    #include "absacc.h"
    
    sfr AUXR = 0x8E; 
    
    unsigned char dspbuf[8] = {10,10,10,10,10,10,10,10};//显示缓冲区
    unsigned char dspcom = 0;
    unsigned char intr;
    bit temper_flag = 0;//温度读取标志
    code unsigned char tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
                                0xff};
    
    void display(void);
    
    void cls_buzz()
    {
    	P2 = ((P2&0x1f)|0xA0); 
    	P0 = 0x00;
    	P2 &= 0x1f;
    }
    void cls_led()
    {
    	P2 = ((P2&0x1f)|0x80); 
    	P0 = 0xFF;
    	P2 &= 0x1f;
    }
    
    //主函数
    void main(void)
    { 
        unsigned char temperature;
    	
    	cls_buzz();cls_led();
        
    	AUXR |= 0x80;
    	TMOD &= 0xF0;
    	TL0 = 0xCD;	
    	TH0 = 0xD4;	
    	TF0 = 0;	
    	TR0 = 1;
    	ET0 = 1;
    	EA = 1;
    	
        while(1)
        {
            if(temper_flag)
    		{
    			temper_flag = 0;
    			temperature = rd_temperature();  //读温度         
            }
    		
    		//显示数据更新    
    		(temperature>=10)?(dspbuf[6] = temperature/10):(dspbuf[6]=10);       
    		dspbuf[7] = temperature%10; 
        }
    }
    
    //定时器中断服务函数
    void isr_timer_0(void)  interrupt 1  //默认中断优先级 1
    {
        display();
    	if(++intr == 100)  //1ms执行一次
    	{
            intr = 0;
    		temper_flag = 1;  //100ms温度读取标志位置1
        }
    }
    
    //显示函数
    void display(void)
    {   
    	P2 = ((P2&0x1f)|0xE0); 
    	P0 = 0xff;
    	P2 &= 0x1f;
    
    	P0 = 1<<dspcom;	
    	P2 = ((P2&0x1f)|0xC0); 
    	P2 &= 0x1f;
    	
    	P0 = tab[dspbuf[dspcom]];	
        P2 = ((P2&0x1f)|0xE0); 
    	P2 &= 0x1f;
    	
        if(++dspcom == 8){
            dspcom = 0;
        }    
    }
    

    2、temp.c

    #include "reg52.h"
    
    sbit DQ = P1^4;
    
    //单总线延时函数
    #ifndef STC12  
    void Delay_OneWire(unsigned int t)  //STC89C52RC
    {
    	while(t--);
    }
    #else
    void Delay_OneWire(unsigned int t)  //STC12C5260S2
    {
    	unsigned char i;
    	while(t--){
    		for(i=0;i<12;i++);
    	}
    }
    #endif
    
    //通过单总线向DS18B20写一个字节
    void Write_DS18B20(unsigned char dat)
    {
    	unsigned char i;
    	for(i=0;i<8;i++)
    	{
    		DQ = 0;
    		DQ = dat&0x01;
    		Delay_OneWire(5);
    		DQ = 1;
    		dat >>= 1;
    	}
    	Delay_OneWire(5);
    }
    
    //从DS18B20读取一个字节
    unsigned char Read_DS18B20(void)
    {
    	unsigned char i;
    	unsigned char dat;
      
    	for(i=0;i<8;i++)
    	{
    		DQ = 0;
    		dat >>= 1;
    		DQ = 1;
    		if(DQ)
    		{
    			dat |= 0x80;
    		}	    
    		Delay_OneWire(5);
    	}
    	return dat;
    }
    
    //DS18B20初始化
    bit init_ds18b20(void)
    {
      	bit initflag = 0;
      	
      	DQ = 1;
      	Delay_OneWire(12);
      	DQ = 0;
      	Delay_OneWire(80); // 延时大于480us
      	DQ = 1;
      	Delay_OneWire(10);  // 14
      	initflag = DQ;     // initflag等于1初始化失败
      	Delay_OneWire(5);
      
      	return initflag;
    }
    
    //DS18B20温度采集程序:整数
    unsigned char rd_temperature(void)
    {
        unsigned char low,high;
      	char temp;
      
      	init_ds18b20();
      	Write_DS18B20(0xCC);
      	Write_DS18B20(0x44); //启动温度转换
      	Delay_OneWire(200);
    
      	init_ds18b20();
      	Write_DS18B20(0xCC);
      	Write_DS18B20(0xBE); //读取寄存器
    
      	low = Read_DS18B20(); //低字节
      	high = Read_DS18B20(); //高字节
      
      	temp = high<<4;
      	temp |= (low>>4);
      
      	return temp;
    }
    

    3、temp.h

    #ifndef _TEMP_H
    #define _TEMP_H
    
    #define OW_SKIP_ROM 0xcc
    #define DS18B20_CONVERT 0x44
    #define DS18B20_READ 0xbe
    
    //函数声明
    unsigned char rd_temperature(void);
    
    #endif
    
    展开全文
  • 利用DS18B20温度传感器和LCD液晶屏测量和显示参数,程序结合按键、EEPROM,实现功能。要求:按K1时显示即时温度;按K2时保存当前温度;按K3时显示最高温度;按K4时显示最近5次的平均温度;要求列出硬件电路图、说明...
  • 基于51单片机+DS18B20温度测温器+LCD1602显示

    千次阅读 多人点赞 2021-02-22 16:03:23
    DS18B20温度传感器DS18B20相关介绍DS18B20特性封装形式与引脚说明供电方式(外部电源供电、寄生电源供电、寄生电源强上拉)内部结构温度存储格式及配置寄存器(模式和分辨率)DS18B20指令(ROM指令操作)指令的使用...
  • 本文介绍了智能集成数字温度传感器DS18B20 的特点和工作原理,对基于DS18B20 多点测温的二种方法进行了分析与探讨。  1. 前言  多点测温在粮食仓库存储的温度监控,禽蛋孵化箱自动温度控制,机柜仪器设备的温度...
  • ds18b20温度传感器

    2021-05-21 21:50:45
    一.如何区分ds18b20的引脚结构 从硬件的结构进行分辨: 扁平面朝上, 从左到右,分别为第一个脚为地,第二个脚为数据传输的单总线,第...DS18B20的内部有20个字节的存储单元,分为ROM和RAM两类,,其中ROM有11个字..
  • 关于ds18b20程序

    2009-05-05 18:01:55
    DS18B20温度传感器 * * C51 * * yajou 2008-06-28 无CRC * ********************************************************/ #include "reg51.h" #include "intrins.h" #include "DS18B20.h" /**********************...
  • 51单片机——DS18B20

    千次阅读 2016-03-18 08:55:33
    单片机——DS18B20 宗旨:技术的学习是有限的,分享的精神是无限的。  DS18B20——温度传感器,单片机可以通过 1-Wire 和 DS18B20 进行通 信,最终将温度读出。1-Wire 总线的硬件接口很简单,只需要把 ...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 218
精华内容 87
关键字:

ds18b20存储