標(biāo)題: 單片機(jī)數(shù)碼管頻率計(jì)proteus仿真和源程序及ppt教程等 [打印本頁]

作者: 51黑ff    時(shí)間: 2016-9-27 12:07
標(biāo)題: 單片機(jī)數(shù)碼管頻率計(jì)proteus仿真和源程序及ppt教程等



頻率計(jì)的ppt教程:


頻率計(jì)的ppt 仿真 程序等所有資料下載:
6位數(shù)顯頻率計(jì)數(shù)器.rar (248.34 KB, 下載次數(shù): 60)


一、MCS-51單片機(jī)定時(shí)器/計(jì)數(shù)器組成:
定時(shí)器/計(jì)數(shù)器0(T0):16位的加計(jì)數(shù)器
定時(shí)器/計(jì)數(shù)器1(T1):16位的加計(jì)數(shù)器
二、定時(shí)器/計(jì)數(shù)器的功能
對(duì)外部輸入信號(hào)的計(jì)數(shù)功能。定時(shí)器/計(jì)數(shù)器0(T0)的外來脈沖輸入端為P3.4;定時(shí)器/計(jì)數(shù)器1(T1)的外來脈沖輸入端為P3.5。
定時(shí)功能。定時(shí)器/計(jì)數(shù)器的定時(shí)功能也是通過計(jì)數(shù)實(shí)現(xiàn)的,它的計(jì)數(shù)脈沖是由單片機(jī)的片內(nèi)振蕩器輸出經(jīng)12分頻后產(chǎn)生的信號(hào),即為對(duì)機(jī)器周期計(jì)數(shù)。


在計(jì)數(shù)工作方式下,計(jì)數(shù)器的計(jì)數(shù)值范圍是:
          1~8192(2的13方)

當(dāng)為定時(shí)工作方式時(shí),定時(shí)時(shí)間的計(jì)算公式為:
         ( 8192 -計(jì)數(shù)初值)×晶振周期×12
或     ( 8192 -計(jì)數(shù)初值)×機(jī)器周期
其時(shí)間單位與晶振周期或機(jī)器周期相同。

如果單片機(jī)的晶振選為6.000MHz,則最小定時(shí)時(shí)間為:
     [8192—(8192—1)]×1/6×10-6×12=2×10-6(s)=2(us)
最長定時(shí)時(shí)間為:
     (8192—0)×1/6×10-6×12=16384×10-6(s)=16384(us)。


在工作方式1下,計(jì)數(shù)器的計(jì)數(shù)值范圍是:
          1~65536(2的16方)

當(dāng)為定時(shí)工作方式1時(shí),定時(shí)時(shí)間的計(jì)算公式為:
         (65536—計(jì)數(shù)初值)× 晶振周期×12
或     (65536—計(jì)數(shù)初值)× 機(jī)器周期
其時(shí)間單位與晶振周期或機(jī)器周期相同。

如果單片機(jī)的晶振選為6.000MHz,則最小定時(shí)時(shí)間為:
      [65536—(65536—1)]×1/6×10-6×12=2×10-6(s)=2(us)
最長定時(shí)時(shí)間為:
      (65536—0)×1/6×10-6×12=131072×10-6(s)=131072(us)


方式2與方式0、1的區(qū)別:
    工作方式0和工作方式1的最大特點(diǎn)就是計(jì)數(shù)溢出后,計(jì)數(shù)器為全0,因而循環(huán)定時(shí)或循環(huán)計(jì)數(shù)應(yīng)用時(shí)就存在反復(fù)設(shè)置初值的問題,這給程序設(shè)計(jì)帶來許多不便,同時(shí)也會(huì)影響計(jì)時(shí)精度。
    工作方式2就具有自動(dòng)重裝載功能,即自動(dòng)加載計(jì)數(shù)初值,所以也有的文獻(xiàn)稱之為自動(dòng)重加載工作方式。在這種工作方式中,16位計(jì)數(shù)器分為兩部分,即以TL0為計(jì)數(shù)器,以TH0作為預(yù)置寄存器,初始化時(shí)把計(jì)數(shù)初值分別加載至TL0和TH0中,當(dāng)計(jì)數(shù)溢出時(shí),不再象方式0和方式1那樣需要“人工干預(yù)”,由軟件重新賦值,而是由預(yù)置寄存器TH以硬件方法自動(dòng)給計(jì)數(shù)器TL0重新加載。
      方式2在串口通訊時(shí),常用作波特率發(fā)生器。


2.怎樣編制計(jì)數(shù)程序?

  首先必須對(duì)定時(shí)計(jì)數(shù)器進(jìn)行初始化,然后再開啟定時(shí)或計(jì)數(shù)。簡單的總結(jié)一下,定時(shí)計(jì)數(shù)器的初始化包括以下內(nèi)容。

(1)確定工作方式——對(duì)TMOD賦值;
如:任務(wù)中的MOV        TMOD,#06H指令,設(shè)定T0為計(jì)數(shù)器工作方式。
(2)預(yù)置定時(shí)計(jì)數(shù)器中計(jì)數(shù)的初值——直接寫入TH和TL;
如:任務(wù)中的MOV   TH0,#00H  兩條指令,設(shè)定計(jì)數(shù)初值。
            MOV          TL0,#00H

(3)根據(jù)需要開放定時(shí)器/計(jì)數(shù)器的中斷——對(duì)IE位賦值;
(4)啟動(dòng)定時(shí)器/計(jì)數(shù)器;
如:任務(wù)中的SETB  TR0  指令
初值的計(jì)算方法
X=M-計(jì)數(shù)值
M是定時(shí)器的最大計(jì)數(shù)值。視工作方式不同而不同。

工作方式0: 13位定時(shí)/計(jì)數(shù)方式,因此,最多可以計(jì)到2的13次方,也就是8192次。

工作方式1: 16位定時(shí)/計(jì)數(shù)方式,因此,最多可以計(jì)到2的16次方,也就是65536次。

工作方式2和工作方式3:都是8位的定時(shí)/計(jì)數(shù)方式,因此,最多可以計(jì)到2的8次方,也說是256次。

預(yù)置值計(jì)算:  用最大計(jì)數(shù)量減去需要的計(jì)數(shù)次數(shù)即可。
通過上面的任務(wù),我們掌握了計(jì)數(shù)程序的編制方法,下面我們?cè)倏纯炊〞r(shí)程序怎樣編制。
首先我們看一下下面的程序段。
           MOV     TMOD,#01H
        MOV           TL0,#00H  
        MOV     TH0,#4CH  
           SETB          TR0      
以上程序是任務(wù)一中的定時(shí)程序段,它的初始化過程和計(jì)數(shù)方式類似。


實(shí)例二:利用方式1定時(shí)
題目:用定時(shí)器T1,使用工作方式1,在單片機(jī)的P1.0輸出一個(gè)周期為2分鐘、占空比為1:1的方波信號(hào)。
解:周期為2分鐘,占空比為1:1的方波信號(hào),只需要利用T1產(chǎn)生定時(shí),每隔1分將P1.0取反即可。
由于定時(shí)器定時(shí)時(shí)間有限,設(shè)定T1的定時(shí)為50ms,軟件計(jì)數(shù)1200次,可以實(shí)現(xiàn)1分鐘定時(shí)。
編程步驟:
1、計(jì)算TMOD的值
       由于:GATE=0;M1、M0=0、1;C/T=0;
       所以:(TMOD)=10H
2、計(jì)算初值(單片機(jī)的振蕩頻率為12MHZ)
 所需要的機(jī)器周期數(shù):
                   n=(50000us/1us)=50000
  計(jì)數(shù)器的初始值:X=65536-50000=15536
            所以:(TH0)=3CH;(TL0)=0B0H


頻率計(jì)工作原理:
實(shí)現(xiàn)的方法:利用T0計(jì)數(shù)器對(duì)從T0輸入的脈沖進(jìn)行計(jì)數(shù),利用T1工作于定時(shí)。每定時(shí)達(dá)到1秒鐘,取出計(jì)數(shù)器的值進(jìn)行顯示。由于每秒鐘按鍵的按下次數(shù)不超過255次,所以只需要顯示TL0的內(nèi)容即可。
步驟:
由于定時(shí)器的最大定時(shí)時(shí)間不能夠達(dá)到1秒鐘,我們?cè)O(shè)定T1定時(shí)100mS,每10次取一次計(jì)數(shù)值。
設(shè)定TMOD,TH1,TL1的內(nèi)容,(fosc)=6MHz
      所以:(TMOD)=51H
                  (TH1)=3CH
                  (TL1)=0B0H

本章要求:
了解中斷源、中斷的功能、中斷系統(tǒng)的組成與功能、中斷優(yōu)先權(quán)管理、中斷響應(yīng)條件、中斷響應(yīng)過程、中斷嵌套等基本概念;
掌握MCS-51單片機(jī)的5個(gè)中斷源;掌握外部中斷的觸發(fā)方式,與的觸發(fā)方式有邊沿方式與電平方式兩種;
掌握定時(shí)器/計(jì)數(shù)器的計(jì)數(shù)脈沖來源,計(jì)數(shù)脈沖來自內(nèi)部振蕩頻率的12分頻后的脈沖則稱為定時(shí)器方式,計(jì)數(shù)脈沖來自外部引腳則稱為計(jì)數(shù)器方式;
掌握中斷請(qǐng)求標(biāo)志的清除方式,邊沿方式下的與、T0、T1的中斷請(qǐng)求標(biāo)志是自動(dòng)被清除的,而串行口的中斷是用戶通過軟件清除的,電平觸發(fā)的與還需要硬件的支持才能被清除;
掌握T0與T1的工作方式,以及各種方式的應(yīng)用;
掌握TCON、SCON、IE、IP、TMOD等特殊功能寄存器的功能與應(yīng)用;
掌握MCS-51單片機(jī)對(duì)各中斷源的響應(yīng)條件與過程。


源程序:
  1. #include <AT89X52.H>
  2. unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  3. unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
  4.                                0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
  5. unsigned char dispbuf[8]={0,0,0,0,0,0,10,10};
  6. unsigned char temp[8];
  7. unsigned char dispcount;
  8. unsigned char T0count;
  9. unsigned char timecount;
  10. bit flag;
  11. unsigned long x;
  12.   
  13. void main(void)
  14. {
  15.   unsigned char i;
  16.   
  17.   TMOD=0x15;
  18.   TH0=0;
  19.   TL0=0;
  20.   TH1=(65536-5000)/256;
  21.   TL1=(65536-5000)%256;
  22.   TR1=1;
  23.   TR0=1;
  24.   ET0=1;
  25.   ET1=1;
  26.   EA=1;
  27.   
  28.   while(1)
  29.    {
  30.      if(flag==1)
  31.        {
  32.          flag=0;
  33.          x=T0count*65536+TH0*256+TL0;
  34.          for(i=0;i<8;i++)
  35.            {
  36.              temp[i]=0;
  37.            }
  38.          i=0;
  39.          while(x/10)
  40.            {
  41.              temp[i]=x%10;
  42.              x=x/10;
  43.              i++;
  44.            }
  45.          temp[i]=x;
  46.          for(i=0;i<6;i++)
  47.            {
  48.              dispbuf[i]=temp[i];
  49.            }
  50.          timecount=0;
  51.          T0count=0;
  52.          TH0=0;
  53.          TL0=0;
  54.          TR0=1;
  55.        }
  56.    }
  57. }
  58.   
  59. void t0(void) interrupt 1 using 0
  60. {
  61.   T0count++;
  62. }
  63.   
  64. void t1(void) interrupt 3 using 0
  65. {
  66.   TH1=(65536-5000)/256;
  67.   TL1=(65536-5000)%256;
  68.   timecount++;
  69.   if(timecount==200)
  70.     {
  71.       TR0=0;
  72.       timecount=0;
  73.       flag=1;
  74.     }
  75.   P2=0xff;
  76.   P0=dispcode[dispbuf[dispcount]];
  77.   P2=dispbit[dispcount];
  78.   dispcount++;
  79.   if(dispcount==8)
  80.     {
  81.       dispcount=0;
  82.     }
  83. }
復(fù)制代碼





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1