黑龍江科技學(xué)院 高 楊
前段時(shí)間做一個(gè)記錄天亮天黑時(shí)間的儀器,要求能存儲時(shí)間,并且時(shí)鐘要精度高,需要的時(shí)候可以上傳到電腦進(jìn)行分析處理。傳感器可以用光敏二極管和光敏三極管以及光敏電阻,考慮到易于調(diào)整最終選擇了使用光敏電阻。在數(shù)碼管的驅(qū)動上選擇了MAX7219芯片剛好驅(qū)動八位共陰極數(shù)碼管,因?yàn)槭诸^上只有三個(gè)按鍵,所以在按鍵的設(shè)計(jì)上,采用一鍵多能的設(shè)計(jì)方法,按鍵的功能分布如下:
K1:按動一次可以進(jìn)行小時(shí)的調(diào)整,且小時(shí)位閃爍給出提示,按動第二次可以對分鐘調(diào)整,同樣給出提示,按下第三次時(shí)候可以對秒進(jìn)行調(diào)整,秒位也閃爍一下進(jìn)行提示,第四次顯示傳感器讀數(shù),第五次按下后進(jìn)入上傳和格式化內(nèi)部EEPROM的操作,并且都會給出提示。
K2:調(diào)整時(shí)間時(shí)候進(jìn)行加操作,上傳和格式化時(shí)候?yàn)樯蟼髦噶铈I。
K3:調(diào)整時(shí)間時(shí)候進(jìn)行減操作,上傳和格式化時(shí)候?yàn)楦袷交噶铈I。
由于手頭沒有時(shí)鐘芯片,又不想去買,就考慮如何用定時(shí)器做出高精度的計(jì)時(shí)器,在進(jìn)行stc的下載中發(fā)現(xiàn)了一個(gè)奇怪的現(xiàn)象,顯示我單片機(jī)的晶振和標(biāo)稱相差很多,更換了幾個(gè)做測試,結(jié)果一樣,終于被我發(fā)現(xiàn)原來定時(shí)器不準(zhǔn)的最大原因在晶振本身是不準(zhǔn)的,現(xiàn)在我按照STC編程軟件提示的頻率設(shè)計(jì)中斷程序的定時(shí)器初始值,然后把中斷跳轉(zhuǎn)的指令消耗的時(shí)間考慮進(jìn)去,進(jìn)行了兩天的測量,盡然與我筆記本的時(shí)間誤差不到1s,獲得較為精準(zhǔn)的時(shí)間成功,這完全可以和普通的時(shí)鐘芯片相比了。
考慮到按鍵的延時(shí)函數(shù),以前都是使用for循環(huán)那樣寫太老套了,在各種書上我們只能看到for循環(huán)和while循環(huán)的延時(shí)函數(shù),這種軟件延時(shí)顯然不能有效的控制延時(shí)時(shí)間,于是我考慮在中斷里加上一個(gè)延時(shí)變量。這樣就可以更為精準(zhǔn)的控制延時(shí)了。而且會使目標(biāo)代碼更為短小。
以前沒有使用過STC的內(nèi)部EEPROM,由于要求能夠存儲足夠多的數(shù)據(jù),需要能掉電保護(hù)的存儲器,查看了STC89C51的手冊發(fā)現(xiàn)竟然有4K的EEPROM可以使用,心里大喜,把手冊上提供的EEPROM讀寫和擦除操作代碼直接復(fù)制過來就行了。
傳感器選擇了光敏電阻,經(jīng)過萬用表的測量,電阻在光照較強(qiáng)的時(shí)候大約1K,在黑暗環(huán)境達(dá)到幾百K,于是選擇了手頭上的一枚10K的電阻進(jìn)行串聯(lián)匹配,用于分壓比較。因?yàn)檫@樣只需要測量定值電阻上的分壓比就行了,不用考慮電壓源的穩(wěn)定性。在AD轉(zhuǎn)換上采用ADC0832一片就OK,還多出來一個(gè)通道呢。
在通過電腦串口上傳數(shù)據(jù)時(shí)候發(fā)現(xiàn)每次上傳一位需要延時(shí)一下,給硬件足夠的反應(yīng)時(shí)間,要不接收會出錯(cuò)的,比如沒有收到全部數(shù)據(jù),數(shù)據(jù)丟失,等等。
在判斷何時(shí)記錄時(shí)間時(shí)候,考慮到傳感器可能會出現(xiàn)數(shù)值震蕩或者不穩(wěn)定情況,那么我就通過設(shè)定緩沖區(qū)來解決這個(gè)問題。定義X1和X2作為觸發(fā)記錄的上下限,其中X1<X2,且X1不等于X2,那么X1和X2直接的取值就作為了緩沖區(qū)了,當(dāng)傳感器讀數(shù)X在緩沖區(qū)和其任意邊界進(jìn)行跳變時(shí)候不進(jìn)行觸發(fā),唯X1(或者X2)跨越緩沖區(qū)進(jìn)入X2(或者X1)時(shí)候觸發(fā)記錄程序,記錄下當(dāng)時(shí)的時(shí)間??紤]到干擾發(fā)生,并進(jìn)行延時(shí)再判斷。
在EEPROM進(jìn)行寫的時(shí)候先查找空白區(qū),在空白區(qū)進(jìn)行按組寫入,本程序只寫入了小時(shí)分鐘秒,如果擴(kuò)展可以加入月份和日期。擦除的時(shí)候逐個(gè)熄滅數(shù)碼管提示進(jìn)度。
其余的設(shè)計(jì)細(xì)節(jié)請參考程序注釋。
代碼如下:
Proteus仿真電路圖
以上就是全部代碼以及細(xì)節(jié)相關(guān)的注釋,希望大家找出其中不足之處或者可改進(jìn)的地方,與我進(jìn)行交流學(xué)習(xí)。