📄 rtc.c
字号:
/*******************************************************************************
* 标题: 蓝海微芯LJD-SY-5200单片机开发系统演示程序 *
* 文件: RTC.C *
* 日期: 2006-7-25 *
* 版本: 1.0 *
* 作者: 蓝海微芯 *
* 网站: http://www.ljd-2008.com *
********************************************************************************
* 描述: *
* 通过8位数码管显示当前的时间包括时分秒,通过时间设置键可对当前的时间 *
* 进行设置。共有两个设置按键按键1和按键2;按键1为选定键。按键1首次被 *
* 按下时钟停止走时并且秒时间开始闪烁,此时可通过按键2对秒时间进行设置, *
* 按键2按下一次秒时间数值加一。当按键1第二次被按下时分时间被选中并不停 *
* 地闪烁,此时通过按键2可对分时间进行设置,按键2按下一次分时间加一。 *
* 按键第三次被按下时小时时间被选中并且不停的闪烁,此时通过按键2可对小 *
* 时时间进行设置,按键2每按下一次小时时间加一。按键1第四次被按下后时间 *
* 设置结束,时钟从设定的时间开始走时。 *
* *
* *
********************************************************************************
* 【版权】 Copyright(C)微芯科技 http://www.bluemcu.com All Rights Reserved *
* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
*******************************************************************************/
#include <reg52.h>
#include<stdio.h>
#include<absacc.h>
#include<intrins.h>
/*须主程序定义的参数*/
#define CH451_RESET 0x0201 /*复位*/
#define CH451_LEFTMOV 0x0300 /*设置移动方式-作移*/
#define CH451_LEFTCYC 0x0301 /*设置移动方式-左循*/
#define CH451_RIGHTMOV 0x0302 /*设置移动方式-右移*/
#define CH451_RIGHTCYC 0x0303 /*设置移动方式-右循*/
#define CH451_SYSOFF 0x0400 /*关显示、键盘、看门狗*/
#define CH451_SYSON1 0x0401 /*开显示*/
#define CH451_SYSON2 0x0403 /*开显示、键盘*/
#define CH451_SYSON3 0x0407 /*开显示、键盘、看门狗功能*/
#define CH451_DSP 0x0500 /*设置默认显示方式*/
#define CH451_BCD 0x0580 /*设置BCD译码方式*/
#define CH451_TWINKLE 0x0600 /*设置闪烁控制*/
#define CH451_DIG0 0x0800 /*数码管位0显示*/
#define CH451_DIG1 0x0900 /*数码管位1显示*/
#define CH451_DIG2 0x0a00 /*数码管位2显示*/
#define CH451_DIG3 0x0b00 /*数码管位3显示*/
#define CH451_DIG4 0x0c00 /*数码管位4显示*/
#define CH451_DIG5 0x0d00 /*数码管位5显示*/
#define CH451_DIG6 0x0e00 /*数码管位6显示*/
#define CH451_DIG7 0x0f00 /*数码管位7显示*/
/*如果使用键盘中断请定义
#define USE_KEY */
#define uchar unsigned char
#define uint unsigned int
sbit T_CLK = P1^1; /*实时时钟时钟线引脚 */
sbit T_IO = P1^0; /*实时时钟数据线引脚 */
sbit T_RST = P1^3; /*实时时钟复位线引脚 */
sbit ch451_din = P1^0;
sbit ch451_clk = P1^1;
sbit ch451_load = P1^2;
sbit ch451_dout = P3^3;
sbit P1_3 = P1^3;
sbit P1_5 = P1^5;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
uchar M;
uchar N;
uchar ch451_key;
uchar key_flag;
/*void RTInputByte(uchar); /* 输入 1Byte */
/*uchar RTOutputByte(void); /* 输出?1Byte */
/*void W1302(uchar, uchar);
/*uchar R1302(uchar);
/*void Set1302(uchar *); /* 设置时间 */
/*void Get1302(uchar curtime[]); /* 读取1302当前时间 */
uchar SClock[3];
/********************************************************************
函 数 名:RTInputByte()
功 能:实时时钟写入一字节
说 明:往DS1302写入1Byte数据 (内部函数)
入口参数:d 写入的数据
返 回 值:无
设 计:蓝海微芯
***********************************************************************/
void RTInputByte(uchar d)
{
uchar i;
ACC = d;
for(i=8; i>0; i--)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/********************************************************************
函 数 名:RTOutputByte()
功 能:实时时钟读取一字节
说 明:从DS1302读取1Byte数据 (内部函数)
入口参数:无
返 回 值:ACC
设 计:蓝海微芯
***********************************************************************/
uchar RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; /*相当于汇编中的 RRC */
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************************************
函 数 名:W1302()
功 能:往DS1302写入数据
说 明:先写地址,后写命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址, ucData: 要写的数据
返 回 值:无
设 计:蓝海微芯
***********************************************************************/
void W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
函 数 名:R1302()
功 能:读取DS1302某地址的数据
说 明:先写地址,后读命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址
返 回 值:ucData :读取的数据
设 计:蓝海微芯
***********************************************************************/
uchar R1302(uchar ucAddr)
{
uchar ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
ucData = RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST = 0;
return(ucData);
}
/********************************************************************
函 数 名:Set1302()
功 能:设置初始时间
说 明:先写地址,后读命令/数据(寄存器多字节方式)
调 用:W1302()
入口参数:pClock: 设置时钟数据
地址格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
返 回 值:无
设 计:蓝海微芯
***********************************************************************/
void Set1302(uchar *pClock)
{
uchar i;
uchar ucAddr = 0x80;
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =3; i>0; i--)
{
W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
pClock++;
ucAddr +=2;
}
W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/********************************************************************
函 数 名:Get1302()
功 能:读取DS1302当前时间
说 明:
调 用:R1302()
入口参数:ucCurtime: 保存当前时间地址。
当前时间格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
返 回 值:无
设 计:蓝海微芯
***********************************************************************/
void Get1302(uchar ucCurtime[])
{
uchar i;
uchar ucAddr = 0x81;
for (i=0; i<3; i++)
{
ucCurtime[i] = R1302(ucAddr); /*格式为: 秒 分 时 日 月 星期 年 */
ucAddr += 2;
}
}
/********************************************************************
函 数 名:ch451_bcd()
功 能:对从DS1302读取的时间值进行转化
说 明:把一字节的BCD码格式的时间值分成两字节
调 用:
入口参数:ds_bcd
返 回 值:
设 计:蓝海微芯
***********************************************************************/
void ch451_bcd(uchar ds_bcd)
{
M = ds_bcd&0xf0;
M>>=4;
N = ds_bcd&0x0f;
}
/********************************************************************
函 数 名:ch451_init()
功 能:对ch451芯片进行初始化
说 明:
调 用:
入口参数:
返 回 值:
设 计:蓝海微芯
***********************************************************************/
void ch451_init(void)
{
ch451_din = 0; /*先低后高,选择4线输入*/
ch451_din = 1;
ch451_load = 1;
ch451_clk = 1;
_nop_();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -