STC单片机控制DS1302程序 (C程序)

描述

#include "REG51.H" 

#include "INTRINS.H" 

typedef unsigned char BYTE; 

sbit SCLK = P1^0;                   //DS1302时钟口P1.0

sbit IO = P1^1;                     //DS1302数据口P1.1 
sbit RST = P1^2;                    //DS1302片选口P1.2 

                    //秒    分    时    日    月  星期    年 
BYTE code init[] = {0x00, 0x00, 0x20, 0x01, 0x01, 0x05, 0x10}; 
BYTE data now[7]; 

void DS1302_Initial(); 
void DS1302_SetTime(BYTE *p); 
void DS1302_GetTime(BYTE *p); 

void main() 

    DS1302_Initial();               //初始化DS1302 
    DS1302_SetTime(init);           //设置初始时间 

    DS1302_GetTime(now);            //读取当前时间 
    while (1); 


/************************************** 
延时X微秒(STC12C5A60S2@12M) 
不同的工作环境,需要调整此函数 
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同 
**************************************/ 
void Delay() 

    _nop_(); 
    _nop_(); 


/************************************** 
从DS1302读1字节数据 
**************************************/ 
BYTE DS1302_ReadByte() 

    BYTE i; 
    BYTE dat = 0; 

    for (i=0; i>= 1;                    //数据右移一位 
        if (IO) dat |= 0x80;        //读取数据 
        SCLK = 1;                   //时钟线拉高 
        Delay();                //延时等待 
    } 

    return dat; 


/************************************** 
向DS1302写1字节数据 
**************************************/ 
void DS1302_WriteByte(BYTE dat) 

    char i; 

    for (i=0; i>= 1;                  //移出数据 
        IO = CY;                    //送出到端口 
        SCLK = 1;                   //时钟线拉高 
        Delay();                //延时等待 
    } 


/************************************** 
读DS1302某地址的的数据 
**************************************/ 
BYTE DS1302_ReadData(BYTE addr) 

    BYTE dat; 

    RST = 0; 
    Delay(); 
    SCLK = 0; 
    Delay(); 
    RST = 1; 
    Delay(); 
    DS1302_WriteByte(addr);         //写地址 
    dat = DS1302_ReadByte();        //读数据 
    SCLK = 1; 
    RST = 0; 

    return dat; 


/************************************** 
往DS1302的某个地址写入数据 
**************************************/ 
void DS1302_WritEDAta(BYTE addr, BYTE dat) 

    RST = 0; 
    Delay(); 
    SCLK = 0; 
    Delay(); 
    RST = 1; 
    Delay(); 
    DS1302_WriteByte(addr);         //写地址 
    DS1302_WriteByte(dat);          //写数据 
    SCLK = 1; 
    RST = 0; 


/************************************** 
写入初始时间 
**************************************/ 
void DS1302_SetTime(BYTE *p) 

    BYTE addr = 0x80; 
    BYTE n = 7; 

    DS1302_WriteData(0x8e, 0x00);   //允许写操作 
    while (n--) 
    { 
        DS1302_WriteData(addr, *p++); 
        addr += 2; 
    } 
    DS1302_WriteData(0x8e, 0x80);   //写保护 


/************************************** 
读取当前时间 
**************************************/ 
void DS1302_GetTime(BYTE *p) 

    BYTE addr = 0x81; 
    BYTE n = 7; 

    while (n--) 
    { 
        *p++ = DS1302_ReadData(addr); 
        addr += 2; 
    } 


/************************************** 
初始化DS1302 
**************************************/ 
void DS1302_Initial() 

    RST = 0; 
    SCLK = 0; 
    DS1302_WriteData(0x8e, 0x00);   //允许写操作 
    DS1302_WriteData(0x80, 0x00);   //时钟启动 
    DS1302_WriteData(0x90, 0xa6);   //一个二极管+4K电阻充电 
    DS1302_WriteData(0x8e, 0x80);   //写保护 
}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分