微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新手,DS1302数码管电子钟

新手,DS1302数码管电子钟

时间:10-02 整理:3721RD 点击:
请前辈高手们帮忙提供一个编程思路,尤其是DS1302的数据实时读取与显示
   附仿真电路图如下:


#include<reg52.h>
#include"ds1302.h"
#include"disp.h"
#define  unsigned char uchar
uchar hour,minute,second;
void main(void)
{
while(1)
{
  ds1302();
disp();
}
}

谢谢,但1302的数据读取与实时显示要怎么实现呢?

为什么仿真的时候,三极管不工作呢,实际用9012,protues里没有,就随便找了个PNP。

用74hc573代替三极管更简单的

先把DS1302的读取程序写好,网上有好多,注意延时。再写显示函数

void v_RTInputByte(uchar ucDa)        //写
{
        uchar i;
        ACC=ucDa;
        for(i=8;i>0;i--)
        {
                if((ACC&0x01)==1)  
                //T_IO=ACC0;  /* 相当于汇编中的RRC */
                T_IO=1;
                else T_IO=0;//if((ACC&0x01)==0)
                T_CLK=1;
                T_CLK=0;
                ACC=ACC>>1;
        }
}
uchar uc_RTOutputByte(void)          //读
{
        uchar i,ACC;
        ACC=0;
        for(i=0;i<8;i++)
        {
                ACC=ACC>>1;   /*相当于汇编中的RRC*/
                if(T_IO==1)
                ACC=ACC|0x80;
                T_CLK=1;
                T_CLK=0;
        }
        return(ACC);
}
void v_W1302(uchar ucAddr,uchar ucDa)     //指定地址写数据
{
        T_RST=0;
        T_CLK=0;
        T_RST=1;
        v_RTInputByte(ucAddr);  /*地址,命令*/
        v_RTInputByte(ucDa);    /*写1Byte数据*/
        T_CLK=1;
        T_RST=0;
}
uchar uc_R1302(uchar ucAddr)     //指定地址读数据
{
        unsigned char ucDa,k;  //BCD转换成16进制
        k=0x00;
        T_RST=0;
        T_CLK=0;
        T_RST=1;
        v_RTInputByte(ucAddr);  /*地址,命令*/
        ucDa=uc_RTOutputByte(); /*读取1Byte数据*/
        T_CLK=1;
        T_RST=0;
        k=ucDa/16;
        ucDa=ucDa%16;
        ucDa=ucDa+k*10;
        return(ucDa);
}
void v_Set1302()//uchar *pSecDa)    设置初始时间值
{
        uchar i,j;
        uchar ucAddr=0x80;         //秒写地址
        v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
        for(i=0;i<7;i++)       //连续写入7个时间
        {
                j=ucCurtime[i];       //代入初始时间
                v_W1302(ucAddr,j); /* 秒 分 时 日 月 星期 年 */
                ucAddr +=2;         //地址+2
        }
        v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
void v_Get1302()         //记录时间
{
        uchar i;
        uchar ucAddr=0x81;     //秒读地址
        for (i=0;i<7;i++)       //连续读数据
        {
                ucCurtime[i]=uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
                ucAddr +=2;
        }
}

单片机与ds1302的通讯程序在上面

你的P1口是位选口,P3口是与DS1302通信因此定义sbit T_rst= P3^3     sbit T_CLK=P3^4    sbit T_IO=P3_5

看看就看看,。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top