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

📄 han.c

📁 ds1302实验
💻 C
字号:
#include "intrins.h"
#include <LCD.c>
#include <reg51.h>
sbit  DS1302_CLK = P1^5;              //实时时钟时钟线引脚 
sbit  DS1302_IO  = P1^6;              //实时时钟数据线引脚 
sbit  DS1302_RST = P1^7;              //实时时钟复位线引脚
sbit  ACC0 = ACC^0;
sbit  ACC7 = ACC^7;


 unsigned char  Second;
 unsigned char  Minute;
 unsigned char  Hour;
 unsigned char  Week;
 unsigned char  Day;
 unsigned char Month;
 unsigned char  Year;
 unsigned char DateString[9];
 unsigned char TimeString[9];            
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR  0x84 
#define DS1302_WEEK  0x8A
#define DS1302_DAY  0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR  0x8C
 void delay_50ms(unsigned int t)
{
 unsigned int j;   
 for(;t>0;t--) 
  for(j=6245;j>0;j--) 
       ;
}



unsigned char stop=0;//stop ring

 

void DS1302InputByte(unsigned char d)  //实时时钟写入一字节(内部函数)
{ 
    unsigned char i;
    ACC = d;
    for(i=8; i>0; i--)
    {
        DS1302_IO = ACC0;            //相当于汇编中的 RRC
        DS1302_CLK = 1;
        DS1302_CLK = 0;
        ACC = ACC >> 1; 
    } 
}

unsigned char DS1302OutputByte(void)  //实时时钟读取一字节(内部函数)
{ 
    unsigned char i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;            //相当于汇编中的 RRC 
        ACC7 = DS1302_IO;
        DS1302_CLK = 1;
        DS1302_CLK = 0;
    } 
    return(ACC); 
}

void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
{
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr);        // 地址,命令 
    DS1302InputByte(ucDa);        // 写1Byte数据
    DS1302_CLK = 1;
    DS1302_RST = 0;
} 

unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
{
    unsigned char ucData;
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr|0x01);        // 地址,命令 
    ucData = DS1302OutputByte();         // 读1Byte数据
    DS1302_CLK = 1;
    DS1302_RST = 0;
    return(ucData);
}

void DS1302_SetProtect(bit flag)        //是否写保护
{
 if(flag)
  Write1302(0x8E,0x10);
 else
  Write1302(0x8E,0x00);
}

void DS1302_Set_Time(unsigned char Address, unsigned char Value)        // 设置时间函数
{
 DS1302_SetProtect(0); //cancel the write protection
 Write1302(Address, ((Value/10)<<4 | (Value%10))); 
}    

 void DS1302_GetTime()
{
 unsigned char ReadValue;
 ReadValue = Read1302(DS1302_SECOND);
Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 ReadValue = Read1302(DS1302_MINUTE);
Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 //Alarm2[1]= Time->Minute;
 ReadValue = Read1302(DS1302_HOUR);
Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
// Alarm2[0]= Time->Hour;
 ReadValue = Read1302(DS1302_DAY);
Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); 
 ReadValue = Read1302(DS1302_WEEK);
Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 ReadValue = Read1302(DS1302_MONTH);
Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 ReadValue = Read1302(DS1302_YEAR);
Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); 
} 

void DateToStr()
{
 DateString[0] = Year/10 + '0';
 DateString[1] = Year%10 + '0';
 DateString[2] = '-';
 DateString[3] = Month/10 + '0';
 DateString[4] = Month%10 + '0';
 DateString[5] = '-';
 DateString[6] = Day/10 + '0';
 DateString[7] = Day%10 + '0';
 DateString[8] = '\0';
}

void TimeToStr()
{
TimeString[0] = Hour/10 + '0';
TimeString[1] = Hour%10 + '0';
TimeString[2] = ':';
TimeString[3] = Minute/10 + '0';
TimeString[4] = Minute%10 + '0';
TimeString[5] = ':';
TimeString[6] = Second/10 + '0';
TimeString[7] = Second%10 + '0';
TimeString[8] = '\0';
}

void Initial_DS1302(void)
{
 unsigned char Second=Read1302(DS1302_SECOND);
 if(Second&0x80)    
  DS1302_Set_Time(DS1302_SECOND,0);
}
 
void main()
{ 
   init_lcd ();
      Initial_DS1302(); 
   DS1302_Set_Time(DS1302_SECOND,0);
   DS1302_Set_Time(DS1302_MINUTE,1);
   DS1302_Set_Time(DS1302_HOUR,15);
   DS1302_Set_Time(DS1302_WEEK,6);
   DS1302_Set_Time(DS1302_DAY,11);
   DS1302_Set_Time(DS1302_MONTH,10);
   DS1302_Set_Time(DS1302_YEAR,8);
 while(1)
 { unsigned char i=0,j=0;

   DS1302_GetTime();
   TimeToStr();
   DateToStr();
   coordinate_1602(1,1);
  while(DateString[i]!='\0')
   { 
    wr_lcd(dat,DateString[i]);
    i++;  
   } 
   coordinate_1602(2,1);
  while(TimeString[j]!='\0')
   {
    wr_lcd(dat,TimeString[j]);
    j++;  
   } 
   delay_50ms(10); 
  }   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -