ds1302时钟练习
内容来自B站小蜜蜂老师
上面寄存器我们可以主要分为三个部分
读寄存器 、 写寄存器 、bit0-bit7
在我们编程中会定义三个数组分别存放我们
1.DS1302读操作的日历时钟地址
2.DS1302写操作的日历时钟地址
3.初始化DS1302日历时钟 譬如(22年1月13日 周四 23时50分30秒)
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的驱动代码比赛是也会提供 学会熟练基于底层驱动代码来实现我们的功能才是最重要的