蓝桥杯单片机必备知识—–(10)DS1302时钟

蓝桥杯单片机必备知识—–(10)DS1302时钟

蓝桥杯单片机必备知识—–(10)DS1302时钟

DS1302:

在这里插入图片描述

写保护:

在这里插入图片描述

ds1302芯片:

在这里插入图片描述

ds1302.h添加代码

void ds1302_write();
void ds1302_read();

ds1302.c

#include <reg52.h>
#include <intrins.h>
sbit SCK=P1^7;		
sbit SDA=P2^3;		
sbit RST = P1^3;   // DS1302复位 
void Write_Ds1302(unsigned  char temp) 
{

unsigned char i;
for (i=0;i<8;i++)     	
{
 
SCK=0;
SDA=temp&0x01;
temp>>=1; 
SCK=1;
}
}   
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{

//需增加
unsigned char num;
RST=0;	_nop_();
SCK=0;	_nop_();
RST=1; 	_nop_();  
Write_Ds1302(address);	
//需增加
num=(dat/10<<4)|(dat%10);
//替换为num
Write_Ds1302(num);
//Write_Ds1302(dat); 
RST=0; 
}
unsigned char Read_Ds1302_Byte ( unsigned char address )
{

//需增加
unsigned char dat_low,dat_high;
unsigned char i,temp=0x00;
RST=0;	_nop_();
SCK=0;	_nop_();
RST=1;	_nop_();
Write_Ds1302(address);
for (i=0;i<8;i++) 	
{
		
SCK=0;
temp>>=1;	
if(SDA)
temp|=0x80;	
SCK=1;
} 
RST=0;	_nop_();
SCK=0;	_nop_();
SCK=1;	_nop_();
SDA=0;	_nop_();
SDA=1;	_nop_();
//需增加
/*以下是进制转化*/
dat_high=temp/16;
dat_low=temp%16;
temp=dat_high*10+dat_low;	
/*以上是进制转化*/
return (temp);			
}
/***************以下都是需要自己写的*******************************/
unsigned int code shijian[]={
50,59,23,0,0,0,0};//ds1302赋值为23:59:50
unsigned int time[7];//用于存放1302读取来的值
//1302读
//不做注释,比赛强行记忆
void ds1302_read()
{

unsigned int i;
unsigned char add;
add=0x81;
Write_Ds1302_Byte(0x8e,0x00);	//写保护关
for(i=0;i<7;i++)
{

time[i]=Read_Ds1302_Byte(add);
add=add+2;
}
Write_Ds1302_Byte(0x8e,0x80);	//写保护开
}
//1302写
//不做注释,比赛强行记忆
void ds1302_write()
{

unsigned int i;
unsigned char add;
add=0x80;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<7;i++)
{

Write_Ds1302_Byte(add,shijian[i]);
add=add+2;
}
Write_Ds1302_Byte(0x8e,0x80);
}

主函数中添加

extern time[]; //标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义

extern time[];//标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义

测试结果:

在这里插入图片描述

整个代码粘贴

ds1302.h

#ifndef __DS1302_H
#define __DS1302_H
void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
void ds1302_write();
void ds1302_read();
#endif

ds1302.c

#include <reg52.h>
#include <intrins.h>
sbit SCK=P1^7;		
sbit SDA=P2^3;		
sbit RST = P1^3;   // DS1302复位 
void Write_Ds1302(unsigned  char temp) 
{

unsigned char i;
for (i=0;i<8;i++)     	
{
 
SCK=0;
SDA=temp&0x01;
temp>>=1; 
SCK=1;
}
}   
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{

//需增加
unsigned char num;
RST=0;	_nop_();
SCK=0;	_nop_();
RST=1; 	_nop_();  
Write_Ds1302(address);	
//需增加
num=(dat/10<<4)|(dat%10);
//替换为num
Write_Ds1302(num);
//Write_Ds1302(dat); 
RST=0; 
}
unsigned char Read_Ds1302_Byte ( unsigned char address )
{

//需增加
unsigned char dat_low,dat_high;
unsigned char i,temp=0x00;
RST=0;	_nop_();
SCK=0;	_nop_();
RST=1;	_nop_();
Write_Ds1302(address);
for (i=0;i<8;i++) 	
{
		
SCK=0;
temp>>=1;	
if(SDA)
temp|=0x80;	
SCK=1;
} 
RST=0;	_nop_();
SCK=0;	_nop_();
SCK=1;	_nop_();
SDA=0;	_nop_();
SDA=1;	_nop_();
//需增加
/*以下是进制转化*/
dat_high=temp/16;
dat_low=temp%16;
temp=dat_high*10+dat_low;	
/*以上是进制转化*/
return (temp);			
}
/***************以下都是需要自己写的*******************************/
unsigned int code shijian[]={
50,59,23,0,0,0,0};//ds1302赋值为23:59:50
unsigned int time[7];//用于存放1302读取来的值
//1302读
//不做注释,比赛强行记忆
void ds1302_read()
{

unsigned int i;
unsigned char add;
add=0x81;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<7;i++)
{

time[i]=Read_Ds1302_Byte(add);
add=add+2;
}
Write_Ds1302_Byte(0x8e,0x80);
}
//1302写
//不做注释,比赛强行记忆
void ds1302_write()
{

unsigned int i;
unsigned char add;
add=0x80;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<7;i++)
{

Write_Ds1302_Byte(add,shijian[i]);
add=add+2;
}
Write_Ds1302_Byte(0x8e,0x80);
}

main.c

#include <stc15f2k60s2.h>
#include "ds1302.h"
#define uchar unsigned char
#define uint unsigned int
uchar tab[] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff,0xbf};
uchar dspbuf[] = {
10,10,10,10,10,10,10,10};
extern time[];
void display();
void load();
void cls()
{

P2 = (P2 & 0x1f) | 0x80;
P0 = 0xff;
P2 = 0x1f;
P2 = (P2 & 0x1f) | 0xa0;
P0 = 0x00;
P2 = 0x1f;
}
void main()
{

cls();
AUXR = 0xc0;
TMOD = 0x00;
TL0 = 0xcd;
TH0 = 0xd4;
TR0 = 1;
ET0 = 1;
EA = 1;
ds1302_write();
while(1)
{

ds1302_read();
}
}
void time0() interrupt 1
{

display();
}
void load()
{

dspbuf[0] = time[2]/10;
dspbuf[1] = time[2]%10;
dspbuf[2] = 11;
dspbuf[3] = time[1]/10;
dspbuf[4] = time[1]%10;
dspbuf[5] = 11;
dspbuf[6] = time[0]/10;
dspbuf[7] = time[0]%10;
}
void display()
{

static unsigned char dspcom = 0;
load();
P2 = (P2 & 0x1f) | 0xe0;
P0 = 0xff;
P2 = 0x1f;
P2 = (P2 & 0x1f) | 0xc0;
P0 = 1 << dspcom;
P2 = 0x1f;
P2 = (P2 & 0x1f) | 0xe0;
P0 = tab[dspbuf[dspcom]];
P2 = 0x1f;
if(++dspcom == 8) dspcom = 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

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

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

(0)
blank

相关推荐

  • 【JavaScript】获取当前页的URL与window.location.href

    【JavaScript】获取当前页的URL与window.location.href

    2021年10月28日
  • 数据挖掘算法与现实生活中的应用案例[通俗易懂]

    数据挖掘算法与现实生活中的应用案例[通俗易懂]如何分辨出垃圾邮件”、“如何判断一笔交易是否属于欺诈”、“如何判断红酒的品质和档次”、“扫描王是如何做到文字识别的”、“如何判断佚名的著作是否出自某位名家之手”、“如何判断一个细胞是否属于肿瘤细胞”等等,这些问题似乎都很专业,都不太好回答。但是,如果了解一点点数据挖掘的知识,你,或许会有柳暗花明的感觉。本文,主要想简单介绍下数据挖掘中的算法,以及它包含的类型。然后,通过现实中触手可及的、活生生的案例

  • uat环境停不了数据库「建议收藏」

    uat环境停不了数据库「建议收藏」uat环境使用shutdownimmediate关闭数据库时,无响应,于是查alert日志,看到如下错误:bash-3.2$tail-200falert_UAT.logSunJul1422:14:18201…

  • ActiveMQ入门系列之应用:Springboot+ActiveMQ+JavaMail实现异步邮件发送「建议收藏」

    我们都买过火车票,买完后会有邮件提醒,有时候邮件并不是买完票立马就能收到邮件通知,这个就用到了异步邮件发送。这篇文章介绍了怎么实现异步邮件发送

  • java常用的三种注释方式

    java常用的三种注释方式1.在java中,有三种常用的标记注释方式,最常用的是单行注释,‘//’它由两条斜杆组成记住是斜杆而不是反斜杠(\),注释是用来给代码注释说明,会存放一些方便理解代码涵义的说明2.如果需要写长篇内容注释且可用多行注释‘/**/’,因为单行注释已经不够满足需求了,在多行注释里面记录比较长的一段注释内容3.最后一种注释是文档注释/***/,功能比较强大,可以生成注释文档(关于文档注释这里先有个概念),java有自带文档注释工具在JDK安装路径下的bin目录下的javadoc.exe4….

  • Tomcat8zip版本安装与配置[通俗易懂]

    Tomcat8zip版本安装与配置[通俗易懂]Tomcat8zip版本安装配置哈哈哈,又到了紧张刺激的每日必答:在开始之前呢,小Du来来带大家了解几个问题,希望能够在面试中,小Du的解答给你帮助。老样子,话不多说直接上图1.什么Tomcat:答:简单总结下,tomcat是一个中间件,在B/S架构中,浏览器发出的http请求经过tpmcat中间件,转发到最终的目的服务器上,响应消息再通过tomcat返回给浏览器。tomcat所做的事情主要有:开启监听端口监听用户的请求,解析用户发来的http请求然后访问到你指定的应用系统,然后你返回的页面经过t

发表回复

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

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