蓝桥杯单片机必备知识—–(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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • navicat premium mac激活码【2021最新】

    (navicat premium mac激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~70YZ…

    2022年3月26日
    167
  • SSH远程连接工具

    SSH远程连接工具摘自 https www cnblogs com ftl1012 p ssh htmlhttps www cnblogs com youngerger p 9104144 htmlSSH 是 Linux 下进行远程连接的基本工具 但是如果仅仅用它来登录那可是太浪费啦 SSH 命令可是完成远程操作的神器啊 借助它我们可以把很多的远程操作自动化掉 下面就

    2025年8月21日
    3
  • jQuery手机菜单

    效果展示 http://hovertree.com/texiao/nav/4/手机扫描二维码查看效果:源码下载 http://hovertree.com/h/bjaf/kroft6

    2021年12月27日
    42
  • Java8 stream 中利用 groupingBy 进行多字段分组求和

    Java8 stream 中利用 groupingBy 进行多字段分组求和Java8的groupingBy实现集合的分组,类似Mysql的groupby分组功能,注意得到的是一个map对集合按照单个属性分组、分组计数、排序List<String>items=Arrays.asList(“apple”,”apple”,”banana”,”apple”,”orange”,”ba…

    2022年8月20日
    80
  • Vuex中的mapGetters

    Vuex中的mapGettersmapGetters辅助函数仅仅是将store中的getter映射到局部计算属性语法是mapGetters([‘language’,’token‘])参数是个数组,数组里是你想要映射的getters里的值import{mapGetters}from’vuex’;computed:{//利用使用对象展开运算符将getter混入computed…

    2022年6月12日
    46
  • SSM-Spring(1)「建议收藏」

    SSM-Spring(1)「建议收藏」SpringSpring是一个开源的免费的框架Spring是一个轻量级的,非入侵式的框架控制反转(IOC),面向切面编程(AOP)支持事务的处理,对框架整合的支持IOC理论UserDaoUserDaoImpUserSeviceUserServiceImp在之前,用户的需求可能会影响原来的代码。使用一个set。public void setUserDao(UserDao userDao){ this.userDao = userDao;}之前是主动创建对象,控制

    2022年8月9日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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