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

目录

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仿真

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值