某鱼:两栖电子
一、系统功能
采用矩阵键盘,按下对应的数字再按下确认按键,数码管会显示自己输入的数字,如果按错可以使用删除按钮进行删除。点击计时按钮可以显示当前的时间。
二、使用器件
DS1302实时时钟芯片,8位数码管,STM32芯片,4×4矩阵按键
三、实物图展示
显示输入的数字:
当前时间:
四、原理
DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
DS1302有三根线,分别是 CE、I/O 和 SCLK,其中 CE 是使能线,SCLK 是时钟线,I/O 是数据线。
数码管:
共阳极数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳极数码管在应用时将公共极COM接到+5V,当某一字段的发光二极管的阴极为低电平时,相应字段点亮,当某一字段的阴极为高电平时,相应字段不亮。
共阴极数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阳极数码管在应用时将公共极COM接到地线GND,当某一字段的发光二极管的阳极为低电平时,相应字段点亮,当某一字段的阳极为高电平时,相应字段不亮。
五、核心代码
/*
读时间函数,顺序为:年周月日时分秒
*/
void ReadDS1302Clock(u8 *p)
{
DS1302_OUT();
DS1302_RST_L();
DS1302_CLK_L();
DS1302_RST_H();
DelayNOP(100);
DS1302SendByte(0xbf); //突发模式
DS1302_IN();
p[5] = DS1302ReceiveByte(); //秒
p[4] = DS1302ReceiveByte(); //分
p[3] = DS1302ReceiveByte(); //时
p[2] = DS1302ReceiveByte(); //日
p[1] = DS1302ReceiveByte(); //月
p[6] = DS1302ReceiveByte(); //周
p[0] = DS1302ReceiveByte(); //年
DS1302ReceiveByte(); //保护标志字节
DelayNOP(100);
DS1302_RST_L();
}
/*
写时间函数,顺序为:年周月日时分秒
*/
void WriteDS1302Clock(u8 *p)
{
Write1302(DS1302_WRITE,0x00); //关闭写保护
DS1302_OUT();
DS1302_RST_L();
DS1302_CLK_L();
DS1302_RST_H();
DelayNOP(100);
DS1302SendByte(0xbe); //突发模式
DS1302SendByte(p[5]); //秒
DS1302SendByte(p[4]); //分
DS1302SendByte(p[3]); //时
DS1302SendByte(p[2]); //日
DS1302SendByte(p[1]); //月
DS1302SendByte(p[6]); //周,设置成周一,没有使用
DS1302SendByte(p[0]); //年
DS1302SendByte(0x80); //保护标志字节
DelayNOP(100);
DS1302_RST_L();
}
void InitClock(void)
{
u8 tmp;
tmp = ReadDS1302Ram(0);
if(tmp^0xa5)
{
WriteDS1302Ram(0,0xa5);
Write1302(DS1302_WRITE,0x00); //关闭写保护
Write1302(0x90,0x03); //禁止涓流充电
Write1302(DS1302_HOUR,0x00); //设置成24小时制
Write1302(DS1302_SECOND,0x00); //使能时钟运行
Write1302(DS1302_WRITE,0x80); //打开写保护
}
}