搜索
bottom↓
回复: 23

用DS1302做时钟时仿真出现问题了,时间隔好几秒才走一下

[复制链接]

出0入0汤圆

发表于 2012-7-4 11:27:45 | 显示全部楼层 |阅读模式
#include<reg51.h>
#include<intrins.h>
#include "delay.h"
#include "1602.h"
#include "DS1302.h"
unsigned char table_time1[]="2012-07-04  3";                                 //外部变量,DS1302中用到
unsigned char table_time2[]="8:23:00";                                                //同上
unsigned char table3[]="i love xxx";                //调试用
main()
{
        unsigned char i;
        init_1602();
        init_DS1302();                          //设定DS1302的初始时间
        while(1)
        {
                read_time();                                                           //DS130的读取时间函数
                /*for(i=0;i<13;i++)
                        display_1602(1,i+2,table_time1[0]);
                for(i=0;i<7;i++)
                        display_1602(2,i+6,table_time1[0]);*/
                for(i=0;i<10;i++)
                        display_1602(1,i,table3[i]);                        //1602的显示函数 第一行第i列显示数据table3[i]
        }
               
}
问题就是仿真的时候给ds1302设定时间了,但是它不按照1秒1秒的走,而是走的很慢,好几秒才走一次
但是如果我把1602的显示函数给注释的时候,芯片又能正常的走了

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-7-4 11:28:18 | 显示全部楼层
本帖最后由 yangkuan85988 于 2012-7-4 11:31 编辑

下面是DS1302的一些代码......

出0入0汤圆

 楼主| 发表于 2012-7-4 11:28:44 | 显示全部楼层
本帖最后由 yangkuan85988 于 2012-7-4 11:30 编辑

void write_byte_DS1302(unsigned char dat)
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                SCL_DS1302=0;
                IO_DS1302=dat&0X01;
                dat>>=1;
                SCL_DS1302=1;
                _nop_();
        }       
}
unsigned char read_byte_DS1302()
{
        unsigned char i,temp;
        for(i=0;i<8;i++)
        {
                SCL_DS1302=0;
                temp>>=1;
                temp=IO_DS1302;
                SCL_DS1302=1;                       
        }
        return temp;
}

void write_DS1302(unsigned char command,unsigned char date)
{
        RST_DS1302=0;
        _nop_();
        SCL_DS1302=0;
        _nop_();
        IO_DS1302=1;
        _nop_();
        RST_DS1302=1;
        _nop_();
        write_byte_DS1302(command);
        write_byte_DS1302(date);
        RST_DS1302=0;
        _nop_();
}
unsigned char read_DS1302(unsigned char command)
{
        unsigned char temp1,temp2,temp;
        RST_DS1302=0;
        _nop_();
        RST_DS1302=1;
        _nop_();
        SCL_DS1302=0;
        _nop_();
        IO_DS1302=1;
        _nop_();

        write_byte_DS1302(command);
        temp1=read_byte_DS1302();
        RST_DS1302=0;
        _nop_();
        temp2=temp1/16;
        temp1=temp1%16;                                //数据格式转换
        temp=temp2*10+temp1;
       
        return temp;                               
}
void init_DS1302()
{
        RST_DS1302=0;
        write_DS1302(PROTECT,0X00);                                //去除写保护
        write_DS1302(WRITE_YEAR,0X12);                        //初始化年                 2012年
        write_DS1302(WRITE_WEEK,0X03);                        //初始化星期        星期三
        write_DS1302(WRITE_MONTH,0X07);                        //初始化月                7月
        write_DS1302(WRITE_DAY,0X04);                        //初始化天                4号
        write_DS1302(WRITE_HOUR,0X08);                        //初始化小时        8点
        write_DS1302(WRITE_MINUTE,0X17);                //初始化分钟        17分
        write_DS1302(WRITE_SECOND,0X00);                //初始化秒钟        0秒
        write_DS1302(PROTECT,0X80);                                //写保护
}
void read_time()
{
        unsigned char second,minute,hour,week,day,month,year;
        write_DS1302(PROTECT,0X00);                                //去除写保护
        year  =read_DS1302(READ_YEAR);                       
        month =read_DS1302(READ_MONTH);
        day   =read_DS1302(READ_DAY);
        week  =read_DS1302(READ_WEEK);
        hour  =read_DS1302(READ_HOUR);
        minute=read_DS1302(READ_MINUTE);
        second=read_DS1302(READ_SECOND);
        write_DS1302(PROTECT,0X80);                                //写保护

        table_time1[2]=year/10;
        table_time1[3]=year%10;
        table_time1[5]=month/10;
        table_time1[6]=month%10;
        table_time1[8]=day/10;
        table_time1[9]=day%10;
        table_time1[13]=week;
       
        table_time2[0]=hour/10;
        table_time2[1]=hour%10;
        table_time2[3]=minute/10;
        table_time2[4]=minute%10;
        table_time2[6]=second/10;
        table_time2[7]=second%10;
}       

出0入0汤圆

发表于 2012-7-4 11:55:41 | 显示全部楼层
给SDA端接上拉试试,

出0入0汤圆

发表于 2012-7-4 12:29:01 | 显示全部楼层
要显示秒位最好至少0.5s更新一次秒位数据,而你的超级循环里面执行周期太长(大于0.5s了,你的1602显示程序里是不是用了Delay延时……等等),无法及时更新,
用状态机吧,如果不熟悉状态机就开个定时器中断约0.5s更新一次时间将就将就

出0入0汤圆

发表于 2012-7-4 12:43:05 | 显示全部楼层
芯片本身走时应该是正确的,问题出在你的软件上,读取时间->显示时间可能有问题。一般情况下,要显示秒的变化,理论上来讲最少应在小于1s的时间间隔里读取秒数据,当然时间间隔小一些秒显示的精度会更高(即显示的时间与芯片时间的误差会更小)。

出0入0汤圆

 楼主| 发表于 2012-7-4 13:00:21 | 显示全部楼层
ytx1689567 发表于 2012-7-4 11:55
给SDA端接上拉试试,

加上上拉之后.....芯片就再也不走了,这是怎么了

出0入0汤圆

 楼主| 发表于 2012-7-4 13:03:14 | 显示全部楼层
BXAK 发表于 2012-7-4 12:29
要显示秒位最好至少0.5s更新一次秒位数据,而你的超级循环里面执行周期太长(大于0.5s了,你的1602显示程序 ...

我1602里面没有用延时函数哦。你是不是指芯片本身再走但是我更新速度没有那么快是吗...按这样理解的画,那我的1602上显示的时间应该是在跳跃的发生变化啊....但用仿真的时候查看DS1602芯片它的时间就走的非常的慢呢

出0入0汤圆

 楼主| 发表于 2012-7-4 13:29:27 | 显示全部楼层
zpxa001 发表于 2012-7-4 12:43
芯片本身走时应该是正确的,问题出在你的软件上,读取时间->显示时间可能有问题。一般情况下,要显示秒的变 ...

我这仿真的现象就是,DS1302隔上好久然后还只是加上一秒,不是连续加上好几秒,就感觉DS1302没有按照1秒的顺寻在走的,我是在protues里面监视芯片的,不知道正不正确

出0入0汤圆

发表于 2012-7-4 13:49:33 | 显示全部楼层
电路没错吧?

出0入0汤圆

发表于 2012-7-4 14:04:48 | 显示全部楼层
楼主应该把仿真工程和程序上传啊。方便大家给你看看。这样子说不清楚的

出0入42汤圆

发表于 2012-7-4 14:06:19 | 显示全部楼层
yangkuan85988 发表于 2012-7-4 13:29
我这仿真的现象就是,DS1302隔上好久然后还只是加上一秒,不是连续加上好几秒,就感觉DS1302没有按照1秒的 ...

仿真比较慢,也算正常吧

出0入0汤圆

 楼主| 发表于 2012-7-4 14:41:59 | 显示全部楼层
BXAK 发表于 2012-7-4 13:49
电路没错吧?

这是我的电路图了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-7-4 14:43:40 | 显示全部楼层
babytaomail 发表于 2012-7-4 14:04
楼主应该把仿真工程和程序上传啊。方便大家给你看看。这样子说不清楚的

你是说还有1602的吗....
#include<reg51.h>
#include<intrins.h>
#include "delay.h"
#include "1602.h"
sbit RS_1602=P2^0;
sbit E_1602=P2^1;
void write_command_1602(unsigned char com)
{
        RS_1602=0;
        P0=com;
        _nop_();
        E_1602=1;
        delay_ms(1);
        E_1602=0;       
}
void write_data_1602(unsigned char dat)
{
        RS_1602=1;
        P0=dat;
        _nop_();
        E_1602=1;
        delay_ms(1);
        E_1602=0;
}
void init_1602()
{
        write_command_1602(0X38);
        write_command_1602(0X0C);
        write_command_1602(0X06);
        write_command_1602(0X80);
        write_command_1602(0X01);
}
void display_1602(unsigned char hang,unsigned char lie,unsigned char date)
{
        if(hang==1)
                write_command_1602(0X80+lie);
        else if(hang==2)
                write_command_1602(0X80+0X40+lie);
        write_data_1602(date);
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-7-4 14:45:39 | 显示全部楼层
albert_w 发表于 2012-7-4 14:06
仿真比较慢,也算正常吧

正常啊....还有现在一直不能正确的读出DS1302的时间出来,很难受啊,表示,大侠能不能帮我看看的读函数啊

出0入0汤圆

发表于 2012-7-4 15:37:54 | 显示全部楼层
仿出问题了还仿个毛啊,直接洞洞板焊个真机来跑。包你满意。

出0入0汤圆

发表于 2012-7-4 16:10:40 | 显示全部楼层
原来是Proteus仿真,还以为是真刀真枪地干呢;如果软仿真,这种情况正常......

出0入0汤圆

 楼主| 发表于 2012-7-4 16:11:40 | 显示全部楼层
fsclub 发表于 2012-7-4 15:37
仿出问题了还仿个毛啊,直接洞洞板焊个真机来跑。包你满意。

嗯.....做个去

出0入0汤圆

 楼主| 发表于 2012-7-4 16:12:06 | 显示全部楼层
zpxa001 发表于 2012-7-4 16:10
原来是Proteus仿真,还以为是真刀真枪地干呢;如果软仿真,这种情况正常...... ...

直接做个去......太烦人了,这仿真

出0入42汤圆

发表于 2012-7-4 16:18:45 | 显示全部楼层
yangkuan85988 发表于 2012-7-4 14:45
正常啊....还有现在一直不能正确的读出DS1302的时间出来,很难受啊,表示,大侠能不能帮我看看的读函数啊 ...

我都是直接抄别人代码的,不想造轮子,要去找

出0入0汤圆

发表于 2012-7-4 19:18:43 | 显示全部楼层
yangkuan85988 发表于 2012-7-4 16:12
直接做个去......太烦人了,这仿真

可以把电路做成模块,做实验方便拆除、组合

出0入0汤圆

发表于 2012-7-4 21:23:32 | 显示全部楼层
如果是仿真速度跟不上,可以尝试修改一下仿真的时间片,也就是仿真的精度;其次尽量减少外围硬件和虚拟器件的使用。在此顺便传上我以前写的DS1302驱动。供楼主参考下。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-7-5 08:53:30 来自手机 | 显示全部楼层
さよなら!

出0入0汤圆

发表于 2012-7-5 17:40:45 来自手机 | 显示全部楼层
视觉℡ 发表于 2012-7-5 08:53
さよなら!

日本人?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 00:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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