蓝桥杯 单片机 DS1302和DS18B20

DS1302 时钟

时钟试题 常作为实验室考核内容

控制三个引脚

P17 时钟 P23输入 P13复位 其他已经配置好

寄存器原理

定位地址 0x80地址

固定格式 0x57 5*10+7*1 =57

小时写入格式 不同 首位区分 A上午 P下午

0为24小时制

1为12小时制 写入8小时 0x87 //1000 7 十二小时制 7*1=7 十二小时制 7点

使用方法

追踪地址

写入59秒 秒 地址 1000 0000 //0x80 传输数据 0x59 输入59秒

写入月份 月 地址 1000 1000//0x88 传输 0x99 输入9月

如下图 h为16进制后标 使用 0x80 = 80h

写入2进制

写入函数

复制代码
void Write_Ds1302(unsigned char temp)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
    SCK=0;//拉高数据得以传输进去
    SDA=temp&0x01;/*
                    1010 0000
                    0000 0001
                    兼并 都为1 传输 一0则0  不修改其他的地方
                                    */
    temp>>=1;//扫过这8位数据
    SCK=1;//关门

    }
}

数据写入

复制代码
void Write_Ds1302_Byte(unsigned char address,unsigned char dat) //地址写入 数据写入
{
    RST=0; _nop_();
    SCK=0; _nop_();
    RST=0; _nop_();
    Write_Ds1302(address);
    Write_Ds1302(dat);
    RST=0;
}

读取

复制代码
unsigned char Read_Ds1302_Byte (unsigned char address)
{
    unsigned char i,temp=0x00; //temp接受数据
    RST=0; _nop_();
    SCK=0; _nop_();
    RST=0; _nop_();
    Write_Ds1302(address);
    for(i=0;i<8;i++)
        {
            SCK=0;
            temp>>=1;
            if(SDA)
            temp|=0x80;
            SCK=1;    
/*
    temp 初始 0000 0000
    SDA       1010 1100
              |       《含义:若其中一个为0则变为1
*/
        }

 RST=0; _nop_();
 SCK=0; _nop_();
 RST=0; _nop_();
 SDA=0; _nop_();
 SDA=1; _nop_();
 return(temp);
}

void Set_Rtc(unsigned char* ucRtc) //写入
{
    unsigned char i;
    Write_Ds1302_Byte(0x80,0);
    for(i=0;i<3;i++)//写入时分秒
        Write_Ds1302_Byte(0x84-i*2,ucRtc[i]);
    /*
         Write_Ds1302_Byte(0x84,ucRtc[0]);时
         Write_Ds1302_Byte(0x82,ucRtc[1]);分
         Write_Ds1302_Byte(0x80,ucRtc[2]);秒
    
   */
    Write_Ds1302_Byte(0x8e,1);
}

void Read_Rtc(unsigned char* ucRtc)//读取
{
    unsigned char i;
    for(i=0;i<3;i++)
        ucRtc[i]=Read_Ds1302_Byte(0x85-i*2);

}

DS18B20模块

温度检测

高速暂存器

默认温度 85度

用户字节分别为 上限 和下限

配置寄存器

byte 2~4 读取字节

温度寄存器

输入

bit7---bit4 整数位 bit3---bit0 小数位

小数计算 后4位 1110 为8 因为这是小数位所以8的-1次方 为0.125

07D0h = 0000 0111 1101 0000

FFD0h = 1111 1111 1101 0000

前5位0为正 1为负

报警 TH TL

比较整数位

改变报警标志位 置回

配置寄存器

配置精度 置位 设置精度

使用方法

1.初始化

2.rom操作 只有这一个芯片

3.功能指令 读入序列号 定位

ROM指令

初始化

单总线拉高 拉高完毕 返回低平

时序问题

接受高平 拉低信号 释放 读取低电平变化 初始化成功 释放总线

复制代码
//总线延时函数
void Delay_OneWire(unsigned int t)
{
    t*=12; //原先1t *=12 则为t/12  若为12t则 有*=12 
    while(t--);
}

//DS18B20设备初始化
bit init_ds18b20(void)
{
    bit initflag=0;
    
    DQ=1;
    Delay_OneWire(12); //高
    DQ=0; 
    Delay_OneWire(80); //低
    DQ=1;
    Delay_OneWire(10); //释放
    initflag =DQ;
    Delay_OneWire(5);  //读取0初始化成功 
}

晶振与周期 写入时间判断

跟晶振有关

指令周期为1us

写入函数

拉低时序不同

复制代码
void Write_DS18B20(unsigned char dat)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        DQ=0;
        DQ= data&0x01; 
/*
    dat    0101 1101 &0x01 
    检测 若同为1则拉入 写入程序
*/
        Delay_OneWire(5);
        DQ=1;
        dat>>=1 ;
    }
        Delay_OneWrie(5);
}

读取时序

复制代码
//读取字节
unsigned char Read_DS18B20(void)
{
    unsigned char i;
    unsigned char dat;
    
    for(i=0;i<8;i++)
    {
        DQ=0;
        dat>>=1;
/*
    
*/
        DQ=1;
        if(DQ)
        {
            dat  |=0x80;
        }
        Delay_OneWire(5)
    }
    return dat;
}

函数总览

复制代码
//温度读取函数 
float rd_temperature(void)
{
    unsigned char low,high;     //返回高低八位
    
    init_ds18b20();    //初始化
    Write_DS18B20(0xcc);    //跳过ROM
    Write_DS18B20(0x44);    //进行温度转换
    
    init_ds18b20();    //初始化
    Write_DS18B20(0xcc);    //跳过ROM
    Write_DS18B20(0x44);    //读取温度

    low=Read_DS18B20();     //读取低
    high=Read_DS18B20();    //读取高

    return((high<<8)|low)/16.0; //精度换算 12位 
}

乘以精度

按顺序读取 从上向下

初始上电时 默认为85度

可以在执行前 进行定义

复制代码
void main()
{
	t=read_t();
	Delay750ms();
	System_Init();
	Timer0_Init();
	while (1)
	{
		Key_Proc();
		Seg_Proc();
		Led_Proc();
	}
}
相关推荐
不悔哥4 天前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
XiHongShi20164 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
深圳老胡4 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
女神下凡4 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
梅梅9664 天前
一款mipi转lvds的lcd调试(LT8912B)
单片机·计算机外设·电脑·显示器·pd芯片
开发笔记-阿牛4 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
CoderYanger4 天前
A.每日一题:835. 图像重叠
java·开发语言·程序人生·leetcode·面试·职场和发展·学习方法
CHENKONG_CK4 天前
破解制鞋打磨痛点:RFID赋能去毛刺工序自动化升级
网络·单片机·嵌入式硬件·网络协议·tcp/ip
三佛科技-187366133974 天前
128KB~512KB Flash车规级MCU选型指南(FT32A072 / FT32A103 系列)
单片机·嵌入式硬件
Brilliantwxx4 天前
【STM32】 SPI Flash 驱动开发实战:阻塞模式驱动 W25Q64(含工程代码)
开发语言·stm32·单片机·嵌入式硬件