日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机定时器总结

發布時間:2024/3/7 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机定时器总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在學習郭天祥老師的單片機教程,遇到很多問題,期間看了很多博客,終于對單片機的定時器有些了解,在此像CSDN優秀的博主表示感謝,由于這是我第一次寫博客(研究內容很淺)為了以后復習方便以及希望各位優秀的童鞋幫我指正錯誤哈哈
最后再廢話一句,本人學的很菜,不懂得東西太多了,寫的也肯定,,,,所以不喜勿噴喲,,,,
言歸正傳:
定時器/計數器:顧名思義既能定時又能計數。它存在于單片機內部的一個獨立硬件部分,依賴晶振產生固定的時間間隔,產生一定的時間間隔后會引起定時器中斷,從而產生的時間信息傳送給主程序。
51單片機有2個定時器,分別是T0和T1,52單片機比51單片機多了一個T2定時器,但51和52的定時器設置差不多。
首先解釋一下常規概念:
周期:周期是物體循環一周的時間
頻率:1秒鐘內循環的次數
(補充下:單片機是靠脈沖來工作的,一個脈沖產生一個操作)
單片機中包括四個周期:分別是時鐘周期、機器周期、指令周期、狀態周期
時鐘周期:也叫振蕩周期,定義為時鐘脈沖(晶振頻率)的倒數
即產生一個脈沖的時間。例如12M晶振,時鐘周期是1/12us
機器周期:單片機訪問一次存儲器的時間,稱為一個機器周期。以51單片機為例,它有固定的機器周期,一個機器周期包含六個狀態例如,取指令、存儲器讀、存儲器寫等。即機器周期等于6個狀態周期,而一個狀態周期是2個時鐘周期,因此一個機器周期又等于12個時鐘周期。單片機的晶振最常用的是12MHZ,11.0592MHZ,當晶振是12MHZ時:時鐘周期是1/12us,機器周期是12*(1/12us)=1us,產生一次機器周期的時間是1us,也就是向寄存器每傳入1個數,機器周期的時間是1us. 11.0592MHZ的晶振同理。
定時器的應用舉例(數碼管1、3、5個亮,時間間隔是1s,以12M的晶振為例,本程序只涉及定時器T0,16位)
設計思路:以12Mhz的晶振來說,機器周期是1us,計滿TH0、TL0就需要2^16-1個數,再來一個數就“溢出”產生中斷,一次溢出也就是65536us,約等于65.5ms,所以定時時間1s超出范圍,因此需要進入中斷20次,每次中斷50ms。

初始化程序需要完成以下工作:

1. 對TMOD賦值,以確定T0和T1的工作方式


本文只涉及T0,所以令T1定時器端口全為0,對于T0定時器:門控位GATE=0,C/T=0(定時器模式) ,M1M0=01(方式一為16位定時計數器)。所以TOMD=0x01

2. 計算初值,并將其寫入TH0、TL0和TH1、TL1
假設單片機的晶振的頻率是12MHZ,那么一個機器周期的時間就是1us,計滿TH0、TL0就需要2的16次方-1個數,再來一個數就“溢出”產生中斷,一次溢出也就是65536us,約等于65.5ms,因此如果我們要定時65.5ms的話,就可以這樣做,但是定的時間如果不是65.5ms的話,則需要裝入定時器中一個初值。假設我們要計數的個數是N個,設裝入的初值是X,則X=2^16-N,比如要裝50000個數的話,初值X=65536-50000=15536,然后把15536對256取模15536/256=60裝入TH0中,15536%256=176裝入TL0中。因為實驗板上的晶振是11.0592MHZ,可知機器周期=1.09us,比如說我們要定時50ms(50000us)那么計數的個數是N=50000/1.09=45872,再計算初始值X=65536-45872=19664,,再分別計算TH0和TL0中具體裝多少就可以了。(本文是以12M晶振為例)
3. 中斷發生時,則對IE賦值,開放中斷

圖為中斷允許控制位
開總中斷EA=0;
外部中斷允許控制位EX0=1,允許外部中斷0中斷
4. 使TR0和TR1置位,啟動定時/計數定時器定時或計數

TR0=1,啟動定時/計數器定時或者計數

完整代碼

下面展示一些 內聯代碼片。

/* 將定時器0設置為1s,進入中斷一共20次,每次進入中斷50ms現象:1/3/5數碼管顯示從0到F靜態*/#include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; uchar num,tt; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 }; void main(){ num=0;tt=0;TMOD=0x01;//設置定時器0位工作方式1 ,由于TMOD的字節地址是89H,不能被8整除,所以不能位尋址sbt=?TH0=(65536-50000)/256; //計算初值:高8位TL0=(65536-50000)%256; //計算初值:低8位EA=1;//開總中斷ET0=1;//開定時器0中斷TR0=1;//啟動定時器0 開始定時,計50ms時馬上進入中斷子程序wela=1;P0=0xEA; //第1、3、5個數碼管全是0;最高位和次高位全是1,低電平有效 1、、3、、5亮wela=0;//27、28、29三句是打開位選信號dula=1;//開段選P0=0x3f;//開始數碼管顯示0dula=0;//關段選while(1){if(tt==4)//只有進入中斷20次,(每進去一次中斷時間為50ms)才有可能tt=20{tt=0;num++;//依次加一if(num==16)num=0;dula=1;P0=table[num];dula=0;} } } void exter0() interrupt 1 //當設置的初值加滿才進去中斷 {TH0=(65536-50000)/256; //計算初值:高8位TL0=(65536-50000)%256; //計算初值:低8位;tt++; //計數 }

下面是我參考的一些博客,希望對大家有所幫助
http://bbs.elecfans.com/jishu_178566_1_1.html
https://blog.csdn.net/weixin_42119585/article/details/103587848
這是我的第一篇博客,寫的不好大家多多指導,大家一起加油

總結

以上是生活随笔為你收集整理的单片机定时器总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。