51-DS1302实时时钟

本文详细介绍了DS1302实时时钟芯片的工作原理及其在微控制器系统中的应用。通过DS1302初始化、读写操作的代码实现,展示了如何设置和读取时间。同时,代码中涉及了BCD码的转换,并利用LCD1602显示时间。此外,还涵盖了主函数中的时间设置和显示功能,包括按键操作和越界判断。

一、

DS1302是一种实时时钟的芯片;

实际中:当我们需要一种芯片时,我们获取芯片以后,首先需要拿到芯片的设计手册,明确芯片的功能,进一步去使用芯片的功能;

BCD码:用四位二进制数表示一位十进制数;简单来说就是将8位分开来代替十进制数-----0001 0011 表示的二进制数是13;0001 =1;0011=3;所以最终表示的二进制数是13;------------------------BCD码转十进制:DEC=BCD/16*10+BCD%16;(2位BCD)

---十进制转BCD码:BCD=DEC/10*16+DEC%10; (2位BCD)

RTC:实时时钟,一种集成电路,通常称为时钟芯片。

要想完成DS1302的书写功能,需要定义单字节写和单字节读两个功能;

DS1302时钟显示:

注意:DS1302.c的主要思路是sbit重新定义引脚,方便后续直接使用;首先初始化DS1302,如上图,将CE置0,SCLK置0;定义写的地址,在读Byte是直接将最低位置1即可;

然后定义写时钟代码和读时钟的代码;据上图,写时钟CE置高电位1,IO口的低位置---置0,用&;开启for循环;SCLK高电位1读取,低电位0移位;开启循环Date,和command是一致的;最终结束后将CE置0;

读时钟时需要注意:因为读时钟时的SCLK电位变化是15,所以先置0,后置1;Date时先置1,后置0,;两次置1相当于一次,保证电位变化为15;

然后建立时钟,读时钟;

建立时钟时,需要写进的是BCD码;初始化数组,内容为年-月-日-时-分-秒-日期,首先关闭写保护,然后写时钟BCD码;

读时钟时需要将读取到的BCD码转换成二进制数;

主函数建立时钟---读时钟;然后将数组打印出来;

main.c

#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"

unsigned char Second,Minute;
void main()
{
	LCD_Init();
	DS1302_Init();
	LCD_ShowString(1,1,"  -  -  ");
	LCD_ShowString(2,1,"  :  :  ");
//	DS1302_WriteByte(0x8E,0x00);//关闭写保护位,如果没有这句代码,结果会显示128;
	DS1302_SetTime();
	while(1)
	{
		DS1302_ReadTime();
		LCD_ShowNum(1,1,DS1302_Time[0],2);
	  LCD_ShowNum(1,4,DS1302_Time[1],2);
		LCD_ShowNum(1,7,DS1302_Time[2],2);
		LCD_ShowNum(2,1,DS1302_Time[3],2);
		LCD_ShowNum(2,4,DS1302_Time[4],2);
		LCD_ShowNum(2,7,DS1302_Time[5],2);
	
	}
}

DS1302.c

#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//定义的是写的地址;查表可得:读的地址在写的地址的基础上把最低位置1即可;
#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[]={22,11,11,19,41,59,5};//年-月-日-时-分-秒-日期

DS1302_Init()
{
	DS1302_CE=0;
	DS1302_SCLK=0;
}
void DS1302_WriteByte(unsigned char command,Date)
{
	unsigned char i;
	DS1302_CE=1;
	for(i=0;i<8;i++)
	{
		DS1302_IO=command&(0x01<<i);
		DS1302_SCLK=1;
	  DS1302_SCLK=0;
	}
	for(i=0;i<8;i++)
	{
		DS1302_IO=Date&(0x01<<i);
		DS1302_SCLK=1;
	  DS1302_SCLK=0;
	}
	DS1302_CE=0;
}
unsigned char DS1302_ReadByte(unsigned char command)
{
	unsigned char i,Date=0x00;//局部变量初始化时不一定是0;
	command=command|0x01;//在定义写的地址基础上将最低位-置1,保证读取ReadByte时写的地址切换为读的地址;
	DS1302_CE=1;
	for(i=0;i<8;i++)
	{
		DS1302_IO=command&(0x01<<i);//&是找0
		DS1302_SCLK=0;
	  DS1302_SCLK=1;
	}
	for(i=0;i<8;i++)
	{
		DS1302_SCLK=1;
	  DS1302_SCLK=0;
	  if(DS1302_IO){Date=Date|(0x01<<i);}//最低位 置1;
	}//|是找1;
	DS1302_CE=0;
	DS1302_IO=0;
	return Date;
}
//注意在此读和写与或不同:是因为写是高电平写-读是低电平读;
//注意写进去的需要转换成BCD码,读出来的需要从BCD码转成二进制;
void DS1302_SetTime(void)
{
	DS1302_WriteByte(DS1302_WP,0x00);//0x00关闭写保护
	DS1302_WriteByte(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);
	DS1302_WriteByte(DS1302_MONTH,DS1302_Time[1]/10*
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值