#include <REGX52.H>
//引脚定义;
sbit DS1302_SCLK=P3^6;
sbit DS1302_IO=P3^4;
sbit DS1302_CE=P3^5;
//对应寄存器位置定义
#define DS1302_SECOND 0X80
#define DS1302_MINUTE 0X82
#define DS1302_HOUR 0X84
#define DS1302_DATE 0X86
#define DS1302_MONTH 0X88
#define DS1302_DAY 0X8A
#define DS1302_YEAR 0X8C
#define DS1302_WP 0X8E
//定义数组,用于存放设定的时间,年月日时分秒星期
unsigned char DS1302_Time[]={23,10,28,19,01,55,6};//顺序:年月日时分秒星期
/**
*@breaf DS1302初始化
*@param无
*@retval无
*/
void DS1302_Init()
{
DS1302_CE = 0; // 将使能位置0,低电平;
DS1302_SCLK=0;//将时钟位置0,低电平;
}
/**
*@breaf DS1302单字节写入函数
*@param command:写入控制指令的指令,包含要写入寄存器的地址;
*@param Data:将要写入的数据内容;
*@retval 无
*/
void DS1302_WriteBety(unsigned char command, Data)
{
unsigned char i;
DS1302_CE = 1;//使能位置高电平;
for (i = 0; i<8; i++)//控制寄存器数据需要通过IO线一个一个写入控制寄存器;低位先写入
{
DS1302_IO = command&(0x01 << i);//相当于把第1--7位置0,只留第0位,如果第0位是0,则为0;反之则为1;
DS1302_SCLK = 1;
DS1302_SCLK = 0;
}
for (i = 0; i<8; i++)//数据写入
{
DS1302_IO = Data&(0x01 << i);//相当于把第1--7位置0,只留第0位,如果第0位是0,则为0;反之则为1;
DS1302_SCLK = 1;
DS1302_SCLK = 0;
}
DS1302_CE = 0;
}
/**
*@breaf DS1302单字节读出函数
*@param command:写入控制指令的指令,包含要读出寄存器的地址;
*@retval Data:读出的数据;
*/
unsigned char DS1302_ReadBety(unsigned char command)
{
unsigned i, Data = 0X00;
command |= 0X01;//写入指令与读出指令只在最后一位相差1,故在此利用或运算消除;
DS1302_CE = 1;//使能位置高电平;
for (i = 0; i<8; i++)//控制寄存器数据需要通过IO线一个一个写入控制寄存器;低位先写入
{
DS1302_IO = command&(0x01 << i);//相当于把第1--7位置0,只留第0位,如果第0位是0,则为0;反之则为1;
DS1302_SCLK = 0;
DS1302_SCLK = 1;
}
DS1302_IO = 0;
for (i = 0; i<8; i++)//数据读出
{
DS1302_SCLK = 1;
DS1302_SCLK = 0;
if (DS1302_IO)
{
Data |= (0X01 << i);
}
}
DS1302_CE = 0;
return Data;
}
/**
*@breaf 向DS1302内设定时间
*@param无
*@retval无
*/
void DS1302_SetTime()
{
DS1302_WriteBety(DS1302_WP, 0x00);//操作 DS1302 之前,关闭写保护,不然指令无法进入控制寄存器;
DS1302_WriteBety(DS1302_YEAR, DS1302_Time[0] / 10 * 16 + DS1302_Time[0] % 10);//写入年,并将10进制转化BCD码;
DS1302_WriteBety(DS1302_MONTH, DS1302_Time[1] / 10 * 16 + DS1302_Time[1] % 10);//写入月,并将10进制转化BCD码;
DS1302_WriteBety(DS1302_DATE, DS1302_Time[2] / 10 * 16 + DS1302_Time[2] % 10);//写入日,并将10进制转化BCD码;
DS1302_WriteBety(DS1302_HOUR, DS1302_Time[3] / 10 * 16 + DS1302_Time[3] % 10);//写入时,并将10进制转化BCD码;
DS1302_WriteBety(DS1302_MINUTE, DS1302_Time[4] / 10 * 16 + DS1302_Time[4] % 10);//写入分,并将10进制转化BCD码;
DS1302_WriteBety(DS1302_SECOND, DS1302_Time[5] / 10 * 16 + DS1302_Time[5] % 10);//写入秒,并将10进制转化BCD码;
DS1302_WriteBety(DS1302_DAY, DS1302_Time[6] / 10 * 16 + DS1302_Time[6] % 10);//写入星期,并将10进制转化BCD码;
DS1302_WriteBety(DS1302_WP, 0x80);//写入结束,开启写保护;
}
/**
*@breaf 读取DS1302内时间
*@param无
*@retval无
*/void DS1302_ReadTime()
{
DS1302_Time[3] = DS1302_ReadBety(DS1302_HOUR);//读取小时BCD码;
DS1302_Time[4]=DS1302_ReadBety(DS1302_MINUTE);//读取分钟BCD码;
DS1302_Time[5]=DS1302_ReadBety(DS1302_SECOND);//读取秒BCD码;
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于51单片机DS1302实时时钟数码管显示
共20个文件
obj:4个
lst:4个
c:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 83 浏览量
2024-05-12
12:00:22
上传
评论
收藏 2.15MB RAR 举报
温馨提示
基于51单片机和DS1302实时时钟的数码管显示功能,主要实现了时间的准确获取与直观的数字显示。以下是对该功能的详细介绍: 核心组件: 51单片机:作为整个系统的控制核心,负责处理来自DS1302的数据,并将其转换为数码管能够理解的格式,从而控制数码管进行时间显示。 DS1302实时时钟芯片:该芯片提供了高精度的时间信息,包括年、月、日、周、时、分、秒等。它通过SPI三线接口与51单片机进行同步通信,确保时间的准确性和实时性。 数码管:用于显示时间信息。数码管由多个发光二极管组成,通过控制不同发光二极管的亮灭来显示不同的数字。常见的数码管有单位数码管和多位数码管,可以分别用于显示单个数字或多个数字组合。 功能实现: 时间获取:DS1302实时时钟芯片通过外接的晶振产生稳定的振荡脉冲信号,从而确保时间的准确性。51单片机通过SPI接口读取DS1302中的时间数据,并将其存储在内部寄存器中。 时间处理:51单片机对读取到的时间数据进行处理,将其转换为数码管能够理解的格式。通常需要将时间数据分解为小时、分钟、秒等部分,并转换为对应的数字编码。 数码管显示:51单片机根据处理后的时间数据,通
资源推荐
资源详情
资源评论
收起资源包目录
基于51单片机DS1302实时时钟数码管显示.rar (20个子文件)
基于51单片机DS1302实时时钟数码管显示
project11.uvgui.李轩 70KB
ds1302.h 361B
DS1302利用晶体管显示时间.mp4 2.12MB
Objects
project11 10KB
DS1302.obj 4KB
project11.hex 3KB
delay.obj 2KB
LCD1602.obj 8KB
project11.build_log.htm 979B
main.obj 11KB
project11.lnp 99B
DS1302.c 3KB
Listings
DS1302.lst 3KB
delay.lst 2KB
main.lst 4KB
LCD1602.lst 5KB
project11.m51 10KB
project11.uvproj 14KB
project11.uvopt 5KB
main.c 2KB
共 20 条
- 1
资源评论
科创工作室li
- 粉丝: 3482
- 资源: 61
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功