打印

做小时钟遇到的问题

[复制链接]
1918|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SYHDJF|  楼主 | 2011-9-20 22:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用STC89C52,1602,DS1302做了个小时钟,基本已经完成,但遇到两个问题,一是:一开始单片机向1302写数据,读数据都可以,但读出的值始终是初始化时写的,即1602显示值不变,最后检测出竟然是单片机的问题,换单片机之后正常工作。单片机还有这样出错的情况?
问题二:断电后重新给电,读出的秒为固定值85,本人将读到的秒值与0x7f相与后再送入1602显示,结果还是一样。但在一直给电情况下,秒值显示正常,从0一直到59循环。这又是什么原因呢?

望各位能帮忙推测一下。谢谢大家

相关帖子

沙发
SYHDJF|  楼主 | 2011-9-21 07:35 | 只看该作者
帮自己顶一下

使用特权

评论回复
板凳
chen3bing| | 2011-9-21 08:02 | 只看该作者
1.换单片机之后正常工作。单片机还有这样出错的情况?
正常工作后,单片机怎么还有这样出错的情况。
2.本人将读到的秒值与0x7f相与后再送入1602显示,结果还是一样
显然程序有问题。

使用特权

评论回复
地板
xyz769| | 2011-9-21 08:14 | 只看该作者
LZ的问题提得都前后矛盾的。。建议贴原理图、贴程序。。

使用特权

评论回复
5
SYHDJF|  楼主 | 2011-9-21 08:46 | 只看该作者
void Run_DS1302(void)              //读出DS1302中的时间并送入1602显示
{       
        v_W1302(0x8f, 0);
        sec = bcdtodec(uc_R1302(0x81));           //读出DS1302中的秒
        sec = (sec)&(0x7f);
        v_W1302(0x8f, 0);
        min = bcdtodec(uc_R1302(0x83));           //读出DS1302中的分
        v_W1302(0x8f, 0);
        hour = bcdtodec(uc_R1302(0x85));   //读出DS1302中的小时
        v_W1302(0x8f, 0);
        day = bcdtodec(uc_R1302(0x87));           //读出DS1302中的日
        v_W1302(0x8f, 0);
        month = bcdtodec(uc_R1302(0x89));  //读出DS1302中的月
        v_W1302(0x8f, 0);
        week = bcdtodec(uc_R1302(0x8b));  //读出DS1302中的星期
        v_W1302(0x8f, 0);
        year = bcdtodec(uc_R1302(0x8d));   //读出DS1302中的年
        //v_W1302(0x8f, 0);

        w_sfm(8,sec);                                                //显示部分
        w_sfm(5,min);
        w_sfm(2,hour);
        w_nyr(9,day);
        w_nyr(6,month);
        w_nyr(3,year);
        w_week(week);

       

}

使用特权

评论回复
6
SYHDJF|  楼主 | 2011-9-21 08:47 | 只看该作者
//1602液晶刷新时分秒函数,add等于2为时,5为分,8为秒
void w_sfm(uchar add,uchar date)
{
        uchar shi,ge;

        shi = date/10;
        ge = date%10;

        w_com(0x80+0x40+add);
        w_date(0x30+shi);
        w_date(0x30+ge);
}

//1602液晶刷新年月日函数,3为年,6为月,9为日
void w_nyr(uchar add,char date)
{
        uchar shi,ge;
       
        shi=date/10;
        ge=date%10;

        w_com(0x80+add);
        w_date(0x30+shi);
        w_date(0x30+ge);
}

使用特权

评论回复
7
SYHDJF|  楼主 | 2011-9-21 08:49 | 只看该作者
//初始化函数
void init(void)
{
        uchar num,flag1;                       

        lcdinit();       
        w_com(0x80);
        for(num=0;num<9;num++)
        {
                w_date(table[num]);
                delayms(1);
        }

        w_com(0x80+0x40);
        for(num=0;num<8;num++)
        {
                w_date(table1[num]);
                delayms(1);
        }

        //v_W1302(0x8f, 0);
        flag1 = uc_R1302(0x81);
        flag1 = flag1&0x80;
        if(flag1==1)
                Write_DS1302Init();
        Run_DS1302();
}

使用特权

评论回复
8
SYHDJF|  楼主 | 2011-9-21 08:50 | 只看该作者
void Main(void)
{       
        init();
        while(1)
        {
                keyscan();
                if(flag==0)
                        Run_DS1302();
        }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

199

帖子

1

粉丝