找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

單片機(jī)DS1302時(shí)鐘 求時(shí)鐘秒點(diǎn)閃爍思路

  [復(fù)制鏈接]
ID:1144680 發(fā)表于 2025-6-6 14:05 | 顯示全部樓層 |閱讀模式
DS1302時(shí)鐘,如何讓秒點(diǎn)閃爍?不想用定時(shí)器,秒點(diǎn)亮?xí)r“秒”正好進(jìn)位。按說(shuō)可以判斷秒進(jìn)位,但如何讓它熄滅0.5秒?
回復(fù)

使用道具 舉報(bào)

ID:1109793 發(fā)表于 2025-6-6 15:32 | 顯示全部樓層
不用定時(shí)器用循環(huán)?
回復(fù)

使用道具 舉報(bào)

ID:1109793 發(fā)表于 2025-6-6 15:41 | 顯示全部樓層
顯示秒的情況下,秒點(diǎn)一直顯示著就行吧。不顯示秒的話,無(wú)所謂進(jìn)位同步了
回復(fù)

使用道具 舉報(bào)

ID:108361 發(fā)表于 2025-6-6 15:59 | 顯示全部樓層
1302有沒(méi)有秒中斷輸出?PCF8563是有秒中斷輸出引腳的
回復(fù)

使用道具 舉報(bào)

ID:69038 發(fā)表于 2025-6-6 16:04 | 顯示全部樓層
直接更新顯示秒讀數(shù)就行了,何必多浪費(fèi)2個(gè)秒點(diǎn)在那閃啊閃的?
如果沒(méi)有顯示秒讀數(shù),開(kāi)個(gè)定時(shí)器,差個(gè)不多500ms就換個(gè)姿態(tài),不就是秒點(diǎn)了?
回復(fù)

使用道具 舉報(bào)

ID:1133081 發(fā)表于 2025-6-6 16:05 | 顯示全部樓層
這個(gè)示例里有你想要的秒點(diǎn)閃爍 4位數(shù)碼管DS1302單鍵調(diào)時(shí)時(shí)鐘 DS18B20程序 仿真.rar (153.83 KB, 下載次數(shù): 0)
回復(fù)

使用道具 舉報(bào)

ID:1144680 發(fā)表于 2025-6-7 20:14 | 顯示全部樓層
xiaobendan001 發(fā)表于 2025-6-6 15:32
不用定時(shí)器用循環(huán)?

用定時(shí)器不能與“秒”準(zhǔn)確同步。
回復(fù)

使用道具 舉報(bào)

ID:1144680 發(fā)表于 2025-6-7 20:15 | 顯示全部樓層
powerdruy 發(fā)表于 2025-6-6 15:59
1302有沒(méi)有秒中斷輸出?PCF8563是有秒中斷輸出引腳的

謝謝提醒,有秒中斷的。沒(méi)想起來(lái)
回復(fù)

使用道具 舉報(bào)

ID:1144680 發(fā)表于 2025-6-7 20:17 | 顯示全部樓層
zhuls 發(fā)表于 2025-6-6 16:04
直接更新顯示秒讀數(shù)就行了,何必多浪費(fèi)2個(gè)秒點(diǎn)在那閃啊閃的?
如果沒(méi)有顯示秒讀數(shù),開(kāi)個(gè)定時(shí)器,差個(gè)不多5 ...

沒(méi)有秒閃,萬(wàn)一不走了都不知道。
用定時(shí)器不能與秒同步。
回復(fù)

使用道具 舉報(bào)

ID:1144680 發(fā)表于 2025-6-7 20:17 | 顯示全部樓層
WL0123 發(fā)表于 2025-6-6 16:05
這個(gè)示例里有你想要的秒點(diǎn)閃爍

謝謝,好好學(xué)習(xí)學(xué)習(xí)。
回復(fù)

使用道具 舉報(bào)

ID:69038 發(fā)表于 2025-6-7 21:01 | 顯示全部樓層
dcc60 發(fā)表于 2025-6-7 20:17
沒(méi)有秒閃,萬(wàn)一不走了都不知道。
用定時(shí)器不能與秒同步。

都顯示“23:59:32”了,中間兩組“:”閃不閃有什么意義?
如果是顯示“23:59”,那可以閃的。
開(kāi)個(gè)定時(shí)器計(jì)數(shù)器會(huì)不?
你的定時(shí)器開(kāi)個(gè)1ms,計(jì)滿500就改變“:”的狀態(tài),不需要太準(zhǔn),前500“;”亮起,500后“;”滅,會(huì)不?
同時(shí)你肯定還會(huì)在大循環(huán)中時(shí)不時(shí)去讀RTC的秒計(jì)數(shù),當(dāng)讀到的秒計(jì)數(shù)是新內(nèi)容時(shí),不管這個(gè)500ms增量到什么值,直接清0,同時(shí)“;”亮起,這樣算不算“同步”?至于500ms后就由它去,多幾10個(gè)計(jì)數(shù)都無(wú)所謂,因?yàn)槭菧缌。。?dāng)下一個(gè)秒讀數(shù)更新時(shí),又清0了,重頭來(lái)過(guò)。。
不完整代碼給你參考:
定時(shí)器計(jì)數(shù):
  1. //tim0中斷
  2. void tim0_Isr() interrupt 1           //
  3. {
  4.         tms++;    //這個(gè)計(jì)滿500就滅秒點(diǎn)
復(fù)制代碼

更新秒點(diǎn)狀態(tài):
  1. //顯示秒點(diǎn)         
  2.         if (tms<=500)      //上半秒?
  3.         {
  4.          //秒點(diǎn)亮
  5.         }
  6.         else  
  7.         {
  8.           //秒點(diǎn)滅
  9.         }
復(fù)制代碼

所謂的同步:
  1.           if(oldsec!=sec) //秒讀數(shù)有變
  2.           {
  3.             tms=0;
  4.             oldsec=sec;
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:88256 發(fā)表于 2025-6-7 22:22 | 顯示全部樓層
dcc60 發(fā)表于 2025-6-7 20:14
用定時(shí)器不能與“秒”準(zhǔn)確同步。

你這腦子不行啊,當(dāng)1302秒中斷時(shí),顯示秒500ms,然后熄滅,這個(gè)熄滅不計(jì)時(shí),管它是400ms還是700ms,等到下一次秒中斷繼續(xù)顯示,你會(huì)揪著這一點(diǎn)冒號(hào)顯示的誤差嗎?
回復(fù)

使用道具 舉報(bào)

ID:654797 發(fā)表于 2025-6-8 06:02 | 顯示全部樓層
dcc60 發(fā)表于 2025-6-7 20:14
用定時(shí)器不能與“秒”準(zhǔn)確同步。

1302沒(méi)有秒輸出,要做到秒同步不太可能吧
回復(fù)

使用道具 舉報(bào)

ID:584814 發(fā)表于 2025-6-8 12:08 | 顯示全部樓層
dcc60 發(fā)表于 2025-6-7 20:15
謝謝提醒,有秒中斷的。沒(méi)想起來(lái)

秒中斷每秒發(fā)生一次,還是得結(jié)合用系統(tǒng)中斷才能做到半秒亮半秒滅的閃。
回復(fù)

使用道具 舉報(bào)

ID:584814 發(fā)表于 2025-6-8 12:13 | 顯示全部樓層
vscos 發(fā)表于 2025-6-8 06:02
1302沒(méi)有秒輸出,要做到秒同步不太可能吧

完全精準(zhǔn)同步?jīng)]必要,畢竟是給肉眼看的。
用1個(gè)1MS中斷計(jì)數(shù),當(dāng)秒位數(shù)字發(fā)生變化時(shí)清零,計(jì)數(shù)大于500時(shí)關(guān)秒點(diǎn)顯示否則開(kāi)。
調(diào)整這個(gè)數(shù)值可以調(diào)整肉眼的觀看效果,且對(duì)系統(tǒng)運(yùn)行無(wú)影響。
在數(shù)碼管的兩個(gè)秒點(diǎn)可分開(kāi)控制的,還可以做到上午閃上點(diǎn)下午閃下點(diǎn)。
回復(fù)

使用道具 舉報(bào)

ID:619259 發(fā)表于 2025-6-8 16:17 | 顯示全部樓層
WL0123 發(fā)表于 2025-6-6 16:05
這個(gè)示例里有你想要的秒點(diǎn)閃爍

你的答案不符合樓主的要求,樓主的秒點(diǎn)閃爍是亮0.5秒,滅0.5秒。你提供的案例是亮1秒,滅1秒。
回復(fù)

使用道具 舉報(bào)

ID:1144680 發(fā)表于 2025-6-8 19:28 | 顯示全部樓層
zhuls 發(fā)表于 2025-6-7 21:01
都顯示“23:59:32”了,中間兩組“:”閃不閃有什么意義?
如果是顯示“23:59”,那可以閃的。
開(kāi)個(gè)定 ...

很好的思路。
實(shí)驗(yàn)階段,有6位、有4位的,6位的自然不用閃,4位的要搞一下。之前已經(jīng)用定時(shí)器“閃”了,想更準(zhǔn)確一點(diǎn)。
回復(fù)

使用道具 舉報(bào)

ID:1144680 發(fā)表于 2025-6-8 19:29 | 顯示全部樓層
hhdsdy 發(fā)表于 2025-6-7 22:22
你這腦子不行啊,當(dāng)1302秒中斷時(shí),顯示秒500ms,然后熄滅,這個(gè)熄滅不計(jì)時(shí),管它是400ms還是700ms ...

有道理。!
回復(fù)

使用道具 舉報(bào)

ID:1144680 發(fā)表于 2025-6-8 19:31 | 顯示全部樓層
vscos 發(fā)表于 2025-6-8 06:02
1302沒(méi)有秒輸出,要做到秒同步不太可能吧

是這樣的,目前看來(lái)只能精確到1秒內(nèi)亮滅一次,500ms有點(diǎn)困難。
回復(fù)

使用道具 舉報(bào)

ID:1144680 發(fā)表于 2025-6-8 19:33 | 顯示全部樓層
man1234567 發(fā)表于 2025-6-8 12:08
秒中斷每秒發(fā)生一次,還是得結(jié)合用系統(tǒng)中斷才能做到半秒亮半秒滅的閃。

目前用定時(shí)器延時(shí)大概0.5秒。
回復(fù)

使用道具 舉報(bào)

ID:1144680 發(fā)表于 2025-6-8 19:37 | 顯示全部樓層
man1234567 發(fā)表于 2025-6-8 12:13
完全精準(zhǔn)同步?jīng)]必要,畢竟是給肉眼看的。
用1個(gè)1MS中斷計(jì)數(shù),當(dāng)秒位數(shù)字發(fā)生變化時(shí)清零,計(jì)數(shù)大于500時(shí) ...

目前用定時(shí)器作秒閃。
很久以前,秒點(diǎn)是做成上下跳動(dòng)閃爍的。
回復(fù)

使用道具 舉報(bào)

ID:1133081 發(fā)表于 2025-6-8 20:14 | 顯示全部樓層
cy009 發(fā)表于 2025-6-8 16:17
你的答案不符合樓主的要求,樓主的秒點(diǎn)閃爍是亮0.5秒,滅0.5秒。你提供的案例是亮1秒,滅1秒。

是你沒(méi)有看懂
回復(fù)

使用道具 舉報(bào)

ID:69038 發(fā)表于 2025-6-8 21:21 | 顯示全部樓層
dcc60 發(fā)表于 2025-6-8 19:28
很好的思路。
實(shí)驗(yàn)階段,有6位、有4位的,6位的自然不用閃,4位的要搞一下。之前已經(jīng)用定時(shí)器“閃”了, ...

想要“更準(zhǔn)確”,就用測(cè)周期的方法:
在系統(tǒng)上電初始化后,先單任務(wù)方式測(cè)一下前后兩次秒讀數(shù)更新之間的計(jì)數(shù)差,就是完整的1秒內(nèi)要有多少個(gè)計(jì)數(shù)?然后這個(gè)計(jì)數(shù)再對(duì)半開(kāi),就是你想要有“更準(zhǔn)確”的亮滅秒點(diǎn)的時(shí)間,即500ms了 。
回復(fù)

使用道具 舉報(bào)

ID:619259 發(fā)表于 2025-6-9 08:37 | 顯示全部樓層
本帖最后由 cy009 于 2025-6-9 18:45 編輯
WL0123 發(fā)表于 2025-6-8 20:14
是你沒(méi)有看懂
同步的問(wèn)題依然有誤差
回復(fù)

使用道具 舉報(bào)

ID:332444 發(fā)表于 2025-6-9 09:13 | 顯示全部樓層
嚇我一跳,還以為1302真的有秒引腳!如果有秒引腳之前我就寫(xiě)錯(cuò)了,冒汗!更新顯示時(shí),可以比較秒值,不同時(shí)點(diǎn)亮,并設(shè)法半秒熄滅,簡(jiǎn)單延時(shí)亦可,定時(shí)器計(jì)數(shù)亦可,當(dāng)然定時(shí)器可設(shè)法精準(zhǔn)。
回復(fù)

使用道具 舉報(bào)

ID:1144680 發(fā)表于 2025-6-9 09:58 | 顯示全部樓層
zhuls 發(fā)表于 2025-6-8 21:21
想要“更準(zhǔn)確”,就用測(cè)周期的方法:
在系統(tǒng)上電初始化后,先單任務(wù)方式測(cè)一下前后兩次秒讀數(shù)更新之間的 ...

想到一塊了。
我的想法是上電后一定時(shí)間(等待系統(tǒng)穩(wěn)定)然后用計(jì)數(shù)方法取半作為計(jì)時(shí)器的亮滅值。
回復(fù)

使用道具 舉報(bào)

ID:76044 發(fā)表于 2025-6-9 10:50 | 顯示全部樓層
這個(gè)問(wèn)題我在制作時(shí)鐘時(shí)也是苦惱過(guò),我處理方式是有二,一是改定時(shí)器的參數(shù),改到同步為止,二是60秒讀一次DS1302時(shí)間,這樣秒數(shù)和閃點(diǎn)是同步的,我現(xiàn)在的制作好的時(shí)鐘看著很滿意
回復(fù)

使用道具 舉報(bào)

ID:996773 發(fā)表于 2025-6-9 13:15 | 顯示全部樓層
這個(gè)和主程序結(jié)構(gòu)有關(guān)系的,我的是這樣設(shè)計(jì)的,主程序一直在查按鍵,查1302的秒數(shù)據(jù)是否有變化,
按鍵和秒都沒(méi)變化就會(huì)往固定的寄存器加1,如果秒和按鍵都沒(méi)有變化數(shù)據(jù)滿200就會(huì)滅掉秒點(diǎn),這個(gè)
時(shí)間段半秒不到,接下來(lái)的半秒多時(shí)間就是熄滅狀態(tài),等到1302秒數(shù)據(jù)變化了就去處理顯示和寄存器
歸零,反正我用的是計(jì)數(shù)器方法,沒(méi)有用中斷和定時(shí)這些資源
回復(fù)

使用道具 舉報(bào)

ID:1144680 發(fā)表于 2025-6-9 20:01 | 顯示全部樓層
xianfajushi 發(fā)表于 2025-6-9 09:13
嚇我一跳,還以為1302真的有秒引腳!如果有秒引腳之前我就寫(xiě)錯(cuò)了,冒汗!更新顯示時(shí),可以比較秒值,不同時(shí) ...

定時(shí)器有累積誤差,只能是個(gè)大概。
回復(fù)

使用道具 舉報(bào)

ID:1144680 發(fā)表于 2025-6-9 20:03 | 顯示全部樓層
lxm41577 發(fā)表于 2025-6-9 10:50
這個(gè)問(wèn)題我在制作時(shí)鐘時(shí)也是苦惱過(guò),我處理方式是有二,一是改定時(shí)器的參數(shù),改到同步為止,二是60秒讀一次 ...

定時(shí)器有累積誤差。
60秒讀一次是什么意思?
回復(fù)

使用道具 舉報(bào)

ID:1144680 發(fā)表于 2025-6-9 20:06 | 顯示全部樓層
hi等你 發(fā)表于 2025-6-9 13:15
這個(gè)和主程序結(jié)構(gòu)有關(guān)系的,我的是這樣設(shè)計(jì)的,主程序一直在查按鍵,查1302的秒數(shù)據(jù)是否有變化,
按鍵和秒 ...

目前能想到最精確的就是秒變化時(shí)“:”亮,然后熄滅大概0.5秒。
回復(fù)

使用道具 舉報(bào)

ID:619259 發(fā)表于 2025-6-9 22:04 | 顯示全部樓層
完美解決秒點(diǎn)同步的問(wèn)題:
1.定義兩個(gè)變量,存儲(chǔ)相鄰兩次讀取秒的值。unsigned char sec_temp1,sec_temp2;
2.定義定時(shí)器計(jì)數(shù)變量。unsigned int cnt;
3.定時(shí)器定時(shí)5ms,計(jì)數(shù)200次即1秒,取一半值(0.5秒)顯示秒點(diǎn),另一半不顯示。
4.秒點(diǎn)同步:判斷相鄰兩次讀取秒的值,若不相等即為秒有進(jìn)位,執(zhí)行cnt=0。
回復(fù)

使用道具 舉報(bào)

ID:332444 發(fā)表于 2025-6-10 10:30 | 顯示全部樓層
dcc60 發(fā)表于 2025-6-9 20:01
定時(shí)器有累積誤差,只能是個(gè)大概。

理解差了,每秒同步是較精準(zhǔn)的。
回復(fù)

使用道具 舉報(bào)

ID:1144680 發(fā)表于 2025-6-10 20:50 | 顯示全部樓層
cy009 發(fā)表于 2025-6-9 22:04
完美解決秒點(diǎn)同步的問(wèn)題:
1.定義兩個(gè)變量,存儲(chǔ)相鄰兩次讀取秒的值。unsigned char sec_temp1,sec_temp2; ...

抽時(shí)間試試。感謝支持。
回復(fù)

使用道具 舉報(bào)

ID:1144680 發(fā)表于 2025-6-10 20:51 | 顯示全部樓層
xianfajushi 發(fā)表于 2025-6-10 10:30
理解差了,每秒同步是較精準(zhǔn)的。

可否把相關(guān)代碼發(fā)出來(lái)學(xué)習(xí)學(xué)習(xí)?
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2025-6-11 13:06 | 顯示全部樓層
定義一個(gè)全局變量,定時(shí)器10mS中斷,在中斷中執(zhí)行 time_sys++;
這個(gè)time_sys就是基準(zhǔn)時(shí)間,根據(jù)這個(gè)基準(zhǔn)時(shí)間來(lái)讀取DS1302,閃燈操作,這樣的話,整體閃燈和秒時(shí)間有10mS的誤差,但這種影響可以忽略不計(jì)的例如
   void read_time(void)     
{
       static u8 ren  = 0;
        if(ren == time_sys) return;
        ren = time_sys;

       讀取一次DS1302秒時(shí)間,這個(gè)秒時(shí)間可以是返回值,也可以是全局變量
}

閃燈程序
   void led_mode(void)     
{
       static u8 ren  = 0;
        if(ren != time_sys)
       {
          ren = time_sys;

         flash_crc = (flash_crc + 1) % 100;
         if(flash_crc < 50)
               {
                 亮燈;
               }
              eles
                  {
                     滅燈;
                  }
       }
}


你自己再寫(xiě)一個(gè)flash_crc 根據(jù)秒來(lái)進(jìn)行歸零的代碼,思考一下
回復(fù)

使用道具 舉報(bào)

ID:1144680 發(fā)表于 2025-6-12 10:02 | 顯示全部樓層
Y_G_G 發(fā)表于 2025-6-11 13:06
定義一個(gè)全局變量,定時(shí)器10mS中斷,在中斷中執(zhí)行 time_sys++;
這個(gè)time_sys就是基準(zhǔn)時(shí)間,根據(jù)這個(gè)基準(zhǔn)時(shí)間 ...

謝謝!好好研究研究。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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