⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.c

📁 DS1302编程学习用时钟芯片片DS1302编程学习用时钟芯片片DS1302编程学习用时钟芯片片
💻 C
字号:
#include <iom16v.h>
#include <macros.h>

extern const unsigned char tab[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};


#define		dion				  PORTB |=BIT(1);	 	   //数据高
#define		dioff				  PORTB &=~BIT(1);
#define		DS1302_CLK_Low		  PORTB &=~BIT(0);
#define		DS1302_CLK_High		  PORTB |=BIT(0);
#define		DS1302_IO_Low  		  PORTB &=~BIT(6);
#define		DS1302_IO_High 		  PORTB |=BIT(6);
#define		DS1302_RST_High 	  PORTB |=BIT(7);
#define		DS1302_RST_Low  	  PORTB &=~BIT(7);
#define		SomeNOP()			  NOP();NOP();NOP();NOP();

unsigned char second,minute,hour,day,month,year;

void dataOUT(unsigned char temp)
{
    unsigned char i,temp1;
   temp1 = tab[temp];
    for(i = 0;i < 8;i++ )
	{
        DS1302_CLK_Low;
		if((temp1&0x80)!= 0x80)
         {
		  dioff;
		 }
        else
         { 
		  dion;
		 }
		  	DS1302_CLK_High;
 			temp1 <<=1;
			DS1302_CLK_Low;						
	}
}

void delay(void)
{
  int i;
  for(i=0;i<200;i++)
 ;
}

void display(unsigned int k)
{
 	 dataOUT(k/1000);
	 PORTB &=0xC7;  		  	//DIG1
	 delay();
	 dataOUT(k/100%10);
	 PORTB |=0x08;
	 PORTB &=0xCF;  		  	//DIG2
	 delay();
	 dataOUT(k/10%10);
	 PORTB &=0xD7;  		  	//DIG3
	 PORTB |=0x10;
	 delay();
	 dataOUT(k%10);
	 PORTB |=0x18;
	 PORTB &=0xDF;  		  	//DIG4
	 delay();
}




/***************向DS1302送一字节数据*************************/
void InputByte(unsigned char byte1)
{
char count=8;
do
{
DS1302_CLK_Low;
SomeNOP();
if(byte1&0x01)
{DS1302_IO_High;}
else
{DS1302_IO_Low;}
SomeNOP();
DS1302_CLK_High;
SomeNOP();
DS1302_CLK_Low;
byte1>>=1;
}while(--count);
}

/****************读DS1302一个字节************************/
unsigned char OutputByte(void)
{
 char count=8;
unsigned char data=0;
DDRB &=0xBF;  		 //PB6 input
do
{
data>>=1;
DS1302_CLK_Low;
SomeNOP();
if(PINB&0x40)
data|=0x80;
DS1302_CLK_High;
SomeNOP();
DS1302_CLK_Low;
}while(--count);
DDRB=0xff;
return(data);
}


/*******************向DS1302某地址写一字节数据****************/
void write_ds1302(unsigned char addr,unsigned char Dat)
{
DS1302_RST_Low;
SomeNOP();
DS1302_CLK_Low;
SomeNOP();
DS1302_RST_High; 
InputByte(addr);
InputByte(Dat);
DS1302_CLK_High;
SomeNOP();
DS1302_RST_Low;
}

/*************读DS1302地址*******************************/
unsigned char read_ds1302(unsigned char addr)
{
  unsigned char Dat;
  DS1302_RST_Low;
  SomeNOP();
  DS1302_CLK_Low;
  SomeNOP();
  DS1302_RST_High;
  InputByte(addr);
  Dat=OutputByte();
  DS1302_CLK_High;
  SomeNOP();
  DS1302_RST_Low;
  return(Dat);
}


/*************************初始化DS1302****************************/
void initial_ds1302()
{
  

  write_ds1302(0x8e,0x00);				//写保护寄存器,在对时钟或RAM写前WP一定要为0

  
  write_ds1302(0x8c,0x06);				//06年

 
  write_ds1302(0x88,0x06);				//6月


  write_ds1302(0x86,0x21);				//21日


  write_ds1302(0x84,0x11);				//11时


  write_ds1302(0x82,0x30);				//0分


  write_ds1302(0x80,0x20);				//0秒

  write_ds1302(0x8e,0x80);				//写保护寄存器

}


/*******************读DS1302时间*************************/
void read_time()
{
  

  second=read_ds1302(0x81);				//秒寄存器
  

  minute=read_ds1302(0x83);				//分
 

  hour=read_ds1302(0x85);				//时


  day=read_ds1302(0x87);				//日
  

  month=read_ds1302(0x89);				//月


  year=read_ds1302(0x8d);				//年
 
}

void main(void)
{
char second1;
DDRB=0xff;

dioff;

initial_ds1302();
while(1)
{
read_time();
delay();
delay();
delay();
second1=(second/16)*10+(second%16);			//HEX to DEC
display(second1);
delay();
delay();
dioff;
}
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -