娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年05月16日(星期五)

2020年05月16日 | 51單片機的定時器與計數器

發布者:RadiantGaze 來源: eefocus關鍵字:51單片機  定時器  計數器 手機看文章 掃描二維碼
隨時隨地手機看文章

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 for(j=0; j

}


邏輯取反與按位取反?

在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單片機  定時器  計數器 引用地址:51單片機的定時器與計數器

上一篇:51單片機第二講(定時器中斷)
下一篇:最后一頁

推薦閱讀

中國芯酸往事作者:戴老板數據支持:遠川研究上個世紀三十年代,河北籍學生張錫綸從中國第一所礦業高等學府焦作工學院畢業,作為一名專業為冶煉學的稀缺人才,他被上海的一家煉鋼廠錄用。抗戰爆發后,上海工業大規模西遷,張錫綸也隨著大部隊輾轉來到了戰時陪都重慶。他工作的煉鋼廠被并入國民政府軍事工業系統,成為隸屬兵工署的第21兵工廠。1945年抗戰勝...
在和成為熱議焦點之前,工業自動化已經奔跑在4.0的路上,其復雜場景的需求為5G和AI這些新技術落地催生出大量的機遇紅利。從系統平臺來看,這些場景會最大限度地利用可擴展的和解決方案來進行設計,處理系統的集成度不斷提高——包括已增強的安全和安保功能。在性能上,實時處理、分析和通信能力是主要需求,而在數據處理上,則需要可擴展的解決方案來有...
1.中斷的概念CPU在處理某一事件A時,發生了另一事件B請求CPU迅速去處理(中斷產生);CPU暫時中斷當前的工作,轉去處理事件B(中斷響應和中斷服務);待CPU將事件B處理完畢后,再回到原來事件A中斷的地方繼續處理事件A(中斷返回),這一過程稱為中斷。2.中斷的優先級51單片機里一共有5個中斷源,分別是外部中斷0,定時器0,外部中斷1,定時器1,串口中斷...
慣性傳感器,加速度計和角速度陀螺儀作為汽車的“內耳”,多年來一直在汽車安全氣囊和穩定控制系統等應用中執行一些基本的低性能任務。無需其他傳感器的輸入,慣性傳感器能夠獨立探測到車輛的運動,例如:一個簡單的單軸加速度計可以探測到汽車的高g急劇減速來打開安全氣囊。更先進的慣性傳感器組件由兩個正交的XY加速度計和一個單軸/雙軸角速度陀螺儀組成...

史海拾趣

問答坊 | AI 解惑

基于單片機的數字氣壓計

主要任務與目標: 任務:設計一個基于單片機的數字氣壓計 目標:1.測量氣壓范圍:0-1個標準大氣壓。 2. 能夠顯示日期,時間、氣壓。3. 測量精度±20%FS(20°C)。4. 干電池供電5. 線性度<0.5%…

查看全部問答∨

基于FPGA與ADC的spi不通

FPGA來接收ad9222輸出的系統,目前由于adc速率有600Mbps,所以要通過SPI調整ADC。而此ADC的SPI有csb,sclk,sdio三線來進行控制,已經可以成功的對ADC的8通道進行開關控制,這是不是說寫SPI的程序沒問題?但是其他的寄存器都配置不進去,output tes ...…

查看全部問答∨

ST7visualdevelop編譯問題

我下載了最新的ST7visual develop(V4.0.1)和最新的Comsic4.5.7但是編譯例程序tutorial_cosmiccosmic.stw時出現編譯錯誤----------- Project tutorial - ST7 Cosmic - Configuration Debug  ...…

查看全部問答∨

誰能幫我分析下這個電路呀!

左上面的那個OPA336反向輸入端和輸出端接的電容起什么作用呀? …

查看全部問答∨

電子設計大賽論文

電子設計大賽論文…

查看全部問答∨

晶振知識 多多學習。。。慢慢積累

晶片進料檢查 洗凈   鍍膜 點膠 硬化 微調 中間檢查 熔接 檢漏 老化 印字   全檢   ...…

查看全部問答∨

電感的繞制

本帖最后由 paulhyde 于 2014-9-15 04:19 編輯 …

查看全部問答∨

關于pll輸出能否通過設置全局時鐘約束接到普通io口上?

小弟最近在做課程設計,做sdram讀取的時候用到pll進行倍頻產生sdram時鐘(100M),但是發現手頭上的板子的sdram接口是普通io口,而專用的pll輸出口卻被sdram地址端占用了,用QII編譯的時候報錯說必須接到pll專用輸出口,不知道有什么辦法可以輸出到 ...…

查看全部問答∨

關于有說EZ430-Chronos手表按鍵后有時會重啟的現象(實際可能非器件或軟件問題)

關于以前有帖子中說EZ430-Chronos按鍵后有時會重啟的現象 我以前也遇到這種情況,恰恰看到帖子中也說有類似現象,所以我以為可能是器件或者軟件有問題 后來特別最近重啟頻繁,沒有按下按鍵的時候也會重啟,重啟的時候還會長時間蜂鳴器響一陣。我 ...…

查看全部問答∨

【新手】TIM2的PWM問題。

求大神幫看看程序 void TIM2_Config() {   TIM_InitStructure.TIM_ClockDivision=TIM_CKD_DIV1;         TIM_InitStructure.TIM_CounterMode=TIM_CounterMode_Up;   TIM_InitStructure.TIM_Period=36 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 通化市| 贵州省| 景宁| 中牟县| 惠东县| 彰化县| 永定县| 黔西县| 鲁山县| 五指山市| 景宁| 鄂温| 本溪市| 徐州市| 衢州市| 谷城县| 内江市| 綦江县| 忻城县| 和静县| 措勤县| 民乐县| 留坝县| 商南县| 福泉市| 安宁市| 河南省| 辽阳县| 北京市| 陇川县| 靖西县| 鹤壁市| 突泉县| 应用必备| 比如县| 闽侯县| 北安市| 朝阳区| 资源县| 义乌市| 噶尔县|