找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么我的时钟程序Proteus仿真可以,开发板上程序会出现错误

[复制链接]
跳转到指定楼层
楼主
ID:811733 发表于 2020-8-7 15:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下,请教程序哪里有问题,谢谢!
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit lcdrs=P2^6;
sbit lcdrw=P2^5;
sbit lcden=P2^7;
sbit ds1302_IO=P3^4;
sbit ds1302_CLK=P3^6;
sbit ds1302_RST=P3^5;
uchar num,i;
uchar code read_addr[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code write_addr[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
uchar time[7] = {0x57,0x59,0x23,0x06,0x08,0x04,0x20};


/****************************************************
LCD1206 程序
******************************************************/
void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}

void write_com(uchar com) //写地址
{
    lcdrs=0;
    P0=com;
    delay(5);
    lcden=1;
    delay(5);
    lcden=0;
}

void write_date(uchar date)  //读数据
{
    lcdrs=1;
    P0=date;
    delay(5);
    lcden=1;
    delay(5);
    lcden=0;
}

void init()              //LCD1206初始化
{
    lcden=0;
    lcdrw=0;
    write_com(0x38);
    write_com(0x0c);
    write_com(0x06);
    write_com(0x01);
}

/***********************************************

/********************
DS1302 写数据
*********************/

void ds1302_write(uchar addr,uchar date)
{
        uchar n;
    ds1302_CLK=0;
        ds1302_RST=1;
        for(n=0;n<8;n++)
        {
        ds1302_IO=addr&0x01;
        addr>>=1;
        ds1302_CLK=1;
        ds1302_CLK=0;
        }
    for(n=0;n<8;n++)
    {
        ds1302_IO=date&0x01;
        date>>=1;
        ds1302_CLK=1;
        ds1302_CLK=0;
    }
        ds1302_RST=0;
}
/**********************
读数据
*************************/
uchar ds1302_read(uchar addr)
{
    uchar n,dat=0;

    ds1302_RST=1;
    for(n=0;n<8;n++)
    {
        ds1302_IO=addr&0x01;
        addr>>=1;
        ds1302_CLK=1;
        ds1302_CLK=0;
    }
    for(n=0;n<8;n++)
    {
        dat=dat>>1;
        if(ds1302_IO==1)
            dat=dat|0x80;
        ds1302_CLK=1;
        ds1302_CLK=0;
    }
    ds1302_RST=0;  
    return dat;
}

void ds1302init()   //ds1302初始化
{
    uchar n;
    ds1302_write(0x8e,0x00);
    for(n=0;n<7;n++)
    {
        ds1302_write(write_addr[n],time[n]);
    }
    ds1302_write(0x8e,0x80);
}

void ds1302_readtime()  //ds1302读数据
{
    uchar n;
    for(n=0;n<7;n++)
    {
        time[n]=ds1302_read(read_addr[n]);
    }
}


void LcdDisplay()
{
        write_com(0x80+0X40);
        write_date('0'+time[2]/16);                                //时
        write_date('0'+(time[2]&0x0f));                                 
        write_date('-');
        write_date('0'+time[1]/16);                                //分
        write_date('0'+(time[1]&0x0f));       
        write_date('-');
        write_date('0'+time[0]/16);                                //秒
        write_date('0'+(time[0]&0x0f));

        write_com(0x80);
        write_date('2');
    write_date('0');
        write_date('0'+time[6]/16);                        //年
        write_date('0'+(time[6]&0x0f));
        write_date('-');
        write_date('0'+time[4]/16);                        //月
        write_date('0'+(time[4]&0x0f));
        write_date('-');
        write_date('0'+time[3]/16);                        //日
        write_date('0'+(time[3]&0x0f));
        write_com(0x8D);
        write_date('0'+(time[5]&0x07));        //星期                         
}

void main()
{
    init();
    ds1302init();

    while(1)
    {
       ds1302_readtime();
    LcdDisplay();


    }
}

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

使用道具 举报

沙发
ID:332444 发表于 2020-8-7 16:33 | 只看该作者
要看是虾米错才能分析,是时序还是延时?
回复

使用道具 举报

板凳
ID:462827 发表于 2020-8-7 16:37 | 只看该作者
你自己对照实物板的原理图看看,lcd1602的控制引脚以及DS1302的引脚对了没有呢
回复

使用道具 举报

地板
ID:782419 发表于 2020-8-7 16:40 | 只看该作者
你的lcd不需要忙检测么?
回复

使用道具 举报

5#
ID:686782 发表于 2020-8-7 20:25 | 只看该作者
如果是时间不对,仿真可能存在PC自动授时的设置,所以你proteus的时间可能根本不是来自程序。
回复

使用道具 举报

6#
ID:811733 发表于 2020-8-7 22:12 | 只看该作者
xianfajushi 发表于 2020-8-7 16:33
要看是虾米错才能分析,是时序还是延时?

像是显示程序没有写好,但是不懂哪里的错误。
回复

使用道具 举报

7#
ID:811733 发表于 2020-8-7 22:12 | 只看该作者
hantu 发表于 2020-8-7 16:37
你自己对照实物板的原理图看看,lcd1602的控制引脚以及DS1302的引脚对了没有呢

引脚都是对应的,原理图已经确认过
回复

使用道具 举报

8#
ID:811733 发表于 2020-8-7 22:19 | 只看该作者
OHHO 发表于 2020-8-7 20:25
如果是时间不对,仿真可能存在PC自动授时的设置,所以你proteus的时间可能根本不是来自程序。

不知道是不是DS1302读取的程序不对,显示出来就不是我初值的值
回复

使用道具 举报

9#
ID:811733 发表于 2020-8-8 00:24 | 只看该作者
问题已经找到,程序中读数据SCLK没有拉低,
uchar ds1302_read(uchar addr)
{
    uchar n,dat=0;
   ds1302_CLK=0;   这句漏了
    ds1302_RST=1;
    for(n=0;n<8;n++)
    {
        ds1302_IO=addr&0x01;
        addr>>=1;
        ds1302_CLK=1;
        ds1302_CLK=0;
    }
    for(n=0;n<8;n++)
    {
        dat=dat>>1;
        if(ds1302_IO==1)
            dat=dat|0x80;
        ds1302_CLK=1;
        ds1302_CLK=0;
    }
    ds1302_RST=0;  
    return dat;
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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