找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3744|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

keilc51編譯ds1302問(wèn)題,顯示85-85-85

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:104982 發(fā)表于 2018-10-12 10:22 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
用c51v959編譯一個(gè)ds1302 的程序,在Proteus下運(yùn)行顯示年月日85-85-85(應(yīng)該顯示18-10-12)
換成舊的c51v953重新編譯  顯示正常
1 提醒小伙伴做時(shí)鐘仿真的時(shí)候注意。
2 請(qǐng)大神分析一下到底是什么原因造成了這一問(wèn)題?
編譯器特性的改變?程序的寫(xiě)法?提供一下思路也行啊,謝謝

31Ds102_usart.rar

37.73 KB, 下載次數(shù): 11

源碼+仿真

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:104982 發(fā)表于 2018-10-12 10:31 | 只看該作者
#include<reg52.h>
#include<stdio.h>
#include <string.h>
#include "DS1302.h"
#define uint unsigned int
#define uchar unsigned char
void Delay(uint x)
{
        uchar i;
        while(x--)
        {
                 for(i=0;i<120;i++);
        }
}
void uart(void)                                        //串口通信初始化
{
        SCON=0x40;                                        //串口通信工作方式1
        REN=1;                                                //允許接收
        TMOD=0x20;                                        //定時(shí)器1的工作方式2
        TH1=0xfd,TL1=0xfd;               
        TI=1;                       //這里一定要注意
        TR1=1;                                                //打開(kāi)定時(shí)器
}               
void Time_show(void)
{
        SYSTEMTIME CurrentTime;       
    DS1302_GetTime(&CurrentTime);
                DateToStr(&CurrentTime);
                TimeToStr(&CurrentTime);
          printf("\r\nCurrentTime.DateString %s\r\n",CurrentTime.DateString);   
                Delay(100);   
}
void main(void)
{
        unsigned char i,RValue;
        unsigned char  RYear;
        uint up=0,down=0,high=0;
        uint result ;
        uart();
        Initial_DS1302();
        while(1)
                {
                        printf("**************usart test******************\r\n");                       
                        Time_show();
                        Delay(1000);
                }
}
回復(fù)

使用道具 舉報(bào)

板凳
ID:104982 發(fā)表于 2018-10-12 10:32 | 只看該作者
/**************************************************************************
  
                                   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^0;              //實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳
sbit  DS1302_IO  = P2^1;              //實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳
sbit  DS1302_RST = P2^2;              //實(shí)時(shí)時(shí)鐘復(fù)位線引腳
sbit  ACC0 = ACC^0;
sbit  ACC7 = ACC^7;

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[9];
        unsigned char TimeString[9];
}SYSTEMTIME;        //定義的時(shí)間類(lèi)型

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

void DS1302InputByte(unsigned char d)         //實(shí)時(shí)時(shí)鐘寫(xiě)入一字節(jié)(內(nèi)部函數(shù))
{
    unsigned char i;
    ACC = d;
    for(i=8; i>0; i--)
    {
        DS1302_IO = ACC0;                   //相當(dāng)于匯編中的 RRC
        DS1302_CLK = 1;
        DS1302_CLK = 0;
        ACC = ACC >> 1;
    }
}

unsigned char DS1302OutputByte(void)         //實(shí)時(shí)時(shí)鐘讀取一字節(jié)(內(nèi)部函數(shù))
{
    unsigned char i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;                                 //相當(dāng)于匯編中的 RRC
        ACC7 = DS1302_IO;
        DS1302_CLK = 1;
        DS1302_CLK = 0;
    }
    return(ACC);
}

void Write1302(unsigned char ucAddr, unsigned char ucDa)        //ucAddr: DS1302地址, ucData: 要寫(xiě)的數(shù)據(jù)
{
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr);               // 地址,命令
    DS1302InputByte(ucDa);               // 寫(xiě)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)        //是否寫(xiě)保護(hù)
{
        if(flag)
                Write1302(0x8E,0x10);
        else
                Write1302(0x8E,0x00);
}

void DS1302_SetTime(unsigned char Address, unsigned char Value)        // 設(shè)置時(shí)間函數(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)
{
        Time->DateString[0] = Time->Year/10 + '0';
        Time->DateString[1] = Time->Year%10 + '0';
        Time->DateString[2] = '-';
        Time->DateString[3] = Time->Month/10 + '0';
        Time->DateString[4] = Time->Month%10 + '0';
        Time->DateString[5] = '-';
        Time->DateString[6] = Time->Day/10 + '0';
        Time->DateString[7] = Time->Day%10 + '0';
        Time->DateString[8] = '\0';
}

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

void Initial_DS1302(void)
{
        unsigned char Second=Read1302(DS1302_SECOND);
        if(Second&0x80)                  
                DS1302_SetTime(DS1302_SECOND,0);
}

/********************************************************************************
void BurstWrite1302(unsigned char *pWClock)        //往DS1302寫(xiě)入時(shí)鐘數(shù)據(jù)(多字節(jié)方式)
{
    unsigned char i;
    Write1302(0x8e,0x00);                 // 控制命令,WP=0,寫(xiě)操作?
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(0xbe);                // 0xbe:時(shí)鐘多字節(jié)寫(xiě)命令
    for (i = 8; i>0; i--)                     //8Byte = 7Byte 時(shí)鐘數(shù)據(jù) + 1Byte 控制
    {
        DS1302InputByte(*pWClock);         // 寫(xiě)1Byte數(shù)據(jù)
        pWClock++;
    }
    DS1302_CLK = 1;
    DS1302_RST = 0;
}

void BurstRead1302(unsigned char *pRClock)        //讀取DS1302時(shí)鐘數(shù)據(jù)(時(shí)鐘多字節(jié)方式)
{
    unsigned char i;
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(0xbf);                     // 0xbf:時(shí)鐘多字節(jié)讀命令
    for (i=8; i>0; i--)
    {
       *pRClock = DS1302OutputByte();   // 讀1Byte數(shù)據(jù)
       pRClock++;
    }
    DS1302_CLK = 1;
    DS1302_RST = 0;
}

void DS1302_TimeStop(bit flag)           // 是否將時(shí)鐘停止
{
        unsigned char Data;
        Data=Read1302(DS1302_SECOND);
        DS1302_SetProtect(0);
        if(flag)
                Write1302(DS1302_SECOND, Data|0x80);
        else
                Write1302(DS1302_SECOND, Data&0x7F);
}
********************************************************************************/
#endif
回復(fù)

使用道具 舉報(bào)

地板
ID:104982 發(fā)表于 2018-11-5 17:41 | 只看該作者
問(wèn)題已解決acc寄存器的問(wèn)題
回復(fù)

使用道具 舉報(bào)

5#
ID:694766 發(fā)表于 2020-2-19 15:30 | 只看該作者
請(qǐng)問(wèn)最后怎么解決的,最近剛好遇到了這個(gè)問(wèn)題
回復(fù)

使用道具 舉報(bào)

6#
ID:379034 發(fā)表于 2020-3-17 22:36 | 只看該作者
ACC寄存器啥問(wèn)題?
回復(fù)

使用道具 舉報(bào)

7#
ID:806448 發(fā)表于 2020-7-21 19:29 來(lái)自手機(jī) | 只看該作者
//往DS1302寫(xiě)入1Byte數(shù)據(jù) void  WriteB(uchar  ucDa){          uchar  i,dat;         dat = ucDa;         for(i=8; i>0; i--){                 T_IO = dat & 0x01;        //相當(dāng)于匯編中的 RRC                 T_CLK = 1;                 T_CLK = 0;                 dat = dat >> 1;                  }  } //從DS1302讀取1Byte數(shù)據(jù) uchar  ReadB(void)                  {  uchar i,b=0;         for(i=8; i>0; i--)         {                 b >>= 1;                 if(T_IO){                         b |= 0x80;                         }                 else{                 b &= 0x7f;                 }                 T_CLK = 1;                 T_CLK = 0;    //相當(dāng)于匯編中的 RRC          }  return(b);  }
回復(fù)

使用道具 舉報(bào)

8#
ID:806448 發(fā)表于 2020-7-21 20:10 來(lái)自手機(jī) | 只看該作者
在c語(yǔ)言中使用ACC寄存器,用Keil4編譯沒(méi)有問(wèn)題,但是keil5編譯,就會(huì)出問(wèn)題的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表