找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 7841|回復(fù): 0
收起左側(cè)

avr單片機(jī)ds1302時(shí)鐘程序詳解

[復(fù)制鏈接]
ID:68618 發(fā)表于 2014-11-11 19:06 | 顯示全部樓層 |閱讀模式
ds1302是一個(gè)時(shí)鐘芯片,和avr沒關(guān)系,這里用mega32操作該芯片,關(guān)于這個(gè)芯片網(wǎng)上資料很多,我簡(jiǎn)單說一下,通信方式是SPI模式,芯片內(nèi)部有幾個(gè)寄存器存放年月日時(shí)分秒,還有寫保護(hù)等。

*****************************************************************
//CPU:mega32
//編譯器:iar
//DS1302
//main函數(shù)中調(diào)用lcd顯示函數(shù)


#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       //時(shí)鐘
#define   TIO      PORTD_Bit7       //數(shù)據(jù)輸出
#define   RIO      PIND_Bit7        //數(shù)據(jù)輸入
#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);
  }
}

//地址、數(shù)據(jù)發(fā)送子程序
void Write1302 ( unsigned char addr,unsigned char data )
{
    unsigned char i;
    IO_D = 1;
    CE = 0; //CE 引腳為低,數(shù)據(jù)傳送中止
    SCLK = 0; //清零時(shí)鐘總線
    CE = 1; //CE 引腳為高,邏輯控制有效
    //發(fā)送地址
    for ( i=8; i>0; i-- ) //循環(huán)8次移位
    {
        SCLK = 0;
        TIO = (addr&0x01); //每次傳輸?shù)妥止?jié)
        addr >>= 1; //右移一位
        SCLK = 1;
    }
    //發(fā)送數(shù)據(jù)
    for ( i=8; i>0; i-- )
    {
        SCLK = 0;
        TIO = (data&0x01);
        data >>= 1;
        SCLK = 1;
    }
   
    CE = 0;
}
//數(shù)據(jù)讀取子程序
unsigned char Read1302 ( unsigned char addr )
{
    unsigned char i,data=0,temp;
    addr = addr | 1;//變?yōu)樽x地址
    IO_D = 1;
    CE=0;
    SCLK=0;
    CE = 1;
    //發(fā)送地址
    for ( i=8; i>0; i-- ) //循環(huán)8次移位
    {
        SCLK = 0;
        TIO = (addr&0x01); //每次傳輸?shù)妥止?jié)
        addr >>= 1; //右移一位
        SCLK = 1;
    }
    IO_D = 0;
    //讀取數(shù)據(jù)
    for ( i=0; i<8; i++ )
    {
        SCLK = 1;
        SCLK = 0;
        data |= RIO<<i;
    }
   
    CE=0;
   
  // data = data/16*10 + data&0x0f ; 為什么不對(duì)
    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); //禁止寫保護(hù)
    Write1302 (SECOND ,0x30); //秒位初始化
    Write1302 (MINUTE ,0x05); //分鐘初始化
    Write1302 (HOUR   ,0x6); //小時(shí)初始化
    Write1302 (DAY    ,0x14); //日位初始化
    Write1302 (MONTH  ,0x12); //月鐘初始化
    Write1302 (YEAR   ,0x88); //年初始化
    Write1302 (PROTECT,0x80); //允許寫保護(hù)
}

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



回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表