【蓝桥杯10】——DS1302时钟

在这里插入图片描述

在这里插入图片描述

使用DS1302编写时钟程序

主程序使用IO扩展方式

#include <STC15F2K60S2.H>
#include <ds1302.h>
#include <absacc.h>
void DS1302_Config();
void Read_DS1302_Timer();
void show(unsigned char w,unsigned char n);
void show_Timer();
void show_Calnedar();
void delay_ms(int n);
void selectHC(unsigned char n);

unsigned char table[]={
    
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0xbf为数码管显示 ——
unsigned char Write_DS1302_adrr[7]={
    
    0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char Read_DS1302_adrr[7]={
    
    0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigned char Timer[7]={
    
    0x24,0x59,0x23,0x19,0x02,0x05,0x21};
                      //24秒 59分 23时 19日 2月  周五 21年
void main()
{
    
    
	selectHC(4); P0=0xff; P2&=0X1F;
	selectHC(5); P0=0x00; P2&=0X1F;
	DS1302_Config();
	while(1)
	{
    
    
		Read_DS1302_Timer();			
		show_Timer();
		//show_Calnedar();
  }
}

//初始化
void DS1302_Config()
{
    
    
	unsigned char i;
	Write_Ds1302( 0x8e,0x00);
	for(i=0;i<7;i++)
	{
    
    
		Write_Ds1302( Write_DS1302_adrr[i],Timer[i]);
  }
	Write_Ds1302( 0x8e,0x80);
}

//读取当前时间
void Read_DS1302_Timer()
{
    
    
	unsigned char j;
	for(j=0;j<7;j++)
	{
    
    
		Timer[j]=Read_Ds1302 (Read_DS1302_adrr[j]);
  }
}

//时间显示函数
void show_Timer()
{
    
    
		show(7,Timer[0]%16);	//显示秒
		show(6,Timer[0]/16);
		
		show(5,10);//显示——
		
		show(4,Timer[1]%16);	//显示分
		show(3,Timer[1]/16);
		
		show(2,10);//显示——
		
		show(1,Timer[2]%16); //显示时
		show(0,Timer[2]/16);
		
}

//日历显示函数
void show_Calnedar()
{
    
    
		show(7,Timer[3]%16);	//显示日
		show(6,Timer[3]/16);
		
		show(5,10);//显示——
		
		show(4,Timer[4]%16);	//显示月
		show(3,Timer[4]/16);
		
		show(2,10);//显示——
		
		show(1,Timer[6]%16); //显示年
		show(0,Timer[6]/16);
}

//寄存器选择
void selectHC(unsigned char n)
{
    
    
	switch(n)
	{
    
    
		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;
	}
}

//第w个数码管显示n
void show(unsigned char w,unsigned char n)
{
    
    
	selectHC(6);
	P0=0X01<<w;
	selectHC(7);
	P0=table[n];
	delay_ms(5);
	P0=0xff;
	P2&=0x1f;
}

//延时函数
void delay_ms(int n)
{
    
    
	int i,j;
	for(i=n;i>0;i--)
		for(j=110;j>0;j--);
}

底层驱动代码

/*
  程序说明: DS1302驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台 8051,12MHz
  日    期: 2011-8-9
*/

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

sbit SCK=P1^7;		
sbit SDA=P2^3;		
sbit RST = P1^3;   // DS1302复位												

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

void Write_Ds1302( unsigned char address,unsigned char dat )     
{
    
    
 	RST=0;
	_nop_();
 	SCK=0;
	_nop_();
 	RST=1;	
   	_nop_();  
 	Write_Ds1302_Byte(address);	
 	Write_Ds1302_Byte(dat);		
 	RST=0; 
}

unsigned char Read_Ds1302 ( unsigned char address )
{
    
    
 	unsigned char i,temp=0x00;
 	RST=0;
	_nop_();
 	SCK=0;
	_nop_();
 	RST=1;
	_nop_();
 	Write_Ds1302_Byte(address);
 	for (i=0;i<8;i++) 	
 	{
    
    		
		SCK=0;
		temp>>=1;	
 		if(SDA)
 		temp|=0x80;	
 		SCK=1;
	} 
 	RST=0;
	_nop_();
 	RST=0;
	SCK=0;
	_nop_();
	SCK=1;
	_nop_();
	SDA=0;
	_nop_();
	SDA=1;
	_nop_();
	return (temp);			
}
#ifndef __DS1302_H
#define __DS1302_H

void Write_Ds1302_Byte(unsigned  char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );

#endif

主程序使用寄存器扩展方式

#include <STC15F2K60S2.H>
#include <ds1302.h>
#include <absacc.h>
void DS1302_Config();
void Read_DS1302_Timer();
void show(unsigned char w,unsigned char n);
void show_Timer();
void show_Calnedar();

unsigned char table[]={
    
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0xbf为数码管显示 ——
unsigned char Write_DS1302_adrr[7]={
    
    0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char Read_DS1302_adrr[7]={
    
    0x81,0x85,0x85,0x87,0x89,0x8b,0x8d};

//2020年4月18日,周六,23点59分24秒
unsigned char Timer[7]={
    
    0x24,0x59,0x23,0x19,0x02,0x05,0x21};
                      //24秒 59分 23时 19日 2月  周五 21年

sbit s7=P3^0;//切换日历/时间显示
int flag=0;  //0显示时间 1显示日历
void main()
{
    
    
	DS1302_Config();
	while(1)
	{
    
    
		Read_DS1302_Timer();			
		show_Timer();
		//show_Calnedar();
  }
}

//初始化
void DS1302_Config()
{
    
    
	unsigned char i;
	Write_Ds1302( 0x8e,0x00);
	for(i=0;i<7;i++)
	{
    
    
		Write_Ds1302( Write_DS1302_adrr[i],Timer[i]);
  }
	Write_Ds1302( 0x8e,0x80);
}

//读取当前时间
void Read_DS1302_Timer()
{
    
    
	unsigned char j;
	for(j=0;j<7;j++)
	{
    
    
		Timer[j]=Read_Ds1302 (Read_DS1302_adrr[j]);
  }
}

//时间显示函数
void show_Timer()
{
    
    
		show(7,table[Timer[0]%16]);	//显示秒
		show(6,table[Timer[0]/16]);
		
		show(5,0xbf);//显示——
		
		show(4,table[Timer[1]%16]);	//显示分
		show(3,table[Timer[1]/16]);
		
		show(2,0xbf);//显示——
		
		show(1,table[Timer[2]%16]); //显示时
		show(0,table[Timer[2]/16]);
		
		XBYTE[0xe000]=0xff;
	  XBYTE[0xc000]=0xff; //消隐
}

//日历显示函数
void show_Calnedar()
{
    
    
		show(7,table[Timer[3]%16]);	//显示日
		show(6,table[Timer[3]/16]);
		
		show(5,0xbf);//显示——
		
		show(4,table[Timer[4]%16]);	//显示月
		show(3,table[Timer[4]/16]);
		
		show(2,0xbf);//显示——
		
		show(1,table[Timer[6]%16]); //显示年
		show(0,table[Timer[6]/16]);
		
		XBYTE[0xe000]=0xff;
	    XBYTE[0xc000]=0xff; //消隐
}

//第w位数码管显示n
void show(unsigned char w,unsigned char n)
{
    
    
	XBYTE[0xe000]=0xff;    //数码管全部熄灭
	XBYTE[0xc000]=0x01<<w; //第w个数码管显示
	XBYTE[0xe000]=n;       //显示n
}

猜你喜欢

转载自blog.csdn.net/z3447643805/article/details/113869766