STC单片机学习------DS1302时钟芯片
把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时钟芯片相关推荐
- 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》...
引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...
- 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》... 1
引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...
- 使用51单片机和DS1302时钟芯片做一个简易的电子时钟
简易的电子时钟实验 一.前言 二.DS1302模块介绍 三.驱动DS1302的代码 3.1 初始化DS1302时钟芯片 3.2 读取DS1302时钟芯片的时间 3.3 设置DS1302时钟芯片的时间 ...
- 用单片机用c语言做闹钟,基于单片机与ds1302时钟芯片的电子闹钟C程序
原标题:基于单片机与ds1302时钟芯片的电子闹钟C程序 #include #define w_second 0x80 //秒写入地址 #define w_minute 0x82 //分写入地址 #d ...
- 【蓝桥杯单片机】DS1302时钟芯片+DS18B20单总线温度传感器(官方驱动源码改写)
实验开发板为CT107D蓝桥官方板,编译环境为MDK5 采用蓝桥官方驱动改写 目录 一.DS1302时钟芯片 二.DS18B20温度传感器 一.DS1302时钟芯片 CE 复位脚 I/O 数据输入/输 ...
- 51单片机使用DS1302时钟芯片实现可调时钟
文章目录 1.实现方法 2.所需函数模块 3.时钟写入(读取)函数(`DS1302.c`) 4.定时器初始化函数(`Timer0Init.c`) 5.按键扫描函数(`Key.c`) 6.时钟调整函数( ...
- 基于AVR系列单片机,DS1302时钟芯片的具体用法
一.引脚连接 二.DS1302初始化 void ds1302_init(void) {Pin1设置为低电平: /*RST脚置低*/Pin2设置为低电平 /*SCK脚置低*/Pin1设置为输出 /*RS ...
- 【C51单片机学习笔记--DS1302时钟芯片蜂鸣器I2C总线AT24C02存储器】
C51单片机学习笔记–DS1302时钟芯片&&蜂鸣器&&I2C总线&&AT24C02存储器 文章目录 一.DS1302时钟芯片介绍 二.DS1302时钟 ...
- 蓝桥杯单片机DS1302时钟芯片驱动代码注释
蓝桥杯单片机DS1302时钟芯片驱动代码之前的疑惑注释了下 /* DS1302 芯片包含一个 实时时钟/日历和 31 字节的静态 RAM. 与时钟/RAM 通讯只需要三根线: CE,I/O (数据线) ...
最新文章
- php的反射作用是什么意思,php反射的作用是什么
- MySQL IN、Exist关联查询时,我们为什么建议小表驱动大表?
- ImageNet Classification with Deep Convolutional Nerual Networks(AlexNet)
- java 手机号码归属地_【原创】Java实现手机号码归属地查询
- OpenCV检测平面物体
- 【STM32】中断优先级管理
- java注解---@SuppressWarnings
- Educational Codeforces Round 80 (Rated for Div. 2) C. Two Arrays 组合数|dp
- vs升级c++项目遇到的一些问题
- 每个数据科学专家都应该知道的六个概率分布
- python writerow 返回值_python – .writerow()csv返回一个数字而不是写行
- 有图有真相——关于“视频专辑:零基础学习C语言 ”
- opencv生成灰度图并保存
- 不同加密算法的国际标准与国标
- 珍大户《认知世界的经济学》学习笔记 -- 第21课 利率的计算 更新时间2021年07月27日22:14:34
- 豆子特斯拉,豆箕宁德时代
- 【Node.js】论一个低配版Web实时通信库是如何实现的1( WebSocket篇)
- java ews appointment_EWS API 2.0读取日历信息-读取内容注意事项
- 我做程序员的那些日子
- 十大项目告诉你:室内定位将是重塑零售世界的下一场革命