历史上的今天
返回首页

历史上的今天

今天是:2025年01月19日(星期日)

正在发生

2020年01月19日 | DS3231温度读取实验 附单片机源程序

2020-01-19 来源:51hei

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

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


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


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!='')

        {

                SendData(*p);

                p++;

        }

}


void UartInit(void)                //9600bps@11.0592MHz

{

        SCON = 0x50;                //8位数据,可变波特率

        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T

        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器

        TMOD &= 0x0F;                //设定定时器1为16位自动重装方式

        TL1 = 0xE0;                //设定定时初值

        TH1 = 0xFE;                //设定定时初值

        ET1 = 0;                //禁止定时器1中断

        TR1 = 1;                //启动定时器1

}


void delay(unsigned long int i)//延时函数

{

        while(i--);

推荐阅读

史海拾趣

AnalogicTech公司的发展小趣事

随着技术的不断进步,AnalogicTech始终保持对创新的追求。公司研发团队不断攻克技术难关,推出了一系列具有高性能、高稳定性的产品。其中,公司的LED背光驱动器系列在市场中取得了显著的成功,为公司的快速发展奠定了坚实的基础。

BOPLA公司的发展小趣事

BOPLA公司成立于XXXX年,初期主要致力于电子开关、熔断器等基础电子元件的研发与生产。创始人凭借对电子行业的深厚理解和敏锐的市场洞察力,带领公司逐步在竞争激烈的市场中站稳脚跟。通过不断的技术创新和品质提升,BOPLA的产品逐渐获得了客户的认可,为公司后续的发展奠定了坚实的基础。

GeneSiC公司的发展小趣事

近年来,随着环保意识的提高和政府对塑料污染治理的关注,BOPLA积极响应国家号召,开始研发和推广生物基可降解材料。经过多年的努力,公司成功推出了BOPLA生物基膜材,实现了产品的绿色转型。这一创新不仅有助于减少塑料污染,还为公司赢得了更多的环保意识和绿色消费市场的青睐。

Good-Ark公司的发展小趣事
考虑电路的防水、防尘等性能,确保其在恶劣环境下也能正常工作。
Analog Microelectronics GmbH公司的发展小趣事
定期检查电路各部件的工作状态,及时更换损坏的元件,确保电路长期稳定运行。
华润华晶公司的发展小趣事
用于将处理后的信号与预设的阈值进行比较,以确定是否需要触发报警。

问答坊 | AI 解惑

DSP编程的几个关键问题!!!(经典!!!)

找到一份好资料,跟大家分享一下,顺便挣点钱!!o(∩_∩)o...…

查看全部问答>

转载:多种传感器书籍大集锦

刚在网上看到的,迫不及待的与大家分享,转自OURAVR [ 本帖最后由 绿茶 于 2009-4-9 13:21 编辑 ]…

查看全部问答>

有没有纯数字的精确测量信号时间间隔的方法?

十个ns左右的误差范围啊,疯了都,目前我想到两个方法,一个是精确扩展计数时间,一个是多测几次,牺牲测量速度,不好弄…

查看全部问答>

HI-TECH C V9.70 和谐文件

HI-TECH C Compiler for PIC10-12-16 MCUs V9.70 已经测试过,破解成功! 1,先安装HI-TECH C Compiler for PIC10-12-16 MCUs V9.70  安装路径为默认路径 \"C 盘下\" 激活PICC 45天试用版! 2,破解,先写入注册文件,运行破解文件, ...…

查看全部问答>

DDRAW程序问题,在全屏方式下,用创建程序的方式打开一个程序后,程序的界面显示不出来,LCD上显示的还是DDRAW的画面

请问如何解决这个问题 // // Copyright (c) Microsoft Corporation.  All rights reserved. // // // Use of this source code is subject to the terms of the Microsoft end-user // license agreement (EULA) under which you l ...…

查看全部问答>

wince usb 驱动问题

我在看wince5.0 usb从驱动源代码具体位置是:/%wince500boot%/public/common/oak/usbfn 这个文件下有3个文件夹: 1.CLASS文件: RNDIS,SERIAL, STORAGE三个文件夹 2.CONTROLLER文件: MDD,NET2280 3.UFNCLIENLIB文件 请问这三个文件都有什 ...…

查看全部问答>

usb拔掉了,如何判断呢

在usb中断中有这个类别的处理吗? (没有多余管脚来判断Vusb)…

查看全部问答>

国产FPGA助学计划

国产FPGA助学计划          自打去年12月中旬开始接触AgateLogic这家本土FPGA器件制造商,不到四个月的时间,虽然手头上总是多个项目齐头并进,真正花在研究琢磨这个国产FPGA项目上的时间或许不会超过 ...…

查看全部问答>

有木有CH4浓度传感器啊,急求资料,帮忙呀

最还好有单片机程序代码,电路图等等,越全越好.谢谢啊 …

查看全部问答>

4-20ma转换成0-5V

各位高手,本人摸电只是懂点基本的.想请教大家个问题.传感器输出的4-20ma如何转换成0-5V.我以前一直就是用250欧电阻将4-20ma转换成1-5V,再进行A/D转换,感觉这样处理没有0-5V方便.比如4-20ma表示0-50度的温度,0V的时候就表示温度是0度,5V的时候就表示 ...…

查看全部问答>