|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
(原創(chuàng))PICC實(shí)現(xiàn)24小時(shí)時(shí)鐘程序 |
| 作者:石魚wleen 欄目:單片機(jī) |
//******************************************************************************* //程 序 名:高精度時(shí)鐘 //設(shè) 計(jì) 者:丫蛋 //設(shè)計(jì)說明:設(shè)置TMR0預(yù)分頻系數(shù)為16,一次計(jì)數(shù)中斷溢出時(shí)間為4096us(0x1000) // 每次TMR0中斷服務(wù)中對(duì)時(shí)間累計(jì)變量microsecond加上4096 // 程序主循環(huán)中不停地查詢變量microsecond,看是否超過50ms,如果時(shí)間超過 // 50ms,則microsecond=microsecond-50000,同時(shí)50ms計(jì)數(shù)器MS50加1 // 基于50ms計(jì)數(shù)器的累加值,更新秒,分和小時(shí)值 // 雖然每一個(gè)50ms的變化時(shí)間略有偏差,但所有偏差值都保留在microsecond // 中,并得到累計(jì)修正,所以長(zhǎng)時(shí)間跨度計(jì)時(shí)精確 //******************************************************************************* #include<pic.h> //*******************//variable define//********************************** LONG int microsecond; //microsecond accumulative unit int MS50; //50ms counter int second; //second counter int minute; //minute counter int hour; //hour counter main() { //*******************//initialize//************************************** T0CS=0; //timer0 work at timer mode T0IF=0; //clear timer0 flag PSA=0; PS2=1; PS1=0; PS0=0; //psa=0,ps2:ps0=100,1:16 prescale VALUE T0IE=1; //timer0 overflow interrupt enable GIE=1; // GLOBAL interrupt enable //*******************//main loop//************************************** while(1) { CLRWDT(); //clear the watchdog T0IE=0; //temporarily forbid the timer0 to interrupt //to KEEP the VALUE of microsecond microsecond-=50000; if(microsecond>=50000) //deal with microsecond>=50000 { MS50=+1; //50ms counter increase 1 if(MS50!=20) T0IE=1; //the time is not one second, resume t0ie MS50=0; //the time is one second,clear MS50 second++; //second counter if(second!=60) T0IE=1; //the time is not one minute, resume t0ie second=0; //the time is one minute,clear second minute++; //minute counter if(minute!=60) T0IE=1; //the time is not one hour, resume t0ie minute=0; //the time is one hour,clear minute hour++; //hour counter if(hour!=24) T0IE=1; //the time is not 24h, resume t0ie hour=0; //the time is 24 hour,clear hour } else microsecond+=50000; T0IE=1; //resume t0ie } } void interrupt timer(void) { microsecond+=4096; } 參考張工的書上的思路設(shè)計(jì)的C語言實(shí)現(xiàn)的高精度時(shí)鐘程序,編譯通過,未實(shí)際運(yùn)行,請(qǐng)大家指點(diǎn)錯(cuò)誤。謝謝了。 |
| 2樓: | >>參與討論 |
| 作者: OYGGJ 于 2005/6/21 9:31:00 發(fā)布:
思路可以,試試吧 思路可以,試試吧 |
|
| 3樓: | >>參與討論 |
| 作者: 石魚wleen 于 2005/6/21 11:30:00 發(fā)布:
正在試行,有結(jié)果了一定和大家分享 |
|
| 4樓: | >>參與討論 |
| 作者: lanyong 于 2005/6/21 13:35:00 發(fā)布:
斷電了,怎么辦呢? |
|
| 5樓: | >>參與討論 |
| 作者: OYGGJ 于 2005/6/21 14:14:00 發(fā)布:
電池了,或者是超級(jí)電容了. 電池了,或者是超級(jí)電容了. |
|
| 6樓: | >>參與討論 |
| 作者: 石魚wleen 于 2005/6/22 10:16:00 發(fā)布:
斷電? 還沒有考慮這個(gè)問題呢?這只是為我的設(shè)計(jì)中的延時(shí)做的一個(gè)程序。要是真要用來做時(shí)鐘的話,可以用電池。時(shí)鐘一般都是用電池。 |
|
| 7樓: | >>參與討論 |
| 作者: martin 于 2005/6/22 11:25:00 發(fā)布:
如果你用的型號(hào)有Timer1 如果你用的型號(hào)有Timer1,在Timer1引腳上接32768的晶體做實(shí)時(shí)時(shí)鐘更簡(jiǎn)單些,而且關(guān)鍵是用Timer1計(jì)時(shí),單片機(jī)可以Sleep。對(duì)于一些新出的PIC,Timer1的功耗有很大改善,小于3微安,這樣做就真的可以用電池供電來實(shí)現(xiàn)一個(gè)低功耗的時(shí)鐘了。 |
|
| 8樓: | >>參與討論 |
| 作者: 滕海波 于 2005/6/23 14:17:00 發(fā)布:
我看你不如有時(shí)鐘芯片來讀取不就好。我試過,程序很簡(jiǎn)單易上手! 我看你不如有時(shí)鐘芯片來讀取不就好。我試過,程序很簡(jiǎn)單易上手! |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號(hào) |