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

標題: 基于STC89C56單片機的DS1302可調時鐘(不按照我設置的時間顯示) [打印本頁]

作者: Diameter    時間: 2023-10-25 21:22
標題: 基于STC89C56單片機的DS1302可調時鐘(不按照我設置的時間顯示)
為什么我的按鍵可調時鐘不按照我的設置的顯示呢 我可以按鍵改變設置的時間LCD也會對應顯示我設置過的時間,但是我只要一按鍵推出TimeSet模式,它就又顯示之前的時間了。我明明聲明了全局數組。但是我在每個時間改變之后的語句后面加了DS1302_SetTime(),就解決這個問題了。有大佬知道為什么么? 為什么不可以等所有東西設置完在退出的最后加一句DS1302_SetTime()實現呢?

51hei圖片_20231025210350.png (665.36 KB, 下載次數: 76)

51hei圖片_20231025210350.png

51hei圖片_20231025210856.png (666.07 KB, 下載次數: 69)

51hei圖片_20231025210856.png

51hei圖片_20231025210922.png (774.77 KB, 下載次數: 73)

51hei圖片_20231025210922.png

51hei圖片_20231025210956.png (552.41 KB, 下載次數: 78)

51hei圖片_20231025210956.png

51hei圖片_20231025212150.jpg (305.02 KB, 下載次數: 88)

51hei圖片_20231025212150.jpg

10-2DS1302可調時鐘.zip

69.15 KB, 下載次數: 28

普中-6開發板原理圖.pdf

205.83 KB, 下載次數: 14


作者: Diameter    時間: 2023-10-25 21:23
全部的源代碼和開發板原理圖已上傳

作者: zhuls    時間: 2023-10-26 07:14
沒有細看你的代碼圖片,能讀寫,說明時序正常,顯示不對可能是你的數據轉換沒做好:
1302讀寫的是十進制BCD碼,你該不會是當做16進制來處理了吧?
作者: xianfajushi    時間: 2023-10-26 07:32
那就改為修改立即生效,不能成功的原因極大可能是讀取,或在調節時停止讀取并在更新后恢復讀取.
作者: wulin    時間: 2023-10-26 10:36
Diameter 發表于 2023-10-25 21:23
全部的源代碼和開發板原理圖已上傳

把這個示例的端口定義按你的實際電路重新定義即可運行。



萬年歷漢字1602 1302 1820 仿真范例程序.rar (141.83 KB, 下載次數: 15)


作者: joyb    時間: 2023-10-26 11:51
把單片機STC89C56換成89C52,單片機性能不完全一致
作者: man1234567    時間: 2023-10-26 18:18
本帖最后由 man1234567 于 2023-10-27 09:59 編輯

主要看主程序里的注釋自己調整就好,總體感覺有些啰嗦有點亂
#include <REGX51.H>
#include "LCD1602.h"
#include "DS1302.h"
#include "Timer0.h"
#include "Key.h"

unsigned char KeyNum,MODE,TimeSetSelect,TimeSetFlashFlag;

void TimeShow(void)//讀時間并按指定位置顯示
{
                DS1302_ReadTime();//讀時間               
                LCD_ShowNum(1,1,DS1302_Time[0],2);//按指定位置顯示年
                LCD_ShowNum(1,4,DS1302_Time[1],2);//按指定位置顯示月
                LCD_ShowNum(1,7,DS1302_Time[2],2);//按指定位置顯示日
                LCD_ShowNum(2,1,DS1302_Time[3],2);//按指定位置顯示時
                LCD_ShowNum(2,4,DS1302_Time[4],2);//按指定位置顯示分
                LCD_ShowNum(2,7,DS1302_Time[5],2);//按指定位置顯示秒
          
}
void TimeSet(void)//修改時間并實時顯示
{
        if(KeyNum==2)//按下2號鍵
        {
                TimeSetSelect++;//年月日時分秒循環跳轉
                if(TimeSetSelect>5)//單向跳轉的防溢出
                {
                        TimeSetSelect=0;
                }
        }
        if(KeyNum==3)//按下3號鍵
        {
                DS1302_Time[TimeSetSelect]++;//時間內容循環跳轉,上行,+
                if(DS1302_Time[0]>99){DS1302_Time[0]=0;}//年
                if(DS1302_Time[1]>12){DS1302_Time[1]=1;}//月
                if(DS1302_Time[1]==1||DS1302_Time[1]==3||DS1302_Time[1]==5||DS1302_Time[1]==7||DS1302_Time[1]==8||DS1302_Time[1]==10||DS1302_Time[1]==12)//適應月大小等
                {               
                        if(DS1302_Time[2]>31)//雙月大防溢出
                        {
                        DS1302_Time[2]=1;
                        }
                }
                else if(DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==9||DS1302_Time[1]==11)//單月小防溢出
                {
                        if(DS1302_Time[2]>30)
                {
                        DS1302_Time[2]=1;
                }
                }
                else if(DS1302_Time[1]==2)//2月平潤防溢出
                {
                        if(DS1302_Time[0]%4==0)
                        {
                                        if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
                        }
                        else
                        {
                                if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
                        }
                       
                }
                if(DS1302_Time[3]>23){DS1302_Time[3]=0;}//時防溢出
                if(DS1302_Time[4]>59){DS1302_Time[4]=0;}//分防溢出
                if(DS1302_Time[5]>59){DS1302_Time[5]=0;}//秒防溢出
                //                DS1302_SetTime();//不奇怪,原因看看主程序注釋。
        }
        if(KeyNum==4)////時間內容循環跳轉,下行,-
        {
                DS1302_Time[TimeSetSelect]--;
                if(DS1302_Time[0]<0){DS1302_Time[0]=99;}//同+相關原理,有些啰嗦可以合寫
                if(DS1302_Time[1]<1){DS1302_Time[1]=12;}
                if(DS1302_Time[1]==1||DS1302_Time[1]==3||DS1302_Time[1]==5||DS1302_Time[1]==7||DS1302_Time[1]==8||DS1302_Time[1]==10||DS1302_Time[1]==12)
                {               
                        if(DS1302_Time[2]<1)
                        {
                        DS1302_Time[2]=31;
                        }
                        if(DS1302_Time[2]>31)
                        {
                        DS1302_Time[2]=1;
                        }
                }
                else if(DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==9||DS1302_Time[1]==11)
                {
                if(DS1302_Time[2]<1)
                {
                DS1302_Time[2]=30;
                }
                        if(DS1302_Time[2]>30)
                {
                        DS1302_Time[2]=1;
                }       
                }
                else if(DS1302_Time[1]==2)
                {
                        if(DS1302_Time[0]%4==0)
                        {
                                if(DS1302_Time[2]<1){DS1302_Time[2]=29;}
                                if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
                        }
                        else
                        {
                                if(DS1302_Time[2]<1){DS1302_Time[2]=28;}
                                if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
                        }
                                DS1302_SetTime();
                }
                if(DS1302_Time[3]<0){DS1302_Time[3]=23;}
                if(DS1302_Time[4]<0){DS1302_Time[4]=59;}
                if(DS1302_Time[5]<0){DS1302_Time[5]=59;}
        }
        if(TimeSetSelect==0&&TimeSetFlashFlag==1){LCD_ShowString(1,1,"  ");}//依選擇調整類別的顯示定位,同樣感覺啰嗦
        else{        LCD_ShowNum(1,1,DS1302_Time[0],2);}
        if(TimeSetSelect==1&&TimeSetFlashFlag==1){LCD_ShowString(1,4,"  ");}
        else{        LCD_ShowNum(1,4,DS1302_Time[1],2);}
        if(TimeSetSelect==2&&TimeSetFlashFlag==1){LCD_ShowString(1,7,"  ");}
        else{        LCD_ShowNum(1,7,DS1302_Time[2],2);}
        if(TimeSetSelect==3&&TimeSetFlashFlag==1){LCD_ShowString(2,1,"  ");}
        else{        LCD_ShowNum(2,1,DS1302_Time[3],2);}
        if(TimeSetSelect==4&&TimeSetFlashFlag==1){LCD_ShowString(2,4,"  ");}
        else{        LCD_ShowNum(2,4,DS1302_Time[4],2);}
        if(TimeSetSelect==5&&TimeSetFlashFlag==1){LCD_ShowString(2,7,"  ");}
        else{        LCD_ShowNum(2,7,DS1302_Time[5],2);}
//        DS1302_SetTime();//寫時間,可以退出調整后寫,否則過于頻繁
}
void main()
{
        LCD_Init();//1602初始化,圖片中正常顯示就沒看了
        DS1302_Init();//1302初始化,圖片中正常顯示就沒看了
        Timer0_Init();//定時器初始化,建議在調整時間開始時執行,停留在調時狀態過長時自動返回顯示
        LCD_ShowString(1,1,"  -  -  ");//美化上行
        LCD_ShowString(2,1,"  :  :  ");//美化下行

        while(1)//主循環,先讀按鍵,有1按下時反轉狀態關并執行相關語句,然后有無按1鍵都選擇狀態執行顯示/寫時。
        {

                KeyNum=Key();//讀按鍵,1為調時/顯時切換,2為調時時選擇調整類別,3、4分別是調整的+和-。
                if(KeyNum==1)//按下1號鍵后切換調時/顯示
                {
                        if(MODE==0)//如果正常顯示時
                        {
                          MODE=1;//立即先切換到調時模式
                                TimeSetSelect=0;//然后選擇從年開始調整,然后并不立即調時,而是隨后寫入時間
                        }
                        else if(MODE==1)//如果調時模式時
                  {
                                MODE=0;//立即先切換到正常顯示模式,然后執行調時
                                DS1302_SetTime();//開始調時,隨后不執行寫時(TimeSet();),往下執行就是顯示新讀取1302的時間
                  }
                }
               
                switch(MODE)//選擇顯時(模式0)和調時(模式1),順序執行不受按鍵影響:
                {
                        case 0:TimeShow();break;//顯時(因為在按下鍵后已反轉模式,因此顯示的以是重新讀1302的時間而不是調整后的時間,此時顯示的時間不是以前的而是以前的時間加上你在調時中停留的時間,理論有一定概率顯示是和以前一樣的)
                        case 1:TimeSet();break;//寫時間(因為在按下鍵后已反轉模式所以不在調時后執行,此時并寫入時間上次讀出的時間,不按鍵就一直這樣寫且理論上極小概率可能回退一秒,再按1鍵就進入調時再反轉進入顯示模式)
                }
        }
}

void Timer0_Routine() interrupt 1//每隔一秒執行一次中斷
{
        static unsigned int T0Count;
        TH0=64535/256;
        TL0=64535%256;
        T0Count++;
        if(T0Count>=500)
        {
                T0Count=0;
                TimeSetFlashFlag=!TimeSetFlashFlag;
        }
}

作者: Diameter    時間: 2023-10-27 11:55
man1234567 發表于 2023-10-26 18:18
主要看主程序里的注釋自己調整就好,總體感覺有些啰嗦有點亂
#include
#include "LCD1602.h"

  “switch(MODE)//選擇顯時(模式0)和調時(模式1),順序執行不受按鍵影響:
                {
                        case 0:TimeShow();break;//顯時(因為在按下鍵后已反轉模式,因此顯示的以是重新讀1302的時間而不是調整后的時間,此時顯示的時間不是以前的而是以前的時間加上你在調時中停留的時間,理論有一定概率顯示是和以前一樣的)” 為啥我的DS1302_SetTime只要調用過不就會把我全局數組里改變的時間寫到DS1302里面 我DS1302不應該存在以前的時間的啊
作者: man1234567    時間: 2023-10-27 14:59
Diameter 發表于 2023-10-27 11:55
“switch(MODE)//選擇顯時(模式0)和調時(模式1),順序執行不受按鍵影響:
                {
    ...

細讀我的注釋就知道了。
改的方式很多,比如模式的切換可以在相應模式工作完成后進行。
你的程序現在是顯示模式時寫時間到1302而修改后不保存只是重讀1302再顯示。
作者: Diameter    時間: 2023-10-27 16:56
man1234567 發表于 2023-10-27 14:59
細讀我的注釋就知道了。
改的方式很多,比如模式的切換可以在相應模式工作完成后進行。
你的程序現在是 ...

逆天我跟著視頻教程做的 DS1302寫完還要加保存程序么 不是寫入 就自動覆蓋DS1302芯片原來的數據啊
作者: 君工創    時間: 2023-10-28 08:56
我之前試過修改不成功,后來每次修改之后重新初始化DS1302就可以了。
作者: man1234567    時間: 2023-10-28 17:15
Diameter 發表于 2023-10-27 16:56
逆天我跟著視頻教程做的 DS1302寫完還要加保存程序么 不是寫入 就自動覆蓋DS1302芯片原來的數據啊

你畫個框圖就知道邏輯錯在哪里了
作者: isyido    時間: 2024-1-7 10:27
是時序上出問題了,寫入操作沒有完成時序?




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲精品自拍视频 | 亚洲另类自拍 | 日韩国产精品一区二区 | 亚洲一区精品视频 | 国产一二区 | 国产综合久久久 | 日韩一区在线视频 | 色综合欧美 | 国产网址 | 黄色一级片免费 | 性久久久久久 | 夜夜爽天天爽 | 99久久婷婷国产综合精品草原 | 日本国产欧美 | 免费黄色大片 | 国产二区视频在线观看 | 日本中文字幕网站 | 黄色一级大片在线免费看国产一 | 精品国产区一区二 | 午夜伦理视频 | 午夜国产在线 | 亚洲精品乱码久久久久 | 成年人免费看视频 | 日韩在线视频免费 | 免费视频毛片 | 国产精品免费在线播放 | 国产精品一区二区久久 | 一区二区在线免费观看 | 人人看人人干 | 国产小视频在线观看 | 亚洲天天干 | 国产日韩在线播放 | 国产一级在线 | av福利在线 | 日本免费不卡视频 | 欧美国产综合 | 亚洲免费小视频 | 天天色天天| 毛片视频免费 | 婷婷四房综合激情五月 | 一区二区三区四区在线播放 |