当前位置: 首页 > news >正文

51——DS1302

1. DS1302介绍

    ds1302是具有涓细电流充电能力的低功耗实时时钟芯片.

    外接32.768khz石英晶振。

    引脚定义:

    命令字:

    寄存器地址:

2. DS1302初始化

3. 指定寄存器写入一个字节

4. 读取一个寄存器的一个字节

5. 实时时钟时间写入与读取

main.c

#include <regx52.h>
#include "lcd1602.h"
#include "ds1302.h"
#include "key.h"
#include "timer0.h"

u8 key_value = 0;
u8 mode = 0;
u8 time_set_select = 0;
u8 TimeSetFlashFlag = 0;

void time_show(void)
{
ds1302_readtime();
//BCD码转十进制
LCD_ShowNum(1, 1, set_time->year, 2);     
LCD_ShowNum(1, 4, set_time->month, 2);     
LCD_ShowNum(1, 7, set_time->date, 2);     
LCD_ShowNum(2, 1, set_time->hour, 2);     
LCD_ShowNum(2, 4, set_time->minute, 2);     
LCD_ShowNum(2, 7, set_time->second, 2);     
LCD_ShowNum(1, 10, set_time->day, 2);    
}

void time_set(void)
{
//选择设置某个时间
if (key_value == button_select_time)
{
time_set_select ++;
time_set_select %= 7;
}
//时间加1
if (key_value == button_time_add)
{
switch (time_set_select)
{
case 0: set_time->year ++; break;
case 1: set_time->month ++; break;
case 2: set_time->date ++; break;
case 3: set_time->hour ++; break;
case 4: set_time->minute ++; break;
case 5: set_time->second ++; break;
case 6: set_time->day ++; break;
}
if (set_time->year > 99) {set_time->year = 0;}
if (set_time->month > 12) {set_time->month = 1;}

if (set_time->month == 1 || set_time->month == 3 || set_time->month == 5
|| set_time->month == 7 || set_time->month == 8 || set_time->month == 10
|| set_time->month == 12)
{
if (set_time->date > 31) {set_time->date = 1;}
}
else if (set_time->month == 4 || set_time->month == 6 || set_time->month == 9
|| set_time->month == 11)
{
if (set_time->date > 30) {set_time->date = 1;}
}
else if (set_time->month == 2)
{
//闰年
if (set_time->year % 4 == 0) {if (set_time->date > 29) {set_time->date = 1;}}
//平年
else {if (set_time->date > 28) {set_time->date = 1;}}
}
if (set_time->hour > 23) {set_time->hour = 0;}
if (set_time->minute > 59) {set_time->minute = 0;}
if (set_time->second > 59) {set_time->second = 0;}    
if (set_time->day > 7) {set_time->day = 0;}            
}
//时间减1
if (key_value == button_time_sub)
{
switch (time_set_select)
{
case 0: set_time->year --; break;
case 1: set_time->month --; break;
case 2: set_time->date --; break;
case 3: set_time->hour --; break;
case 4: set_time->minute --; break;
case 5: set_time->second --; break;
case 6: set_time->day --; break;            
}
if (set_time->year < 0) {set_time->year = 99;}
if (set_time->month < 1) {set_time->month = 12;}

if (set_time->month == 1 || set_time->month == 3 || set_time->month == 5
|| set_time->month == 7 || set_time->month == 8 || set_time->month == 10
|| set_time->month == 12)
{
if (set_time->date < 1) {set_time->date = 31;}
if (set_time->date > 31) {set_time->date = 1;}            
}
else if (set_time->month == 4 || set_time->month == 6 || set_time->month == 9
|| set_time->month == 11)
{
if (set_time->date < 1) {set_time->date = 30;}
if (set_time->date > 30) {set_time->date = 1;}            
}
else if (set_time->month == 2)
{
//闰年
if (set_time->year % 4 == 0) {if (set_time->date < 1) {set_time->date = 29;}
if (set_time->date > 29) {set_time->date = 1;}}    
//平年
else {if (set_time->date < 1) {set_time->date = 28;}
if (set_time->date > 28) {set_time->date = 1;}}
}
if (set_time->hour < 0) {set_time->hour = 23;}
if (set_time->minute < 0) {set_time->minute = 59;}
if (set_time->second < 0) {set_time->second = 59;}    
if (set_time->day < 0) {set_time->day = 7;}            
}    
if (time_set_select == 0 && TimeSetFlashFlag == 1) {LCD_ShowString(1, 1, "  ");}
else {LCD_ShowNum(1, 1, set_time->year, 2);}
if (time_set_select == 1 && TimeSetFlashFlag == 1) {LCD_ShowString(1, 4, "  ");}
else {LCD_ShowNum(1, 4, set_time->month, 2);}
if (time_set_select == 2 && TimeSetFlashFlag == 1) {LCD_ShowString(1, 7, "  ");}
else {LCD_ShowNum(1, 7, set_time->date, 2);}
if (time_set_select == 3 && TimeSetFlashFlag == 1) {LCD_ShowString(2, 1, "  ");}
else {LCD_ShowNum(2, 1, set_time->hour, 2);}
if (time_set_select == 4 && TimeSetFlashFlag == 1) {LCD_ShowString(2, 4, "  ");}
else {LCD_ShowNum(2, 4, set_time->minute, 2);}
if (time_set_select == 5 && TimeSetFlashFlag == 1) {LCD_ShowString(2, 7, "  ");}
else {LCD_ShowNum(2, 7, set_time->second, 2);}
if (time_set_select == 6 && TimeSetFlashFlag == 1) {LCD_ShowString(1, 10, "  ");}
else {LCD_ShowNum(1, 10, set_time->day, 2);}         
}
void main(void)
{
LCD_Init();
ds1302_init();
time_init();
timer0_init();

ds1302_settime(set_time);
LCD_ShowString(1, 1, "  -  -");
LCD_ShowString(2, 1, "  :  :");    
while (1)
{
key_value = key_scan();
switch (mode)
{
case 0: time_show();break;
case 1: time_set();break;
}
//选择模式->显示时间/设置时间
if (key_value == button_select_mode)
{
if (mode == 0) {mode = 1;}
else if (mode == 1) {mode = 0;ds1302_settime(set_time);}
}

    }
}

void timer0_routine(void)    interrupt 1
{
static u16 count = 0;

TH0 = 0xFC;
TL0 = 0x66;
count ++;
if (count >= 500)
{
count = 0;
TimeSetFlashFlag =! TimeSetFlashFlag;
}
}

    

http://www.dtcms.com/a/430686.html

相关文章:

  • 语校网500所里程碑:日本语言学校数据库的标准化与可追溯机制
  • wordpress 站长主题商城系统源码
  • docker快速使用yolov11
  • 鸿蒙NEXT SSAP连接与数据传输实战:轻松实现跨设备通信
  • 第10章 Docker
  • 【迭代】本地高性能c++对话系统e2e_voice
  • linux的进程和线程
  • 漏扫常见问题——口令类
  • 广州建设高端网站韶关手机网站建站
  • NetApp存储基本概念科普:物理层到逻辑层
  • 操作系统复习问题总结
  • 笔记(C++篇)—— Day 12(类的默认成员函数)
  • 牛客算法基础noob59 简写单词
  • CSS断点(Breakpoints)介绍(响应式设计中用于定义不同屏幕尺寸下应用不同样式的特定点)Tailwind断点
  • Flink SQL 查询 核心概念与实战指南
  • 建设网站的合同招远网站建设
  • 免费域名的网站有哪些可视化建网站
  • 【Linuxvs code】Xshell远程配置到VS Code环境配置指南
  • 微服务网关深度设计:从Spring Cloud Gateway到Envoy,流量治理与安全认证实战指南
  • 全新体验:利用Istio提升微服务安全与监控
  • Nuitka加快打包速度(ccache)全平台配置——持续更新中
  • 大数据毕业设计选题推荐-基于大数据的全球能源消耗量数据分析与可视化系统-大数据-Spark-Hadoop-Bigdata
  • 机械行业做网站猎头公司找的工作怎么样
  • 04_Numpy结构化数组
  • 深圳市龙华区价格优化网站建设
  • 博客标题:解密 IntelliJ IDEA 调试:当你的 List 不仅仅是 List
  • 12.如何使用 JavaScript 构建便签应用程序 | 入门项目
  • 第四届云计算、大数据应用与软件工程国际学术会议(CBASE 2025)
  • 全栈工程师项目练习记录
  • Vue CLI为何不显示webpack配置