找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7227|回复: 0
收起左侧

avr单片机ds1302时钟程序详解

[复制链接]
ID:68618 发表于 2014-11-11 19:06 | 显示全部楼层 |阅读模式
ds1302是一个时钟芯片,和avr没关系,这里用mega32操作该芯片,关于这个芯片网上资料很多,我简单说一下,通信方式是SPI模式,芯片内部有几个寄存器存放年月日时分秒,还有写保护等。

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


#include <ioavr.h>
#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<<i;
    }
   
    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); //允许写保护
}

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



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表