久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1450|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機定時器與中斷

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:424834 發(fā)表于 2019-11-17 21:45 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
51單片機共有兩個16位可編程的定時器/計數(shù)器,即定時器T0和定時器T1。它們既有定時功能又有計數(shù)功能,通過設(shè)置一些相關(guān)的特殊功能寄存器就可以選擇啟用哪一個功能。定時器系統(tǒng)是單片機內(nèi)部一個獨立硬件部分,與CPU和晶振之間通過內(nèi)部某些控制線連接并相互作用,CPU一旦啟動定時功能,定時器便會在晶振的作用下自動計時,當定時器計數(shù)器積滿之后就會產(chǎn)生中斷,通知CPU接下來做什么。

定時器或計數(shù)器實質(zhì)是加一計數(shù)器(16位)(其輸入脈沖有兩個來源,一是由系統(tǒng)時鐘振蕩器輸出脈沖經(jīng)過十二分頻后送來;另外是T0或T1引腳輸入的外部脈沖源,每來一個脈沖計數(shù)器加1,當加到計數(shù)器全為1時,在輸入一個脈沖就可使計數(shù)器回零,計數(shù)器的溢出是的TCON寄存器中TF0或TF1置1,向CPU發(fā)出中斷請求,如果定時或計數(shù)器工作于定時模式,則表示定時時間到了,如果是計數(shù)則表示計數(shù)值已滿)由高八位和低八位兩個寄存器組成。
TMOD:定時器/計數(shù)器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER) ,確定工作方式和功能
TCON:控制寄存器,控制T0,T1的啟動和停止及設(shè)置溢出標志。

定時器/計數(shù)器模式控制寄存器TMOD是一個逐位定義的8位寄存器,但只能使用字節(jié)尋址,其字節(jié)地址為89H。其格式為:其中低四位定義定時器/計數(shù)器C/T0,高四位定義定時器/計數(shù)器C/T1,各位的說明:
GATE——門控制。
GATE=1時,由外部中斷引腳INT0、INT1來啟動定時器T0、T1。 當INT0引腳為高電平時TR0置位,啟動定時器T0; 當INT1引腳為高電平時TR1置位,啟動定時器T1。 GATE=0時,僅由TR0,TR1置位分別啟動定時器T0、T1。
C/T——功能選擇位
C/T=0時為定時功能,C/T=1時為計數(shù)功能。 置位時選擇計數(shù)功能,清零時選擇定時功能。
M0、M1——方式選擇功能
由于有2位,因此有4種工作方式:
M1M0 工作方式計數(shù)器模式 TMOD(設(shè)置定時器模式)
0 0 方式0 13位計數(shù)器 TMOD=0x00
0 1 方式1 16位計數(shù)器 TMOD=0x01
1 0 方式2 自動重裝8位計數(shù)器 TMOD=0x02
1 1 方式3 T0分為2個8位獨立計數(shù)器,T1為無中斷重裝8位計數(shù)器 TMOD=0x03 單片機定時器0設(shè)置為工作方式1為TMOD=0x01

TCON: 定時器/計數(shù)器控制寄存器(TIMER/COUNTER CONTROL REGISTER)
TMOD分成2段,TCON控制更加精細,分成四段,在本文中只要用到高四段。 TF0(TF1)——計數(shù)溢出標志位,當計數(shù)器計數(shù)溢出時,該位置1。
TR0(TR1)——定時器運行控制位 當TR0(TR1)=0 停止定時器/計數(shù)器工作 當TR0(TR1)=1 啟動定時器/計數(shù)器工作
IE0(IE1)——外中斷請求標志位

IT0(IT1)——外中斷請求信號方式控制位 當IT0(IT1)=1 脈沖方式(后沿負跳有效)
當IT0(IT1)=0 電平方式(低電平有效)此位由軟件置1或清0。
TF0(TF1)——計數(shù)溢出標志位
當計數(shù)器產(chǎn)生計數(shù)溢出時,此位由硬件置1。當轉(zhuǎn)向中斷服務(wù)時,再有硬件自動清0。計數(shù)溢出的標志位的使用有兩種情況:采用中斷方式時,作中斷請求標志位來使用;采用查詢方式時,作查詢狀態(tài)位來使用。注意記憶方法,理解單詞原形,就絕對不會把TF和TR搞混。TF的F也就是溢出Over Flow的F。TR的R就是運行Run。默認是0不運行,當然要置1才運行
//在寫單片機定時器程序時候,在程序開始出需要對定時器及中斷寄存器做初始化設(shè)置,通常初始化過程如下:對TMOD賦值,以確定T0和T1的工作方式; 計算初值,并將初值寫入TH0,TL0或者TH1,TL1; 中斷方式時,則對IE賦值,開放中斷 使TR0或TR1置位,啟動定時器/計數(shù)器定時或者計數(shù)。
//實現(xiàn)led燈一秒亮滅閃爍
//實現(xiàn)led燈一秒亮滅閃爍#define  uhar  unsinged char #define  uint  unsinged intuchar num;void main(){    TMOD=0x01;//設(shè)置定時器0為工作方式1(M1 M0為01)    TH0=(65536-45872)/256;//裝初值11.0582晶振定時50ms數(shù)為45872    TL0=(65536-45872)%256;    EA=1;//開總中斷    ET0=1;//開定時器0中斷    TR0=1;//啟動定時器0    while(1);//程序停止在這里等待中斷發(fā)生}void T0_time() interrupt 1{    TMOD=0x01;//重裝初值    TH0=(65536-45872)/256;    num++;//num每加一次判斷一次是否到20次    if(num==20)//如果到了20次,說明1秒時間到        {            num=0;//num清0重新計數(shù)            led=~led1;        }}

編寫單片機定時器程序的步驟:

1.對TMOD賦值,以確定T0和T1的工作方式。
2.計算初值,并將初值寫入TH0,TL0或TH1,TL1。
3.中斷方式時,對IE賦值,開放中斷。
4.使TR0或TR1置位,啟動定時器/計數(shù)器定時或計數(shù)。
1.定時器使用方法
1.時間的計算
要實現(xiàn)定時50ms,(65536-T0)x12/12000000=0.05s得T0=15536即0x3c要實現(xiàn)定時tms,可以利用(65536-t)x12/12000000= txE-3;求出t,即可。
2.對TMOD賦值,以確定T0和T1的工作方式
//例子TMOD=0x01;    //0b00000001  用的是定時器0,工作在方式1(16位寄存器)TMOD:定時器/計數(shù)器模式控制寄存器GATE=1時,由外部中斷引腳INT0、INT1來啟動定時器T0、T1。   當INT0引腳為高電平時TR0置位,啟動定時器T0;   當INT1引腳為高電平時TR1置位,啟動定時器T1。   GATE=0時,僅由TR0,TR1置位分別啟動定時器T0、T1。   Ⅱ,C/T——功能選擇位   C/T=0時為定時功能,C/T=1時為計數(shù)功能。   置位時選擇計數(shù)功能,清零時選擇定時功能。   Ⅲ,M0、M1——方式選擇功能   由于有2位,因此有4種工作方式     M1  M0 工作方式 計數(shù)器模式 TMOD(設(shè)置定時器模式)    0 0 方式0 13位計數(shù)器 TMOD=0x00   0 1 方式1 16位計數(shù)器 TMOD=0x01   1 0 方式2 自動重裝8位計數(shù)器 TMOD=0x02   1 1 方式3 T0分為2個8位獨立計數(shù)器,T1為無中斷重裝8位計數(shù)器 TMOD=0x03
/**********************************************************************************************定時器1的初始化函數(shù)************************************************************************************************/void timer1_init()   //這里是定時器1初始化函數(shù){     TMOD |= 0x10;          //TMOD里 MO 置1     TMOD &= 0xdf;        //TOOD里  M1 清零 定時器選擇為 16位定時模式     TH1   = 0xFC;          //下面2句是 定時器的初值 也就是你定時器需要定時的時間     TL1   = 0x67;    TR1   = 1;               //啟動定時器 }

3.計算初值,并將初值寫入TH0,TL0或TH1,TL1。
TH0=(65536-50000)/256; //裝定時器初值高8位TL0=(65536-50000)%256; //裝定時器初值低8位        TH0=(65536-T0)/256 ;//裝定時器初值高8位TL0=(65536-T0)%256 ;//裝定時器初值低8位//其中T0是需要計算的時間//一般編程過程并直接計算T0的值,直接寫讓單片機自己去計算
4.中斷方式時,對IE賦值,開放中斷。
EA=1;   //開 總中斷ET0=1; //開 定時器0中斷 EA=1;開 總中斷         EA=0;關(guān)閉 總中斷 ET0=1;開 定時器0中斷    ET0=0;關(guān)閉 定時器0中斷 EA=1;開 總中斷         EA=0;關(guān)閉 總中斷 ET1=1;開 定時器1中斷    ET1=0;關(guān)閉 定時器1中斷 /*********** //TR0=1;//啟動定時器0   TR0=1;//關(guān)閉定時器0 ************/
5.//定時器初始化
/************************************定時器初始化案例******************************************/void timer0Init(){        TMOD=0x01;            //0b00000001  用的是定時器0,工作在方式1(16位寄存器)        TH0=(65536-50000)/256;   //裝定時器初值高8位        TL0=(65536-50000)%256;    //裝定時器初值低8位                EA=1;//開總中斷        ET0=1; //開定時器0中斷   //TR0=1;//啟動定時器0   TR0=1;//關(guān)閉定時器0}
6..一般使用定時器的代碼步驟
//實現(xiàn)led燈一秒亮滅閃爍#define  uhar  unsinged char #define  uint  unsinged intuchar num;void main(){    TMOD=0x01;//設(shè)置定時器0為工作方式1(M1 M0為01)    TH0=(65536-45872)/256;//裝初值11.0582晶振定時50ms數(shù)為45872    TL0=(65536-45872)%256;    EA=1;//開總中斷    ET0=1;//開定時器0中斷    TR0=1;//啟動定時器0    while(1);//程序停止在這里等待中斷發(fā)生}void T0_time() interrupt 1{    TMOD=0x01;//重裝初值    TH0=(65536-45872)/256;    num++;//num每加一次判斷一次是否到20次    if(num==20)//如果到了20次,說明1秒時間到        {            num=0;//num清0重新計數(shù)            led=~led1;        }}

/定時器0中斷函數(shù)#define  uhar  unsinged char void T0/T1_time() interrupt 1//使用定時器中斷1{        TMOD=0X01;//選擇了定時器0 方式1    //可以設(shè)置TMOD=0x00;0x01;0x10;0x11;共四組方式        TH0=(65536-T0)/256;   //裝定時器初值高8位        TL0=(65536-T0)%256;    //裝定時器初值低8位    //T0是需要計算的時間    uchar count=0;    if(count==X)        {        count=0; //清0重新計數(shù)        執(zhí)行程序代碼    }    //其中X是需要計算次數(shù),比如讓定時器定時個1s;    //則需要定時器一個50ms的時間;    //如果要達成1s則需要執(zhí)行20次;    //讓定時器定時個50ms時間,需要這樣去寫    //TH0=(65536-50000)/256;    //TL0=(65536-50000)%256;    //讓定時器定時個T0時間,需要這樣去寫    //     //TH0=(65536-T0乘10的3次方)/256;    //TL0=(65536-T0乘10的3次方)%256;            }void main(){     timer0Init();//初始化     //執(zhí)行程序代碼,完成相應(yīng)的功能;     while(1)     {        //執(zhí)行程序代碼,完成相應(yīng)的功能;     }}void T0_time() interrupt 1{    TMOD=0x01;//重裝初值    TH0=(65536-45872)/256;    num++;//num每加一次判斷一次是否到20次    if(num==20)//如果到了20次,說明1秒時間到        {            num=0;//num清0重新計數(shù)            led=~led1;        }}
/*************************網(wǎng)上程序******************************/
/*************************網(wǎng)上程序******************************/#include"reg51.h"sbit led=P1^1;#define uchar unsigned char//#define uint unsigned intuchar num;//定義全局變量void t0Iint()//定時器0的初始化函數(shù){       TMOD=0x01;//設(shè)置定時器0為工作方式1(M1 M0為01)    TH0=(65536-50000)/256;//裝初值11.0582晶振定時50ms數(shù)為45872    TL0=(65536-50000)%256;    EA=1;//開總中斷    ET0=1;//開定時器0中斷}void main(){     t0Iint();     //TMOD=0x01;//設(shè)置定時器0為工作方式1(M1 M0為01)     // TH0=(65536-50000)/256;//裝初值11.0582晶振定時50ms數(shù)為45872    //TL0=(65536-50000)%256;    //EA=1;//開總中斷    //ET0=1;//開定時器0中斷    TR0=1;//啟動定時器0    while(1);//程序停止在這里等待中斷發(fā)生}void T0_time() interrupt 1{    //TMOD=0x01;//重裝初值    //TH0=(65536-50000)/256;       num++;//num每加一次判斷一次是否到20次    if(num==20)//如果到了20次,說明1秒時間到        {            num=0;//num清0重新計數(shù)            led=~led;        }}


模板


/**********該程序經(jīng)過處理更容易懂和套模板利用********************************************/#include"reg51.h"sbit led=P1^1;//定義一個LED燈為1.1引腳#define uchar unsigned char//#define uint unsigned intuchar num;//定義全局變量void timer0Iint()//定時器0的初始化函數(shù){       TMOD=0x01;//設(shè)置定時器0為工作方式1(M1 M0為01)    TH0=(65536-50000)/256;//裝初值11.0582晶振定時50ms數(shù)為45872    TL0=(65536-50000)%256;    EA=1;//開總中斷    ET0=1;//開定時器0中斷}void T0_time() interrupt 1{       num++;//num每加一次判斷一次是否到20次      if(num==20)//如果到了20次,說明1秒時間到        {            num=0;//num清0重新計數(shù)            led=~led;        }}void main(){     timer0Iint();     TR0=1;//啟動定時器0//該步驟也可在初始化寫    while(1)    {    }//程序停止在這里等待中斷發(fā)生   


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人二区 | 99在线免费视频 | 国产情侣激情 | 中文字幕视频一区 | 成人福利视频 | 毛片韩国| 亚洲国产成人精品久久 | 成人免费黄色片 | 精品在线播放 | www.久草.com | 三级视频在线观看电影 | 黄色成人免费看 | 国产精品我不卡 | 国产美女自拍视频 | 免费在线观看黄视频 | 成人欧美一区二区三区1314 | 成人欧美一区二区三区在线播放 | 国产精品久久国产精品 | av一区二区三区四区 | 国产精品一区二区av | 日本免费在线看 | 亚洲免费在线视频 | 日韩小视频在线 | 日韩精品一区二区久久 | 国产不卡一区 | 一级片免费视频 | 色婷婷精品久久二区二区蜜臂av | 6080亚洲精品一区二区 | 亚洲一区国产 | 男女羞羞免费网站 | 澳门永久av免费网站 | 人人叉| 狠狠狠干| 在线欧美亚洲 | 天天宗合网 | 免费九九视频 | 99re6在线视频精品免费 | 毛片免费看 | 欧美亚洲国产一区二区三区 | 成人在线免费视频 | 国产7777 |