![]() |
發布時間: 2012-8-30 14:31
正文摘要:首先聲明下我只是個菜鳥,只會1點C語言,匯編什么的~對我而言是天書,看不懂開發板也周日下午到的手,“十天學會單片機和C語言編程”也才看完 Lesson3,講到 T0 中斷。試著做教程里的 課后練習,第1題,題目是:第一 ... |
只是截圖時用的 Notepad++ 文本編輯器
應用了 tomorrow_night_bright 皮膚 [此貼子已經被作者于2012-9-4 8:48:55編輯過]
|
敢問樓主用的什么代碼編輯器 貌似不是keil? |
單獨計量一個us是不容易,但是10天差5秒是可以計量的。 |
結果是閃爍1次慢1微秒,折換到1小時就是慢 18ms 軟件仿真本就不準! 在網上查了一下,能測1微秒的量具還真沒找到。 [此貼子已經被作者于2012-9-1 22:31:50編輯過]
|
你的理解是對的!
按我上面給你的回復試一試,就那么多。 |
繼續學習~發現T0 T1 的工作方式2 也是具有自動重裝的,
只不過只能有8位也就是最大256us [12M晶振]
256us 時間有點短,留給程序執行的其它代碼時間不多。
我這樣理解不錯吧? |
TH2=(65536-46080)/256 ;//46080...11.0592MHZ晶振的初裝值
[此貼子已經被作者于2012-9-1 9:36:46編輯過]
|
呵呵,我的代碼里,12M晶振不準引起的誤差,我就是再怎么個強迫癥,我也無能為力了 【STC-ISP下載時顯示的貌似確實不是精確12M,是不滿12M】
我們開發板 STC89C52單片機 芯片 是有 定時器/計數器2 的吧,
查了 reg52.h , 定時器/計數器2 不是很懂, 是不是這樣 IE 寄存器的 ET2 位是 定時器/計數器2 開關 對應的 T2CON 寄存器的 TR2和TF2位是 開始計時和溢出的標志位
T2CON 其它位都是什么作用? 始初值、工作方式啊 什么的是哪在個寄存器位?
看不懂啊,還缺點理論知識, 定時器/計數器2 使用教程在哪有的沒?
[此貼子已經被作者于2012-8-31 12:07:58編輯過]
|
首先你的精益求精的精神我是贊賞的。
基于你這種精神和目的,但是我不得不告訴你:定時器工作在這種模式下,不可能那么精確!(12m晶振,只要有誤差就肯定大于1us)
原因是由于51單片機在響應中斷請求時的一些條件(具體的你自己再看看資料吧),不可能任何情況下都及時響應。由于重新裝載定時初值是在中斷內,所以就會造成重新裝載初值的時間不確定(當然是us級的),自然就造成了誤差。
怎么辦呢?如果是做單片機時鐘(不用時鐘芯片),確實需要這么高的精度時,可以采用定時器/計數器2(51沒有,52有),自動重裝載初值的工作模式。 |
看了那個貼子,匯編不懂~哈
參照貼子,按思路試了一下,應該也是可以調整 延遲語句 精確定時到200ms, 但這種 延遲語句 沒辦法方便調整成其它時間,比如改成250ms,又得反復調 延遲語句 到精確。 【這方法也可以把精確定時調小,比如 延遲語句 1次是50ms,要250ms定時 就調用5次】
又順著貼子看到 _nop_() 函數正好是 1 μs,看了之前的程序, 閃爍1次慢1 μs 不對,而是快了1 μs; 加個 _nop_() 應該正好
調了下我的程序,關了數碼管干擾,加了 _nop_() 空函數,正好間隔200ms,非常精確。 改定時就修改 if 的判斷語句,可以隨便改 50ms 倍數 的間隔時間,都是精準的。
當然主程序循環體語句數量改變等,定時器中斷程序里的 堆棧 操作時間也會隨著變,調起來也麻煩了 =_=!
我的程序改成這樣了:
[此貼子已經被作者于2012-8-30 22:01:37編輯過]
|
我原來曾經專門開過一個帖子介紹過精確定時的問題 http://m.zg4o1577.cn/bbs/dpj-4711-1.html
你按上面網址的做 能精確到1微妙 . |