【蓝桥杯练习-ds1302时钟】

ds1302时钟练习

内容来自B站小蜜蜂老师

在这里插入图片描述

上面寄存器我们可以主要分为三个部分
读寄存器 、 写寄存器 、bit0-bit7
在我们编程中会定义三个数组分别存放我们
1.DS1302读操作的日历时钟地址
2.DS1302写操作的日历时钟地址
3.初始化DS1302日历时钟 譬如(22113日 周四 235030秒)

1.读操作地址
unsigned char code Write_Ds1302_Adrr[] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};

2.写操作地址
unsigned char code Read_Ds1302_Addr[] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};

3.时钟初始化
unsigned char  Init_Clock[7] = {0x30,0x50,0x23,0x13,0x01,0x04,0x22};

核心代码

#include "reg52.h"
#include "ds1302.h"

//共阳数目管段码
//0-f  0xbf代表 -
unsigned char code SMG_Duan[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
															   0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xbf};


//定义DS1302读操作的日历时钟地址
unsigned char code Write_Ds1302_Adrr[] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
//定义DS1302写操作的日历时钟地址
unsigned char code Read_Ds1302_Addr[] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
//初始化DS1302日历时钟为22年1月13日 周四 23时50分30秒
unsigned char  Init_Clock[7] = {0x30,0x50,0x23,0x13,0x01,0x04,0x22};




//------------------------------简单延时函数-----------------------------
//简单延时函数
void delay(unsigned int t)
{
	while(t--);
}
//-----------------------------------------------------------------------

//-----------------------------74HC138初始化-----------------------------
void Init_74HC138(unsigned char n)
{
 	switch(n)
	{
	 	case 4: P2 = P2 | 0x1f; P2 = 0x80; break;
		case 5: P2 = P2 | 0x1f; P2 = 0xa0; break;
		case 6: P2 = P2 | 0x1f; P2 = 0xc0; break;
		case 7: P2 = P2 | 0x1f; P2 = 0xe0; break;
	}
}


void InitSystem(void)
{
	Init_74HC138(5); //选通Y5 控制继电器和蜂鸣器
	P0 = 0x00;  //关闭继电器和蜂鸣器
	Init_74HC138(4); //选通Y4 控制LED
	P0 = 0xff;  //关闭LED
}
//---------------------------------------------------------------


//----------------------------数码管按位显示----------------------
void Show_SMGBit_Data(unsigned char pos ,unsigned char dat)
{
	Init_74HC138(6); //选通Y6 
	P0 = 0x01 << pos;	 //进行数码管位置选择
	Init_74HC138(7); //选通Y7
	P0 = dat;	 //进行数码管显示
}


//关闭所有数码管
void SMG_CLOSEALL(unsigned char dat)
{
 	Init_74HC138(6);
	P0 = 0xff;
	Init_74HC138(7);
	P0 = dat;
}

//----------------------------------------------------------------


//--------------------------------DS1302初始化配置----------------
void DS1302_Config(void)
{
 	char i;
	//关闭写保护
	Write_Ds1302(0x8E,0x00);
	for(i = 0;i < 7;i++)
	{
		Write_Ds1302(Write_Ds1302_Adrr[i],Init_Clock[i]);
	}
	//打开写保护
	Write_Ds1302(0x8E,0x80);
}
//------------------------------------------------------------------


//--------------------------------DS1302读取数据--------------------

void Read_DS1302(void)
{
 	char i;
	for(i = 0; i< 7;i++)
	{
		Init_Clock[i] = Read_Ds1302(Read_Ds1302_Addr[i]);
	}
}
//--------------------------------------------------------------------


//-------------------------------数码管数据显示-----------------------
void SMG_Display_DS1302	(void)
{
		Show_SMGBit_Data(0,SMG_Duan[Init_Clock[2]/16]);	 //小时十位
		delay(100);
		Show_SMGBit_Data(1,SMG_Duan[Init_Clock[2]%16]);	 //小时个位
		delay(100);
		Show_SMGBit_Data(2,SMG_Duan[16]);
		delay(100);
		Show_SMGBit_Data(3,SMG_Duan[Init_Clock[1]/16]);	 //分钟十位
		delay(100);
		Show_SMGBit_Data(4,SMG_Duan[Init_Clock[1]%16]);	 //分钟个位
		delay(100);
		Show_SMGBit_Data(5,SMG_Duan[16]);
		delay(100);
		Show_SMGBit_Data(6,SMG_Duan[Init_Clock[0]/16]);	 //秒的十位
		delay(100);
		Show_SMGBit_Data(7,SMG_Duan[Init_Clock[0]%16]);	 //秒的个位
		delay(100);
		SMG_CLOSEALL(0xff);
		delay(100);
}
//------------------------------------------------------------------


//---------------------------------主函数----------------------------
void main(void)
{
	InitSystem();
	DS1302_Config();
	while(1)
	{
		 Read_DS1302();
		 SMG_Display_DS1302();
	}
}
同样对于ds1302的驱动代码比赛是也会提供 学会熟练基于底层驱动代码来实现我们的功能才是最重要的
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小殷学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值