DS3231温度读取实验 附单片机源程序

2020-01-19来源: 51hei关键字:DS3231  温度读取  单片机

DS3231作为一个走时精准的RTC芯片,内部带有温度补偿电路,此例将读取其中11H和12H寄存器,提取测得的温度值并传送到串口输出。

类似程序网上非常之多,不再赘述,在此重新提说几处需要注意的地方。
www.84653.com_【官方首页】-皇冠现金网1.根据DS3231的芯片手册,其温度传感器的精度为±3℃,毕竟不是专用的温度传感器,在使用中可以作为一个参考,且仅此而已。


2.根据DS3231的芯片手册,其温度分辨率为±0.25℃,所以其小数部分读出的值只能是.00、.25、.50、.75这四种,如果读出的值不是这四种,则数据处理有误。


www.84653.com_【官方首页】-皇冠现金网3.本实验使用一个float型数据直接接收了转换的温度值,没有对补码的符号位进行判断等。

注明:本程序没有使用CONV位进行强制转换,但是实际上温度值的刷新速度还是很令人满意(用手按住芯片,温度值更改速度很快,下面的测试图片是恒温下检测的,故无变化)。
测试程序:


#include

#include"stdio.h"

#include

//位定义

sbit DS3231_SDA=P3^3;

sbit DS3231_SCL=P3^2;


//运行数组

unsigned char DS3231_Time_Buffer[7]={0x00,0x48,0x11,0x02,0x12,0x02,0x19};

unsigned char temp[2]={0,0};

char buf[20]={0};

//运行标志位

bit busy=0;

//运行变量

float v;


/*##############################################################################

编写/测试:凌净清河

日期:2019年2月12日

测试平台:IAP15W4K58S4


鸣谢:DS3231部分驱动函数借用了51黑论坛上某位的程序,但是时间太久忘记是谁的了。

并未修改原作者的写法,如果原作者认出,鄙人在此表示感谢,或可联系我提名。

##############################################################################*/


/*###################以下为给DS3231定义的IIC通信函数################*/

void DS3231_Delay()//使用空操作进行短暂的延时

{

        _nop_();

        _nop_();

        _nop_();

        _nop_();

}


void DS3231_IIC_Start()//IIC总线的开始信号

{

        DS3231_SCL=1;

        DS3231_SDA=1;

        DS3231_Delay();

        DS3231_SDA=0;

        DS3231_Delay();

        DS3231_SCL=0;

}


void DS3231_IIC_Stop()//IIC总线的停止信号

{

        DS3231_SCL=0;

        DS3231_SDA=0;

        DS3231_Delay();

        DS3231_SCL=1;

        DS3231_Delay();

        DS3231_SDA=1;

        DS3231_Delay();

}


bit DS3231_IIC_Send_Byte(unsigned char dat)//写操作

{

        unsigned char mask;//定义一个掩码用于进行按位发送数据的操作

        bit ack;


        for(mask=0x80;mask!=0;mask>>=1)

        {

                if((mask&dat)==0)

                        DS3231_SDA=0;

                else

                        DS3231_SDA=1;

                DS3231_Delay();

                DS3231_SCL=1;

                DS3231_Delay();

                DS3231_SCL=0;

        }

        DS3231_SDA=1;

        DS3231_Delay();

        DS3231_SCL=1;

        ack=DS3231_SDA;

        DS3231_Delay();

        DS3231_SCL=0;


        return (~ack);

}


unsigned char DS3231_IIC_Read_Byte_NAK()//读操作+非应答

{

        unsigned char mask;//定义一个用于累加的位存储临时变量

        unsigned char dat;


        DS3231_SDA=1;

        for(mask=0x80;mask!=0;mask>>=1)

        {

                DS3231_Delay();

                DS3231_SCL=1;

                if(DS3231_SDA==0)

                        dat&=~mask;

                else

                        dat|=mask;

                DS3231_Delay();

                DS3231_SCL=0;

        }

        DS3231_SDA=1;

        DS3231_Delay();

        DS3231_SCL=1;

        DS3231_Delay();

        DS3231_SCL=0;


        return dat;

}


unsigned char DS3231_IIC_Read_Byte_ACK()//读操作+应答

{

        unsigned char mask;//定义一个用于累加的位存储临时变量

        unsigned char dat;


        DS3231_SDA=1;

        for(mask=0x80;mask!=0;mask>>=1)

        {

                DS3231_Delay();

                DS3231_SCL=1;

                if(DS3231_SDA==0)

                        dat&=~mask;

                else

                        dat|=mask;

                DS3231_Delay();

                DS3231_SCL=0;

        }

        DS3231_SDA=0;

        DS3231_Delay();

        DS3231_SCL=1;

        DS3231_Delay();

        DS3231_SCL=0;


        return dat;

}

/*#################以下为给DS3231封装的寄存器通信函数###############*/


void DS3231_Read_Registers(unsigned char *buf,unsigned char addr,unsigned char len)//读EEPROM中多个字节

{

        do{

                DS3231_IIC_Start();

                if(DS3231_IIC_Send_Byte(0xD0))

                {

                        break;

                }

                DS3231_IIC_Stop();

          }while(1);

        DS3231_IIC_Send_Byte(addr);

        DS3231_IIC_Start();

        DS3231_IIC_Send_Byte((0xD0)|0x01);//寻址,读操作

        while(len>1)

        {

                *buf++=DS3231_IIC_Read_Byte_ACK();

                len--;

        }

        *buf=DS3231_IIC_Read_Byte_NAK();//读一个字节

        DS3231_IIC_Stop();

}


void DS3231_Write_Registers(unsigned char *buf,unsigned char addr,unsigned char len)//写寄存器,传入待写入数组

{

        while(len>0)

        {        

                do{

                        DS3231_IIC_Start();

                        if(DS3231_IIC_Send_Byte(0xD0))

                        {

                                break;

                        }

                        DS3231_IIC_Stop();

                  }while(1);


                DS3231_IIC_Send_Byte(addr);

                while(len>0)

                {

                        DS3231_IIC_Send_Byte(*buf++);

                        len--;

                        addr++;

                        if((addr&0x07)==0)

                        {

                                break;

                        }

                }

                DS3231_IIC_Stop();

        }

}


void SendData(unsigned char dat)//串口1发送一个字节数据

{

        while(busy);

        busy=1;

        SBUF=dat;

}


void SendString(char *p)//串口发送一个字符串

{

        while(*p!='')

        {

[1] [2]
关键字:DS3231  温度读取  单片机 编辑:什么鱼 引用地址:http://news.tiffanyevening.com/mcu/ic486145.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:4位数码管流水灯时钟程序
下一篇:对180度360度sg90舵机的使用经验+单片机程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

基于STM8的DS18B20检测
最近要鼓捣出5V的ds18b20用stm8采集,网上一搜发现大部分都是把数据端直接接到3.3的引脚,我也这么做的。用的DS18B20为淘宝外面有钢管的那种,系统板为STM8L051,第一次接触stm8先去找的库函数,以附件形式粘贴到下面。用IAR建工程一搜一大把。单总线协议因为只有一条线,时序很重要,肯定要使用延时函数,用的原子哥的延时函数,,照搬原子哥的代码:http://www.openedv.com/posts/list/17347/htm记得定义头文件时加上 #include "stm8l15x_conf.h",不然会报错#include "delay.h" 
发表于 2020-02-22
基于STM8的DS18B20检测
STM8S105K4使用硬件SPI来读取LSM9DS1
STM8S105K4使用硬件spi读LSM9DS1的注意SPI配置的几个要素:MSB、主从、PHASE_EDGE、POLARITY、NSS ;主机时钟和SPI的速度的匹配,需要测试。STM8的spi初始化函数中的CRC是个什么鬼?SPI读取LSM9DS1时,需要先指定读取地址,然后再发一个直接的时序,读取该地址的数据。www.84653.com_【官方首页】-皇冠现金网此时一定把第一次读地址的数据(虽然没有用)也读出来。代码SPI_Cmd(ENABLE);    CS_M_L;    while(SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);    SPI->DR
发表于 2020-02-20
基于单片机的火灾报警器设计
随着现代家庭用火、用电量的增加,家庭火灾发生的频率越来越高。火灾报警器也随之被广泛应用于各种场合。本课题所研究的无线多功能火灾报警器采用STC89C51为核心控制器,利用气体传感器MQ-2、ADC0832模数转换器、DS18B20温度传感器等实现基本功能。通过这些传感器和芯片,当环境中可燃气体浓度或温度等发生变化时系统会发出相应的灯光报警信号和声音报警信号,以此来实现火灾报警,智能化提示。 #include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include "intrins.h"       
发表于 2020-02-18
基于单片机的火灾报警器设计
基于PIC单片机的测温网络的开发
简介:介绍一种利用PIC单片机和DS18B20构造单总线测温网络的方法,文章给出了系统硬件结构和软件流程图。本测温网络应用在磁致伸缩液位传感器上,利用附在不锈钢管内壁的不同位置上的三个DS18B20,测量不同液位层的温度 。www.84653.com_【官方首页】-皇冠现金网1硬件设计整个系统由上位机和下位机组成。上位机用PC机,下位机用PIC16C63(原理框图见图1)。www.84653.com_【官方首页】-皇冠现金网系统硬件部分主要有PIC16C63、AT24C01、DS18B20、显示电路、电源电路、时钟电路和通信电路。用户需要时可通过上位机下达测量命令,下位机进行测量并把结果送给上位机或显示在液晶显示模块上。三个温度点任何一路发生故障,都会传给上位机一个默认值,用户可以据此在线更换新的温度传感器,系统能够自动找到并启用
发表于 2020-02-18
基于PIC单片机的测温网络的开发
AVR多功能实验箱DS1302时钟实验源码资源
/******************************************************************************************************************程序功能:DS1302时钟实验开发环境:WINAVR/GCC20100110硬件环境:eeskill多功能开发学习板/实验箱(2017版):ATMEGA16,12M晶振接线说明:使用杜邦线连接核心板PA0~PA2口与底板JP26具体接法,PA2-STCP,PA1-SHCP,PA0-DS使用杜邦线连接核心板PA3~PA5口与底板JP45具体接法,PA3-SCLK,PA4-IO,PA5-RST。跳线说明
发表于 2020-02-16
AVR多功能实验箱DS1302时钟实验源码资源
用51单片同时测温度(DS18B20)和频率(外部中断测)
=0; //因DS18B20对时序要求高且受中断影响,故先关闭总中断     read_temp();//读取温度     ds1820disp();//显示     CT_init();//定时计数器初始化          EA=1;//开总中断          EX0=1;//允许外部中断         IT0
发表于 2020-02-10
小广播
何立民专栏 单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 tiffanyevening.com, Inc. All rights reserved

页面底部区域 foot.htm