欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1785|回復: 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();


    }
}

回復

使用道具 舉報

ID:332444 發表于 2020-8-7 16:33 | 顯示全部樓層
要看是蝦米錯才能分析,是時序還是延時?
回復

使用道具 舉報

ID:462827 發表于 2020-8-7 16:37 | 顯示全部樓層
你自己對照實物板的原理圖看看,lcd1602的控制引腳以及DS1302的引腳對了沒有呢
回復

使用道具 舉報

ID:782419 發表于 2020-8-7 16:40 | 顯示全部樓層
你的lcd不需要忙檢測么?
回復

使用道具 舉報

ID:686782 發表于 2020-8-7 20:25 | 顯示全部樓層
如果是時間不對,仿真可能存在PC自動授時的設置,所以你proteus的時間可能根本不是來自程序。
回復

使用道具 舉報

ID:811733 發表于 2020-8-7 22:12 | 顯示全部樓層
xianfajushi 發表于 2020-8-7 16:33
要看是蝦米錯才能分析,是時序還是延時?

像是顯示程序沒有寫好,但是不懂哪里的錯誤。
回復

使用道具 舉報

ID:811733 發表于 2020-8-7 22:12 | 顯示全部樓層
hantu 發表于 2020-8-7 16:37
你自己對照實物板的原理圖看看,lcd1602的控制引腳以及DS1302的引腳對了沒有呢

引腳都是對應的,原理圖已經確認過
回復

使用道具 舉報

ID:811733 發表于 2020-8-7 22:19 | 顯示全部樓層
OHHO 發表于 2020-8-7 20:25
如果是時間不對,仿真可能存在PC自動授時的設置,所以你proteus的時間可能根本不是來自程序。

不知道是不是DS1302讀取的程序不對,顯示出來就不是我初值的值
回復

使用道具 舉報

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;
}
回復

使用道具 舉報

10#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表