電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 2318|回復: 6
收起左側(cè)

單片機C語言實例-206-12864+DS1302時鐘+18B20溫度計

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2022-2-23 14:26:22 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機C語言實例-206-12864+DS1302時鐘+18B20溫度計

/**************************************************************************

                                   THE REAL TIMER DS1302 DRIVER LIB

                             COPYRIGHT (c)   2005 BY JJJ.
                                       --  ALL RIGHTS RESERVED  --

   File Name:       DS1302.h
   Author:          Jiang Jian Jun
   Created:         2003/7/21
   Modified:                NO
   Revision:                 1.0

***************************************************************************/
#ifndef _REAL_TIMER_DS1302_2003_7_21_
#define _REAL_TIMER_DS1302_2003_7_21_

sbit  DS1302_CLK = P2^4;              //實時時鐘時鐘線引腳
sbit  DS1302_IO  = P2^5;              //實時時鐘數(shù)據(jù)線引腳
sbit  DS1302_RST = P2^6;              //實時時鐘復位線引腳
sbit  ACC0 = ACC^0;
sbit  ACC7 = ACC^7;
char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;

typedef struct __SYSTEMTIME__
{
        unsigned char Second;
        unsigned char Minute;
        unsigned char Hour;
        unsigned char Week;
        unsigned char Day;
        unsigned char Month;
        unsigned char  Year;
        unsigned char DateString[11];
        unsigned char TimeString[9];
}SYSTEMTIME;        //定義的時間類型

#define AM(X)        X
#define PM(X)        (X+12)                      // 轉(zhuǎn)成24小時制
#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
#define DS1302_RAM(X)        (0xC0+(X)*2)           //用于計算 DS1302_RAM 地址的宏

void DS1302InputByte(unsigned char d)         //實時時鐘寫入一字節(jié)(內(nèi)部函數(shù))
{
    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)         //實時時鐘讀取一字節(jié)(內(nèi)部函數(shù))
{
    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: 要寫的數(shù)據(jù)
{
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr);               // 地址,命令
    DS1302InputByte(ucDa);               // 寫1Byte數(shù)據(jù)
    DS1302_CLK = 1;
    DS1302_RST = 0;
}

unsigned char Read1302(unsigned char ucAddr)        //讀取DS1302某地址的數(shù)據(jù)
{
    unsigned char ucData;
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr|0x01);        // 地址,命令
    ucData = DS1302OutputByte();         // 讀1Byte數(shù)據(jù)
    DS1302_CLK = 1;
    DS1302_RST = 0;
    return(ucData);
}

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

void DS1302_SetTime(unsigned char Address, unsigned char Value)        // 設置時間函數(shù)
{
        DS1302_SetProtect(0);
        Write1302(Address, ((Value/10)<<4 | (Value%10)));
}

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

void DateToStr(SYSTEMTIME *Time)
{   if(hide_year<2)
    {
          Time->DateString[0] = Time->Year/10 + '0';
          Time->DateString[1] = Time->Year%10 + '0';
        }
          else
            {
              Time->DateString[0] = ' ';
              Time->DateString[1] = ' ';
                }
        Time->DateString[2] = '-';
        if(hide_month<2)
        {
          Time->DateString[3] = Time->Month/10 + '0';
          Time->DateString[4] = Time->Month%10 + '0';
        }
          else
          {
            Time->DateString[3] = ' ';
            Time->DateString[4] = ' ';
          }
        Time->DateString[5] = '-';
        if(hide_day<2)
        {
          Time->DateString[6] = Time->Day/10 + '0';
          Time->DateString[7] = Time->Day%10 + '0';
        }
          else
          {
            Time->DateString[6] = ' ';
            Time->DateString[7] = ' ';            
          }
        if(hide_week<2)
        {
          Time->DateString[8] = ' ';
          Time->DateString[9] = Time->Week%10 + '0';
        }
          else
          {
            Time->DateString[8] = ' ';
            Time->DateString[9] = ' ';
          }

        Time->DateString[10] = '\0';
}

void TimeToStr(SYSTEMTIME *Time)
{   if(hide_hour<2)
    {
          Time->TimeString[0] = Time->Hour/10 + '0';
          Time->TimeString[1] = Time->Hour%10 + '0';
        }
          else
            {
              Time->TimeString[0] = ' ';
              Time->TimeString[1] = ' ';
                }
        Time->TimeString[2] = ':';
    if(hide_min<2)
        {
          Time->TimeString[3] = Time->Minute/10 + '0';
          Time->TimeString[4] = Time->Minute%10 + '0';
        }
          else
            {
              Time->TimeString[3] = ' ';
              Time->TimeString[4] = ' ';
               }
        Time->TimeString[5] = ':';
    if(hide_sec<2)
    {
          Time->TimeString[6] = Time->Second/10 + '0';
          Time->TimeString[7] = Time->Second%10 + '0';
    }
      else
       {
         Time->TimeString[6] = ' ';
             Time->TimeString[7] = ' ';
       }
        Time->DateString[8] = '\0';
}

void Initial_DS1302(void)
{   
        unsigned char Second=Read1302(DS1302_SECOND);
        Write1302(0x8e,0x00); //寫入允許
        Write1302(0x80,0x50);
        Write1302(0x82,0x56);
        Write1302(0x84,0x22);
        Write1302(0x8e,0x80); //禁止寫入
        if(Second&0x80)                  
                DS1302_SetTime(DS1302_SECOND,0x80);
}

#endif


更多詳情參考附件文檔

游客,如果您要查看本帖隱藏內(nèi)容請回復

回復

使用道具 舉報

3

主題

303

帖子

1432

積分

三級會員

Rank: 3Rank: 3

積分
1432
沙發(fā)
發(fā)表于 2023-8-10 00:27:30 | 只看該作者
正需要呢,樓主辛苦了
回復 支持 反對

使用道具 舉報

0

主題

507

帖子

956

積分

二級會員

Rank: 2

積分
956
板凳
發(fā)表于 2023-8-30 09:23:30 | 只看該作者
謝謝分享                           
回復 支持 反對

使用道具 舉報

8

主題

1177

帖子

6110

積分

高級會員

Rank: 5Rank: 5

積分
6110
地板
發(fā)表于 2023-9-2 07:07:39 | 只看該作者
謝謝分享,學習學習
回復 支持 反對

使用道具 舉報

0

主題

507

帖子

956

積分

二級會員

Rank: 2

積分
956
5#
發(fā)表于 2023-9-3 18:09:34 | 只看該作者
謝謝分享                              
回復 支持 反對

使用道具 舉報

4

主題

157

帖子

534

積分

二級會員

Rank: 2

積分
534
6#
發(fā)表于 2023-9-24 11:26:46 | 只看該作者
6666666666666666666666666666
回復 支持 反對

使用道具 舉報

0

主題

21

帖子

86

積分

一級會員

Rank: 1

積分
86
7#
發(fā)表于 2024-7-23 18:30:47 | 只看該作者
您好!我是一名電子信息專業(yè)的學生,前來學習學習

回復 支持 反對

使用道具 舉報

發(fā)表回復

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表