把DS1302调试出来了,写个记录吧,下次用着时候省得再重新满大街的找资料。 芯片介绍就不写了,度娘一搜一大把,写几点笔记:

1、向寄存器写入数据前,要先关闭写保护,即向 0x8E 写入 0x00,开启写保护时候写入0x80;

2、DS1302 第5脚 RST脚,类似于一般芯片的CS脚,读写寄存器时候要将其拉高。一般的片子都是拉低,这里跟其他不一样;

3、接收或发送数据时候,低位在前,高位在后。感觉有点别扭;

4、设置时间,或读取时间时候,是BCD码,不是十六进制。比如,11时56分,读出时候就是0x11时,0x56分。

/* Includes ------------------------------------------------------------------*/
#include "STC_NEW_8051.h"
#include <stdio.h>
#include "mySTC.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/// 各寄存器的写命令。KEIL对中文支持不太好,原文注释这里原样表述一遍
#define SECOND_REG_WRITE    0x80
#define MINUTE_REG_WRITE    0x82
#define HOUR_REG_WRITE      0x84
#define DAY_REG_WRITE       0x86
#define MONTH_REG_WRITE     0x88
#define WEEK_REG_WRITE      0x8A
#define YEAR_REG_WRITE      0x8C// 各寄存器的读命令
#define SECOND_REG_READ     0x81
#define MINUTE_REG_READ     0x83
#define HOUR_REG_READ       0x85
#define DAY_REG_READ        0x87
#define MONTH_REG_READ      0x89
#define WEEK_REG_READ       0x8B
#define YEAR_REG_READ       0x8D// 三根线进行通讯,控制
sbit DS1302_SCK  = P1^0;
sbit DS1302_IO   = P1^1;
sbit DS1302_RST  = P2^0;// 向DS1302写入一个字节
void DS1302_WriteByte(u8 writeByte)
{u8 retry = 0;// DS1302 接收或发送数据时,低位在前,高位在后for(retry=0; retry!=8; ++retry){if(1 == (writeByte & 0x01)){DS1302_IO = 1;}else{DS1302_IO = 0;}// 参考了别人的例程,这里竟然不需要延时..好吧DS1302_SCK = 1;DS1302_SCK = 0;writeByte >>= 1;}
}// 从DS1302中读出一个字节
u8 DS1302_ReadByte(void)
{u8 retry = 0;u8 readByte = 0;// 最低位在前,高位在后。跟一般的通讯不太一样for(retry=0; retry!=8; ++retry){readByte >>= 1;if(DS1302_IO){readByte |= 0x80;}      DS1302_SCK = 1;        DS1302_SCK = 0;            }   return readByte;
}// 向某个寄存器写入一个字节数值
void DS1302_WriteReg(u8 addr, u8 value)
{DS1302_RST = 0;DS1302_SCK = 0;DS1302_RST = 1;DS1302_WriteByte(addr);DS1302_WriteByte(value);DS1302_SCK = 1;DS1302_RST = 0;
}// 读取某个寄存器的值
u8 DS1302_ReadReg(u8 addr)
{u8 readByte = 0;DS1302_RST = 0;DS1302_SCK = 0;DS1302_RST = 1;DS1302_WriteByte(addr);readByte = DS1302_ReadByte();DS1302_SCK = 1;DS1302_RST = 0;return readByte;
}// DS1302的初始化
void DS1302_Init(void)
{// 先关闭写保护DS1302_WriteReg(0x8E, 0x00);// 设置时间,秒、分、时等等,注意噢,写入的是BCD码DS1302_WriteReg(SECOND_REG_WRITE, 0);    DS1302_WriteReg(MINUTE_REG_WRITE, 0x20);DS1302_WriteReg(HOUR_REG_WRITE, 0x17);DS1302_WriteReg(DAY_REG_WRITE, 0x52);DS1302_WriteReg(MONTH_REG_WRITE, 0x12);DS1302_WriteReg(YEAR_REG_WRITE, 0x13);DS1302_WriteReg(WEEK_REG_WRITE, 0x04);// 一些设置后,继续开户写保护DS1302_WriteReg(0x90, 0x01);DS1302_WriteReg(0xC0, 0xF0);DS1302_WriteReg(0x8E, 0x80);
}// 读时间,然后在八段数码管上显示出来
void DS1302_Test(void)
{u8 hour, min, sec;hour = DS1302_ReadReg(HOUR_REG_READ);// BCD码转换成十六进制hour = (hour/16)*10 + (hour%16);min = DS1302_ReadReg(MINUTE_REG_READ);    min = (min/16)*10 + (min%16);sec = DS1302_ReadReg(SECOND_REG_READ);  sec = (sec/16)*10 + (sec%16);LedSegmentDisplay(7, hour/10);DelayTime(2);LedSegmentDisplay(6, hour%10);DelayTime(2);// 显示个横线,下同LedSegmentDisplayRaw(5, 0x40);DelayTime(2);LedSegmentDisplay(4, min/10);DelayTime(2);LedSegmentDisplay(3, min%10);DelayTime(2);LedSegmentDisplayRaw(2, 0x40);DelayTime(2);LedSegmentDisplay(1, sec/10);DelayTime(2);LedSegmentDisplay(0, sec%10);DelayTime(1);
}

STC单片机学习------DS1302时钟芯片相关推荐

  1. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》...

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

  2. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》... 1

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

  3. 使用51单片机和DS1302时钟芯片做一个简易的电子时钟

    简易的电子时钟实验 一.前言 二.DS1302模块介绍 三.驱动DS1302的代码 3.1 初始化DS1302时钟芯片 3.2 读取DS1302时钟芯片的时间 3.3 设置DS1302时钟芯片的时间 ...

  4. 用单片机用c语言做闹钟,基于单片机与ds1302时钟芯片的电子闹钟C程序

    原标题:基于单片机与ds1302时钟芯片的电子闹钟C程序 #include #define w_second 0x80 //秒写入地址 #define w_minute 0x82 //分写入地址 #d ...

  5. 【蓝桥杯单片机】DS1302时钟芯片+DS18B20单总线温度传感器(官方驱动源码改写)

    实验开发板为CT107D蓝桥官方板,编译环境为MDK5 采用蓝桥官方驱动改写 目录 一.DS1302时钟芯片 二.DS18B20温度传感器 一.DS1302时钟芯片 CE 复位脚 I/O 数据输入/输 ...

  6. 51单片机使用DS1302时钟芯片实现可调时钟

    文章目录 1.实现方法 2.所需函数模块 3.时钟写入(读取)函数(`DS1302.c`) 4.定时器初始化函数(`Timer0Init.c`) 5.按键扫描函数(`Key.c`) 6.时钟调整函数( ...

  7. 基于AVR系列单片机,DS1302时钟芯片的具体用法

    一.引脚连接 二.DS1302初始化 void ds1302_init(void) {Pin1设置为低电平: /*RST脚置低*/Pin2设置为低电平 /*SCK脚置低*/Pin1设置为输出 /*RS ...

  8. 【C51单片机学习笔记--DS1302时钟芯片蜂鸣器I2C总线AT24C02存储器】

    C51单片机学习笔记–DS1302时钟芯片&&蜂鸣器&&I2C总线&&AT24C02存储器 文章目录 一.DS1302时钟芯片介绍 二.DS1302时钟 ...

  9. 蓝桥杯单片机DS1302时钟芯片驱动代码注释

    蓝桥杯单片机DS1302时钟芯片驱动代码之前的疑惑注释了下 /* DS1302 芯片包含一个 实时时钟/日历和 31 字节的静态 RAM. 与时钟/RAM 通讯只需要三根线: CE,I/O (数据线) ...

最新文章

  1. php的反射作用是什么意思,php反射的作用是什么
  2. MySQL IN、Exist关联查询时,我们为什么建议小表驱动大表?
  3. ImageNet Classification with Deep Convolutional Nerual Networks(AlexNet)
  4. java 手机号码归属地_【原创】Java实现手机号码归属地查询
  5. OpenCV检测平面物体
  6. 【STM32】中断优先级管理
  7. java注解---@SuppressWarnings
  8. Educational Codeforces Round 80 (Rated for Div. 2) C. Two Arrays 组合数|dp
  9. vs升级c++项目遇到的一些问题
  10. 每个数据科学专家都应该知道的六个概率分布
  11. python writerow 返回值_python – .writerow()csv返回一个数字而不是写行
  12. 有图有真相——关于“视频专辑:零基础学习C语言 ”
  13. opencv生成灰度图并保存
  14. 不同加密算法的国际标准与国标
  15. 珍大户《认知世界的经济学》学习笔记 -- 第21课 利率的计算 更新时间2021年07月27日22:14:34
  16. 豆子特斯拉,豆箕宁德时代
  17. 【Node.js】论一个低配版Web实时通信库是如何实现的1( WebSocket篇)
  18. java ews appointment_EWS API 2.0读取日历信息-读取内容注意事项
  19. 我做程序员的那些日子
  20. 十大项目告诉你:室内定位将是重塑零售世界的下一场革命

热门文章

  1. Wind River Workbench 3.x VxWorks项目类型
  2. bin文件和hex文件互转
  3. 【总结】访问一个网页的全过程
  4. Nordic SDK14.2 S332 multiprotocol例程iphone不能连接问题2种解决方案
  5. 几何代数(Geometric Algebra 也叫克利福德代数 Clifford Algebra)简介
  6. 基于大数据的房价分析
  7. 软件工程-大学体育馆管理系统用例图
  8. Go语言开发环境安装
  9. mysql常用 的数据库引擎
  10. Polygon zkEVM zkROM代码解析(2)