找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4377|回復(fù): 33
收起左側(cè)

單片機(jī)+DS1302程序 顯示亂碼,走時(shí)跳動?

  [復(fù)制鏈接]
ID:447439 發(fā)表于 2022-5-30 17:28 | 顯示全部樓層 |閱讀模式
不知道芯片怎么了,兩個(gè)型號都這個(gè)問題。不走時(shí)或時(shí)間秒亂跳5-85-99-83等。。。亂碼。
亂碼.jpg
兩次重啟串口打印的信息
兩次重啟串口打印的信息.jpg 模塊.jpg
單片機(jī)源程序如下:
#include "DS1302.h"

u8 DS1302sec=1,DS1302min=1,DS1302hour=8;
u8 DS1302day=26,DS1302month=4,DS1302week,DS1302year=20;

/**********向1302寫某一地址和數(shù)據(jù)(指令)**************/
void Write_Byte_1302(u8 add,u8 dat)
{
        u8 i;
        DS1302SCL = 0;
        DS1302RST = 1;
        add = add & 0xfe;                //將控制指令的最低位清零,數(shù)據(jù)能夠輸入
        for(i=0;i<8;i++)
        {
                DS1302SDA = add &0X01;
                DS1302SCL = 1;                        //上升沿輸入數(shù)據(jù)
                DS1302SCL = 0;
                add >>= 1;
        }
        for(i=0;i<8;i++)
        {
                DS1302SDA = dat &0X01;
                DS1302SCL=1;                        //上升沿輸入數(shù)據(jù)
                DS1302SCL=0;
                dat>>=1;
        }
      
        DS1302RST = 0;                        //寫完數(shù)據(jù)后將rst清零,終止數(shù)傳輸
}

/*************讀取1302的數(shù)據(jù)**********/
u8 Read_Byte_1302(u8 add)
{
        u8 i,dat;
        DS1302SCL = 0;
        DS1302RST = 1;                //開啟數(shù)據(jù)傳輸
        add = add |0x01;                //將最低位置一,保證數(shù)據(jù)是輸出
        for(i=0;i<8;i++)
        {
                DS1302SDA = add &0X01;
                DS1302SCL=1;
                DS1302SCL=0;
                add >>=1;
        }
        for(i=0;i<8;i++)
        {
                dat >>=1;
                if(DS1302SDA)        dat = dat | 0x80;
                else        dat = dat & 0x7f;
                DS1302SCL=1;
                DS1302SCL=0;
        }
        DS1302RST = 0;                        //終止數(shù)據(jù)傳輸
        dat=dat/16*10+dat%16;
        return        dat;
}

void Write_1302()
{
        Write_Byte_1302(0x8e,0x00);                //關(guān)閉寫保護(hù)
        Write_Byte_1302(0x80,0x80);
        Write_Byte_1302(0x80,DS1302sec/10*16+DS1302sec%10);
        Write_Byte_1302(0x82,DS1302min/10*16+DS1302min%10);
        Write_Byte_1302(0x84,DS1302hour/10*16+DS1302hour%10);
        Write_Byte_1302(0x86,DS1302day/10*16+DS1302day%10);
        Write_Byte_1302(0x88,DS1302month/10*16+DS1302month%10);
        Write_Byte_1302(0x8c,DS1302year/10*16+DS1302year%10);
        Write_Byte_1302(0x8e,0x80);                //開啟寫保護(hù)
}


/***********************顯示周*********************/
//=====計(jì)算2000~2099年任一天星期幾
//                year:00-99
//                month:01-12
//                day:01-31
u8          GetWeekFromDay(u8 y,u8 m,u8 d)
{
        u8 value;
        if(m==1||m==2)
        {
                m+=12;
                if(y>0)        y--;
                else y=4;
        }
        value=(d+2*m+3*(m+1)/5+y+y/4)%7;
        return value;
}

void Read_1302()
{
        DS1302sec =Read_Byte_1302(0x80);
        DS1302min =Read_Byte_1302(0x82);
        DS1302hour =Read_Byte_1302(0x84);
        DS1302day =Read_Byte_1302(0x86);
        DS1302month =Read_Byte_1302(0x88);
        DS1302year =Read_Byte_1302(0x8c);
      
        DS1302week = GetWeekFromDay(DS1302year,DS1302month,DS1302day);
}
芯片.jpg
回復(fù)

使用道具 舉報(bào)

ID:447439 發(fā)表于 2022-5-30 19:07 | 顯示全部樓層
#include "DS1302.h"

u8 DS1302sec=1,DS1302min=1,DS1302hour=8;
u8 DS1302day=26,DS1302month=4,DS1302week,DS1302year=20;

/**********向1302寫某一地址和數(shù)據(jù)(指令)**************/
void Write_Byte_1302(u8 add,u8 dat)
{
        u8 i;
        DS1302SCL = 0;
        DS1302RST = 1;
        add = add & 0xfe;                //將控制指令的最低位清零,數(shù)據(jù)能夠輸入
        for(i=0;i<8;i++)
        {
                DS1302SDA = add &0X01;
                DS1302SCL = 1;                        //上升沿輸入數(shù)據(jù)
                DS1302SCL = 0;
                add >>= 1;
        }
        for(i=0;i<8;i++)
        {
                DS1302SDA = dat &0X01;
                DS1302SCL=1;                        //上升沿輸入數(shù)據(jù)
                DS1302SCL=0;
                dat>>=1;
        }
        
        DS1302RST = 0;                        //寫完數(shù)據(jù)后將rst清零,終止數(shù)傳輸
}

/*************讀取1302的數(shù)據(jù)**********/
u8 Read_Byte_1302(u8 add)
{
        u8 i,dat;
        DS1302SCL = 0;
        DS1302RST = 1;                //開啟數(shù)據(jù)傳輸
        add = add |0x01;                //將最低位置一,保證數(shù)據(jù)是輸出
        for(i=0;i<8;i++)
        {
                DS1302SDA = add &0X01;
                DS1302SCL=1;
                DS1302SCL=0;
                add >>=1;
        }
        for(i=0;i<8;i++)
        {
                dat >>=1;
                if(DS1302SDA)        dat = dat | 0x80;
                else        dat = dat & 0x7f;
                DS1302SCL=1;
                DS1302SCL=0;
        }
        DS1302RST = 0;                        //終止數(shù)據(jù)傳輸
        dat=dat/16*10+dat%16;
        return        dat;
}

void Write_1302()
{
        Write_Byte_1302(0x8e,0x00);                //關(guān)閉寫保護(hù)
        Write_Byte_1302(0x80,0x80);
        Write_Byte_1302(0x80,DS1302sec/10*16+DS1302sec%10);
        Write_Byte_1302(0x82,DS1302min/10*16+DS1302min%10);
        Write_Byte_1302(0x84,DS1302hour/10*16+DS1302hour%10);
        Write_Byte_1302(0x86,DS1302day/10*16+DS1302day%10);
        Write_Byte_1302(0x88,DS1302month/10*16+DS1302month%10);
        Write_Byte_1302(0x8c,DS1302year/10*16+DS1302year%10);
        Write_Byte_1302(0x8e,0x80);                //開啟寫保護(hù)
}


/***********************顯示周*********************/
//=====計(jì)算2000~2099年任一天星期幾
//                year:00-99
//                month:01-12
//                day:01-31
u8          GetWeekFromDay(u8 y,u8 m,u8 d)
{
        u8 value;
        if(m==1||m==2)
        {
                m+=12;
                if(y>0)        y--;
                else y=4;
        }
        value=(d+2*m+3*(m+1)/5+y+y/4)%7;
        return value;
}

void Read_1302()
{
        DS1302sec =Read_Byte_1302(0x80);
        DS1302min =Read_Byte_1302(0x82);
        DS1302hour =Read_Byte_1302(0x84);
        DS1302day =Read_Byte_1302(0x86);
        DS1302month =Read_Byte_1302(0x88);
        DS1302year =Read_Byte_1302(0x8c);
        
        DS1302week = GetWeekFromDay(DS1302year,DS1302month,DS1302day);
}
回復(fù)

使用道具 舉報(bào)

ID:776619 發(fā)表于 2022-5-30 20:22 | 顯示全部樓層
感覺你沒有處現(xiàn)數(shù)據(jù):如取出的秒是58秒,要顯示5則58這個(gè)數(shù)要除10的數(shù)加0x30才能在屏幕上顯示出5,8這個(gè)數(shù)要58取10的余數(shù)即8加0x30才能顯示出8.其他的同理。
回復(fù)

使用道具 舉報(bào)

ID:447439 發(fā)表于 2022-5-30 20:41 | 顯示全部樓層
麻煩具體說說,我有點(diǎn)沒反應(yīng)過來。
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2022-5-30 20:44 | 顯示全部樓層
/*************讀取1302的數(shù)據(jù)**********/
u8 Read_Byte_1302(u8 add)
{
        u8 i,dat;        DS1302SDA = 0;          //  << 這里加一句 這個(gè)  很多亂跳時(shí)間的問題就解決了
        DS1302SCL = 0;
        DS1302RST = 1;                //開啟數(shù)據(jù)傳輸
        add = add |0x01;                //將最低位置一,保證數(shù)據(jù)是輸出
        for(i=0;i<8;i++)
        {
                DS1302SDA = add &0X01;
                DS1302SCL=1;
                DS1302SCL=0;
                add >>=1;
        }
回復(fù)

使用道具 舉報(bào)

ID:447439 發(fā)表于 2022-5-30 21:14 | 顯示全部樓層
188610329 發(fā)表于 2022-5-30 20:44
/*************讀取1302的數(shù)據(jù)**********/
u8 Read_Byte_1302(u8 add)
{

謝謝親,經(jīng)測試解決亂碼的問題了。但是還是顯示87,83,>7等字................
無亂碼.jpg
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2022-5-30 21:23 | 顯示全部樓層
小丑only 發(fā)表于 2022-5-30 21:14
謝謝親,經(jīng)測試解決亂碼的問題了。但是還是顯示87,83,>7等字................

秒的數(shù)值  >  0x80  表示:
時(shí)鐘停止
兩個(gè)可能,
1) 沒有寫入 正確的秒鐘時(shí)間,時(shí)鐘沒有啟動,你嘗試寫入 0x00看看。
2) 晶振沒有正常工作,會自動進(jìn)入時(shí)鐘停止模式。 檢查一下晶振。
回復(fù)

使用道具 舉報(bào)

ID:447439 發(fā)表于 2022-5-30 21:27 | 顯示全部樓層
188610329 發(fā)表于 2022-5-30 21:23
秒的數(shù)值  >  0x80  表示:
時(shí)鐘停止
兩個(gè)可能,

晶振問題能排除,下午用恒溫晶振測試。沒反應(yīng)。
回復(fù)

使用道具 舉報(bào)

ID:447439 發(fā)表于 2022-5-30 21:28 | 顯示全部樓層
188610329 發(fā)表于 2022-5-30 21:23
秒的數(shù)值  >  0x80  表示:
時(shí)鐘停止
兩個(gè)可能,

還有一個(gè)問題像大佬反饋,用串口打印的時(shí)候。1302輸出兩組數(shù)據(jù)后就自動停止了
回復(fù)

使用道具 舉報(bào)

ID:447439 發(fā)表于 2022-5-30 21:43 | 顯示全部樓層
188610329 發(fā)表于 2022-5-30 21:23
秒的數(shù)值  >  0x80  表示:
時(shí)鐘停止
兩個(gè)可能,

寫0X00了,沒啥效果
回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 2022-5-30 21:45 | 顯示全部樓層
STC8單片機(jī)+DS1302+DS18B20+74HC595的LED16x32點(diǎn)陣溫度萬年歷源代碼 http://www.torrancerestoration.com/bbs/dpj-200968-1.html

按我代碼操作,如果還有問題 排查線路,盡量焊死,杜邦線十分不可靠
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2022-5-30 22:28 | 顯示全部樓層
你看看是不是 寫保護(hù)了? 給 0x8E 地址寫 0x00 然后 再給
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2022-5-30 22:29 | 顯示全部樓層
寫了 0x00 至少顯示 要變 00 吧?
你看看是不是寫保護(hù)了, 給 0x8e 地址 寫 0x00 , 然后再 給 0x80 地址 寫 0x00 看看
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2022-5-30 22:43 | 顯示全部樓層
void Write_1302()
{
        Write_Byte_1302(0x8e,0x00);                //關(guān)閉寫保護(hù)
        Write_Byte_1302(0x80,0x00);
//        Write_Byte_1302(0x80,DS1302sec/10*16+DS1302sec%10);
//        Write_Byte_1302(0x82,DS1302min/10*16+DS1302min%10);
//        Write_Byte_1302(0x84,DS1302hour/10*16+DS1302hour%10);
//        Write_Byte_1302(0x86,DS1302day/10*16+DS1302day%10);
//        Write_Byte_1302(0x88,DS1302month/10*16+DS1302month%10);
//        Write_Byte_1302(0x8c,DS1302year/10*16+DS1302year%10);
        Write_Byte_1302(0x8e,0x80);                //開啟寫保護(hù)
}


先不要搞得花里胡俏的, 就這樣寫完,然后,讀看看,時(shí)間到底如何。
回復(fù)

使用道具 舉報(bào)

ID:447439 發(fā)表于 2022-5-30 22:48 | 顯示全部樓層
188610329 發(fā)表于 2022-5-30 22:29
寫了 0x00 至少顯示 要變 00 吧?
你看看是不是寫保護(hù)了, 給 0x8e 地址 寫 0x00 , 然后再 給 0x80 地址  ...

親,都寫0了。變成15了。
回復(fù)

使用道具 舉報(bào)

ID:447439 發(fā)表于 2022-5-30 22:50 | 顯示全部樓層
188610329 發(fā)表于 2022-5-30 22:43
void Write_1302()
{
        Write_Byte_1302(0x8e,0x00);                //關(guān)閉寫保護(hù)

親,0沒變成,變成15了
寫0.jpg
回復(fù)

使用道具 舉報(bào)

ID:447439 發(fā)表于 2022-5-30 22:52 | 顯示全部樓層
小丑only 發(fā)表于 2022-5-30 22:50
親,0沒變成,變成15了

準(zhǔn)確說I5


是不是這兩個(gè)1302的芯片都壞了
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2022-5-30 23:06 | 顯示全部樓層

芯片是沒有問題的……
你的情況來看…… 可能,換條杜邦線比換芯片更靠譜……
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2022-5-30 23:16 | 顯示全部樓層

I5    對應(yīng)  0x49  0x35
基于你 串口通信   還原出 0x19  0x05     那么原值應(yīng)該是 0xc3  即頭尾 1  中間 0,

首先要確定,是寫錯(cuò)還是讀錯(cuò), 你先給 DS1302 斷電, 拿掉電池,1分鐘后 再上電池, 再連接單片機(jī), 然后看看時(shí)間恢復(fù)  成 全 01   秒 80 沒有?

然后,讀 / 寫程序 加一些 NOP 延時(shí), 看看效果, 最后,杜邦線 最好短些 好一些的。

       for(i=0;i<8;i++)
        {
                DS1302SDA = add &0X01;
                _nop_();                DS1302SCL=1;
                _nop_();
                _nop_();                DS1302SCL=0;
                add >>=1;
        }
        for(i=0;i<8;i++)
        {
                dat >>=1;
                if(DS1302SDA)        dat = dat | 0x80;
                else        dat = dat & 0x7f;
                _nop_();
                DS1302SCL=1;
                _nop_();
                _nop_();
                DS1302SCL=0;
        }

回復(fù)

使用道具 舉報(bào)

ID:447439 發(fā)表于 2022-5-30 23:18 | 顯示全部樓層
188610329 發(fā)表于 2022-5-30 23:16
I5    對應(yīng)  0x49  0x35
基于你 串口通信   還原出 0x19  0x05     那么原值應(yīng)該是 0xc3  即頭尾 1  中 ...

收到,謝謝。我再試試
回復(fù)

使用道具 舉報(bào)

ID:1031072 發(fā)表于 2022-5-31 09:17 來自觸屏版 | 顯示全部樓層
給 0x8E 地址寫 0x00 然后 再給。如取出的秒是58秒,要顯示5則58這個(gè)數(shù)要除10的數(shù)加0x30才能在屏幕上顯示出5,8這個(gè)數(shù)要58取10的余數(shù)即8加0x30才能顯示出8.其他的同理。
回復(fù)

使用道具 舉報(bào)

ID:1012735 發(fā)表于 2022-5-31 13:03 | 顯示全部樓層
1601791993 發(fā)表于 2022-5-31 09:17
給 0x8E 地址寫 0x00 然后 再給。如取出的秒是58秒,要顯示5則58這個(gè)數(shù)要除10的數(shù)加0x30才能在屏幕上顯示出 ...

感覺LCD顯示代碼有問題
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2022-5-31 20:41 | 顯示全部樓層
數(shù)據(jù)和時(shí)鐘線有沒有加上拉電阻?
回復(fù)

使用道具 舉報(bào)

ID:329625 發(fā)表于 2022-6-8 20:17 | 顯示全部樓層
嘗試調(diào)整一下延時(shí)部分
回復(fù)

使用道具 舉報(bào)

ID:776619 發(fā)表于 2022-6-9 01:43 | 顯示全部樓層
寫時(shí)鐘地址是寫秒是80,讀秒是81,如此類推,你讀時(shí)間所有的地址都是寫時(shí)鐘地址是不對的。它是分開的,寫是80、82.....,讀時(shí)間是81、83....
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-6-9 10:05 | 顯示全部樓層
wolfinn 發(fā)表于 2022-6-9 01:43
寫時(shí)鐘地址是寫秒是80,讀秒是81,如此類推,你讀時(shí)間所有的地址都是寫時(shí)鐘地址是不對的。它是分開的,寫是 ...

他的讀函數(shù)內(nèi)有先將地址最低位置一
所以形參用寫時(shí)鐘地址也是可以的
回復(fù)

使用道具 舉報(bào)

ID:776619 發(fā)表于 2022-6-9 14:28 | 顯示全部樓層
lkc8210 發(fā)表于 2022-6-9 10:05
他的讀函數(shù)內(nèi)有先將地址最低位置一
所以形參用寫時(shí)鐘地址也是可以的

哦,我沒細(xì)看,我一般只看直觀的。
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2022-6-9 17:38 來自觸屏版 | 顯示全部樓層
wolfinn 發(fā)表于 2022-6-9 01:43
寫時(shí)鐘地址是寫秒是80,讀秒是81,如此類推,你讀時(shí)間所有的地址都是寫時(shí)鐘地址是不對的。它是分開的,寫是 ...

他這個(gè),其實(shí)和你的問題,是異曲同工,都是數(shù)據(jù)亂入問題,所以,你在解決你的問題之前,其實(shí)幫不到他……,代碼來講,雖然寫的都不好,但都不是代碼上的問題。
回復(fù)

使用道具 舉報(bào)

ID:776619 發(fā)表于 2022-6-9 19:18 | 顯示全部樓層
188610329 發(fā)表于 2022-6-9 17:38
他這個(gè),其實(shí)和你的問題,是異曲同工,都是數(shù)據(jù)亂入問題,所以,你在解決你的問題之前,其實(shí)幫不到他…… ...

我連續(xù)打印過DS1302的數(shù)據(jù),并沒有0XFF情況發(fā)生,一個(gè)都沒有。我是一下子讀完時(shí)鐘到一個(gè)數(shù)組的。
回復(fù)

使用道具 舉報(bào)

ID:776619 發(fā)表于 2022-6-9 19:22 | 顯示全部樓層
188610329 發(fā)表于 2022-6-9 17:38
他這個(gè),其實(shí)和你的問題,是異曲同工,都是數(shù)據(jù)亂入問題,所以,你在解決你的問題之前,其實(shí)幫不到他…… ...

我的問題現(xiàn)在可能是資源方面或地址重疊問題。數(shù)據(jù)類型的不確定性已經(jīng)是確認(rèn)了的。現(xiàn)在是為什么被沖為零的問題,按說一個(gè)全局變量的值是不會變的。
回復(fù)

使用道具 舉報(bào)

ID:776619 發(fā)表于 2022-6-9 19:38 | 顯示全部樓層
我的界面是這樣的,說一下吧。
GPS對時(shí),處理的是GPS模塊輸出的帶時(shí)間的串口數(shù)據(jù),處理時(shí)第二行會有亂碼,表現(xiàn)為第一個(gè)空和30度這個(gè)3字處會有亂碼。就象我所說的我想再水一個(gè)貼的話會寫我的單片機(jī)會打游戲%,會輸出%,%........,處理完串口數(shù)據(jù)就正常顯示溫度了。


12864一到三行顯示是用一個(gè)16的數(shù)組算好后輸出的。算好一行輸出 ,再算下一行輸出。
第四行用的是固定的字符串輸出,遇空結(jié)束。
循環(huán)內(nèi)還有讀溫度讀時(shí)間的函數(shù)調(diào)用。
在串入一個(gè)輸出秒的語句,打印可以大量有輸出,但這時(shí)一到三行無顯示了,第四行正常顯示,。這也有點(diǎn)不解。
51hei圖片_20220609193714.jpg
回復(fù)

使用道具 舉報(bào)

ID:776619 發(fā)表于 2022-6-9 19:47 | 顯示全部樓層
188610329 發(fā)表于 2022-6-9 17:38
他這個(gè),其實(shí)和你的問題,是異曲同工,都是數(shù)據(jù)亂入問題,所以,你在解決你的問題之前,其實(shí)幫不到他…… ...

我不是在幫他,興趣來了回一句,發(fā)現(xiàn)好象讀寫好象是用同地址,才寫一句,要我仔細(xì)看他的程序我不樂意,畢竟這是個(gè)小功能通用應(yīng)知的程序。
回復(fù)

使用道具 舉報(bào)

ID:100982 發(fā)表于 2022-8-26 16:40 | 顯示全部樓層
188610329 發(fā)表于 2022-5-30 20:44
/*************讀取1302的數(shù)據(jù)**********/
u8 Read_Byte_1302(u8 add)
{

哈,成功解決我的1302用1602顯示屏幕閃爍問題
回復(fù)

使用道具 舉報(bào)

ID:979469 發(fā)表于 2022-8-29 08:27 | 顯示全部樓層
寫時(shí)鐘地址是寫秒是80,讀秒是81,如此類推,你讀時(shí)間所有的地址都是寫時(shí)鐘地址是不對的。它是分開的,寫是80、82.....,讀時(shí)間是81、83....
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表