單片機第六章定時器計數器ppt課件.ppt_第1頁
單片機第六章定時器計數器ppt課件.ppt_第2頁
單片機第六章定時器計數器ppt課件.ppt_第3頁
單片機第六章定時器計數器ppt課件.ppt_第4頁
單片機第六章定時器計數器ppt課件.ppt_第5頁
已閱讀5頁,還剩55頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第6章AT89C51單片機的定時器 計數器 1 1 內容概要工業檢測與控制 許多場合都要用到計數或定時功能 例如 對外部脈沖進行計數 產生精確的定時時間等 AT89C51片內有兩個可編程的定時器 計數器T1 T0 可滿足需要 本章介紹定時器 計數器的結構與功能 2種工作模式和4種工作方式 以及相關的2個特殊功能寄存器TMOD和TCON各位的定義及其編程 最后介紹定時器 計數器的編程及應用實例 2 定時 實現方式 1 軟件定時 2 不可編程硬件定時 3 可編程定時 3 定時 計數器的定時和計數功能 在TMOD中 各有一個控制位 C T 分別用于控制定時 計數器T0和T1是工作在定時器方式還是計數器方式 1 定時功能 計數輸入信號是內部時鐘脈沖 每個機器周期使寄存器的值加1 所以 計數頻率是振蕩頻率的1 12 2 計數功能 計數脈沖來自相應的外部輸入引腳 T0為P3 4 T1為P3 5 定時 計數器的核心部件是二進制加1計數器 TH0 TL0或TH1 TL1 4 2個16位定時器 計數器 52系列有3個16位Timer 定時器 對片內機器時鐘 周期方波 進行計數計數器 對Tx引腳輸入的負脈沖進行計數 與Timer工作有關的特殊功能寄存器 TCON和TMOD 5 6 1定時器 計數器的結構定時器 計數器結構如圖6 1所示 定時器 計數器T0由特殊功能寄存器TH0 TL0構成 定時器 計數器T1由特殊功能寄存器TH1 TL1構成 6 圖6 1AT89C51單片機的定時器 計數器結構框圖 6 具有定時器和計數器2種工作模式 4種工作方式 方式0 方式1 方式2和方式3 屬于增計數器 TMOD用于選擇定時器 計數器T0 T1的工作模式和工作方式 TCON用于控制T0 T1的啟動和停止計數 同時包含了T0 T1的狀態 T0 T1不論是工作在定時器模式還是計數器模式 都是對脈沖信號進行計數 只是計數信號的來源不同 計數器模式是對加在T0 P3 4 和T1 P3 5 兩個引腳上的外部脈沖進行計數 見圖6 1 定時器工作模式是對單片機的時鐘振蕩器信號經片內 7 7 12分頻后的內部脈沖信號計數 由于時鐘頻率是定值 所以可根據計數值可計算出定時時間 計數器的起始計數都是從計數器初值開始的 單片機復位時計數器的初值為0 也可用指令給計數器裝入一個新的初值 AT89C51的定時器 計數器屬于增1計數器 8 Timer的2個特殊功能寄存器 TCON TMOD TF1TR1TF0TR0IE1IT1IE0IT0 定時器控制寄存器TCON 88H TFx Timer0 1計數溢出標志位 1計數溢出 0計數未滿TFx標志位可用于申請中斷或供CPU查詢 在進入中斷服務程序時會自動清零 但在查詢方式時必須軟件清零 TRx Timer0 1運行控制位 1啟動計數 0停止計數 9 TR0 TR1 Timer0 1運行控制位 TR0 TR1 0時 Timer0 1停止計數TR0 TR1 1時 Timer0 1啟動計數 定時器T0 T1中斷申請過程 在已經開放T0 T1中斷允許且已被啟動的前提下 T0 T1加滿溢出時TF0 TF1標志位自動置 1 檢測到TCON中TF0 TF1變 1 后 將產生指令 LCALL000BH LCALL001BH執行中斷服務程序 TF0 TF1標志位會自動清 0 以備下次中斷申請 定時 計數器可按片內機器周期定時 也可對由T0 T1引腳輸入一個負脈沖進行加法計數 TF1TR1TF0TR0IE1IT1IE0IT0 TCON 88H 10 GATEC TM1M0GATEC TM1M0 定時器方式寄存器TMOD 89H T1 T0 M1 M0 工作方式定義位 定義4種方式 C T 計數器 定時器選擇位 1外部事件計數器 對Tx引腳的負脈沖計數 0片內時鐘定時器 對機器周期脈沖計數定時 00 13位Timer 用它無益 不要記它 01 16位Timer 經常用到10 可自動重裝的8位Timer 經常用到11 T0分為2個8位Timer T1此時不工作 因為沒有帶來甚麼好處 幾乎無用 11 GATEC TM1M0GATEC TM1M0 T1 T0 GATE門控位 Timer可由軟件與硬件兩者控制 GATE 0 普通用法Timer的啟 停由軟件對TRx位寫 1 0 控制 定時器方式寄存器TMOD 續 89H GATE 1 門控用法Timer的啟 停由軟件對TRx位寫 1 0 和在INTx引腳上出現的信號的高 低共同控制 12 計數脈沖輸入 定時器 計數器的工作方式 定時器 計數器共有四種工作方式 1 方式0 13位方式 13位計數器 定時器 計數器 13 2 方式1 16位方式 14 3 方式2 8位自動裝入時間常數方式 15 4 方式3 2個8位方式 僅T0可以工作在方式3 此時T0分成2個獨立的計數器 TL0和TH0 前者用原來T0的控制信號 TR0 TF0 后者用原來T1的控制信號 TR1 TF1 16 6 3對外部輸入的計數信號的要求當定時器 計數器工作在計數器模式時 計數脈沖來自外部輸入引腳T0或T1 當輸入信號產生負跳變時 計數器的值增1 每個機器周期的S5P2期間 都對外部輸入引腳T0或T1進行采樣 如在第一個機器周期中采得的值為1 而在下一個機器周期中采得的值為0 則在緊跟著的再下一個機器周期S3P1 17 期間 計數器加1 由于確認一次負跳變要花2個機器周期 因此外部輸入的計數脈沖的最高頻率為系統振蕩器頻率的1 24 例如 選用6MHz頻率的晶體 允許輸入的脈沖頻率最高為250kHz 如果選用12MHz頻率的晶體 則可輸入最高頻率為500kHz的外部脈沖 對于外部輸入信號的占空比并沒有什么限制 但為了確保某一給定電平在變化之前能被采樣一次 則這一電平至少要保持一個機器周期 18 故對外部輸入信號的要求如圖6 12所示 圖中 Tcy為機器周期 19 圖6 12對外部計數輸入信號的要求 19 THx TLx賦初值 THx賦高8位 TLx賦低8位 工作方式1的編程要點 TMOD選方式 寫 M1 M0 01b選方式1 若不用門控位 直接用軟件寫TRx控制啟 停 若使用門控位 先置位TRx 然后由INTx端的高 低電平來控制其啟 停 若要允許中斷 還須先置位ETx EA等中斷允許控制位 并編寫中斷服務程序 若不用中斷 可查詢 計數溢出標志TFx 的方式工作 但溢出標志TFx須軟件清0 20 THx TLx賦相同初值在TLx計數達到0FFH再加 1 時 TL0將溢出 進位位直接進入 TFx 去申請中斷 同時打開三態門 使THx中的值自動重裝 Copy 進TLx 工作方式2的編程 TMOD寄存器選方式 寫 M1 M0 10b選中方式2 其他用法與各種方式1完全相同 21 定時器小結 2個16位加法計數器 運行 停止由TRx位控制 當GATE 1時 由TRx位和Tx引腳上的信號共同控制 工作方式由TMOD決定 計數 定時由C T位決定工作方式0 13位 永遠不用工作方式3 T0拆為雙8位 幾乎無用工作方式1 16位 經常用到工作方式2 8位自動重裝 經常用到 從初值按機器周期或外部脈沖遞加 溢出位TFx申請中斷 中斷允許由ETx位和EA位控制 22 定時器初始化程序應完成如下工作 對TMOD賦值 以確定T0和T1的工作方式 計算初值 并將其寫入TH0 TL0或TH1 TL1 中斷方式時 則對IE賦值 開放中斷 使TR0或TR1置位 啟動定時 計數器定時或計數 23 6 4定時器 計數器的編程和應用4種方式 方式0與方式1基本相同 只是計數位數不同 方式0初值計算復雜 一般不用方式0 而用方式1 6 4 1方式1的應用 例6 1 假設系統時鐘頻率采用6MHz 在P1 0引腳上輸出一個周期為2ms的方波 如圖6 13所示 24 圖6 13P1 0引腳上輸出周期為2ms的方波 24 基本思想 方波周期T0確定 T0每隔1ms計數溢出1次 即T0每隔1ms產生一次中斷 CPU響應中斷后 在中斷服務子程序中對P1 0取反 如圖6 13所示 為此要做如下幾步工作 1 計算計數初值X機器周期 2 s 2 10 6s設需要裝入T0的初值為X 則有 216 X 2 10 6 1 10 3 216 X 500 X 65036 X化為十六進制數 即 65036 FE0CH T0的初值為TH0 FEH TL0 0CH 25 25 2 初始化程序設計采用定時器中斷方式工作 包括定時器初始化和中斷系統初始化 主要是對寄存器IP IE TCON TMOD的相應位進行正確的設置 并將計數初值送入定時器中 3 程序設計中斷服務子程序除了完成所要求的產生方波的工作之外 還要注意將計數初值重新裝入定時器 為下一次產生中斷做準備 本例 主程序用一條轉至自身的短跳轉指令來代替 26 26 參考程序如下 ORG0000H 程序入口RESET AJMPMAIN 轉主程序ORG000BH T0中斷入口AJMPIT0P 轉T0中斷處理程序IT0PORG0100H 主程序入口MAIN MOVSP 60H 設堆棧指針MOVTMOD 01H 設置T0為方式1定時ACALLPT0M0 調用初始化子程序PT0M0HERE AJMPHERE 原地循環 等待中斷 27 27 PT0M0 MOVTL0 0CH T0初始化 裝初值的低8位MOVTH0 0FEH 裝初值的高8位SETBET0 允許T0中斷SETBEA 總中斷允許SETBTR0 啟動T0RETIT0P MOVTL0 0CH 中斷子程序 T0重裝初值MOVTH0 0FEHCPLP1 0 P1 0的狀態取反RETI程序說明 當單片機復位時 從程序入口0000H跳向主程序MAIN處執行 其中調用了T0初始化子程序PT0M0 28 28 子程序返回后 程序執行 AJMPHERE 指令 則循環等待 當響應T0定時中斷時 則跳向T0中斷入口 再從T0中斷入口跳向IT0P標號處執行T0中斷服務子程序 當執行完中斷返回的指令 RETI 后 又返回斷點處繼續執行循環指令 AJMPHERE 在實際的程序中 AJMPHERE 實際上是一段主程序 當下一次定時器T0的1ms定時中斷發生時 再跳向T0中斷入口 從而重復執行上述過程 如CPU不做其他工作 也可用查詢方式進行控制 程序要簡單得多 29 29 查詢方式參考程序 MOVTMOD 01H 設置T0為方式1LOOP MOVTH0 0FEH T0置初值MOVTL0 0CHSETBTR0 接通T0LOOP1 JNBTF0 LOOP1 查TF0 TF0 0 T0未溢出 TF0 1 T0溢出 CLRTR0 T0溢出 關斷T0CPLP1 0 P1 0的狀態求反SJMPLOOP查詢程序雖簡單 但CPU必須要不斷查詢TF0標志 工作效率低 30 30 例6 2 系統時鐘為6MHz 編寫定時器T0產生1s定時的程序 基本思想 采用定時器模式 因定時時間較長 首先確定采用哪一種工作方式 時鐘為6MHz的條件下 定時器各種工作方式最長可定時時間 方式0最長可定時16 384ms 方式1最長可定時131 072ms 方式2最長可定時512 s 由上可見 可選方式1 每隔100ms中斷一次 中斷10次為1s 31 31 1 計算計數初值X因為 216 X 2 10 6 10 1 所以X 15536 3CB0H 因此TH0 3CH TL0 B0H 2 10次計數的實現對于中斷10次的計數 采用B寄存器作為中斷次數計數器 3 程序設計參考程序如下 ORG0000H 程序運行入口RESET LJMPMAIN 跳向主程序入口MAINORG000BH T0的中斷入口LJMPIT0P 轉T0中斷處理子程序IT0PORG1000H 主程序入口 32 32 MAIN MOVSP 60H 設堆棧指針MOVB 0AH 設循環次數10次MOVTMOD 01H 設置T0工作在方式1定時MOVTL0 0B0H 給T0設初值MOVTH0 3CHSETBET0 允許T0中斷SETBEA 總中斷允許SETBTR0 啟動T0HERE SJMPHERE 原地循環 等待中斷 33 33 IT0P MOVTL0 0B0H T0中斷子程序 T0重裝初值MOVTH0 3CHDJNZB RTURN B中斷次數計數 減1非0則 中斷返回CLRTR0 1s定時時間到 停止T0工作SETBF0 1s定時時間到標志F0置1RTURN RETI程序說明 不論1s定時時間是否已到 都返回到 SJMPHERE 指令處 SJMPHERE 指令實際是一段主程序 在這段主程序中再通過對F0標志的判定 可知1s定時是否到 再進行具體處理 34 34 例利用定時 計數器T0的方式1 產生10ms的定時 并使P1 0引腳上輸出周期為20ms的方波 采用中斷方式 設系統時鐘頻率為12MHz 解 1 計算計數初值X 由于晶振為12MHz 所以機器周期Tcy為1 s 所以 N t Tcy 10 10 3 1 10 6 10000X 65536 10000 55536 D8F0H即應將D8H送入TH0中 F0H送入TL0中2 求T0的方式控制字TMOD M1M0 01 GATE 0 C T 0 可取方式控制字為01H 35 采用查詢方式 ORG0000HLJMPMAIN 跳轉到主程序ORG0100HMAIN MOVTMOD 01H 置T0工作于方式1LOOP MOVTH0 0D8H 裝入計數初值MOVTL0 0F0HSETBTR0 啟動T0JNBTF0 查詢TF0 0 等待 T0在工作 未計滿CLRTF0 清TF0 此時 TF0 1 10ms定時到CPLP1 0 P1 0取反 產生方波的半個周期SJMPLOOP 循環產生方波END 36 ORG0000HLJMPMAIN 跳轉到主程序ORG000BH T0的中斷入口地址LJMPDVT0 轉向中斷服務程序ORG0100HMAIN MOVTMOD 01H 置T0工作于方式1MOVTH0 0D8H 裝入計數初值MOVTL0 0F0HSETBET0 T0開中斷SETBEA CPU開中斷SETBTR0 啟動T0SJMP 等待中斷DVT0 CPLP1 0 P1 0取反輸出MOVTH0 0D8H 重新裝入計數值MOVTL0 0F0HRETI 中斷返回END 采用中斷方式 37 6 4 2方式2的應用方式2是一個可以自動重新裝載初值的8位計數器 定時器 可省去重裝初值指令 當某個定時器 計數器不使用時 可擴展一個負跳沿觸發的外中斷源 例6 3 擴展一個負跳沿觸發的外部中斷源 把定時器 計數器T0腳作為外部中斷請求輸入端 溢出標志TF0作為外中斷請求標志 基本思想 設為方式2 自動裝入常數方式 計數模式 TH0 TL0初值均為0FFH 當T0腳發生負跳變時 T0計數溢出 TF0置 1 單片機發出中斷請求 38 38 初始化程序 ORG0000HAJMPIINI 跳到初始化程序ORG000BHAJMPIT0P 跳到外中斷處理程序IINI MOVTMOD 06H 設置T0為方式2MOVTL0 0FFH 設T0初值MOVTH0 0FFHSETBET0 允許T0中斷SETBEA 總中斷允許SETBTR0 啟動T0 IT0P 外中斷處理程序段 39 39 程序說明 當連接在P3 4 T0腳 的外部中斷請求輸入腳電平發生負跳變時 TL0加1 產生溢出 TF0置 1 向單片機發出中斷請求 同時TH0的內容0FFH送TL0 即TL0恢復初值0FFH P3 4腳相當于一個負跳沿觸發的外中斷請求源輸入 對P3 5也可做類似的處理 例6 4 當T0 P3 4 引腳上發生負跳變時 作為P1 0引腳產生方波的啟動信號 開始從P1 0腳上輸出一個周期為1ms的方波 如圖6 14所示 系統時鐘6MHz 40 40 基本思想 T0設為方式1計數 初值為FFFFH 當外部計數輸入端T0 P3 4 發生一次負跳變時 T0加1且溢出 溢出標志TF0置 1 向CPU發出中斷請求 此時T0相當于一個負跳沿觸發的外部中斷源 進入T0中斷程序后 F0標志置 1 說明T0引腳上已接收過負跳變信號 T1定義為方式2定時 在T0引腳產生一次負跳變后 啟動T1每500 s產生一次中斷 在中斷服務子程序中對P1 0求反 使P1 0產生周期1ms的方波 由于省去重新裝初值指令 所以可產生精確的定時時間 41 41 42 圖6 14負跳變觸發輸出一個周期為1ms的方波 42 2 計算T1的初值設T1的初值為x 則 28 x 2 10 6 5 10 4x 28 250 6 06H 3 程序設計參考程序 ORG0000H 程序入口RESET LJMPMAIN 跳向主程序MAINORG000BH T0的中斷入口LJMPIT0P 轉T0中斷服務程序ORG001BH T1的中斷入口 43 43 LJMPIT1P 轉T1中斷服務程序ORG0100H 主程序入口MAIN MOVSP 60H 設堆棧指針ACALLPT0M2 調用對T0 T1初始化子程序LOOP MOVC F0 T0是否產生過中斷 若產生 過 F0置1JNCLOOP T0未產生中斷 C 0 則跳 到LOOP 等待T0中斷SETBET1 允許T1產生定時中斷SETBTR1 啟動T1HERE AJMPHERE 44 44 PT0M2 MOVTMOD 26H 對T0 T1初始化 T0方式1 計數 T1方式2定時MOVTL0 0FFH T0置初值MOVTH0 0FFHSETBET0 允許T0中斷MOVTL1 06H T1置初值MOVTH1 06HCLRF0 把T0已發生中斷標志F0清0SETBEA 總中斷允許SETBTR0 啟動T0RET 45 45 IT0P CLRTR0 T0中斷服務程序 停止T0計數SETBF0 把T0引腳接收過負脈沖標志F0置1 即接收過負跳變RETIIT1P CPLP1 0 T1中斷服務程序 P1 0位取反RETI程序說明 當單片機復位時 從0000H跳向主程序MAIN處執行程序 其中調用了對T0 T1初始化子程序PT0M2 子程序返回后執行標號LOOP處指令 循環等待T0引腳上負脈沖的到來 由于負脈沖到來的標志位F0的復位初始值為0 所以程序就在標號LOOP處循環等待 46 46 當T0 P3 4 腳發生負跳變時 由于T0計數溢出 則跳向T0中斷服務子程序 此時停止T0計數 并把T0引腳接收過負脈沖的標志F0置1 當中斷返回時 由于F0已被置1 則程序跳出LOOP處的循環等待 此時執行指令來允許T1中斷 并啟動T1定時 然后執行 AJMPHERE 指令 循環等待 等待T1的500 s定時中斷到來 當T1的500 s定時中斷產生時 則進入T1的中斷服務子程序IT1P 把P1 0腳電平取反 由于是自動裝初值 省去對T1重裝初值指令 中斷返回后 到 AJMPHERE 處等待T1的500 s定時中斷 如此重復 即得到圖6 14波形 47 47 例6 5 利用定時器T1的方式2計數 每計滿100個數 將P1 0取反 本例是方式2計數模式的應用舉例 1 選擇工作方式外部信號由T1 P3 5 引腳輸入 每發生一次負跳變計數器便加1 每輸入100個脈沖 計數器將產生溢出中斷 在中斷服務程序中將P1 0取反一次 T1工作在方式2的控制字TMOD 60H 不使用T0時 TMOD低4位任取 但不能使T0為方式3 這里取全0 2 計算T1的初值X 28 100 156 9CHTL1的初值為9CH 重裝初值寄存器TH1 9CH 48 48 3 參考程序 ORG0000H 程序運行入口LJMPMAIN 跳向主程序MAINORG001BH T1中斷服務程序入口CPLP1 0 P1 0位取反RETIORG0100H 主程序入口MAIN MOVTMOD 60H 設置T1為方式2計數MOVTL0 9CH T0置初值MOVTH0 9CHSETBTR1 啟動T1HERE AJMPHEREEND 49 49 6 4 4門控制位GATEx的應用 測量脈沖寬度介紹門控制位GATE的具體應用 測量 P3 3 引腳上正脈沖的寬度 例6 7 門控位GATE1可使T1的啟動計數受的控制 當GATE1 1 TR1 1時 只有INT1 引腳輸入高電平時 T1才被允許計數 可測量引腳 P3 3 上正脈沖的寬度 其方法如圖6 16所示 50 圖6 16利用GATE位測量正脈沖的寬度 50 參考程序 ORG0000HRESET AJMPMAIN 復位入口轉主程序ORG0100H 主程序入口MAIN MOVSP 60HMOVTMOD 90H 向TMOD寫控制字 T1為方 式1定時 GATE1 1MOVTL1 00HMOVTH1 00HLOOP0 JBP3 3 LOOP0 等待低SETBTR1 如為低 啟動T1 51 51 LOOP1 JNBP3 3 LOOP1 等待升高LOOP2 JBP3 3 LOOP2 為高 此時計數器計數 等待降低CLRTR1 停止T1計數MOVA TL1 T1計數值送A 將T1計數值送顯示器 END執行以上程序 使引腳上出現的正脈沖寬度以機器周期數的形式顯示在顯示器上 52 將A中的T1計數值送到顯示器顯示 52 6 4 5實時時鐘的設計介紹使用定時器 計數器實現時鐘 1 實現實時時鐘的基本思想最小計時單位是秒 如何獲得1s的定時時間呢 從前面介紹知 定時器方式1 最大定時時間也只能131ms 可將定時器的定時時間定為100ms 中斷方式進行溢出次數的累計 計滿10次 即得秒計時 而計數10次可用循環程序的方法實現 初值的計算如例6 2 片內RAM規定3個單元為秒 分 時單元 42H 秒 單元 41H 分 單元 40H 時 單元 53 53 從秒到分 從分到時是通過

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論