蓝桥杯ds1302时分秒显示

Posted 一心向月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯ds1302时分秒显示相关的知识,希望对你有一定的参考价值。


这次我只让它显示时分秒,如果有需要显示年月日的,自行修改。
main.c文件

#include "stc15f2k60s2.h"
#include "ds1302.h"

typedef unsigned char u8;
typedef unsigned int u16;

u8 code duan[12]=0xc0,0xf9,0xa4,0xb0,0x99,0x92,
				  0x82,0xf8,0x80,0x90,0xff,0xbf;

extern unsigned char time[3];

void delay(u16 i)

	while(i--);


void Chan_hc573(chose)

	switch(chose)
	
		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;
	
	P2 = ( P2 & 0x1f ) | 0x00;


void Smg_display(u8 com,u8 dat)

	P0=0xff;
	Chan_hc573(7);
	P0=0x01<<com;
	Chan_hc573(6);
	P0=dat;
	Chan_hc573(7);


void Close_smg()

	P0=0x00;
	Chan_hc573(6);
	P0=0xff;
	Chan_hc573(7);


void Display_temp()

	Smg_display(0,duan[time[0]/16]); delay(500);
	Smg_display(1,duan[time[0]%16]); delay(500);
	Smg_display(2,duan[11]); delay(500);
	Smg_display(3,duan[time[1]/16]); delay(500);
	Smg_display(4,duan[time[1]%16]); delay(500);
	Smg_display(5,duan[11]); delay(500);
	Smg_display(6,duan[time[2]/16]); delay(500);
	Smg_display(7,duan[time[2]%16]); delay(500);
	Close_smg();


void Init_system()

	P0=0x00;
	Chan_hc573(5);
	P0=0xff;
	Chan_hc573(4);


void main()

	Init_system();
	wire_ds1302();
	while(1)
	
		read_ds1302();
		Display_temp();
	

ds1302.c文件

#include <reg52.h>
#include <intrins.h>
#include "ds1302.h"

sbit SCK=P1^7;		
sbit SDA=P2^3;		
sbit RST = P1^3; 	

unsigned  char time[3]=0x13,0x14,0x20;
unsigned  char wire_addr[3]=0x84,0x82,0x80;
unsigned  char read_addr[3]=0x85,0x83,0x81;

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 )     

 	RST=0;	_nop_();
 	SCK=0;	_nop_();
 	RST=1; 	_nop_();  
 	Write_Ds1302(address);	
 	Write_Ds1302(dat);		
 	RST=0; 


unsigned char Read_Ds1302_Byte ( unsigned char address )

 	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_();
	return (temp);			


void wire_ds1302()

	unsigned char i;
	for(i=0;i<3;i++)
	
		Write_Ds1302_Byte(wire_addr[i],time[i]);
	


void read_ds1302()

	unsigned char i;
	for(i=0;i<3;i++)
	
		time[i]=Read_Ds1302_Byte(read_addr[i]);
	

ds1302.h文件

#ifndef __DS1302_H
#define __DS1302_H

void wire_ds1302();
void read_ds1302();

#endif

以上是关于蓝桥杯ds1302时分秒显示的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯ds1302时分秒显示

如何读出DS1302里面的时钟数据?

蓝桥杯——根据手册写底层

蓝桥杯万能模板

蓝桥杯万能模板

蓝桥杯万能模板