找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1774|回复: 1
打印 上一主题 下一主题
收起左侧

基于51单片机,通过ds1302实现电子时钟

[复制链接]
跳转到指定楼层
楼主
ID:493177 发表于 2019-3-29 09:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是一个通过ds1302时钟芯片写的一个电子时钟
并且加入了红外传感器,用一个遥控来控制时钟
希望对大家有用。
#include "ds1302.h"


unsigned char code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; //DS1302读时间寄存器地址
unsigned char code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//DS1302写时间寄存器地址
unsigned char code qq[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x9,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
unsigned char code qdm[]={0x02,0x9f,0x25,0x0d,0x99,0x49,0x40,0x1f,0x00,0x08,0xff};
unsigned char code hh[12]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12};
unsigned char tim[7]; //存放时间数据临时数组
unsigned char s[16],t[16];
unsigned char c = 0,u = 0;wei = 0,zx = 0,o = 0,date = 0,xw = 0;
unsigned char month = 0,day = 0,h = 0,m = 0,send = 0;
bit zt = 0,x = 0,f = 0,stop = 0;
unsigned char key = 0,ke = 0,PH1 = 0,PL1 = 0;
unsigned int js = 0,js1 = 0,year = 0,Time;

sbit IRIN = P3^2;
unsigned char IrValue[5];  // IrValue的0-3用来放原始数据,4用来放经过校验确认无误的键值

sbit SHCP=P3^3;
sbit DS=P3^4;
sbit STCP=P3^6;
sbit OE=P3^5;
sbit KEY1 = P2^0;
sbit KEY2 = P2^1;
sbit KEY3 = P2^2;

void Init(void)
{
    SHCP=DS=STCP=1;    //DS1302初始化
    TMOD = 0x20;
    TH1 = TL1 = 56;
    ET1 = 1;
    TR1 = 1;
    OE=0;
    PH1 = PL1 = 0;
    IPH = 0x08;
}

void IrInit(void)
{
    IT0  = 1;//下降沿触发
    EX0  = 1;//打开中断0允许
    EA = 1;
    IRIN = 1;//初始化端口
    PX0 = 1;
}

/*******************************************************************************
* 函 数 名       :延时函数
* 函数功能         :
* 输    入       :X
* 输    出         :无
*******************************************************************************/
void DelayMs(unsigned int x)   
{
    unsigned char i;
    while(x--)
        for (i = 0; i<114; i++);
}
void Delay(unsigned int i)
{
    unsigned int j;
    while(i--)
        for(j=1;j>0;j--);
}
//毫秒级延时
void Delay_1ms(unsigned int i)
{
    unsigned int j;
    while(i--)
        for(j=600;j>0;j--);
}

/*******************************************************************************
* 函 数 名       : ds1302_write_reg
* 函数功能         : 写入寄存器地址,向写入的寄存器地址写入数据(仅在内部使用)
* 输    入       : 寄存器地址reg_addr 数据 value
* 输    出         : 无
*******************************************************************************/      
static void ds1302_write_reg(unsigned char reg_addr,unsigned char value)
{
      unsigned char i = 0;
      unsigned char dat = 0;
    //第一部分:时序起始部分
        DS_SCLK = 0; //DS_SCLK为低时,DS_RST由低变高,
        Delay(1);
        DS_RST  = 0;
        Delay(1);
        DS_RST  = 1;
        Delay(1);
    //第二部分:写入地址
        for(i=0;i<8;i++)
        {
            dat = reg_addr & 0x01;
            DS_IO = dat;
            DS_SCLK = 1;//制造上升沿
            Delay(1);
            DS_SCLK = 0;//小周期结束,给下一个周期做准备
            Delay(1);
            reg_addr>>=1;
        }


ds1302.c.tar.gz

3.83 KB, 下载次数: 16, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:518884 发表于 2019-4-23 08:43 | 只看该作者
写的不错、、、、、
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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