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

📄 ds1302._c

📁 mega128+VS1003做的mp3的程序 可以用WINAVR编译
💻 _C
字号:
/*********************************************************************************
*移植时一定要注意函数 void Ds1302buf_Write(uchar cmd, uchar data),中的方向和,读PIN引脚
*********************************************************************************/
#include <iom64v.h>
#include <macros.h>
#include "./ds1302.h"
#define  uchar unsigned char
#define  uint  unsigned int
 
#define	 nop    NOP(); \
		 		NOP(); \
				NOP(); \
				NOP(); \
				NOP()
		 		    
#define     sei()   SEI()       
#define     cli()   CLI()  
                
#define  DSCL(x)  PORTE = (PORTE & ~(1<<2))|(x<<2)  
#define  DSDA(x)  PORTE = (PORTE & ~(1<<3))|(x<<3)
#define  DRST(x)  PORTE = (PORTE & ~(1<<4))|(x<<4)

#define		SEC_W		0x80       /*Ds1302buf命令字*/
#define		SEC_R		0x81
#define	    MIN_W		0x82
#define		MIN_R		0x83
#define		hour_W		0x84
#define		hour_R		0x85
#define		DATE_W		0x86
#define		DATE_R		0x87
#define		MONTH_W		0x88
#define		MONTH_R		0x89
#define		WEEK_W		0x8a
#define		WEEK_R		0x8b
#define		YEAR_W		0x8c
#define		YEAR_R		0x8d
#define		WP_W		0x8E
#define 	POWER_W 	0X90
extern struct time_now timebuf;
#define		Ds1302buf  timebuf

#define PRINTF_COM 1
void ds1302_init(void)
{
 DDRE  |= (1<<2)|(1<<3)|(1<<4);
 PORTE |= (1<<2)|(1<<3)|(1<<4); 
}
/*********************************************************************************************************************************************
写一个字节到Ds1302buf,参数分别为命令、数据
*********************************************************************************************************************************************/
void Ds1302buf_Write(uchar cmd, uchar data)
{uchar i;
 DSCL(0);
 DRST(0);
 nop;
 DRST(1);
 nop;
 for(i=0; i<8; i++)/*发送内部地址*/
   {
    DSCL(0);
   	nop;
    if(cmd & (1<<i)) DSDA(1);
	  else DSDA(0);
    DSCL(1);
	nop;
   }
 for(i=0; i<8; i++)/*发送数据*/
   {
	DSCL(0);
	nop;
    if(data & (1<<i)) DSDA(1);
	  else DSDA(0);
    DSCL(1);
	nop;
   }
 DRST(0);
}
/*********************************************************************************************************************************************
从Ds1302buf读一个字节数据返回,参数只有命令,返回数据
*******************************************************************************************************************************************/
uchar Ds1302buf_Read(uchar cmd)
{
 uchar i;
 uchar data;
 DSCL(0);
 DRST(0);
 nop;
 DRST(1);
 nop;
 for(i=0; i<8; i++)/*发送内部地址*/
	{
	DSCL(0);
	nop;
    if(cmd & (1<<i)) DSDA(1);
	  else DSDA(0);
    DSCL(1);
	nop;
    }
 DDRE &= ~(1<<3);                   
 DSDA(0);
 DSCL(0);
 nop;
 if(PINE & (1<<3)) data |=0x80;
 	else data &= 0x7f;
 for(i=0; i<7; i++)/*读数据*/
 	{       data >>=1;
  		DSCL(1);
		nop;
		DSCL(0);
		nop;
  		if(PINE & (1<<3)) {data |=0x80;}
    		else {data &= 0x7f;}
  	}
 DDRE |= 1<<3;
 DRST(0);
 return data;
}
/*********************************************************************************************************************************************
从Ds1302buf中读取时钟日历信息
*********************************************************************************************************************************************/
void Read_InfoDs1302buf(void)
{cli();
 Ds1302buf.sec   = Ds1302buf_Read(SEC_R) & 0x7f;
 Ds1302buf.min   = Ds1302buf_Read(MIN_R) & 0x7f;
 Ds1302buf.hour  = Ds1302buf_Read(hour_R)  & 0x3f;
 Ds1302buf.date  = Ds1302buf_Read(DATE_R)& 0x3f;
 Ds1302buf.month = Ds1302buf_Read(MONTH_R) & 0x1f;
 Ds1302buf.week  = Ds1302buf_Read(WEEK_R)  & 0x07;
 Ds1302buf.year  = Ds1302buf_Read(YEAR_R);
 sei();
}
/*********************************************************************************************************************************************
将时钟日历信息存储到Ds1302buf中
*********************************************************************************************************************************************/
void Write_InfoDs1302buf(void)
{cli();
 Ds1302buf_Write(WP_W,    0x00);     
 Ds1302buf_Write(SEC_W,   Ds1302buf.sec);
 Ds1302buf_Write(MIN_W,   Ds1302buf.min);
 Ds1302buf_Write(hour_W,  Ds1302buf.hour);
 Ds1302buf_Write(DATE_W,  Ds1302buf.date);
 Ds1302buf_Write(MONTH_W, Ds1302buf.month);
 Ds1302buf_Write(WEEK_W,  Ds1302buf.week);
 Ds1302buf_Write(YEAR_W,  Ds1302buf.year);
 Ds1302buf_Write(POWER_W, 0x16);
 Ds1302buf_Write(WP_W,    0x80);
 sei();
}  
/****************************************************************************************************************************************
*****************************************************************************************************************************************
*************************************以上的部分很重要不可以轻易更改!*********************************************************************
*****************************************************************************************************************************************
****************************************************************************************************************************************/
/*********************************************************************************************************************************************
设置时间日期
*********************************************************************************************************************************************/
void Set_time(void)
{
 Ds1302buf.sec   = 0x10;
 Ds1302buf.min   = 0x34;
 Ds1302buf.hour  = 0x14;
 Ds1302buf.date  = 0x19;
 Ds1302buf.month = 0x10;
 Ds1302buf.week  = 0x04;
 Ds1302buf.year  = 0x06;
 Write_InfoDs1302buf();
}           
/*********************************************************************************************************************************************
打印时间日期到超级终端
*********************************************************************************************************************************************/
void Printf_time(void)
{ 
  #ifdef PRINTF_COM
  uchar temp;                        
  Read_InfoDs1302buf();
  Print_str("当前时间:");
  temp = Ds1302buf.hour;
  temp >>= 4;
  temp &= 0x0f;         
  USART_Transmit(temp+'0');  
  temp = Ds1302buf.hour;
  temp &= 0x0f;         
  USART_Transmit(temp+'0'); 
  Print_str(":");
  temp = Ds1302buf.min;
  temp >>= 4;
  temp &= 0x0f;         
  USART_Transmit(temp+'0');  
  temp = Ds1302buf.min;
  temp &= 0x0f;         
  USART_Transmit(temp+'0'); 
  Print_str(":");
  temp = Ds1302buf.sec;
  temp >>= 4;
  temp &= 0x0f;         
  USART_Transmit(temp+'0');  
  temp = Ds1302buf.sec;
  temp &= 0x0f;         
  USART_Transmit(temp+'0'); 
  Print_str("\r\n");
  Print_str("当前日期:");     
  temp = Ds1302buf.year;
  temp >>= 4;
  temp &= 0x0f;         
  USART_Transmit(temp+'0');  
  temp = Ds1302buf.year;
  temp &= 0x0f;         
  USART_Transmit(temp+'0'); 
  Print_str("年");
  temp = Ds1302buf.month;
  temp >>= 4;
  temp &= 0x0f;         
  USART_Transmit(temp+'0');  
  temp = Ds1302buf.month;
  temp &= 0x0f;         
  USART_Transmit(temp+'0'); 
  Print_str("月"); 
  temp = Ds1302buf.date;
  temp >>= 4;
  temp &= 0x0f;         
  USART_Transmit(temp+'0');  
  temp = Ds1302buf.date;
  temp &= 0x0f;         
  USART_Transmit(temp+'0'); 
  Print_str("日 :");  
  Print_str("  星期:");
  temp = Ds1302buf.week;
  temp >>= 4;
  temp &= 0x0f;         
  USART_Transmit(temp+'0');  
  temp = Ds1302buf.week;
  temp &= 0x0f;         
  USART_Transmit(temp+'0'); 
  Print_str("\r\n"); 
  #endif
} 

⌨️ 快捷键说明

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