1.0
1.0.1定時器
(1)51單片機的定時器是一個內部外設。
(2)定時器相當于CPU的一個“鬧鐘”。
(3)定時器是用計數器來實現的。
1.0.2計數器
(1)計數器可以計數外部脈沖的個數.
(2)脈沖:(個人理解)單片機中一個低電平跳變成高電平在回到低電平的這么一個過程就稱為一個脈沖。
1.0.3定時器是如何工作的
(1)第一步:先設置好定時器的時鐘源(AT89C51單片機的時鐘源只有一個不需要設置)
(2)第二步:初始化時鐘相關寄存器
(3)第三步:設置定時時間(計數個數)
(4)第四步:設置中斷處理程序(定時器總是與中斷相互配合使用)
(5)第五步:打開定時器
(6)第六步:定時器計數到后產生中斷,然后執行中斷處理程序。
1.1寄存器
1.1.0什么是寄存器
(1)register。
(2)寄存器,寄存,內容可變,一般按位定義。
(3)寄存器使用地址訪問,編程上像內存一樣。
1.1.1寄存器的工作原理
(1)寄存器和硬件之間有雙向影響。
(2)軟件可以讀寫寄存器。
(3)總結:寄存器是軟件能夠控制硬件的關鍵。
1.1.2單片機學習的關鍵就是各種寄存器
(1)單片機的學習主要包括2個:CPU和各種內部外設。
(2)各種內部外設的編程接口就是寄存器。
(3)熟悉一款單片機其實就是熟悉他的寄存器。
(4)寄存器會隨著單片機的復雜化而變復雜。
(5)學會用C語言操作寄存器的技巧。
1.2AT89C51定時器介紹
(1)外部12MHz晶振,單片機工作在12T模式下,則內部時鐘頻率是1MHz,則時鐘脈沖寬度為1us(1/1MHz = 1us)。
(2)單片機工作在6T模式下,則內部時鐘頻率是2MHz,則時鐘脈沖寬度為0.5us(1/2MHz = 0.5us)。
1.3定時器的主要寄存器介紹
TCON
(1)8個位,但是有4個名字:TF、TR、IE、IT,每個名字的符號都有2個,后面分別帶0和1,對應T0和T1.
(2)TF: timer flag,定時器(溢出)標志位,是只讀(軟件只是通過讀取TF1來知道硬件的狀態,而不用去寫這一位來設置硬件的狀態)的。timer定時時間到了后會做2件事情:第一個是把TF標志改為1,第二個是產生中斷讓CPU去中斷處理;TF是硬件清零的(由1變0是自動的,不需要軟件來干預。)有一些CPU的設計是需要軟件去清零的,這時候用戶的程序就一定要記得給標志位清零,不然就不能重復進入中斷或者反復不停的重復進入中斷。
(3)TR就是timer run,就是定時器的啟動計數的開關。當我們把整個定時器初始化好了之后,我們給TR位寫1就可以開啟計數了。
TR位和GATE位有一定關聯性。
(4)GATE是TMOD寄存器中的,也有2個分別對應T0和T1。GATE位中文名叫門控位,工作方式是:當GATE=0時(相當于門是打開的,此時GATE位是可以忽略的),此時定時器開關就只受TR位影響。具體就是TR=1開啟計數,TR=0結束計數。當timer處于定時器工作模式時GATE就要等于0;GATE一般是在timer處于計數器模式時用的。當timer用來計數時,很關鍵的就是什么條件下計數,什么條件下不計數。當GATE=0時計數條件只有TR1一個(TR1=1就計數,TR1=0就不計數),當GATE=1時是否計數不僅取決于TR1還取決于INT1引腳(P3.3),實際規則是:當TR1=1并且INT1引腳也為高電平時才會計數。
(5) TH0 TL0中寫入的值計算:
假如要寫入1000.那么1000所對應的16進制為:0x3E8高八位為:0x03 低八位為:0XE8
也可以是TL0 = 1000 %256 TH0 = 1000 / 256;
1000 = 0x3E8 = 高0x3 低0xE8 => TL0 = 0xE8 TH0 = 0x3
要寫入8888也一樣。
8888 = 0x22B8 = 高0x22 低0xB8 => TL0 = 0xB8 TH0 = 0x22
(6)我們開發板的定時器最多能訂多長時間?
內部時鐘頻率是1MHz,時鐘周期是1us。最多能定65535(16位定時器),也就是說最大定時時間為65535*1us=65535us=65.535ms。
如果要定比較長的時間(譬如2s),定時器直接是不能滿足的,解決辦法是多次定時后加起來構成一個長時間。
1.4加法定時器與減法定時器
加法定時器和減法定時器
(1)定時器的原理就是計數器,加法定時器計數方法是從我們給定的值開始計數,直到溢出(譬如16位定時器最大值為0xffff,也就是65535,計數值到達這個值就溢出了)。減法定時器是從我們給定的值開始減1,減到0就溢出了。
(2)實例來看,譬如16位定時器。我們設置的計數值為1000,則如果是減法定時器那么計數個數就是1000,如果是加法定時器則計數個數就是65535-1000=64535.
(3)51單片機就是典型的加法定時器
(4)現代的單片機或者嵌入式soc,一般常用的都是減法定時器了。雖然加法定時器和減法定時器都能實現功能,但是明顯減法定時器更加直觀。
#include //利用定時器實現數碼管顯示0-F依次顯示的同時 LED燈每1s閃爍一次。 //定時器選用定時器0: /* 接線: 矩陣鍵盤:P1端口 數碼管: P0端口 */ #define DIG P0 sbit LED = P3^0; unsigned char count = 20; //20次,對應1s。 void delay(unsigned char t); //獨立數碼管的顯示0-F unsigned char varry[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xA1,0x86,0x8e}; void Timer0_Isr() interrupt 1 using 1 // interrupt 1 { TL0 = (65535 - 50000) / 256; TH0 = (65535 - 50000) % 256; if(count-- == 0) { count = 20; LED = !LED; } } void main(void) { unsigned char i = 0; TMOD = 0x01; //定時器模式寄存器:0x01表示16位定時器,TL0 TH0全用 //51單片機的定時器是加法定時器,要注意初值的計算。 TL0 = (65535 - 50000) / 256; TH0 = (65535 - 50000) % 256; TR0 = 1; //定時器0的運行控制位,該位由軟件置位或清0. TR=1表示允許開始記數 ET0 = 1; //T0中斷溢出允許位,也就是打開中斷 EA = 1; //打開中斷總開關 count = 20; while(1) { for(i=0; i<16;i++) { DIG = varry[i]; delay(200); //大概延時,能看出變化就好。 } } } void delay(unsigned char t) { unsigned char i,j; for(i=0;i } 邏輯取反與按位取反? 在51單片機中實現LED的翻轉,得以LED閃爍。 sbit LED = P3^0; LED = !LED; LED = ~ LED;竟然都可以達到效果!!! using 關鍵字的使用 (1)目前還沒有完全搞懂用法:但是我在以上的程序中實驗了一下:0-3(4及其以上是不存在的,編譯器報錯) using 0 的情況下數碼管的顯示切換速度變快了,而且快了很多。 using 1 2 3 這三個沒有區別。(就是簡單的實驗現象上沒有區別) 去掉using 0 的數碼管顯示與using 1 2 3 速度一樣。(肉眼觀察) 以下是網友總結的:原文鏈接:http://www.51hei.com/mcu/766.html using關鍵字的作用就是指定某個函數在執行時切換寄存器組的 51中有四個寄存器組,每個組有R0-R7這8個寄存器,用于CPU的數據處理,一般主函數main()默認使用第0組,因為PSW寄存器的初始值的第3、4位是00嘛,即默認指定了第0組。using 0就是指定在執行函數時切換為使用第0組,不加using關鍵字的話,一般都默認使用第0組,但這樣的話在調用其他函數(包括中斷服務函數)的時候,就會加入一些壓棧指令以保護原來的R0-R7寄存器的(這樣的話,程序執行會效率會低一點,因為會產生很多個指令是用來壓棧出棧的),照這樣說,只是加了using 0,使用的也是第0組又不是其它的組,程序就不應該有問題了吧,但是就是因為加了using 0,編譯了一次,才發現在定時器中斷函數t0()的入口中并沒有發現把R0-R7的代碼壓入棧呀,就是說沒有保護好R7呀,那當然就是在執行完之后回來R7不能回復原來的值啦,接下來的事情。。。。我就不說啦,這就是問題的根源,去掉using 0就可以了,編譯器就自動幫你將R0-R7壓棧,手動加了using 0,就是讓編譯器以為之前用的并不是第0組,而現在執行這個中斷函數時就切換到第0組,而省去了將R0-R7這8個寄存器壓入棧的指令了,這樣雖然看起來是快了,然而對于這個程序來說卻是致命的問題!!!因為根本沒有保護好R0-R7,而沒有保護R7并不是我預期發生的!!!這不是編譯器的問題,是自己沒有了解好、用好using的問題啊!還有,其實也可以在編譯器選項里有選項來硬性規定編譯器統一不直接使用寄存器而是使用間接尋址的辦法來改變循環變量分配的地址的,或者使用。
上一篇:51單片機第二講(定時器中斷)
下一篇:最后一頁
推薦閱讀
史海拾趣
Anderson Power是一家專注于電源連接器和配件制造的公司,以下是該公司發展的相關故事:
公司成立與初期階段:Anderson Power成立于1953年,總部位于美國馬薩諸塞州斯特林。最初,公司主要從事電源連接器的制造和銷售。公司的創始人是William E. Anderson,他在創立公司之初便致力于提供高質量、可靠的連接器產品,滿足不斷增長的市場需求。
技術創新與產品發展:隨著市場的需求不斷增長,Anderson Power不斷進行技術創新和產品開發,推出了一系列新型的電源連接器和配件產品。公司在連接器設計和制造方面擁有豐富的經驗和專業知識,能夠根據客戶的需求定制各種類型的連接器產品。
客戶合作與市場拓展:Anderson Power與全球各個行業的客戶建立了長期穩定的合作關系。公司的客戶群涵蓋了汽車、航空航天、工業、能源等多個領域。通過與客戶的緊密合作,Anderson Power不斷拓展市場份額,提升品牌知名度,成為電源連接器領域的領先供應商之一。
全球布局與生產基地:為了更好地服務全球客戶,Anderson Power在全球建立了多個生產基地和銷售辦事處。除了在美國的總部外,公司還在歐洲、亞洲等地區設立了生產工廠和銷售辦事處,以滿足不同地區客戶的需求。這些生產基地擁有先進的設備和技術,能夠為客戶提供高質量的連接器產品。
持續發展與未來展望:作為一家專注于電源連接器的公司,Anderson Power將繼續致力于技術創新和產品發展。公司將不斷推出適應市場需求的新產品,提升生產效率和產品質量,以滿足客戶不斷變化的需求。同時,Anderson Power也將繼續關注行業的發展趨勢和技術變革,不斷調整戰略,保持在行業內的競爭優勢。
Corsair Memory Inc公司的成功不僅在于其產品的創新,更在于其與全球知名電腦廠商的合作。多家世界級的OEM合作伙伴選擇Corsair作為其內存供應商,這不僅提升了Corsair的品牌影響力,也為其帶來了穩定的訂單和市場份額。這種合作關系的建立,是Corsair在電子行業中持續發展的重要支撐。
面對日益激烈的市場競爭和不斷變化的客戶需求,Cornell Dubilier公司積極引進智能化生產設備和解決方案。例如,公司部署了Rethink Robotics的智能協作機器人,顯著提高了生產效率和質量。通過與機器人技術的結合,Cornell Dubilier公司在電力電容制造領域取得了顯著的成績,實現了生產過程的自動化和智能化。
在環保意識日益增強的今天,ACI公司積極響應國家號召,將綠色環保理念融入產品設計和生產過程中。公司采用環保材料和生產工藝,推出了一系列綠色電子產品。這些產品不僅具有優異的性能,而且符合環保標準,得到了消費者的廣泛認可。通過倡導綠色環保理念,ACI成功引領了行業潮流,樹立了良好的企業形象。
在發展的過程中,Ferroperm公司不斷進行技術創新和產品研發,推動產品的多樣化發展。他們成功開發了一系列具有高性能和獨特功能的電磁材料,如高性能鐵氧體、NdFeB永磁體等。這些產品不僅滿足了客戶對電磁材料性能的高要求,還推動了相關行業的發展。同時,Ferroperm還不斷拓展產品線,推出了變壓器、電感器、濾波器等一系列電子產品,進一步鞏固了其在電磁材料領域的領先地位。
主要任務與目標: 任務:設計一個基于單片機的數字氣壓計 目標:1.測量氣壓范圍:0-1個標準大氣壓。 2. 能夠顯示日期,時間、氣壓。3. 測量精度±20%FS(20°C)。4. 干電池供電5. 線性度<0.5%… 查看全部問答∨ |
FPGA來接收ad9222輸出的系統,目前由于adc速率有600Mbps,所以要通過SPI調整ADC。而此ADC的SPI有csb,sclk,sdio三線來進行控制,已經可以成功的對ADC的8通道進行開關控制,這是不是說寫SPI的程序沒問題?但是其他的寄存器都配置不進去,output tes ...… 查看全部問答∨ |
我下載了最新的ST7visual develop(V4.0.1)和最新的Comsic4.5.7但是編譯例程序tutorial_cosmiccosmic.stw時出現編譯錯誤----------- Project tutorial - ST7 Cosmic - Configuration Debug ...… 查看全部問答∨ |
|
小弟最近在做課程設計,做sdram讀取的時候用到pll進行倍頻產生sdram時鐘(100M),但是發現手頭上的板子的sdram接口是普通io口,而專用的pll輸出口卻被sdram地址端占用了,用QII編譯的時候報錯說必須接到pll專用輸出口,不知道有什么辦法可以輸出到 ...… 查看全部問答∨ |
|
關于有說EZ430-Chronos手表按鍵后有時會重啟的現象(實際可能非器件或軟件問題) 關于以前有帖子中說EZ430-Chronos按鍵后有時會重啟的現象 我以前也遇到這種情況,恰恰看到帖子中也說有類似現象,所以我以為可能是器件或者軟件有問題 后來特別最近重啟頻繁,沒有按下按鍵的時候也會重啟,重啟的時候還會長時間蜂鳴器響一陣。我 ...… 查看全部問答∨ |
求大神幫看看程序 void TIM2_Config() { TIM_InitStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_InitStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_InitStructure.TIM_Period=36 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 英特爾 SoC FPGA 開發者論壇 (ISDF) 預約報名享好禮!
- TI史上最強音視頻DSP—DM6467之SEED開發板全套資源
- 全球首款Cortex-M23內核物聯網芯片SAML10和SAM L11系列 闖關獲取SAML10/SAML11法寶,拆除電子界安全危機,贏好禮!
- Sitara™ AM335x ARM® Cortex™-A8 團購
- 看MCU精品課程,讓你立馬變身考試達人!
- 有獎連線:“泰”想開車 動力篇:800V超充技術,掃清里程焦慮
- Microchip最新SAM 以及 PIC32單片機軟件開發平臺-- MPLAB® Harmony V3介紹 ”
- “TI 中國大學計劃” 知多少——答題贏好禮!
- EEworld版主招新啦!歡迎加入我們的隊伍
- 下載有禮!是德科技高速數字精選解決方案,專為您的數字設計而挑戰!