蓝桥杯单片机必备知识—–(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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CSS画猪

    效果查看:http://hovertree.com/texiao/css3/6/CSS3画猪头:http://hovertree.com/texiao/css3/6/1/代码如下:转自:htt

    2021年12月22日
    44
  • delphi vcl_delphi数据类型

    delphi vcl_delphi数据类型[+]窗体和应用程序类表示Form和Application对象,这些类是从TComponent派生而来,它们实际也是组件,单独地把它列举出来,以示与拖到窗体上的控件加以区别。1、TApplication类TApplication类封装了Windows程序的基本操作。TApplication所担负的任务有:管理图标、提供快捷帮助和基本消息处理。每个Delphi应用程序都

    2022年9月24日
    4
  • php 监听端口数据客户端ip_PHP获取客户端和服务器端IP[通俗易懂]

    客户端的ip变量:$_SERVER[‘REMOTE_ADDR’]:客户端IP,也有可能是代理IP$_SERVER[‘HTTP_CLIENT_IP’]:代理端的IP,可能存在,也可能伪造$_SERVER[‘HTTP_X_FORWARD_FOR’]:用户在哪个ip上使用的id,可能存在,也可能伪造服务端的ip变量:$_SERVER[‘SERVER_NAME’]:需要使用函数gethostname…

    2022年4月17日
    54
  • file_get_contents(“php://input”)的使用方法

    file_get_contents(“php://input”)的使用方法

    2021年10月11日
    104
  • JavaScript下载本地文件

    JavaScript下载本地文件网上很多关于JS下载文件操作的代码,都过于繁杂,偶然找到这个方法,务必记录一下,太简单实用了/Template/MaterielDictionary.xlsx为文件相对路径,后边参数可不动。window.open(‘/Template/MaterielDictionary.xlsx’,’newwindow’,’height=100,width=400,top=0

    2022年6月10日
    173
  • js中join方法

    js中join方法js中的join方法join方法用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的。大白话:join方法可以用符不同的分隔符来构建这个字串。join方法值接受一个参数,即用作分隔符的字符串,然后返回所有数组项的字符串。vararr=["red","yellow","blue"];vararray=[];下面开始调用join方法1a…

    2022年4月29日
    82

发表回复

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

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