📄 rtc.c
字号:
/*******************************************************************************
* 标题: student2000单片机开发系统演示程序 *
* 文件: fun.C *
* 日期: 2007-5-4 *
* 版本: 1.0 *
********************************************************************************
* 描述: *
* 大部分通用函数集合 *
* RS232,RS485,延时函数,协议框架演示等 */
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#include <absacc.h>
#include <stdio.h>
#include "SYBXT1.h"
sbit ds_scl=P1^1;
sbit ds_rst=P1^3;
sbit ds_sda= P1^0;
sbit ACC7=ACC^7;
sbit ACC0=ACC^0;
DateTime dt;
xdata DateTime dtset;
xdata uchar str[50];
//xdata SetJdqTime dtjdq;
bit clock_12h=0;//24小时
bit clock_am_pm=0;//上午
bit clockset_12h=0;//24小时
bit clockset_am_pm=0;//上午
static void wt_byte(uchar xx)
{
uchar i=8;
ACC=xx;
do
{
ds_scl=0;
ds_sda=ACC0;
ACC>>=1;
_nop_();
ds_scl=1;
}
while (--i);
}
static uchar rd_byte(void)
{
uchar i=8;
do
{
ds_scl=1;
ACC>>=1;
ds_scl=0;
_nop_();
ACC7=ds_sda;
}
while (--i);
return (ACC);
}
void ds_read(uchar command,uchar idata *time)
{
uchar command1;
command1=command;
command=command|0x01;
ds_scl=0;
ds_rst=1;
wt_byte(command);
*time=rd_byte();
ds_rst=0;
if(command1== SECOND_ADDR)
{
*time &= 0x7f;
}
else if(command1 == HOUR_ADDR)
{
if((*time & 0x80) != 0)//
{//12小时
clock_12h = 1;
//确定是上午还是下午?
if((*time&0x20) != 0)
clock_am_pm = 1;//下午
else
clock_am_pm = 0;//上午
*time &= 0x1f;//范围0——12的bcd数
}
else
{//24小时
clock_12h = 1;
*time &= 0x3f;
}
}
*time =bcd2_hex(*time);
}
//用bcd输入如:0x00~0x59:表示00~59的十进制数
void ds_write(uchar command,uchar idata *time)
{
uchar i;
clock_12h=0;//24小时
clock_am_pm=0;//上午
i = *time / 10;
i <<= 4;
i |= (*time % 10);
*time = i;
if(command == HOUR_ADDR)
{
if(clock_12h)
{
if(clock_am_pm)
*time |= 0xa0;
else
{
*time &= 0x1f;
*time |= 0x80;
}
}
else
*time &= 0x7f;
}
command &= 0xfe;//set write state
ds_scl=0;
ds_rst=1;
wt_byte(command);
wt_byte(*time);
ds_rst=0;
}
uchar bcd2_hex(uchar val)
{
uchar i;
i = val&0x0f;
val >>= 4;
val &= 0x0f;
val *= 10;
i += val;
return i;
}
/*
void ds_checktime(void)
{
//设置年月日是分秒
uchar i;
uchar n;
i=0;
dt.second=0;
dt.year=07;
dt.month=02;
dt.day=10;
dt.week=3;
dt.hour=13;
dt.minute=20;
dt.second=0;
ds_write(CONTROL_ADDR, (uchar *)&i);
i=dt.second&0x7f;
ds_write(SECOND_ADDR, (uchar *)&i);
//i=0;
ds_write(MINUTE_ADDR,(uchar *) &dt.minute);
//i=12;
ds_write(HOUR_ADDR, (uchar *)&dt.hour);
//i=31;
ds_write(DAY_ADDR, (uchar *)&dt.day);
//i=5;
ds_write(MONTH_ADDR,(uchar *)&dt.month);
//i=06;
ds_write(YEAR_ADDR,(uchar *)&dt.year);
i=0;
ds_write(0x8e,(uchar *)&i);
n=0;
n =sprintf(str, "%02bd-",dt.year);
n+=sprintf(str+n,"%02bd-",dt.month);
n+=sprintf(str+n,"%02bd ",dt.day);
n+=sprintf(str+n,"%02bd:",dt.hour);
n+=sprintf(str+n,"%02bd:",dt.minute);
n+=sprintf(str+n,"%02bd",dt.second);
//send_bytes(str);
}
*/
void ds_init(void)
{
xdata uchar ss[5];
uchar i;
ds_scl=0;
ds_rst=0;
ds_sda=0;
ds_read(0x81,(uchar *)&i);
if (i&0x80)
{
// send_bytes("clock has been stop!\n");
// send_bytes("it's running!\n");
i=0;
ds_write(0x8e,(uchar*)&i);
i=0;
ds_write(0x80,(uchar*)&i);
i=0xa5;
ds_write(0x90,(uchar*)&i);
}
//read ram
ds_read(0xc1,(uchar *)&i);
ss[0]=i;
ds_read(0xc3,(uchar *)&i);
ss[1]=i;
if(strncmp(ss,"ok",2)==0)
{
//不需要初始化;
}
else
{
//设置年月日是分秒
i=0;
ds_write(CONTROL_ADDR, (uchar *)&i);
i=0;
ds_write(SECOND_ADDR, (uchar *)&i);
i=0;
ds_write(MINUTE_ADDR,(uchar *) &i);
i=12;
ds_write(HOUR_ADDR, (uchar *)&i);
i=31;
ds_write(DAY_ADDR, (uchar *)&i);
i=5;
ds_write(MONTH_ADDR,(uchar *)&i);
i=06;
ds_write(YEAR_ADDR,(uchar *)&i);
i=0;
ds_write(0x8e,(uchar *)&i);
i=0xa5;
ds_write(0x90,(uchar *)&i);
i='o';
ds_write(0xc0,(uchar *)&i);
i='k';
ds_write(0xc2,(uchar *)&i);
send_bytes("set default time!\n");
//Delay_msec(5);
}
send_bytes("time format error,has modify\n\n");
// ds_checktime();
}
bit bgo=1;
void timeoutput()
{
uchar i;
int n;
int second;
ds_read(SECOND_ADDR+1,(uchar *)&i);
dt.second =i;
ds_read(MINUTE_ADDR+1,(uchar *)&i);
dt.minute=i;
ds_read(HOUR_ADDR+1,(uchar *)&i);
dt.hour=i;
ds_read(DAY_ADDR+1,(uchar *)&i);
dt.day=i;
ds_read(MONTH_ADDR+1,(uchar *)&i);
dt.month=i;
ds_read(YEAR_ADDR+1,(uchar *)&i);
dt.year=i;
if(bgo)
{
n=sprintf(str,"%02bd-",0x07f&dt.year);
n+=sprintf(str+n,"%02bd-",0x07f&dt.month);
n+=sprintf(str+n,"%02bd ",0x07f&dt.day);
n+=sprintf(str+n,"%02bd:",0x07f&dt.hour);
n+=sprintf(str+n,"%02bd:",0x07f&dt.minute);
n+=sprintf(str+n,"%02bd\n",0x07f&dt.second);
send_bytes(str);
bgo=0;
}
if(second!=dt.second)
{
n=0;
n=sprintf(str,"%02bd-",0x07f&dt.year);
n+=sprintf(str+n,"%02bd-",0x07f&dt.month);
n+=sprintf(str+n,"%02bd ",0x07f&dt.day);
n+=sprintf(str+n,"%02bd:",0x07f&dt.hour);
n+=sprintf(str+n,"%02bd:",0x07f&dt.minute);
n+=sprintf(str+n,"%02bd\n",0x07f&dt.second);
send_bytes(str);
}
second=dt.second;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -