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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

89C51單片機定時/計數器0

作者:未知   來源:不詳   點擊數:  更新時間:2014年06月22日   【字體:

89C51單片機的定時計數功能由特殊功能寄存器TMOD和TCON共同控制。
TMOD沒有位地址,不能進行位操作,其每位的名稱和功能如下:
TMOD:GATE C/T1  M1 M0 GATE  C/T1   M1  M0
                         D7          D6           D5    D4       D3          D2         D1      D0
 GATE      
C/T1      M1     M0    控制定時計時器1;
 
GATE       C/T0      M1     M0   控制定時計時器0;
GATE=0時,定時計數信號是T0腳狀態(P3.4)或機器周期(C/T=0計機器周期,即定時,C/T=1,計T0腳的狀態,即計數),計數開始開關是TR0(0關閉計數,1開始計數)。
GATE=1時,定時計數功能由T0腳(P3.4)或者機器周期確定(C/T=0計數機器周期,即定時,C/T=1,計數T0腳的變化狀態,即計數),計數開始開關由TR0(0關閉計數,1開始計數)和INT0(管腳P3.2共同確定。
 M1M0是計數方式選擇:計數在TH0和TL0進行。
 00為方式0,13位(TH0的8位和TL0的低5位)二進制計數器,由0可數到2的13次方-1;
 01為方式1,16位二進制計數器,由0可數到2的16次方-1;
 10為方式2,8位二進制計數器,TH0放計數初值,計數在TL0進行,溢出后自動將 
                     TH0中的初值裝入TL0;
11為方式3,TH0是個8為計數器,HL0是個8位計數器。兩個計數器相互獨立。
T1和T0功能相同。
特殊功能寄存器TCON,可以位操作,但一般不用位地址,而用位的功能名稱:
位地址:8FH  8EH  8DH  8Ch  8Bh  8Ah  89H  88H
TCON :TF1  TR1  TF0   TR0   IE1   IT1   IE0   IT0 

               D7    D6    D5    D4    D3   D2   D1    D0 
TF0是T0計數標志位:定時計數溢出時,該位被自動置1,中斷計數結束后自動清0.
TR0是計數開關,GATE=0時,TR0=1打開計數,0關閉。當GATE=1時,和INT0一起控制計數器打開,即GATE=1,TR0=1,INT0=1才可打開計數,否則關閉。
定時/計數時,由TH0 TL0的值開始加1計數到FFFFH滿,再計數就溢出,如果是定時/計數模式,溢出后將TF0置1,計數定時結束,如果是中斷模式,中斷請求由硬件給TF0置1,計數結束后,也就是中斷結束后,自動將TF0清0。
/***************定時器定時50ms,在計數20下為1秒,顯示60秒計時(查詢模式)***********/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

int yu[]={
               0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
             };
int t,k,dat;
void delay(int ms)
{
 while(ms--)
   {
    int i;
    for(i=0;i<30;i++);
   }
}
void Timer0()
   {       
     if(TF0==1)//查詢TF0為1,說明計數滿了,計數結束。
         {
          t++;
          TH0=0x3c;//這里是計數滿后重新裝入計數初值.也可TH0=(65536-5000)/256
          TL0=0xb0;//計數溢出后再次計數從這里開始,
也可TL0=(65536-5000)%256
       /*如果先計算初值麻煩,還可以用16位二進制的最大值65536-定時計數次數賦值給TH0和TL0,例如定時40ms,需對機器周期計數4000下,可以
            TH0=(65536-4000)/256;TL0=(65536-4000)%*/

          TF0=0;
         }
            //清除溢出標志
   }
void T1s()
{
  if(t==20)//計數一次50ms,20次為1秒
      {t=0;
       dat++;
       if(dat==60)//60次為1分鐘
        dat=0;
      }
}
void main()
{
  TMOD=0x01;
   /*此設置(0000 0101)T0的GATE=0,C/T為0,M1M0為01。
    GATE=0,關閉INT0(P3.2)腳對計數開始的控制,只由TR0控制開始。
    C/T=0,定時功能,計數機器周期的個數。
    M1M0=01,計數方式選擇方式1,16位二進制計數器,由TH0 TL0開始計數到FFFFH滿
    再計數就溢出,如果是定時/計數模式,溢出后將TF0置1,計數定時結束,如果是中
    斷模式清0,有硬件給TF0置1,計數結束,也就是中斷結束,自動將TF0清0.
    打開計數器0中斷將ET0=1,EA=1 */
  TH0=0x3c;//設置計數器計數初值50ms從3CB0H開始計數
  TL0=0xb0;//第一次從這里的設置開始計數
  TR0=1; 
  while(1)
   { 
      Timer0();
      T1s();     
     P0=yu[dat%10];
      delay(1);
      P2=0x01;   
      delay(1);
      P2=0x00;
     P0=yu[dat/10];
      delay(1);
      P2=0x02;
      delay(1);
      P2=0x00;   
   }

/*******定時/計數器0中斷應用,按鍵沒按一次數碼管顯示加1(中斷模式)*************/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
int yu[]={
               0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
             };
int k;
void delay(int ms)
{
 while(ms--)
   {
    int i;
    for(i=0;i<30;i++);
   }
}
void ddd() interrupt 1
   {
     TH0=0xff;//這里是計數滿后重新裝入計數初值
     TL0=0xfa;//計數溢出后再次計數從這里開始
     delay(5);
     if(TF0==0)//計數中斷時TF0由硬件置1,響應中斷并開始計數,計數產生溢出后自動清0,結束計數。
            {        //所以,響應中斷后,查詢TF0的狀態可以判斷中斷計數是否結束
               if(k==99)
               k=0;
              else
               k++;
           }        
   }
void main()
{
  TMOD=0x05;
/*此設置(0000 0101)T0的GATE=0,C/T為1,M1M0為01。
   GATE=0,關閉INT0(P3.2)腳對計數開始的控制,只由TR0控制開始。
    C/T=1,計數功能,計數管腳T0(P3.4)的狀態變化。
   M1M0=01,計數方式選擇方式1,16位二進制計數器,由TH0 TL0開始計數到FFFFH滿,再計數就溢出,如果是定時/計數模式,溢出后將TF0置1,計數定時結束,如果是中斷模式清0,有硬件給TF0置1,計數結束,也就是中斷結束,自動將TF0清0.打開計數器0中斷將ET0=1,EA=1 */

  TH0=0xff;//設置計數器計數初值
  TL0=0xfc;//第一次從這里的設置開始計數
  ET0=1;

  TR0=1;
  EA=1;
  while(1)
   {
   P0=yu[k%10];
      delay(1);
      P2=0x01;   
      delay(1);
      P2=0x00;
      P0=yu[k/10];
      delay(1);
      P2=0x02;
      delay(1);
      P2=0x00;   
   }
}



/******用查詢模式計數
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
int yu[]={
               0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
             };
int k;
void delay(int ms)
{
 while(ms--)
   {
    int i;
    for(i=0;i<30;i++);
   }
}
void jishu()
   {     
     if(TF0==1)//查詢TF0,為1,說明計數滿了,計數結束。
         {
           TH0=0xff;//這里是計數滿后重新裝入計數初值
           TL0=0xff;//計數溢出后再次計數從這里開始
           delay(5);
           if(k==99)
           k=0;
           else
           k++;
         }
        TF0=0;     //清除溢出標志
   }
void main()
{
  TMOD=0x05;
/*此設置(0000 0101)T0的GATE=0,C/T為1,M1M0為01。
   GATE=0,關閉INT0(P3.2)腳對計數開始的控制,只由TR0控制開始。
    C/T=1,計數功能,計數管腳T0(P3.4)的狀態變化。
   M1M0=01,計數方式選擇方式1,16位二進制計數器,由TH0 TL0開始計數到FFFFH滿,再計數就溢出,如果是定時/計數模式,溢出后將TF0置1,計數定時結束,如果是中斷模式清0,有硬件給TF0置1,計數結束,也就是中斷結束,自動將TF0清0.打開計數器0中斷將ET0=1,EA=1 */

  TH0=0xff;//設置計數器計數初值
  TL0=0xff;//第一次從這里的設置開始計數
  TR0=1;
  while(1)
   { 
      jishu();
   P0=yu[k%10];
      delay(1);
      P2=0x01;   
      delay(1);
      P2=0x00;
     P0=yu[k/10];
      delay(1);
      P2=0x02;
      delay(1);
      P2=0x00;   
   }
}
/**********************用定時中斷設計秒表及顯示****************************/

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
int yu[]={
               0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
             };
int k,dat;
void delay(int ms)
{
 while(ms--)
   {
    int i;
    for(i=0;i<30;i++);
   }
}
void ddd() interrupt 1
   {
     TH0=(8192-4000)-(8192-4000)%32;//這里是計數滿后重新裝入計數初值
     TL0=(8192-4000)%32;//計數溢出后再次計數從這里開始
     delay(5);
     if(TF0==0)//計數中斷時TF0由硬件置1,響應中斷并開始計數,計數產生溢出后自動清0,結束計數。
            {        //所以,響應中斷后,查詢TF0的狀態可以判斷中斷計數是否結束
              if(k==250)
               {k=0;
               dat++;}
              else
               k++;
                //關閉T0計數器,TR0=0句不能在主程序中,要在查詢函數或中斷函數中,否則停不下來。
           }       
   }
void main()
{
  TMOD=0x00;
/*此設置(0000 0101)T0的GATE=0,C/T為1,M1M0為01。
   GATE=0,關閉INT0(P3.2)腳對計數開始的控制,只由TR0控制開始。
    C/T=1,計數功能,計數管腳T0(P3.4)的狀態變化。
   M1M0=01,計數方式選擇方式1,16位二進制計數器,由TH0 TL0開始計數到FFFFH滿,再計數就溢出,如果是定時/計數模式,溢出后將TF0置1,計數定時結束,如果是中斷模式清0,有硬件給TF0置1,計數結束,也就是中斷結束,自動將TF0清0.打開計數器0中斷將ET0=1,EA=1 */
  TH0=0xa3;//設置計數器計數初值
  TL0=0x00;//第一次從這里的設置開始計數
  ET0=1;
  TR0=1;
  EA=1;
  while(1)
   {
    
   P0=yu[dat%10];
      delay(1);
      P2=0x01;   
      delay(1);
      P2=0x00;
      P0=yu[((dat%1000)%100)/10];
      delay(1);
      P2=0x02;
      delay(1);
      P2=0x00;
   P0=yu[(dat%1000)/100];
      delay(1);
      P2=0x04;   
      delay(1);
      P2=0x00;
      P0=yu[dat/1000];
      delay(1);
      P2=0x08;
      delay(1);
      P2=0x00;
   }

=====================================================
匯編語言編寫的T0中斷定時器
    ORG 0000H
     Ljmp main
     ORG 000BH
     Ljmp T0ZD
     org 0100h
main:mov TMOD,#00h
     mov TH0,#83h
     mov TL0,#00h
     mov r7,#00h
     setb EA
     setb ET0
     setb TR0
     mov dptr,#0300h
disp:mov 70h,r3
     mov a,70h
     mov b,#0ah
     div ab
     movc a,@a+dptr
     mov P0,a
     mov P2,#02h
     nop
     nop
     mov P2,#00h
     mov a,b
     movc a,@a+dptr
     mov P0,a
     mov P2,#01h
     nop
     nop
     mov P2,#00h
     sjmp disp
T0ZD:mov TL0,#00h
     mov TH0,#83h
     cpl p1.7    
     cjne r7,#250D,zzz
     mov r7,#00h
     cjne r3,#60h,ddd
     mov r3,#00h
ddd: inc r3
zzz: inc r7
     reti
     org 0300h
db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
     end
=================================================== 
關閉窗口

相關文章

主站蜘蛛池模板: 久草免费在线视频 | 亚洲欧美另类在线 | 久久免费观看视频 | 精品久久久久久久久久久久久久 | 久久精品国产清自在天天线 | 欧美日韩在线视频一区二区 | 婷婷开心激情综合五月天 | 亚洲精品欧美一区二区三区 | 在线国产一区二区 | 91中文字幕在线观看 | 中文日韩字幕 | 亚洲成人久久久 | 综合久久久久 | 国产精品免费一区二区三区四区 | 欧美日韩激情 | 麻豆va | 日韩不卡一区二区 | 欧美综合一区 | 国内精品视频在线观看 | 草草精品 | 伊人99 | 天天综合操 | 91中文在线观看 | 黄色毛片免费看 | 欲色av| 欧美综合国产精品久久丁香 | 五月精品视频 | 成人一区二区电影 | 96国产精品久久久久aⅴ四区 | 欧美一级一 | 本地毛片| 337p日本欧洲亚洲大胆鲁鲁 | 四虎海外| 久久久一区二区 | 欧美日韩亚洲国产综合 | 国产成人精品一区二三区在线观看 | 日韩有码一区 | 91私密视频 | 天堂久久网| 欧美最猛性xxxxx亚洲精品 | 国产一区二区在线免费观看 |