做小时钟遇到的问题

[复制链接]
3056|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的问题提得都前后矛盾的。。建议贴原理图、贴程序。。
 楼主| 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);

       

}
 楼主| 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);
}
 楼主| 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();
}
 楼主| SYHDJF 发表于 2011-9-21 08:50 | 显示全部楼层
void Main(void)
{       
        init();
        while(1)
        {
                keyscan();
                if(flag==0)
                        Run_DS1302();
        }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

199

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部