欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
keilc51編譯ds1302問題,顯示85-85-85
[打印本頁]
作者:
linuxcso
時間:
2018-10-12 10:22
標題:
keilc51編譯ds1302問題,顯示85-85-85
用c51v959編譯一個ds1302 的程序,在Proteus下運行顯示年月日85-85-85(應該顯示18-10-12)
換成舊的c51v953重新編譯 顯示正常
1 提醒小伙伴做時鐘仿真的時候注意。
2 請大神分析一下到底是什么原因造成了這一問題?
編譯器特性的改變?程序的寫法?提供一下思路也行啊,謝謝
31Ds102_usart.rar
2018-10-12 11:17 上傳
點擊文件名下載附件
37.73 KB, 下載次數: 11
源碼+仿真
作者:
linuxcso
時間:
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; //定時器1的工作方式2
TH1=0xfd,TL1=0xfd;
TI=1; //這里一定要注意
TR1=1; //打開定時器
}
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);
}
}
作者:
linuxcso
時間:
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; //實時時鐘時鐘線引腳
sbit DS1302_IO = P2^1; //實時時鐘數據線引腳
sbit DS1302_RST = P2^2; //實時時鐘復位線引腳
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; //定義的時間類型
#define AM(X) X
#define PM(X) (X+12) // 轉成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) //實時時鐘寫入一字節(內部函數)
{
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_SetTime(unsigned char Address, unsigned char Value) // 設置時間函數
{
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寫入時鐘數據(多字節方式)
{
unsigned char i;
Write1302(0x8e,0x00); // 控制命令,WP=0,寫操作?
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(0xbe); // 0xbe:時鐘多字節寫命令
for (i = 8; i>0; i--) //8Byte = 7Byte 時鐘數據 + 1Byte 控制
{
DS1302InputByte(*pWClock); // 寫1Byte數據
pWClock++;
}
DS1302_CLK = 1;
DS1302_RST = 0;
}
void BurstRead1302(unsigned char *pRClock) //讀取DS1302時鐘數據(時鐘多字節方式)
{
unsigned char i;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(0xbf); // 0xbf:時鐘多字節讀命令
for (i=8; i>0; i--)
{
*pRClock = DS1302OutputByte(); // 讀1Byte數據
pRClock++;
}
DS1302_CLK = 1;
DS1302_RST = 0;
}
void DS1302_TimeStop(bit flag) // 是否將時鐘停止
{
unsigned char Data;
Data=Read1302(DS1302_SECOND);
DS1302_SetProtect(0);
if(flag)
Write1302(DS1302_SECOND, Data|0x80);
else
Write1302(DS1302_SECOND, Data&0x7F);
}
********************************************************************************/
#endif
作者:
linuxcso
時間:
2018-11-5 17:41
問題已解決acc寄存器的問題
作者:
BlueBlue--
時間:
2020-2-19 15:30
請問最后怎么解決的,最近剛好遇到了這個問題
作者:
小白222
時間:
2020-3-17 22:36
ACC寄存器啥問題?
作者:
融昧
時間:
2020-7-21 19:29
//往DS1302寫入1Byte數據 void WriteB(uchar ucDa){ uchar i,dat; dat = ucDa; for(i=8; i>0; i--){ T_IO = dat & 0x01; //相當于匯編中的 RRC T_CLK = 1; T_CLK = 0; dat = dat >> 1; } } //從DS1302讀取1Byte數據 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; //相當于匯編中的 RRC } return(b); }
作者:
融昧
時間:
2020-7-21 20:10
在c語言中使用ACC寄存器,用Keil4編譯沒有問題,但是keil5編譯,就會出問題的
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1