51单片机+proteus+(DS1302+DS18B20)

news2024/9/24 13:22:56

目录

1.温度传感器检测(DS18B20)

1.1基本概念

1.1.1 DS18B20的简介

1.1.2 DS18B20的框图

​编辑 1.1.3 DS18B20的指令

1.1.4 总线时序协议

1.2代码

1.2.1DS18B20的初始化代码

1.2.2DS18B20的读代码

1.2.3DS18B20的写时序

​编辑 1.2.4DS18B20的温度初始化

1.2.5主函数的代码

​编辑

1.3仿真

 ​编辑

2.实时时钟(DS1302)

2.1基本概念

2.1.1DS1302的简介

 2.1.2DS1302的框图

2.1.3DS1302的时序

2.2代码

2.2.1写字节函数

2.2.2读字节函数

2.2.3读数据函数

2.2.4写数据函数和初始化函数

2.2.5主函数代码

2.3仿真


1.温度传感器检测(DS18B20)

1.1基本概念

1.1.1 DS18B20的简介

  • DS18B20的介绍

  • DS18B20的特点 
(1)采用单线接口方式 DS18B20 温度传感器仅需要一条线即可实现与微处理器的双向通
(2)测温范围 DS18B20 温度传感器的测温范围可达- 55 ℃~ +125 ℃,在 -10 ℃到 +85 ℃范围内误差为 ±0.4°
(3)工作电源 : 3.0 5.5V /DC DS18B20 温度传感器可以采用外部独立电源供电,也可以用数据线寄生 电源供电。
(4)DS18B20 温度传感器在应用过程中不需要任何外围元件。
(5)DS18B20 温度传感器测量温度的结果以 9~12 位数字量方式串行传送。
(6)掉电保护功能, DS18B20 温度传感器内部含有 EEPROM ,通过配置寄存器可以设定数字转换精度和报警温度。在DS18B20 温度传感器掉电以后仍可保存分辨率及报警温度的设定值
  • DS18B20的引脚图

 

 (1)DS18B20的DQ端为什么接上拉电阻

         在使用DS18B20时,需要为其提供1-Wire接口电源和接口信号线,其中接口信号线被称为DQ线。一般情况下,DQ线是由微控制器或其他器件提供的。由于DS18B20是数字传感器,它通过DQ线向微控制器发送温度数据。在DS18B20通信过程中,需要使用上拉电阻将DQ线拉高VCC,这是因为DS18B20的通信协议是基于重复的脉冲信号而为了避免设备之间互相干扰,必须确保DQ线的电平处于一个稳定的状态。 如果没有上拉电阻,DQ线就会漂移,导致通信不稳定或失败。 DS18B20的工作电流约为1mA,VCC一般为5V,则电阻R=5V/1mA=5KΩ

1.1.2 DS18B20的框图

  • DS18B20的框图

(1)DS18B20的另一个功能是可以在没有外部电源供电的情况下工作。当总线处于高电平状态,DQ与上拉电阻连接通过单总线对器件供电。同时处于高电平状态的总线信号对内部电容(Cpp)充电,在总线处于低电平状态时,该电容提供能量给器件。这种提供能量的形式被称为“寄生电源”。作为替代选择,DS18B20同样可以通过VDD引脚连接外部电源供电。

(2)64位只读存储器储存器件的唯一片序列号。高速暂存器含有两个字节的温度寄存器,这两个寄存器用来存储温度传感器输出的数据。除此之外,高速暂存器提供一个直接的温度报警值寄存器(TH 和 TL),和一个字节的的配置寄存器。配置寄存器允许用户将温度的精度设定为9,10,11 或12位。TH,TL和配置寄存器是非易失性的可擦除程序寄存器(EEPROM),所以存储的数据在器件掉电时不会消失

(3)DS18B20通过达拉斯公司独有的单总线协议依靠一个单线端口通讯。当全部器件经由一个3态端口或者漏极开路端口(DQ引脚在DS18B20上的情况下)与总线连接的时候,控制线需要连接一个弱上拉电阻。在这个总线系统中,微控制器(主器件)依靠每个器件独有的64位片序列号辨认总线上的器件和记录总线上的器件地址。由于每个装置有一个独特的片序列码,总线可以连接的器件数目事实上是无限的。

  • 内部器件的作用

(1)电容作用:处于高电平时由寄生电路给电容充电,当处于低电平时,电容放电维持内部电路的供电稳定。

(2)二极管1:由外部电源Vpu经过二极管1给内部电路充电

(3)二极管2:由VDD经过二极管2给内部电路充电、

(4)电源探测:检测外部的VDD是否存在来调节内部的的结构来省电。

(5)64位ROM和单总线接口:作为器件地址,用于总线通信的寻址。单总线的寻址

(6)暂存器:用于总线的数据交互

(7)EEPROM:用于保存温度触发阈值和配置参数

  • 存储器结构

(1) 测温操作

        在上电状态下默认的精度为12位。DS18B20启动后保持低功耗等待状态; 当需要执行温度测量和AD转换时,总线控制器必须发出[44h]命令。在那之后, 产生的温度数据以两个字节的形式被存储到高速暂存器的温度寄存器中, DS18B20继续保持等待状态。当DS18B20由外部电源供电时,总线控制器在温度转换指令之后发起“读时序”,DS18B20正在温度转换中返回0,转换结束返回 1。如果DS18B20由寄生电源供电,除非在进入温度转换时总线被一个强上拉拉高,否则将不会由返回值。

转换的二进制是实际温度的16倍 

(2)报警操作信号

         DS18B20完成一次温度转换后,就拿温度值与和存储在TH和TL中一个字节的用户自定义的报警预置值进行比较。 标志位(S)指出温度值的正负:正数S=0,负数S=1。 TH和TL寄存器是非易失性的,所以它们在掉电时仍然保存数据。在存储器节将解释TH和TL是怎么存入高速暂存器的第2和第3个字节的。
        当TH和TL为8位寄存器时,4位温度寄存器中的11个位用来和TH、TL进行比较。如果测得的温度高于TH或低于TL,报警条件成立,DS18B20内部就会置位一个报警标识。每进行一次测温就对这个标识进行一次更新;因此,如果报警条件不成立了,在下一次温度转换后报警标识将被移去。
         总线控制器通过发出报警搜索命令[ECh]检测总线上所有的 DS18B20 报警标识 。 任何置位报警标识的DS18B20将响应这条命令,所以总线控制器能精确定位每一个满足报警条件DS18B20。如果报警条件成立,而TH或TL的设置已经改变, 另一个温度转换将重新确认报警条件。

(3)配置寄存器 

         存储器的第4位为配置寄存器,其组织见图 8。用户可以通过R0和R1位来设定 DS18B20的精度。上电默认设置:R0=1,R1=1(12 位精度)。注意: 精度和转换时间之间有直接的关系。暂存器的位7和位0-4被器件保留,禁止写入;在读回数据时,它们全部表现为逻辑1。

 1.1.3 DS18B20的指令

1.1.4 总线时序协议

  • 初始化

(1)在初始化序列期间,单片机总线控制器拉低总线并保持480us以发出(TX)一个复位脉冲信号,然后释放总线,进入接 收状态(RX)。当总线被释放后,5kΩ的上拉电阻将总线拉到高电平。当DS18B20检测到IO引脚上的上升沿后,等待15-60us,然后发出一个由60-240us低电平信号构成的存在脉冲

  • 读时序(低位在前)

(1)当总线控制把数据线从高电平拉低到低电平时,读时序开始,数据线必须至少保持1us,然后总线被释放。 在总线控制器发出读时序后,DS18B20通过拉高或拉低总线上来传输10。当传输0结束后,总线将被释放,通过上拉电阻回到高电平空闲状态。从DS18B20输出的数据在读时序的下降沿出现后15us内有效。因此,总线控制器在读时序开始15us内释放总线然后采样总线状态, 以读取数据线的状态

(2)接收一位:主机将总线拉低1~15us,然后释放总线,并在拉低后15us内读取总线电平(尽量贴近15us的末尾),读取为低电平则为接收0,读取为高电平则为接收1 ,整个时间片应大于60us

  • 写时序(低位在前)

(1)发送一位:主机将总线拉低60~120us,然后释放总线,表示发送0;主机将总线拉低1~15us,然后释放总线,表示发送1。从机将在总线拉低30us后(典型值)读取电平,整个时间片应大于60us。

(2)写时序分为写“0”时序和写“1”时序两个过程。DS18B20写“0”时序和写“1”时序的要求不同,当要写“0” 时,单总线要被拉低至少60us,以保证DS18B20能够在15us45us之间正确地采样I/O总线上的“0”电平;当要写“1”时,单总线被拉低之后,在15s之内就得释放单总线

  • DS18B20读取温度的时序

1.2代码

1.2.1DS18B20的初始化代码

1.2.2DS18B20的读代码

1.2.3DS18B20的写时序

 1.2.4DS18B20的温度初始化

1.2.5主函数的代码

1.3仿真

 

2.实时时钟(DS1302)

2.1基本概念

2.1.1DS1302的简介

  • DS1302时钟芯片内含有一个实时时钟/日历和31个字节静态RAM,实时时钟/日历能提供2100年之前的秒、分、时、日、日期、月、年等信息,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM指示决定采用24小时或12小时格式。内部含有31个字节静态RAM,可提供用户访问。
  • BCD码格式

(1)BCD码(Binary Coded Decimal‎),用4位二进制数来表示1位十进制数0-9这十个数简称BCD码。我们时钟日历寄存器使用的是8421码型的BCD码

(2)8421码型BCD码最小值为0000(二进制),最大值为1001(二进制);9

(3) BCD码转十进制:DEC=BCD/16*10+BCD%16; (2位BCD)

(4)十进制转BCD码:BCD=DEC/10*16+DEC%10; (2位BCD)

 2.1.2DS1302的框图

引脚线RST
RST
输入信号,高时允许读写DS1302数据,为低时禁止读写。
该引脚有两个功能: 
CE开始控制字访问移位寄存器的控制逻辑;
CE提供结束单字节或多字节数据传输的方法。
Vcc1
主电源。
当Vcc2< Vcc1时,由Vcc1向DS1302供电
Vcc2
备份电源。
当Vcc2>Vcc1+0.2V时,由Vcc2 向DS1302供电
SCLK
串行时钟,输入,控制数据的输入与输出
I/O
三线接口时的双向数据线
X1、X2
32.768KHz 晶振管脚
GND电源地

(1)电路接到电源时IO和SCLK将会起作用,当CE为低电平时,此时IO和SCLK不起作用,此时不能写和读

  • DS1302控制字

(1)位7:控制字的最高有效位必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。

(2)位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据

(3)位5至位1(A4~A0):指示操作单元的地址;

(4)位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。 控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0 位)开始。同样,在紧跟8 位的控制字指令后的下一个SCLK 脉冲的下降沿读出 DS1302 的数据,读出的数据也是从最低位到最高位

 

  • DS1302存储器格式 

  • DS1302寄存器格式​​​​​​​

​​​​​​​​​​​​​​

(1)秒寄存器(81h、80h)的BIT7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。

(2)小时寄存器(85h、84h)的BIT7用于定义DS1302是运行于12小时模式还是24小时模式,当为1时,选择12小时模式,此时BIT5为AM/PM位,在24小时模式时此位为小时数据位。

(3)控制寄存器(8Fh、8Eh)的BIT7是写保护位(WP),其它7位均为0。在任何对时钟或RAM读写操作之前,WP位必须为0。当WP位为1时,不能对任何时钟日历寄存器或RAM进行写操作。

 (4)突发模式(burst mode 或称多字节传输模式),突发模式可以指定任何的时钟/日历或者RAM寄存器为突发模式,和以前一样,第6位指定时钟或RAM而0位指定读或写。突发模式的实质是指一次传送多个字节的时钟信号和RAM数据

2.1.3DS1302的时序

数据的传输是从最低位开始(BIT0)。数据是以位(BIT)为单位依次写入或读出,读写数据操作中SCLK上升沿时执行写入数据,下降沿时执行读出数据。如果CE为低,所有的I/O引脚变为高阻抗状态,数据传输终止

  • 读时序

(1)读数据:CE端从低到高的一个上升沿开始允许开始读数据,拉低CE端则禁止读写数据;开始的8个SCLK周期,写命令字节,数据的后8个SCLK在下降沿时读出数据。

  • 写数据

 (1)写数据:CE端从低到高的一个上升沿开始允许开始写数据,拉低CE端则禁止读写数据;开始的8个SCLK周期,写命令字节,数据的后8个SCLK 周期写入数据。

2.2代码

2.2.1写字节函数

void DS1302_writeByte(unsigned char sent_dat)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        DS1302_SCLK=0;//时钟线锁存到数据
        if(sent_dat&(0x01<<i))//低位先入
        {
            DS1302_IO=1;
        }
        else{
            DS1302_IO=0;
        }
        DS1302_SCLK=1;//此时将数据写入到时钟线中
    }
    DS1302_SCLK=0;//此时是2个字节数据的转换的时钟周期
} 

2.2.2读字节函数

unsigned char DS1302_readByte()
{
    unsigned char i,read_data=0x00;
    for(i=0;i<8;i++)
    {
        if(DS1302_IO)
        {
            read_data=read_data|(0x01<<i); //如果判断的位数据位为1时,此时将其余位为0
        }
        else
        {
            read_data=read_data&(~(0x01<<i));//如果判断的位数据位为0时,此时将其余位为1
        }
        DS1302_SCLK=1;
        DS1302_SCLK=0;
    }
    return read_data;  
}

2.2.3读数据函数

unsigned char Read_DS1302_data(unsigned char cmd)
{
    unsigned char readate; 
    DS1302_RST=1;
    DS1302_writeByte(cmd);
    readate=DS1302_readByte();
    DS1302_RST=0;
    return readate;
}

2.2.4写数据函数和初始化函数

void Write_DS1302_data(unsigned char cmd,unsigned char dat)
{ 
    DS1302_RST=1;
    DS1302_writeByte(cmd);
    DS1302_writeByte(dat);
    DS1302_RST=0;
}

void Write_DS1302_Init()
{   
    Write_DS1302_data(0x8E,0x00);//关闭写保护
    Write_DS1302_data(0x80,0x15);//向秒寄存器中写入的数据,写秒15(16进制)
    Write_DS1302_data(0x82,0x15);//向分寄存器中写入的数据,写分15(16进制)
}

void Read_DS1302_Init()
{   
    second=Read_DS1302_data(0x81);//向秒寄存器中写入的数据,写秒15
    minute=Read_DS1302_data(0x83);//向分寄存器中写入的数据,写分15
}

2.2.5主函数代码

void loop()
{
    Read_DS1302_Init();
    
   
    LCD_WriteNum(1,2,second&0x0f,1);//显示是十进制
    second=second&0xf0; //高四位,十位
    second=second>>4;
    LCD_WriteNum(1,1,second,1);
    
    LCD_WriteNum(2,2,minute&0x0f,1);//显示是十进制
    minute=minute&0xf0; //高四位,十位
    minute=minute>>4;
    LCD_WriteNum(2,1,minute,1);
    //LCD_WriteNum(2,1,minute,3);//显示是十进制
}


void main()
{
    LCD_Init();
    Write_DS1302_Init();
   // Read_DS1302_Init();
    
    while(1)
    {
         loop();   
        
    }


}

2.3仿真

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2138517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[C语言]第九节 函数一基础知识到高级技巧的全景探索

目录 9.1 函数的概念 9.2 库函数 9.2.1 标准库与库函数 示例&#xff1a;常见库函数 9.2.2 标准库与头文件的关系 参考资料和学习工具 如何使用库函数 ​编辑 9.3 ⾃定义函数 9.3.1 函数的语法形式 9.3.2函数的举例 9.4 实参与形参 9.4.1 什么是实参&#xff1f; 9…

嵌入式单片机中数码管基本实现方法

1. 点亮数码管 本节课利用已经学习的LED知识去控制一个8位数码管。 本节的原理比较简单。不需要多少时间讲。 更多时间是跟大家一起编码调试,从中学习一些编码思路和学习方法。 1.1. 什么是数码管 数码管是什么?下图就是一个数码管 从硬件上个看,其实就是8个LED组合…

Python实用的27个实例,涵盖从基础到进阶的所有领域!

Python 是一种广泛使用的高级编程语言&#xff0c;以其简洁的语法和丰富的库支持而受到开发者们的喜爱。以下列出了 27 个实用的 Python 实例&#xff0c;涵盖从基础到进阶的不同领域&#xff0c;帮助你提升编程技能。 1. 打印 "Hello, World!" print("Hello,…

企业微信如何利用群聊机器人定时推送消息

背景&#xff1a;公司其他部门有在群聊中新建机器人并定时推送消息的需求&#xff0c;webhook已准备好 1、准备一台服务器或者虚拟机&#xff0c;编写脚本 [rootlocalhost opt]# vim crontab.sh curl https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key4d38964b-04f2-44…

【Arduino】国产arduino驱动

买的国产 arduino&#xff0c;如果 windows识别不到。或者用 Arduino自带的Driver程序仍不能驱动。又不想用驱动精灵&#xff0c;可以直接安装驱动程序 99%大概率是CH340芯片&#xff0c;驱动下载连接如下。 你可以从 WCH 官方网站 下载并安装 CH340 驱动程序 安装即可用&am…

进阶岛 renwu5: 茴香豆:企业级知识问答工具实践闯关任务

进阶岛 renwu5: 茴香豆&#xff1a;企业级知识问答工具实践闯关任务 renwu: https://kkgithub.com/InternLM/Tutorial/blob/camp3/docs/L2/Huixiangdou/task.md 在 InternStudio 中利用 Internlm2-7b 搭建标准版茴香豆知识助手&#xff0c;并使用 Gradio 界面完成 2 轮问答&a…

什么是java的spi?

Java SPI&#xff08;Service Provider Interface&#xff09;是一种提供服务发现机制的设计模式&#xff0c;允许在运行时动态地发现、加载和替换服务的实现。SPI机制的核心思想是&#xff1a;通过接口定义服务&#xff0c;并且使用外部的实现类来提供该服务的具体功能。 目录…

这些学校就业不错且好考,努努力就能上岸的江浙沪学校!

这些学校就业不错且好考&#xff0c;努努力就能上岸&#xff0c;搭配历年数据&#xff0c;供大家参考~ 目录 ① 南京信息工程大学 ② 南京工业大学 ③ 浙江工业大学 ④ 中国计量大学 ⑤ 上海电力大学 ① 南京信息工程大学 复试线招生人数 双一流高校&#xff0c;金牛湖…

3.4.2 __ipipe_init_early之fixup_percpu_data()

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 3.4.2 __ipipe_init_early之fixup_percpu_data() 这个函数只有在CPU是SMP对称多core的情况下&#xff0c;才会真正运作&#xff0c;否则就是个空函数。 #ifdef CONFIG_SMPstatic inline void fixup_percpu_data…

约瑟夫环和一元多项式修正版

这里先附上上一篇博文的链接大家可以对比着看&#xff0c;错误已经改正https://blog.csdn.net/2302_78946488/article/details/141751514?spm1001.2014.3001.5501 约瑟夫环 以下是详细代码 //约瑟夫环 #include<stdio.h> #include<stdlib.h> //建立链表结点 str…

哈夫曼编码——CSP-J1真题讲解

假设有一组字符{a,b,c,d,e,f}&#xff0c;对应的频率分别为5%、9%、12%、13%、16%、45%。请问以下哪个选项是字符a,b,c,d,e,f分别对应的一组哈夫曼编码?( ) A. 1111&#xff0c;1110&#xff0c;101&#xff0c;100&#xff0c;110&#xff0c;0 B. 1010&#xff0c;1001&…

视频工具EasyDarwin生成RTMP给WVP拉流列表

效果 运行 登录 http://127.0.0.1:10086/ admin/admin 创建RTMP服务

离线数仓ODS层准备

离线数仓ODS层设计-Operational Data Store ODS层设计要点ODS层-日志表-json表SERDEhive导入json表&#xff08;hive表和json表 字段不一致 解决方案&#xff09; 复杂数据类型日志表-建表语句 ODS层设计要点 &#xff08;1&#xff09;ODS层的表结构设计依托于从业务系统同步…

Qt 菜单栏、工具栏、状态栏、标签、铆接部件(浮动窗口) 设置窗口核心部件(文本编辑控件)的基本使用

效果 代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QToolBar> #include<QDebug> #include<QPushButton> #include<QStatusBar> #include<QLabel> #include<QDockWidget> #include<QTextEdi…

第1步win10宿主机与虚拟机通过NAT共享上网互通

VM的CentOS采用NAT共用宿主机网卡宿主机器无法连接到虚拟CentOS 要实现宿主机与虚拟机通信&#xff0c;原理就是给宿主机的网卡配置一个与虚拟机网关相同网段的IP地址&#xff0c;实现可以互通。 1、查看虚拟机的IP地址 2、编辑虚拟机的虚拟网络的NAT和DHCP的配置&#xff0c;…

springboot3.X版本集成mybatis遇到的问题

由于我本地springboot为3.x版本&#xff0c;如下图所示&#xff0c;最新版本 当我参照如下搜索的内容去集成mybatis的时候&#xff0c;会出现各种各样的报错 最根本的原因是搜出来的配置是参照springboot2.X版本&#xff0c;当我们使用springboot3.x版本之后&#xff0c;需要配…

【C++】STL--string(上)

前言 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用户自己管理&#xff0c;稍不留…

8个前端库-小且美

前提&#xff1a;前端有很多小而美的库&#xff0c;接入成本很低又能满足日常开发需求&#xff0c;同时无论是 npm 方式引入还是直接复制到本地使用都可以。 1.radash radash相比与 lodash&#xff0c;更加面向现代&#xff0c;提供更多新功能&#xff08;tryit&#xff0c;…

前端层面----监控与埋点

前言&#xff1a; 站在产品的视角&#xff0c;经常会问如下几个问题&#xff1a; 产品有没有用户使用 用户用得怎么样 系统会不会经常出现异常 如何更好地满足用户需求服务用户 当站在技术视角时&#xff0c;经常会问如下几个问题&#xff1a; 系统出现异常的频率如何 异常…

MyBatis中多对一关系的三种处理方法

目录 MyBatis中多对一关系的三种处理方法 1.通过级联属性赋值 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff09;测试代码 4&#xff09;测试结果 2.通过标签 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff09;测试代码 4&#xff09;测试结果 3.分步查询 …