资源简介

采用三线制传输机制,通过单片机MCU的I/O实现三线制方式读取DS1302S时钟数据并分别将年、月、日、时间信息分别显示在数码管上。编写按键程序,实现不同按键显示年、月、日、时间等信息。

资源截图

代码片段和文件信息

#include “reg51.h“
#include “intrins.h“
#define uchar unsigned char
#define uint unsigned int
uchar code discode[]={0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f};
//数码管显示0~9的段码表

sbit DS1302_CLK = P3^6; //实时时钟时钟线引脚
sbit DS1302_IO = P3^4; //实时时钟数据线引脚
sbit DS1302_RST = P3^5; //实时时钟复位线引脚
sbit ACC0 = ACC^0; //定义ACC的最低位和最高位,在对ACC移位操作后,用于传输数据
sbit ACC7 = ACC^7;

typedef struct SYSTEM_TIME
{
uchar Second;
uchar Minute;
uchar Hour;
uchar Week;
uchar Day;
uchar Month;
uchar Year;
} SYSTEMTIME; //定义的时间类型结构体

#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

sbit K1=P3^1; //将K1位定义为P3.0引脚
sbit K2=P3^0; //将K2位定义为P3.1引脚
sbit K3=P3^2; //将K3位定义为P3.2引脚

SYSTEMTIME T; //声明一个储存时间信息的结构体

uchar k=0; //时间显示模式转换

/******内部指令**************/
void DS1302InputByte(uchar d) //实时时钟写入1B(内部函数)
{
uchar i;
ACC=d;
for(i=8;i>0;i--)
{
DS1302_IO=ACC0; //相当于汇编中的RRC
DS1302_CLK=1;
DS1302_CLK=0; //写数据在上升沿,且先写低位再写高位
ACC=ACC>>1; //因为在前面已定义ACC0=ACC^0;以便再次利用
}
}

uchar DS1302OutputByte(void) //函数功能:实时时钟读取1B(内部函数)
{
uchar i;
for(i=8;i>0;i--)
{
ACC=ACC>>1; //相当于汇编中的RRC
ACC7=DS1302_IO; //由低位到高位传播ACC7中的信息
DS1302_CLK=1; //读信息是在下降沿
DS1302_CLK=0;
}
DS1302_IO=0;
return (ACC);
}

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

uchar Read1302(uchar ucAddr) //读取DS1302某地址的数据
{
uchar ucData;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr|0x01); //上升沿,写地址,命令
ucData=DS1302OutputByte(); //下降沿,读1B数据
DS1302_CLK=1;
DS1302_RST=0;
return (ucData); //在上升沿之后进行写操作,在下降沿之前进行读操作
}

void DS1302_SetProtect(bit flag) //是否写保护
{
if(flag)
Write1302(0x8E0x80);
else
Write1302(0x8E0x00);
}

void DS1302_SetTime(uchar Addressuchar Value) //函数功能:设置时间
{
DS1302_SetProtect(0);
Write1302(Address((Value/10)<<4|(Value%10))); //将十进制数转换为BCD码
//在DS1302中的与日历、时钟相关的寄存器存放的数据必须为BCD码形式
}

void DS1302_GetTime(SYSTEMTIME *Time)
{
uchar ReadValue;
ReadValue=Read1302(DS1302_SECOND);
//将BCD码转换为十进制数,此处为结构体操作
Time->Second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
ReadValue=Read1302(DS1302_MINUTE);
Time->Minute=((ReadValue&0x70)>>4)*10+(R

评论

共有 条评论