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











Proteus仿真電路圖
以上就是全部代碼以及細節相關的注釋,希望大家找出其中不足之處或者可改進的地方,與我進行交流學習。