历史上的今天
返回首页

历史上的今天

今天是:2024年11月28日(星期四)

正在发生

2019年11月28日 | avr单片机ds1302时钟程序详解

2019-11-28 来源:51hei

ds1302是一个时钟芯片,和avr没关系,这里用mega32操作该芯片,关于这个芯片网上资料很多,我简单说一下,通信方式是SPI模式,芯片内部有几个寄存器存放年月日时分秒,还有写保护等。


*****************************************************************
//CPU:mega32
//编译器:iar
//DS1302
//main函数中调用lcd显示函数


#include
#include "lcd.h"
void Write1302 ( unsigned char addr,unsigned char dat );
unsigned char Read1302 ( unsigned char addr );
void ds1302_init(void);


//寄存器宏定义
#define SECOND 0x80
#define MINUTE 0x82
#define HOUR 0x84
#define DAY 0x86
#define MONTH 0x88
#define YEAR 0x8C
#define PROTECT 0x8E

//管脚定义
#define   CE       PORTD_Bit5       //读写使能
#define   SCLK     PORTD_Bit6       //时钟
#define   TIO      PORTD_Bit7       //数据输出
#define   RIO      PIND_Bit7        //数据输入
#define   CE_D     DDRD_Bit5        //CE方向
#define   SCLK_D   DDRD_Bit6        //SCLK方向
#define   IO_D     DDRD_Bit7        //IO方向

void main(void)
{
  ds1302_init();
  lcd_init();
  while(1)
  {
    delay(10000);
    clear();
    display_string(num2str(Read1302(YEAR)),0,0);display_string("YEAR",0,16);display_string(num2str(Read1302(MONTH)),0,64);display_string("MONTH",0,80);
    display_string(num2str(Read1302(DAY)),2,0);display_string("DAY",2,16);display_string(num2str(Read1302(HOUR)),2,64);display_string("HOUR",2,80);
    display_string(num2str(Read1302(MINUTE)),4,0);display_string("MIN",4,16);display_string(num2str(Read1302(SECOND)),4,64);display_string("SECOND",4,80);
  }
}


//地址、数据发送子程序
void Write1302 ( unsigned char addr,unsigned char data )
{
    unsigned char i;
    IO_D = 1;
    CE = 0; //CE 引脚为低,数据传送中止
    SCLK = 0; //清零时钟总线
    CE = 1; //CE 引脚为高,逻辑控制有效
    //发送地址
    for ( i=8; i>0; i-- ) //循环8次移位
    {
        SCLK = 0;
        TIO = (addr&0x01); //每次传输低字节
        addr >>= 1; //右移一位
        SCLK = 1;
    }
    //发送数据
    for ( i=8; i>0; i-- )
    {
        SCLK = 0;
        TIO = (data&0x01);
        data >>= 1;
        SCLK = 1;
    }
    
    CE = 0;

}
//数据读取子程序
unsigned char Read1302 ( unsigned char addr )
{
    unsigned char i,data=0,temp;
    addr = addr | 1;//变为读地址
    IO_D = 1;
    CE=0;
    SCLK=0;
    CE = 1;
    //发送地址
    for ( i=8; i>0; i-- ) //循环8次移位
    {
        SCLK = 0;
        TIO = (addr&0x01); //每次传输低字节
        addr >>= 1; //右移一位
        SCLK = 1;
    }
    IO_D = 0;
    //读取数据
    for ( i=0; i<8; i++ )
    {
        SCLK = 1;
        SCLK = 0;
        data |= RIO<    }
    
    CE=0;
    
  // data = data/16*10 + data&0x0f ; 为什么不对
    temp = data>>4;
    data &= 0x0f;
    data = temp*10 + data;
    
    return (data);
}
//初始化DS1302
void ds1302_init(void)
{
    CE_D = 1  ;     //CE 输出
    SCLK_D = 1 ;    //SCLK 输出
    Write1302 (PROTECT,0X00); //禁止写保护
    Write1302 (SECOND ,0x30); //秒位初始化
    Write1302 (MINUTE ,0x05); //分钟初始化
    Write1302 (HOUR   ,0x6); //小时初始化
    Write1302 (DAY    ,0x14); //日位初始化
    Write1302 (MONTH  ,0x12); //月钟初始化
    Write1302 (YEAR   ,0x88); //年初始化
    Write1302 (PROTECT,0x80); //允许写保护
}


******************************************************************

推荐阅读

史海拾趣

Codeco Corporation Of Vermont公司的发展小趣事

随着电子行业的快速发展和变革,Codeco面临着新的挑战和机遇。为了应对这些变革,公司及时调整战略,加大在人工智能、物联网等领域的投入。通过与高校、研究机构的合作,Codeco不断吸收新的技术和理念,推出了一系列符合市场需求的创新产品。这些举措使得Codeco在行业中保持了领先地位。

Amveco Toroidal Power Products公司的发展小趣事

为了进一步扩大市场份额,Amveco公司积极寻求与行业内外的合作伙伴建立战略合作关系。公司与多家知名的电子设备制造商建立了长期稳定的合作关系,为其提供定制化的环形变压器解决方案。此外,公司还通过参加国际电子展会、建立海外销售网络等方式,积极开拓国际市场,实现了业务的全球化布局。

Baneasa SA公司的发展小趣事

面对日益增长的市场需求,Baneasa SA意识到必须提升产能以满足客户的需求。于是,公司投入大量资金对生产线进行升级改造,引进了先进的生产设备和技术。这些举措使得Baneasa SA的产能得到了大幅提升,同时也保证了产品质量的稳定性和可靠性。

Edsun Laboratories Inc公司的发展小趣事

ECM Electronics Limited.自创立之初,就注重技术创新。公司投入大量研发资金,专注于开发高效、节能的电子产品。通过不断的技术迭代和产品创新,ECM成功推出了一系列具有竞争力的产品,逐渐在市场上建立了良好的口碑。同时,公司还积极与高校和科研机构合作,引进先进技术,为公司的持续发展提供了强大的技术支撑。

Amphenol(安费诺)公司的发展小趣事

在竞争激烈的电子行业中,品质是企业生存和发展的关键。ECM Electronics Limited.深知这一点,始终将产品质量放在首位。公司建立了严格的质量管理体系,从原材料采购到产品生产、检测、包装等各个环节都严格把关,确保每一件产品都符合高标准的质量要求。正是凭借过硬的产品品质,ECM赢得了客户的信赖和市场的认可。

晨晶电子(Chenjing Electronics)公司的发展小趣事

晨晶电子自成立以来,始终坚持以技术创新为核心竞争力。公司拥有一支高素质的研发团队,致力于石英晶体元器件的研发与生产。通过不断的技术创新和产品升级,晨晶电子在行业内逐渐树立了技术领先的地位。其产品广泛应用于通信、计算机、消费电子等领域,赢得了众多客户的信赖和好评。

问答坊 | AI 解惑

大家觉得搞单片机(嵌入式电子技术开发)累吗???

大家觉得搞单片机(嵌入式电子技术开发)累吗??? http://bbs.21ic.com/viewthread.php?tid=127427…

查看全部问答>

定时器产生的中断请求,如何获取来响应自己的程序呢?

定时器产生的中断请求,如何获取来响应自己的程序呢? 我想利用定时器在指定的时间到达时,执行我写的一段程序,怎么获取定时器的这个中断呢? 有例程最好,我不知道这个过程如何写,是不是中断有一个固定的模式?? 新手求指教啊~~~~…

查看全部问答>

PSDSoft Express软件生成的编程文件obj格式解析

各位好:     最近用到PSDSoft Express软件,其生成的编程文件obj中,包含:PLD映射,SRAM数据,EPROM数据,不知如何划分!因为编程PSD501芯片要用到这个文件.    另外,发现此软件生成的项目中,在生成obj文件之前,会自动 ...…

查看全部问答>

谁能给我讲下SPI总线是如何识别相同设备优先级的?

就是在一个SPI总线上我有两个一样的IC,A,B;现在SPI总线是如何识别他们两个呢?怎样确定他们的优先级呢?比如说要把A的那个信号切换到什么状态的方法? 请高手指教!…

查看全部问答>

求助:NiosII的模拟I2C控制没有应答

使用NiosII控制高频头CU1216,在NiosII IDE中运行下列程序后,由于没有应答,程序死在Write_I2C_Byte函数的while(I2C_Ackn() );,reset,sda,scl均加了上拉电阻,进行了一些检查均没有结果 ,哪位高手能帮我指点迷津?谢谢。 #include \"i2c.h\" ...…

查看全部问答>

北桥坏了?

哪个兄弟知道北桥坏了 电脑是什么症状? …

查看全部问答>

pc的串口中断

最近搞单片机和pc通信    想问pc机的串口如果有接受中断 用c 在dos下怎么编呢? 比如说在keil中有 void serial(void) interrupt 4 这样有中断就可以进入中断服务程序 但是用c 在tubor c下如何实现其进入中断服务程序呢? 不啬赐教!…

查看全部问答>

几年来学习的过程的体会

       很早的时候知道嵌入式很火,自己也很喜欢。于是自己抱着书看,看51、arm... ,最后还学linux,学习移植,编译内核,都是蒙着头过河。一味的追求想象中的 高科技,现在才发现自己的学习之路走的有点偏。 &n ...…

查看全部问答>

关于 正弦波信号发生器的问题

我最近在设计一个正弦波发生器的过程中,出现了很诡异的问题。频率稍微上调多点,输出波形就截止。采取fpga的de0开发板,方案如下:1.  频率处理以及显示(元件1) ——> 输出整形(integer)频率  f2. 输入频率  —— ...…

查看全部问答>

mos管驱动拖尾现象是怎么回事

请教各位大侠,mos管驱动拖尾现象是怎么回事?如何改善?…

查看全部问答>