蓝桥杯记录第七篇_DS1302(时钟)

驱动

#include <ds1302.h>
#include <intrins.h>

sbit SCK=P1^7;  
sbit SDA=P2^3;  
sbit RST = P1^3;   // DS1302复位

void Write_Ds1302(unsigned  char temp) 
{
 unsigned char i;
 for (i=0;i<8;i++)      
 { 
  SCK=0;
  SDA=temp&0x01;
  temp>>=1; 
  SCK=1;
 }
}   

void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{
  RST=0; _nop_();
  SCK=0; _nop_();
  RST=1;  _nop_();  
  Write_Ds1302(address); 
  Write_Ds1302(dat);  
  RST=0; 
}

unsigned char Read_Ds1302_Byte ( unsigned char address )
{
  unsigned char i,temp=0x00;
  RST=0; _nop_();
  SCK=0; _nop_();
  RST=1; _nop_();
  Write_Ds1302(address);
  for (i=0;i<8;i++)  
  {  
  SCK=0;
  temp>>=1; 
   if(SDA)
   temp|=0x80; 
   SCK=1;
 } 
  RST=0; _nop_();
  SCK=0; _nop_();
 SCK=1; _nop_();
 SDA=0; _nop_();
 SDA=1; _nop_();
 return (temp);   
}

自己添加的

ds1302.c:

unsigned char code addr_write[3]={0X80,0X82,0X84}; //写地址 
unsigned char code addr_read[3]={0X81,0X83,0X85}; //读地址
unsigned char time[3]={0X50,0X59,0X23};          
//初始化的时间:23:59:50


/**
* @Function       ds1302_wrtie_time
* @Description:   写时间
* @param          void
* @return         void 
*/
void ds1302_write_time(void)
{
 unsigned char i=0;
 EA=0;
 Write_Ds1302(0X8E,0X00);            //清除写保护
 for(i=0;i<3;i++)
 {
   Write_Ds1302(addr_write[i],time[i]);  
 }
 Write_Ds1302(0X8E,0X80);           //开启写保护
 EA=1;
}


/**
* @Function       ds1302_read_time
* @Description:   读时间
* @param          void
* @return         void 
*/
void ds1302_read_time(void)
{
  unsigned char i=0;
 EA=0;
 for(i=0;i<3;i++)
 {
   time[i]=Read_Ds1302 (addr_read[i]);
 } 
 EA=1;
}

ds1302.h:

#ifndef _DS1302_H_
#define _DS1302_H_

#include <STC15F2K60S2.H>

void ds1302_write_time(void);
void ds1302_read_time(void);

extern unsigned char time[3];

#endif

main.c

void main(void)
{
  ds1302_write_time();
  while(1)
  {
    ds1302_read_time();
 
   /********显示*********/
   dspbuf[0]=time[2]/16;
   dspbuf[1]=time[2]%16;
   dspbuf[2]=10;
   dspbuf[3]=time[1]/16;
   dspbuf[4]=time[1]%16;
   dspbuf[5]=10;
   dspbuf[6]=time[0]/16;
   dspbuf[7]=time[0]%16;
  }
}

扩展(一些考过的应用)

  1. 调成12小时制
    if(time[2]>0X12)              //如果大于12小时,就减去12个小时
    {
      dspbuf[0]=(time[2]-0X12)/16;
      dspbuf[1]=(time[2]-0X12)%16;
    }
    else                         //其他正常显示
    {
      dspbuf[0]=time[2]/16;
      dspbuf[1]=time[2]%16;    
    }
    dspbuf[2]=10;
    dspbuf[3]=time[1]/16;
    dspbuf[4]=time[1]%16;
    dspbuf[5]=10;
    dspbuf[6]=time[0]/16;
    dspbuf[7]=time[0]%16;
  1. 时间的暂停和开始

比如时间停止显示,按下K4后开始
原理:秒位的寄存器第0位CH
当CH为1时时间停止
则在再写对应的秒位或上“1000 0000” 能让第0位“CH”置1
从而达到停止时间的目的

  if(k4_press)
  {
    k4_press=0;
   if(k4_count==0)
   {
     flag_time=1;
    k4_count=!k4_count;
   }
   else if(k4_count==1)
   {
     flag_time=0;
    k4_count=!k4_count;
   }
  }

  if(flag_time==0)  //上电初始值为0,按键按下后变为1
     Write_Ds1302(0X80,time[0]|0X80);   //上电为CH=1;
  

3.调整时间(以调小时为例)

unsigned time_set //设置一个中间变量

if(按键按下)
{
    time_set=time[2]/16*10+time[2]%16;  //把当前的时间读成10进制
    time_set++;                         //加一个小时
    
    if(!(time_set>=0 && time_set<24))   //判断是否在0~24小时之间
    time_set=0;    
    
    time[2]=time_set/10*16+time_set%10; //变回16进制
    
    Write_Ds1302(0X8E,0X00);                 //清除写保护
    Write_Ds1302(addr_write[2],time[2]);     //写时间
    Write_Ds1302(0X8E,0X80);                 //开启写保护
}
  1. 闹钟
  if(time[2]==time_alarm[2])
  {
   if(time[1]==time_alarm[1])
   {
     if(time[0]==time_alarm[0])
      flag_alarm=1;    //闹钟标志位置1
    else 
     flag_alarm=0;     //闹钟标志位置0
   }
  }
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值