久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3986|回復: 33
打印 上一主題 下一主題
收起左側

單片機+DS1302程序 顯示亂碼,走時跳動?

  [復制鏈接]
跳轉到指定樓層
樓主
不知道芯片怎么了,兩個型號都這個問題。不走時或時間秒亂跳5-85-99-83等。。。亂碼。

兩次重啟串口打印的信息

單片機源程序如下:
#include "DS1302.h"

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

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

/*************讀取1302的數據**********/
u8 Read_Byte_1302(u8 add)
{
        u8 i,dat;
        DS1302SCL = 0;
        DS1302RST = 1;                //開啟數據傳輸
        add = add |0x01;                //將最低位置一,保證數據是輸出
        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;                        //終止數據傳輸
        dat=dat/16*10+dat%16;
        return        dat;
}

void Write_1302()
{
        Write_Byte_1302(0x8e,0x00);                //關閉寫保護
        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);                //開啟寫保護
}


/***********************顯示周*********************/
//=====計算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 (802.61 KB, 下載次數: 130)

芯片.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:447439 發表于 2022-5-30 19:07 | 只看該作者
#include "DS1302.h"

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

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

/*************讀取1302的數據**********/
u8 Read_Byte_1302(u8 add)
{
        u8 i,dat;
        DS1302SCL = 0;
        DS1302RST = 1;                //開啟數據傳輸
        add = add |0x01;                //將最低位置一,保證數據是輸出
        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;                        //終止數據傳輸
        dat=dat/16*10+dat%16;
        return        dat;
}

void Write_1302()
{
        Write_Byte_1302(0x8e,0x00);                //關閉寫保護
        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);                //開啟寫保護
}


/***********************顯示周*********************/
//=====計算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);
}
回復

使用道具 舉報

板凳
ID:776619 發表于 2022-5-30 20:22 | 只看該作者
感覺你沒有處現數據:如取出的秒是58秒,要顯示5則58這個數要除10的數加0x30才能在屏幕上顯示出5,8這個數要58取10的余數即8加0x30才能顯示出8.其他的同理。
回復

使用道具 舉報

地板
ID:447439 發表于 2022-5-30 20:41 | 只看該作者
麻煩具體說說,我有點沒反應過來。
回復

使用道具 舉報

5#
ID:624769 發表于 2022-5-30 20:44 | 只看該作者
/*************讀取1302的數據**********/
u8 Read_Byte_1302(u8 add)
{
        u8 i,dat;        DS1302SDA = 0;          //  << 這里加一句 這個  很多亂跳時間的問題就解決了
        DS1302SCL = 0;
        DS1302RST = 1;                //開啟數據傳輸
        add = add |0x01;                //將最低位置一,保證數據是輸出
        for(i=0;i<8;i++)
        {
                DS1302SDA = add &0X01;
                DS1302SCL=1;
                DS1302SCL=0;
                add >>=1;
        }
回復

使用道具 舉報

6#
ID:447439 發表于 2022-5-30 21:14 | 只看該作者
188610329 發表于 2022-5-30 20:44
/*************讀取1302的數據**********/
u8 Read_Byte_1302(u8 add)
{

謝謝親,經測試解決亂碼的問題了。但是還是顯示87,83,>7等字................

無亂碼.jpg (424.35 KB, 下載次數: 131)

無亂碼.jpg
回復

使用道具 舉報

7#
ID:624769 發表于 2022-5-30 21:23 | 只看該作者
小丑only 發表于 2022-5-30 21:14
謝謝親,經測試解決亂碼的問題了。但是還是顯示87,83,>7等字................

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

使用道具 舉報

8#
ID:447439 發表于 2022-5-30 21:27 | 只看該作者
188610329 發表于 2022-5-30 21:23
秒的數值  >  0x80  表示:
時鐘停止
兩個可能,

晶振問題能排除,下午用恒溫晶振測試。沒反應。
回復

使用道具 舉報

9#
ID:447439 發表于 2022-5-30 21:28 | 只看該作者
188610329 發表于 2022-5-30 21:23
秒的數值  >  0x80  表示:
時鐘停止
兩個可能,

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

使用道具 舉報

10#
ID:447439 發表于 2022-5-30 21:43 | 只看該作者
188610329 發表于 2022-5-30 21:23
秒的數值  >  0x80  表示:
時鐘停止
兩個可能,

寫0X00了,沒啥效果
回復

使用道具 舉報

11#
ID:390416 發表于 2022-5-30 21:45 | 只看該作者
STC8單片機+DS1302+DS18B20+74HC595的LED16x32點陣溫度萬年歷源代碼 http://www.zg4o1577.cn/bbs/dpj-200968-1.html

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

使用道具 舉報

12#
ID:624769 發表于 2022-5-30 22:28 | 只看該作者
你看看是不是 寫保護了? 給 0x8E 地址寫 0x00 然后 再給
回復

使用道具 舉報

13#
ID:624769 發表于 2022-5-30 22:29 | 只看該作者
寫了 0x00 至少顯示 要變 00 吧?
你看看是不是寫保護了, 給 0x8e 地址 寫 0x00 , 然后再 給 0x80 地址 寫 0x00 看看
回復

使用道具 舉報

14#
ID:624769 發表于 2022-5-30 22:43 | 只看該作者
void Write_1302()
{
        Write_Byte_1302(0x8e,0x00);                //關閉寫保護
        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);                //開啟寫保護
}


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

使用道具 舉報

15#
ID:447439 發表于 2022-5-30 22:48 | 只看該作者
188610329 發表于 2022-5-30 22:29
寫了 0x00 至少顯示 要變 00 吧?
你看看是不是寫保護了, 給 0x8e 地址 寫 0x00 , 然后再 給 0x80 地址  ...

親,都寫0了。變成15了。
回復

使用道具 舉報

16#
ID:447439 發表于 2022-5-30 22:50 | 只看該作者
188610329 發表于 2022-5-30 22:43
void Write_1302()
{
        Write_Byte_1302(0x8e,0x00);                //關閉寫保護

親,0沒變成,變成15了

寫0.jpg (419.54 KB, 下載次數: 121)

寫0.jpg
回復

使用道具 舉報

17#
ID:447439 發表于 2022-5-30 22:52 | 只看該作者
小丑only 發表于 2022-5-30 22:50
親,0沒變成,變成15了

準確說I5


是不是這兩個1302的芯片都壞了
回復

使用道具 舉報

18#
ID:624769 發表于 2022-5-30 23:06 | 只看該作者

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

使用道具 舉報

19#
ID:624769 發表于 2022-5-30 23:16 | 只看該作者

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

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

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

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

回復

使用道具 舉報

20#
ID:447439 發表于 2022-5-30 23:18 | 只看該作者
188610329 發表于 2022-5-30 23:16
I5    對應  0x49  0x35
基于你 串口通信   還原出 0x19  0x05     那么原值應該是 0xc3  即頭尾 1  中 ...

收到,謝謝。我再試試
回復

使用道具 舉報

21#
ID:1031072 發表于 2022-5-31 09:17 來自手機 | 只看該作者
給 0x8E 地址寫 0x00 然后 再給。如取出的秒是58秒,要顯示5則58這個數要除10的數加0x30才能在屏幕上顯示出5,8這個數要58取10的余數即8加0x30才能顯示出8.其他的同理。
回復

使用道具 舉報

22#
ID:1012735 發表于 2022-5-31 13:03 | 只看該作者
1601791993 發表于 2022-5-31 09:17
給 0x8E 地址寫 0x00 然后 再給。如取出的秒是58秒,要顯示5則58這個數要除10的數加0x30才能在屏幕上顯示出 ...

感覺LCD顯示代碼有問題
回復

使用道具 舉報

23#
ID:401564 發表于 2022-5-31 20:41 | 只看該作者
數據和時鐘線有沒有加上拉電阻?
回復

使用道具 舉報

24#
ID:329625 發表于 2022-6-8 20:17 | 只看該作者
嘗試調整一下延時部分
回復

使用道具 舉報

25#
ID:776619 發表于 2022-6-9 01:43 | 只看該作者
寫時鐘地址是寫秒是80,讀秒是81,如此類推,你讀時間所有的地址都是寫時鐘地址是不對的。它是分開的,寫是80、82.....,讀時間是81、83....
回復

使用道具 舉報

26#
ID:161164 發表于 2022-6-9 10:05 | 只看該作者
wolfinn 發表于 2022-6-9 01:43
寫時鐘地址是寫秒是80,讀秒是81,如此類推,你讀時間所有的地址都是寫時鐘地址是不對的。它是分開的,寫是 ...

他的讀函數內有先將地址最低位置一
所以形參用寫時鐘地址也是可以的
回復

使用道具 舉報

27#
ID:776619 發表于 2022-6-9 14:28 | 只看該作者
lkc8210 發表于 2022-6-9 10:05
他的讀函數內有先將地址最低位置一
所以形參用寫時鐘地址也是可以的

哦,我沒細看,我一般只看直觀的。
回復

使用道具 舉報

28#
ID:624769 發表于 2022-6-9 17:38 來自手機 | 只看該作者
wolfinn 發表于 2022-6-9 01:43
寫時鐘地址是寫秒是80,讀秒是81,如此類推,你讀時間所有的地址都是寫時鐘地址是不對的。它是分開的,寫是 ...

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

使用道具 舉報

29#
ID:776619 發表于 2022-6-9 19:18 | 只看該作者
188610329 發表于 2022-6-9 17:38
他這個,其實和你的問題,是異曲同工,都是數據亂入問題,所以,你在解決你的問題之前,其實幫不到他…… ...

我連續打印過DS1302的數據,并沒有0XFF情況發生,一個都沒有。我是一下子讀完時鐘到一個數組的。
回復

使用道具 舉報

30#
ID:776619 發表于 2022-6-9 19:22 | 只看該作者
188610329 發表于 2022-6-9 17:38
他這個,其實和你的問題,是異曲同工,都是數據亂入問題,所以,你在解決你的問題之前,其實幫不到他…… ...

我的問題現在可能是資源方面或地址重疊問題。數據類型的不確定性已經是確認了的。現在是為什么被沖為零的問題,按說一個全局變量的值是不會變的。
回復

使用道具 舉報

31#
ID:776619 發表于 2022-6-9 19:38 | 只看該作者
我的界面是這樣的,說一下吧。
GPS對時,處理的是GPS模塊輸出的帶時間的串口數據,處理時第二行會有亂碼,表現為第一個空和30度這個3字處會有亂碼。就象我所說的我想再水一個貼的話會寫我的單片機會打游戲%,會輸出%,%........,處理完串口數據就正常顯示溫度了。


12864一到三行顯示是用一個16的數組算好后輸出的。算好一行輸出 ,再算下一行輸出。
第四行用的是固定的字符串輸出,遇空結束。
循環內還有讀溫度讀時間的函數調用。
在串入一個輸出秒的語句,打印可以大量有輸出,但這時一到三行無顯示了,第四行正常顯示,。這也有點不解。

51hei圖片_20220609193714.jpg (189.84 KB, 下載次數: 130)

51hei圖片_20220609193714.jpg
回復

使用道具 舉報

32#
ID:776619 發表于 2022-6-9 19:47 | 只看該作者
188610329 發表于 2022-6-9 17:38
他這個,其實和你的問題,是異曲同工,都是數據亂入問題,所以,你在解決你的問題之前,其實幫不到他…… ...

我不是在幫他,興趣來了回一句,發現好象讀寫好象是用同地址,才寫一句,要我仔細看他的程序我不樂意,畢竟這是個小功能通用應知的程序。
回復

使用道具 舉報

33#
ID:100982 發表于 2022-8-26 16:40 | 只看該作者
188610329 發表于 2022-5-30 20:44
/*************讀取1302的數據**********/
u8 Read_Byte_1302(u8 add)
{

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

使用道具 舉報

34#
ID:979469 發表于 2022-8-29 08:27 | 只看該作者
寫時鐘地址是寫秒是80,讀秒是81,如此類推,你讀時間所有的地址都是寫時鐘地址是不對的。它是分開的,寫是80、82.....,讀時間是81、83....
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 美国黄色一级片 | 91婷婷韩国欧美一区二区 | 成年人的视频免费观看 | 久久综合久 | 欧美一级片久久 | 欧美一区二区在线观看 | 国产精品一区一区 | 在线看亚洲 | 欧美成人猛片aaaaaaa | av在线播放一区二区 | 欧美亚洲在线视频 | 91视频.com | 欧美亚洲一区二区三区 | 成人在线国产 | 91精品久久久 | 99热精品国产 | 国产99久久久国产精品下药 | 精品无码久久久久久国产 | 日韩一级 | 欧美区在线 | 国产成人精品一区二区三区在线 | 国产精品电影在线观看 | 天天干天天草 | 久久精品亚洲精品国产欧美kt∨ | 毛片a| 国产91在线 | 亚洲 | 91欧美激情一区二区三区成人 | 99久久婷婷国产综合精品首页 | www.色.com| 久久久蜜桃一区二区人 | 亚洲天堂一区 | 日韩欧美中文字幕在线观看 | 亚洲一区播放 | 亚洲一区二区三区免费观看 | 国产三区av| ww 255hh 在线观看 | 久久久噜噜噜久久中文字幕色伊伊 | 欧美日韩亚洲国产 | 国产精品久久久久久久久久 | 亚洲色片网站 | 久久精品影视 |