单片机控制ds1302的时钟C程序

发布者:JoyfulSunflower最新更新时间:2012-12-05 来源: 51hei 关键字:单片机  ds1302  时钟C程序 手机看文章 扫描二维码
随时随地手机看文章

/**************************************************/
/* ds1302实时时钟C程序 */
/*51hei.com会员经典作品已经测试成功/
/**************http://www.51hei.com/ziliao/file/ds1302c.rar 点此链接下载本例的代码*****/

#include < reg52.h>
#include

#define uchar unsigned char

sbit T_CLK = P3^4; /*实时时钟时钟线引脚 */
sbit T_IO = P3^3; /*实时时钟数据线引脚 */
sbit T_RST = P3^2; /*实时时钟复位线引脚 */
//sbit OE=P3^6;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;

uchar time[8]="  :  :  ";
uchar min,hou,day,mon,yea;

void Init1302(void);
void v_W1302(uchar ucAddr, uchar ucDa);
uchar uc_R1302(uchar ucAddr);
void v_BurstW1302T(uchar *pSecDa);
void v_BurstR1302T(uchar *pSecDa);
void v_BurstW1302R(uchar *pReDa);
void v_BurstR1302R(uchar *pReDa);
void v_Set1302(uchar *pSecDa);
void v_Get1302(uchar ucCurtime[]);
void donetime(void);
void bcd_int(uchar i);
void bcdtoInt(void);
void SetTime(void);
/****************************************
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
****************************************************/
void v_WTInputByte(uchar ucDa)
 {
  uchar i;
  //OE=0;
  ACC= ucDa;
  for(i=8; i>0; i--)
   {
    T_IO = ACC0; //*相当于汇编中的 RRC
    T_CLK = 1;
    T_CLK = 0;
    ACC =ACC>> 1;
   }
 // OE=1; 
 }
/***************************************************
*
* 名称: uchar uc_RTOutputByte
* 说明:
* 功能: 从DS1302读取1Byte数据
* 调用:
* 输入:
* 返回值: ACC
****************************************************/
uchar uc_RTOutputByte(void)
 {
  uchar i;
  //OE=0;
  for(i=8; i>0; i--)
   {
    ACC = ACC>>1; //*相当于汇编中的 RRC
    ACC7 = T_IO;
    T_CLK = 1;        
    T_CLK = 0;
   } 
  //OE=1;   
  return(ACC);
 }
/***************************************************
*
* 名称: v_W1302
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: v_RTInputByte()
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
*******************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
 {
  //OE=0;
  T_RST = 0;
  T_CLK = 0;
  T_RST = 1;
  v_WTInputByte(ucAddr); /* 地址,命令 */
  v_WTInputByte(ucDa); /* 写1Byte数据*/
  T_CLK = 1;
  T_RST =0;
  //OE=1; 
 } [page]
/**************************************************
*
* 名称: uc_R1302
* 说明: 先写地址,后读命令/数据
* 功能: 读取DS1302某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
****************************************************/
uchar uc_R1302(uchar ucAddr)
 {
  uchar ucDa;
  //OE=0;
  T_RST = 0;
  T_CLK = 0;
  T_RST = 1;
  v_WTInputByte(ucAddr); /* 地址,命令 */
  ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
  T_CLK = 1;
  T_RST =0;
 // OE=1;
  return(ucDa);
 }
/***********************************************
*
* 名称: v_BurstW1302T
* 说明: 先写地址,后写数据(时钟多字节方式)
* 功能: 往DS1302写入时钟数据(多字节方式)
* 调用: v_RTInputByte()
* 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
* 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
******************************************************/
/*void v_BurstW1302T(uchar *pSecDa)
 {
  uchar i;
  v_W1302(0x8e,0x00); //* 控制命令,WP=0,写操作?
  T_RST = 0;
  T_CLK = 0;
  T_RST = 1;
  v_WTInputByte(0xbe); //* 0xbe:时钟多字节写命令
  for (i=8;i>0;i--) //*8Byte = 7Byte 时钟数据 + 1Byte 控制
   {
    v_WTInputByte(*pSecDa);//* 写1Byte数据
    pSecDa++;
   }
  T_CLK = 1;
  T_RST =0;
 }  */      
/*******************************************
*
* 名称: v_BurstR1302T
* 说明: 先写地址,后读命令/数据(时钟多字节方式)
* 功能: 读取DS1302时钟数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: ucDa :读取的数据
***********************************************/
/*void v_BurstR1302T(uchar *pSecDa)
 {
  uchar i;
  T_RST = 0;
  T_CLK = 0;
  T_RST = 1;
  v_WTInputByte(0xbf); //* 0xbf:时钟多字节读命令
  for (i=8; i>0; i--)
   {
    *pSecDa = uc_RTOutputByte(); //* 读1Byte数据
    pSecDa++;
   }
  T_CLK = 1;
  T_RST =0;
 }  */    
/******************************************
*
* 名称: v_BurstW1302R
* 说明: 先写地址,后写数据(寄存器多字节方式)
* 功能: 往DS1302寄存器数写入数据(多字节方式)
* 调用: v_RTInputByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
**********************************************/
/*void v_BurstW1302R(uchar *pReDa)
 {
  uchar i;
  v_W1302(0x8e,0x00); //* 控制命令,WP=0,写操作?
  T_RST = 0;
  T_CLK = 0;
  T_RST = 1;
  v_WTInputByte(0xfe); //* 0xbe:时钟多字节写命令
  for (i=31;i>0;i--) //*31Byte 寄存器数据
   {
    v_WTInputByte(*pReDa); //* 写1Byte数据
    pReDa++;
   }
  T_CLK = 1;
  T_RST =0;
 }   */    [page]
/************************************************
*
* 名称: uc_BurstR1302R
* 说明: 先写地址,后读命令/数据(寄存器多字节方式)
* 功能: 读取DS1302寄存器数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***************************************************/
/*void v_BurstR1302R(uchar *pReDa)
 {
  uchar i;
  T_RST = 0;
  T_CLK = 0;
  T_RST = 1;
  v_WTInputByte(0xff); //* 0xbf:时钟多字节读命令
  for (i=31; i>0; i--) //*31Byte 寄存器数据
   {
    *pReDa = uc_RTOutputByte(); //* 读1Byte数据
    pReDa++;
   }
  T_CLK = 1;
  T_RST =0;
 }  */ 
/************************************************
*
* 名称: v_Set1302
* 说明:
* 功能: 设置初始时间
* 调用: v_W1302()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
*****************************************************/
/*void v_Set1302(uchar *pSecDa)
 {
  uchar i;
  uchar ucAddr = 0x80;
  v_W1302(0x8e,0x00); // 控制命令,WP=0,写操作?
  for(i =7;i>0;i--)
   {
    v_W1302(ucAddr,*pSecDa);  //秒 分 时 日 月 星期 年
    pSecDa++;
    ucAddr +=2;
   }
  v_W1302(0x8e,0x80); // 控制命令,WP=1,写保护?
 }  */
/**********************************************
*
* 名称: v_Get1302
* 说明:
* 功能: 读取DS1302当前时间
* 调用: uc_R1302()
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
*****************************************************/
/*void v_Get1302(uchar ucCurtime[])
 {
  uchar i;
  uchar ucAddr = 0x81;
  for (i=0;i<7;i++)
   {
    ucCurtime[i] = uc_R1302(ucAddr);//*格式为: 秒 分 时 日 月 星期 年
    ucAddr += 2;
   }
 } */ 
/**************************************************
* 名称: Init1302
* 说明:
* 功能: 初始化DS1302
* 调用: 
* 输入: 
* 返回值: 无
*********************************************************/
void Init1302(void)
 {
  v_W1302(0x8e,0x00);  //控制写入WP=0
  v_W1302(0x90,0xa5);
  v_W1302(0x80,0x00);  //秒
  v_W1302(0x82,0x59);  //分
  v_W1302(0x84,0x10);  //时
  v_W1302(0x86,0x01);  //日
  v_W1302(0x88,0x08);  //月
  v_W1302(0x8a,0x03);  //星期
  v_W1302(0x8c,0x07);  //年 */ 
  v_W1302(0x8e,0x80);
 }
/******************************************************
* 名称: donetime
* 说明:
* 功能: 时间处理
* 调用: 
* 输入: 
* 返回值: 无
**************************************************************/
void donetime(void)
 {
  uchar d;
  d=uc_R1302(0x81);
  time[6]=d/16+48;
  time[7]=d%16+48;
  d=uc_R1302(0x83);
  time[3]=d/16+48;
  time[4]=d%16+48;
  d=uc_R1302(0x85);
  time[0]=d/16+48;
  time[1]=d%16+48;
  //bcd_int(d);    
 }   

 //
/*void bcd_int(uchar i)
  {
  uchar j;  
  time[0]=(i&0x0f)+48;
  j=i>>4;
  time[1]=(j&0x0f)+48;
 }  */
//
/*void bcdtoInt(void)
 {
  uchar i;
  for(i=0;i<7;i++)
   bcd_int(ucCurtm[i]);
 }  */
//
void SetTime(void)
 {
   v_W1302(0x8e,0x00);
   v_W1302(0x80,0x80);
   v_W1302(0x82,min);
   v_W1302(0x84,hou);
   v_W1302(0x86,day);
   v_W1302(0x88,mon);
   v_W1302(0x8c,yea);
   v_W1302(0x80,0x00);
   v_W1302(0x8e,0x80);
 }

关键字:单片机  ds1302  时钟C程序 引用地址:单片机控制ds1302的时钟C程序

上一篇:单片机驱动16*16点阵LED汉字显示c51程序
下一篇:单片机一键多功能按键识别技术

推荐阅读最新更新时间:2024-03-16 13:14

AVR M16单片机NRF2401无线通信开发包
单片机源程序如下: //ICC-AVR application builder : // Target : M16 // Crystal: 8.0000Mhz #include iom16v.h #include macros.h //------------------------------------------------------------------------------ //--------------------------------NRF24L01接口定义-------------------------------- //-------------------------------------
[单片机]
51单片机写中断程序的一般步骤
51单片机内部有5个中断源: 1、INT0 外部中断0(序号0); 2、T0 定时器/计数器0中断(1); 3、INT1 外部中断1(2); 4、T1 定时器/计数器1中断(3); 5、T1/R1 串行口中断;(4) 外部中断程序步骤(以外部中断0为例): 1、EA=1 //开总中断 2、EX0=1//开外部中断0 3、IT0=1//跳变沿触发(默认为0,0为低电平触发) 中断服务程序 void 函数名() interrupt 0 { 中断处理内容 } 定时器中断程序步骤(以定时器0中断为例) 1、TMOD=0x01(设置定时器0为工作方式1) 2、TH0=(65536-50000)/256
[单片机]
51单片机心形灯实现从左到右顺时针流水编程
心形灯原理图 编译软件:Keil uVision5 (如有需要可点此链接下载:https://download.csdn.net/download/qq_36931762/11343174) 单片机程序下载软件:STC-ISP (如有需要可点此链接下载:https://download.csdn.net/download/qq_36931762/11343157) 程序代码: #include reg51.h #include intrins.h unsigned char code table ={0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; unsigned
[单片机]
51<font color='red'>单片机</font>心形灯实现从左到右顺时针流水编程
MSP430单片机在PTN产品中的应用
简介:详细介绍了阿尔卡特朗讯1850业务传输平台TSS-5通用单板控制器的功能以及MSP430单片机在FIN产品中的应用。TSS-5系统选取MSP4 30单片机作为它的通用单板控制器,单板控制器主要用于监测外部电压、电流、探测槽位号、控制面板LED灯、下载FPGA固件、控制外部电压,监测单板锁存器状态以及主板的通讯。 PTN是一种以面向连接的分组技术为内核,同时具备端到端的业务管理、层次化OAM及电信级保护等传送特性,以承载电信级以太网业务为主,兼容TDM、ATM等业务的综合传送技术。 PTN分组传送网是目前传输界公认取代SDH的下一代传输技术,1850TSS是阿尔卡特朗讯为应对移动IP业务发展的趋势确定性以及模式不确定性
[单片机]
MSP430<font color='red'>单片机</font>在PTN产品中的应用
AT89S51单片机原理与应用
一、AT89S51与AT89C51的区别 这里,初学者要澄清单片机实际使用方面的一个产品概念,MCS-51单片机是美国INTE公司于1980年推出的产品,典型产品有8031(内部没有程序存储器,实际使用方面已经被市场淘汰)、8051(芯片采用HMOS,功耗是630mW,是89C51的5倍,实际使用方面已经被市场淘汰)和8751等通用产品,一直到现在,MCS-51内核系列兼容的单片机仍是应用的主流产品(比如目前流行的89S51、已经停产的89C51等),各高校及专业学校的培训教材仍与MCS-51单片机作为代表进行理论基础学习。 有些文献甚至也将8051泛指MCS-51系列单片机,8051是早期的最典型的代表作,由于MCS-51单
[单片机]
单片机控制GSM模块(TC35I)电路设计
虽然单片机和TC35I模块都是TTL电平,但是TC35模块输入输出的TTL正电平逻辑不是+5V,而是+2.9V,但是单片机的输入输出的TTL正电平逻辑是+5V,所以如果直接将TC35I的RX,TX与单片机的TX,RX对应连接后,当然也要连接GND,是不会通信的,因为电平不统一。 解决方法; 1.给单片机的RX TX的IO口加上拉电阻,也就是分压,叫它那两个IO的电压等于2.9V左右,和GSM模块匹配。 2。给GSM模块上面的RX,TX加OC门驱动,提高电压。 3。单片机和GSM模块上面如果都有DB9(串口)和MAX232,那么可以直接将单片机的DB9和GSM模块的DB9上面的2-3.3-2.5-5这样连接。 O
[单片机]
基于AVR单片机对热敏电阻的温度测量
1 负温热敏电阻 PSB型负温热敏电阻由Co,Mn,Ni等过渡金属元素的氧化物组成,经高温烧成半陶瓷,利用半导体毫微米的精密加工工艺,采用玻璃管封装,耐温性好,可靠性高,反应速度快、灵敏度高。他采用轴向型结构,便于安装,能承受更高温度,且玻璃封装耐高低温(-50~350℃)。PT-25E2热敏电阻温度阻值变化曲线图如图1所示。 2 AVR单片机测温原理 温度测量电路如图2所示,标准电阻Rp,热敏电阻Rt,电容C1与AVR单片机三个引脚相连。其中PC0,PC1为一般普通IO引脚,CP1为捕获触发输入引脚,可以设定上升沿触发捕获中断。 Rp为100 kΩ的精密电阻;Rt为100 kΩ精度为1%的热敏电阻;C1为0.1μF的瓷片电
[单片机]
基于AVR<font color='red'>单片机</font>对热敏电阻的温度测量
51单片机控制步进电机硬件连接部分
1、概要: 本案例讲解的内容是51单片机控制步进电机硬件连接部分。后续会分别讲解单片机程序,S曲线加减速方法,上位机等相关内容 2、功能原理图: 2.1、51单片机: ①输出脉冲到TB6600驱动器PUL端口,从而控制步进电机转动 ②控制TB6600驱动器ENA端口,从而控制步进电机使能 ③控制TB6600驱动器DIR端口,从而控制步进电机转动方向 2.2、步进电机: ①提供机械动力 2.3、稳压电源: ①为步进电机提供电源 2.4、TB6600驱动器: ①二相四线步进电机专用驱动器 3、实物图: ** ①** 、51****单片机控制板一个 ** ②** 、二相四线步进电机一个 ** ③** 、稳压电源一个 ** ④** 、
[单片机]
51<font color='red'>单片机</font>控制步进电机硬件连接部分
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved