📄 ds12997.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 + -