蓝桥杯单片机DS1302实时时间设计(时间暂停、启动设置)

蓝桥杯单片机DS1302实时时间设计(时间暂停、启动设置)

蓝桥杯单片机DS1302时间设计,这也是蓝桥杯中常考的一个模块。对于DS1302的操作也是非常简单的,只需要简单记住控制写入以及读出的地址位便可,其余都是在调用官方提供的底层驱动代码,只要会调用就能够轻松编写出一个实时时钟了。

设计时钟的暂停以及暂停之后启动,使用按键S4进行控制,还有就是使用按键S5进行控制日期的显示。

# include "reg52.h"
# include "ds1302.h" // 官方提供的底层驱动代码
typedef unsigned int u16;
typedef unsigned char u8;
// 秒 分 时 日 月 周 年(最后两位)
u8 code DS1302_read[7] = {
0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};		 // Ds1302读取数据的地址位
u8 code DS1302_write[7] = {
0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
// 20-10-10-23-59-50(2020-10-10 23:59:50) 
u8 timer[7] = {
0x50,0x59,0x23,0x10,0x10,0x06,0x20};
u8 shuma[12] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xbf};
sbit S4 = P3^3;
sbit S5 = P3^2;
u8 stop = 0;
u8 temp;		// 用于保存暂停之前的秒钟的数值,点击启动的时候重新写入到秒钟的寄存器中即可
// 实现功能:按键控制,按下按键S4,暂停时钟计算(开始);按下S5显示日期,放开继续显示时钟;
// 主要考点:最后一位控制写的位数,低电位才能够写入,高电位写入保护,禁止写入内容;秒钟的第一位控制暂停的位置,高电位暂停;
// 外设初始化
void init_system()
{

P2 = (P2 & 0x1f) | 0x80;
P0 = 0xff;
P2 = (P2 & 0x1f);
P2 = (P2 & 0x1f) | 0xa0;
P0 = 0x00;
P2 = (P2 & 0x1f);
P2 = (P2 & 0x1f) | 0xc0;
P0 = 0x00;
P2 = (P2 & 0x1f);
}
// 导通函数
void select(u8 local)
{

switch(local)
{

case(4): P2 = (P2 & 0x1f) | 0x80; break;
case(5): P2 = (P2 & 0x1f) | 0xa0; break;
case(6): P2 = (P2 & 0x1f) | 0xc0; break;
case(7): P2 = (P2 & 0x1f) | 0xe0; break;
}
}
// 简单延时函数
void delay()
{

u8 t;
t = 200;
while(t--);
}
// 数码管点亮函数,点亮单个数码管
void display(u8 local, u8 num)
{

select(6);
P0 = 0x80 >> (local - 1);
P2 = P2 & 0x1f;
select(7);
P0 = num;
P2 = P2 & 0x1f;
// 简单延时
delay();
// 消隐 (为了不要让最后一个数码管特别亮,其余的特别暗)
select(6);
P0 = 0x00;
P2 = P2 & 0x1f;
}
// DS1302芯片的初始化,写入初始时间
void ds1302_init()
{

u8 i;
Write_Ds1302_Byte(0x8e,0x00);		  // 打开写入保护位,不打开无法写入数据
for(i = 0; i < 7; i++)
{

Write_Ds1302_Byte(DS1302_write[i],timer[i]);     // 分别写入初始化时间到对应的寄存器中
}
Write_Ds1302_Byte(0x8e,0x80);		  // 关闭写入保护位,防止数据被恶意修改
}
// DS1302芯片的时间读取
void ds1302_reader()
{

u8 i;
for(i = 0; i < 7; i++)
{

timer[i] = Read_Ds1302_Byte(DS1302_read[i]);
}
}
// 数码管显示的内容
void shuma_display(u8 i,u8 j,u8 k)
{

display(3,shuma[10]);
display(6,shuma[10]);
display(1,shuma[i%16]);
display(2,shuma[i/16]);
display(4,shuma[j%16]);
display(5,shuma[j/16]);
display(7,shuma[k%16]);
display(8,shuma[k/16]);
}
void scan()
{

if(S4 == 0)
{

delay();
if(S4 == 0 && stop == 0)			 // 启动暂停的控制位
{

temp = Read_Ds1302_Byte(DS1302_read[0]);
Write_Ds1302_Byte( 0x8e,0x00);
Write_Ds1302_Byte( DS1302_write[0],0x00);
Write_Ds1302_Byte( 0x8e,0x80);
stop = 1;
}
if(S4 == 0 && stop == 1)
{

Write_Ds1302_Byte( 0x8e,0x00);
Write_Ds1302_Byte( DS1302_write[0],temp);
Write_Ds1302_Byte( 0x8e,0x80);
stop = 0;
}
while(!S4){
shuma_display(timer[0],timer[1],timer[2]);}
}
if(S5 == 0)								// 显示日期
{

delay();
if(S5 == 0)
{

shuma_display(timer[3],timer[4],timer[6]);
while(!S5){
shuma_display(timer[3],timer[4],timer[6]);}
}
}
}
void main()
{

init_system();
ds1302_init(); //写入数据到芯片中
while(1)
{

ds1302_reader(); // 读取数据
scan();
if(stop == 0)
{

shuma_display(timer[0],timer[1],timer[2]);
}
if(stop == 1)
{

shuma_display(temp,timer[1],timer[2]);
}
// 这里的暂停之后启动还存在一定的小问题,欢迎给出建议修改
}
}

具体思路:使用一个判断位来判断当前时钟是暂停状态还是启动状态,按下暂停之后保存当前的时间,同时把秒钟寄存器的最高位置为1,;在下一次启动的时候,把暂停前保存的时间重新写入到时钟寄存器中。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115105.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • centos6.5防火墙关闭命令(cmd关闭防火墙)

    cmd命令关闭防火墙netstopmpssvc CentOS6关闭防火墙使用以下命令,//临时关闭serviceiptablesstop//禁止开机启动chkconfigiptablesoffCentOS7中若使用同样的命令会报错,stop iptables.serviceFailedtostopiptables.service:Unitipt…

  • 网络虚拟化和SDN

    1、什么是虚拟化2、服务器虚拟化3、网络虚拟化4、云计算跟网络虚拟化的结合5、SDN在网络虚拟化和云计算中的作用一、什么是虚拟化虚拟化技术,就是将一个物理实体,通过一些复用的技术,克隆出多个虚拟的等价物,这些虚拟的等价物依附于物理的实体之上,共享物理实体的各种资源。类似于进程与线程的关系,在一个进程内可以fork出多个线程,所有线程共享进程的内存资源。提到虚拟化技术,现在通常是指服…

  • linux发邮件失败,Linux SendMail发送邮件失败诊断案例,sendmail发送邮件

    linux发邮件失败,Linux SendMail发送邮件失败诊断案例,sendmail发送邮件LinuxSendMail发送邮件失败诊断案例,sendmail发送邮件Linux上Sendmail经常由于一些配置问题,导致邮件发送失败,下面整理、收集了一些邮件发送失败、异常的案例。案例1:在新服务器上测试sendmail发送邮件时,发现邮件发送不成功,检查/var/log/maillog日志文件发现如下错误(Notice:hostname、邮箱地址等信息使用xxx代替)tail/var/…

    2022年10月20日
  • Android CompoundButton[通俗易懂]

    Android CompoundButton[通俗易懂]为什么80%的码农都做不了架构师?>>>…

  • Django的HttpRequest[通俗易懂]

    Django的HttpRequest[通俗易懂]HttpReqeust对象服务器接收到http协议的请求后,会根据报文创建HttpRequest对象,这个对象不需要我们创建,直接使用服务器构造好的对象就可以。视图的第一个参数必须是HttpRequest对象,在django.http模块中定义了HttpRequest对象的API。属性下面除非特别说明,属性都是只读的。path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。…

  • Java 数组转list_string数组转list

    Java 数组转list_string数组转listava中数组转list使用Arrays.asList(T…a)方法。示例:publicclassApp{publicstaticvoidmain(String[]args){List&lt;String&gt;stringA=Arrays.asList("hello","world","A");String[]stringArray={"h…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号