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的特点
-
DS18B20的引脚图
(1)DS18B20的DQ端为什么接上拉电阻
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)报警操作信号
(3)配置寄存器
1.1.3 DS18B20的指令
1.1.4 总线时序协议
- 初始化
(1)在初始化序列期间,单片机总线控制器拉低总线并保持480us以发出(TX)一个复位脉冲信号,然后释放总线,进入接 收状态(RX)。当总线被释放后,5kΩ的上拉电阻将总线拉到高电平。当DS18B20检测到IO引脚上的上升沿后,等待15-60us,然后发出一个由60-240us低电平信号构成的存在脉冲
- 读时序(低位在前)
(1)当总线控制把数据线从高电平拉低到低电平时,读时序开始,数据线必须至少保持1us,然后总线被释放。 在总线控制器发出读时序后,DS18B20通过拉高或拉低总线上来传输1或0。当传输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能够在15us到45us之间正确地采样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();
}
}