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

📄 ds12997.c

📁 本程序经调试好使
💻 C
字号:
/******************************************************/
//Title:ATMAGE16 & DS12887时钟程序-查询方式
//ICC-AVR : 2009-3-4 17:04:40
// Target : M16
// Crystal: 1.0000Mhz ~8.0000Mhz都好使
//Author  :borlittle
//Function:usart+DS12887 RTC test
//备注	  :本程序经调试好使,如果程序不好使,请注意检查硬件连线,内部时钟
//记得要校验准
// AVR 执行时间:8MHZ ->0.125us  4MHZ->0.25us  //无串口,模拟总线最简版
//               2MHZ->0.5us      *1MHZ->1us ,每句后延时2句
// at89s52  执行时间:11.0592MHZ->2.17us 
//
//
/****************************************************/

#include <iom16v.h>       
#include <macros.h>

#define uchar unsigned char		//定义无符号字符为 uchar
#define uint  unsigned int       //定义无符号整型

uchar y1,y2,y3,y4,y5,y6;

/**********************接口定义*********************************/
//GND <--   MOT		   VCC  -->VCC
//			.		   SQW
//			.		   .
//PA_0<-- 	AD0	       .     
//PA_1<-- 	AD1		   .
//PA_2<-- 	AD2        IRQ   -->PB_0
//PA_3<-- 	AD3        REET	 -->VCC
//PA_4<-- 	AD4		   DS	 -->PB_1
//PA_5<-- 	AD5		   .
//PA_6<-- 	AD6		   R/W	 -->PB_2
//PA_7<-- 	AD7		   AS	 -->PB_3
//		    GND		   CS    -->PB_4 
/*********************引脚说明***********************************/
//DS12887       16    器件
//数据线       PA口    数据地址公用总线
//DS_IRQ        PB0    时间中断     
//DS_DS         PB1    数据选通
//DS_RW    		PB2	   读写控制
//DS_AS			PB3	   地址选通
//DS_CS         PB4	   芯片片选
//DS_MOT        GND    模式选择

/*******************数据地址定义*************************************/
#define	DS12887_Second		0x00	//秒
#define	DS12887_Minute		0x02	//分
#define	DS12887_Hour		0x04	//时
#define	DS12887_Week		0x06	//星期
#define	DS12887_Day		    0x07	//日
#define	DS12887_Month		0x08	//月
#define	DS12887_Year		0x09	//年

//引脚电平定义
#define P_DS_1 PORTB|=BIT(PB1)	  	//DS_DS为1
#define P_DS_0 PORTB&=~BIT(PB1)		//DS_DS为0
#define D_DS_1 DDRB |=BIT(PB1)      //设为输出

#define P_RW_1  PORTB|=BIT(PB2)	    //DS_RW为1
#define P_RW_0  PORTB&=~BIT(PB2)	//DS_RW为0
#define D_RW_1   DDRB |=BIT(PB2)    //设为输出

#define P_AS_1 PORTB|=BIT(PB3)		//DS_AS为1
#define P_AS_0 PORTB&=~BIT(PB3)    	//DS_AS为0
#define D_AS_1  DDRB |=BIT(PB3)     //设为输出

#define P_CS_1 PORTB|=BIT(PB4)     //DS_CS为1
#define P_CS_0 PORTB&=~BIT(PB4)	   //DS_CS为0				
#define D_CS_1  DDRB |=BIT(PB4)     //设为输出

 			
//数据端口定义
#define AD_DDR DDRA 			//AD(地址/数据服用线)的输入/输出控制
#define AD_PORT PORTA			//AD(地址/数据服用线)的输出电平控制
#define AD_PIN PINA			//AD(地址/数据服用线)的输入电平控制


//定义时间类型,结构体数据类型
typedef struct _SYSTEMTIME_
{
	unsigned  char Second;
	unsigned  char Minute;
	unsigned  char Hour;
	unsigned  char Week;
	unsigned  char Day;
	unsigned  char Month;
	unsigned  char Year;
	unsigned  char DateString[9];
	unsigned  char TimeString[9];
}SYSTEMTIME;			

/***********************函数声明*****************************/
void DS12887_Init(void);						//DS12887初始化
void DS12887_Write( uchar Address,  uchar Value);		//DS12887指定地址写入数据
uchar DS12887_Read(uchar Address);					//DS12887指定地址中读出数据	
void DS12887_SetTime( uchar Address,  uchar Value);	//设置时间函数
void DS12887_GetTime(SYSTEMTIME *Time);					//读出时间

/*******DS12887指定地址写入数据 ,严格按照INTERL的时序,程序**********/
void DS12887_Write( uchar Address, uchar Value)
{
	
	P_AS_0; 
    _NOP(); 
    _NOP();     
    P_DS_1; 
	_NOP(); 
    _NOP();
    P_RW_1;            //给出读信号 
    _NOP(); 
    _NOP();    
    P_AS_1;            //锁存信号高电平 
    _NOP(); 
    _NOP(); 
    AD_DDR = 0xFF;          //数据口设置为输出 
    _NOP(); 
    _NOP();
	_NOP();
	_NOP(); 
    AD_PORT = Address;       //给出地址 
    _NOP(); 
    _NOP();  
	_NOP(); 
    _NOP();
	_NOP();
	_NOP();                     // 
    P_AS_0;            //锁存信号低电平 
    _NOP(); 
    _NOP();  
    P_RW_0;            //给出写信号 
    _NOP(); 
    _NOP(); 
    _NOP(); 
    AD_PORT = Value;  //写出数据 
    _NOP(); 
    _NOP(); 
    _NOP(); 
    _NOP();
	_NOP();
	_NOP();
	_NOP();
	_NOP(); 
    P_RW_1;            //给出读信号 
    _NOP(); 
    _NOP(); 
    _NOP(); 
    P_AS_1;            //片选信号高电平 
    _NOP(); 
    _NOP();  
}
/*********DS12887指定地址中读出数据,严格按照INTERL的时序!!!!!********/
uchar DS12887_Read( uchar Address)
{   
	 unsigned char temp = 0;     
    P_AS_0;            //锁存信号高电平 
    _NOP(); 
    _NOP(); 
	P_DS_1; 
	_NOP(); 
    _NOP();
    P_RW_1;            //给出读信号    
    _NOP(); 
    _NOP(); 
    P_AS_1;            //锁存信号高电平 
    _NOP(); 
    _NOP(); 
    AD_DDR = 0xFF;         //数据口设置为输出 
	_NOP();
	_NOP();
	_NOP();
	_NOP();
    AD_PORT = Address;       //给出地址 
    _NOP(); 
    _NOP(); 
	 _NOP(); 
    _NOP();
	_NOP();
	_NOP();
	_NOP();
	_NOP();
    P_AS_0;            //锁存信号低电平 
    _NOP(); 
    _NOP();     
    P_DS_0;            //给出写信号 
    _NOP(); 
    _NOP(); 
    AD_DDR = 0X00;          //端口方向设置为输入 
    _NOP(); 
    _NOP();
	_NOP();
	_NOP(); 
    temp = AD_PIN;   //读入数据 
    _NOP();
	_NOP();
	_NOP();
	_NOP();
	_NOP();
	_NOP();
	_NOP();
	_NOP(); 
    P_DS_1;            // 
    _NOP(); 
    _NOP(); 
	P_AS_1;            // 
    _NOP(); 
    _NOP(); 
    return temp; 
}

//DS12887初始化
void DS12887_Init(void)
{
	DS12887_Write(0x0a, 0x20);	//打开振荡器,启动DS12887
	DS12887_Write(0x0b, 0x86);	//禁止更新,接下来初始化数据,即写入时间,日期等
	DS12887_Write(0x0b, 0x06);	//正常更新,二进制格式,24进制小时
}



//设置时间函数
void DS12887_SetTime( uchar Address,  uchar Value)
{
	DS12887_Write(0x0b, 0x86);	//禁止更新,接下来初始化数据,即写入时间,日期等
	DS12887_Write(Address,Value);
	DS12887_Write(0x0b, 0x06);	//正常更新,二进制格式,24进制小时
}


//读出时间
void DS12887_GetTime(SYSTEMTIME *Time)
{   uchar temp;
	Time->Second = DS12887_Read(DS12887_Second);
	Time->Minute = DS12887_Read(DS12887_Minute);
	Time->Hour   = DS12887_Read(DS12887_Hour  );
	Time->Day    = DS12887_Read(DS12887_Day   );
	//Time->Week   = DS12887_Read(DS12887_Week  );
	Time->Month  = DS12887_Read(DS12887_Month );
	Time->Year   = DS12887_Read(DS12887_Year  );
  
  y1=DS12887_Read(DS12887_Second);
  y2=DS12887_Read(DS12887_Minute);
  y3=DS12887_Read(DS12887_Hour  );
  y4=DS12887_Read(DS12887_Day   );
  y5=DS12887_Read(DS12887_Month );
  y6=DS12887_Read(DS12887_Year  );
}

/*****************端口初始化********************************/
void port_init(void) 
{
 DDRB  = 0xFF; 
 PORTB = 0xFF; //设为输出高电平
 
 DDRA  = 0x00; 
 PORTA = 0x00; //设为高阻态

}
/********************初始化器件************************************/
void init_devices(void) 
{
 port_init();
 }



/***************主函数*****************************/
void main(void)
{
	SYSTEMTIME CurrentTime;
    init_devices();
	
	DS12887_Init();
	 DS12887_GetTime(&CurrentTime);
/*************时间初始化设置 ,2009-2-16 2:00:00************/
//*
DS12887_SetTime(DS12887_Second, 0); //设置秒
DS12887_SetTime(DS12887_Minute, 34); //设置分
DS12887_SetTime(DS12887_Hour,16);	 //设置时
DS12887_SetTime(DS12887_Day, 4);	 //设置天
DS12887_SetTime(DS12887_Month, 3); //设置月
DS12887_SetTime(DS12887_Year, 9);	 //设置年
//*/
// str_send("DS12887工作中.......");
 while(1) 
 {
 DS12887_GetTime(&CurrentTime);
// delay5ms();
// delay5ms();
 }
 }	

⌨️ 快捷键说明

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