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

📄 rtc.c

📁 lyd-sy-5100单片机开发板的示例程序 分为C语言版本和ASM汇编版本。其他牌子的板子也可以使用其C语言版本。
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************************
*  标题:  蓝海微芯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 + -