|
0.png (167.95 KB, 下載次數(shù): 97)
下載附件
2016-9-27 11:58 上傳
頻率計的ppt教程:
0.png (182.35 KB, 下載次數(shù): 90)
下載附件
2016-9-27 12:05 上傳
0.png (53.63 KB, 下載次數(shù): 87)
下載附件
2016-9-27 11:58 上傳
頻率計的ppt 仿真 程序等所有資料下載:
6位數(shù)顯頻率計數(shù)器.rar
(248.34 KB, 下載次數(shù): 60)
2016-9-27 12:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
一、MCS-51單片機定時器/計數(shù)器組成:
定時器/計數(shù)器0(T0):16位的加計數(shù)器
定時器/計數(shù)器1(T1):16位的加計數(shù)器
二、定時器/計數(shù)器的功能
對外部輸入信號的計數(shù)功能。定時器/計數(shù)器0(T0)的外來脈沖輸入端為P3.4;定時器/計數(shù)器1(T1)的外來脈沖輸入端為P3.5。
定時功能。定時器/計數(shù)器的定時功能也是通過計數(shù)實現(xiàn)的,它的計數(shù)脈沖是由單片機的片內振蕩器輸出經(jīng)12分頻后產(chǎn)生的信號,即為對機器周期計數(shù)。
在計數(shù)工作方式下,計數(shù)器的計數(shù)值范圍是:
1~8192(2的13方)
當為定時工作方式時,定時時間的計算公式為:
( 8192 -計數(shù)初值)×晶振周期×12
或 ( 8192 -計數(shù)初值)×機器周期
其時間單位與晶振周期或機器周期相同。
如果單片機的晶振選為6.000MHz,則最小定時時間為:
[8192—(8192—1)]×1/6×10-6×12=2×10-6(s)=2(us)
最長定時時間為:
(8192—0)×1/6×10-6×12=16384×10-6(s)=16384(us)。
在工作方式1下,計數(shù)器的計數(shù)值范圍是:
1~65536(2的16方)
當為定時工作方式1時,定時時間的計算公式為:
(65536—計數(shù)初值)× 晶振周期×12
或 (65536—計數(shù)初值)× 機器周期
其時間單位與晶振周期或機器周期相同。
如果單片機的晶振選為6.000MHz,則最小定時時間為:
[65536—(65536—1)]×1/6×10-6×12=2×10-6(s)=2(us)
最長定時時間為:
(65536—0)×1/6×10-6×12=131072×10-6(s)=131072(us)
方式2與方式0、1的區(qū)別:
工作方式0和工作方式1的最大特點就是計數(shù)溢出后,計數(shù)器為全0,因而循環(huán)定時或循環(huán)計數(shù)應用時就存在反復設置初值的問題,這給程序設計帶來許多不便,同時也會影響計時精度。
工作方式2就具有自動重裝載功能,即自動加載計數(shù)初值,所以也有的文獻稱之為自動重加載工作方式。在這種工作方式中,16位計數(shù)器分為兩部分,即以TL0為計數(shù)器,以TH0作為預置寄存器,初始化時把計數(shù)初值分別加載至TL0和TH0中,當計數(shù)溢出時,不再象方式0和方式1那樣需要“人工干預”,由軟件重新賦值,而是由預置寄存器TH以硬件方法自動給計數(shù)器TL0重新加載。
方式2在串口通訊時,常用作波特率發(fā)生器。
2.怎樣編制計數(shù)程序?
首先必須對定時計數(shù)器進行初始化,然后再開啟定時或計數(shù)。簡單的總結一下,定時計數(shù)器的初始化包括以下內容。
(1)確定工作方式——對TMOD賦值;
如:任務中的MOV TMOD,#06H指令,設定T0為計數(shù)器工作方式。
(2)預置定時計數(shù)器中計數(shù)的初值——直接寫入TH和TL;
如:任務中的MOV TH0,#00H 兩條指令,設定計數(shù)初值。
MOV TL0,#00H
(3)根據(jù)需要開放定時器/計數(shù)器的中斷——對IE位賦值;
(4)啟動定時器/計數(shù)器;
如:任務中的SETB TR0 指令
初值的計算方法
X=M-計數(shù)值
M是定時器的最大計數(shù)值。視工作方式不同而不同。
工作方式0: 13位定時/計數(shù)方式,因此,最多可以計到2的13次方,也就是8192次。
工作方式1: 16位定時/計數(shù)方式,因此,最多可以計到2的16次方,也就是65536次。
工作方式2和工作方式3:都是8位的定時/計數(shù)方式,因此,最多可以計到2的8次方,也說是256次。
預置值計算: 用最大計數(shù)量減去需要的計數(shù)次數(shù)即可。
通過上面的任務,我們掌握了計數(shù)程序的編制方法,下面我們再看看定時程序怎樣編制。
首先我們看一下下面的程序段。
MOV TMOD,#01H
MOV TL0,#00H
MOV TH0,#4CH
SETB TR0
以上程序是任務一中的定時程序段,它的初始化過程和計數(shù)方式類似。
實例二:利用方式1定時
題目:用定時器T1,使用工作方式1,在單片機的P1.0輸出一個周期為2分鐘、占空比為1:1的方波信號。
解:周期為2分鐘,占空比為1:1的方波信號,只需要利用T1產(chǎn)生定時,每隔1分將P1.0取反即可。
由于定時器定時時間有限,設定T1的定時為50ms,軟件計數(shù)1200次,可以實現(xiàn)1分鐘定時。
編程步驟:
1、計算TMOD的值
由于:GATE=0;M1、M0=0、1;C/T=0;
所以:(TMOD)=10H
2、計算初值(單片機的振蕩頻率為12MHZ)
所需要的機器周期數(shù):
n=(50000us/1us)=50000
計數(shù)器的初始值:X=65536-50000=15536
所以:(TH0)=3CH;(TL0)=0B0H
頻率計工作原理:
實現(xiàn)的方法:利用T0計數(shù)器對從T0輸入的脈沖進行計數(shù),利用T1工作于定時。每定時達到1秒鐘,取出計數(shù)器的值進行顯示。由于每秒鐘按鍵的按下次數(shù)不超過255次,所以只需要顯示TL0的內容即可。
步驟:
由于定時器的最大定時時間不能夠達到1秒鐘,我們設定T1定時100mS,每10次取一次計數(shù)值。
設定TMOD,TH1,TL1的內容,(fosc)=6MHz
所以:(TMOD)=51H
(TH1)=3CH
(TL1)=0B0H
本章要求:
了解中斷源、中斷的功能、中斷系統(tǒng)的組成與功能、中斷優(yōu)先權管理、中斷響應條件、中斷響應過程、中斷嵌套等基本概念;
掌握MCS-51單片機的5個中斷源;掌握外部中斷的觸發(fā)方式,與的觸發(fā)方式有邊沿方式與電平方式兩種;
掌握定時器/計數(shù)器的計數(shù)脈沖來源,計數(shù)脈沖來自內部振蕩頻率的12分頻后的脈沖則稱為定時器方式,計數(shù)脈沖來自外部引腳則稱為計數(shù)器方式;
掌握中斷請求標志的清除方式,邊沿方式下的與、T0、T1的中斷請求標志是自動被清除的,而串行口的中斷是用戶通過軟件清除的,電平觸發(fā)的與還需要硬件的支持才能被清除;
掌握T0與T1的工作方式,以及各種方式的應用;
掌握TCON、SCON、IE、IP、TMOD等特殊功能寄存器的功能與應用;
掌握MCS-51單片機對各中斷源的響應條件與過程。
源程序:
- #include <AT89X52.H>
- unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
- unsigned char dispbuf[8]={0,0,0,0,0,0,10,10};
- unsigned char temp[8];
- unsigned char dispcount;
- unsigned char T0count;
- unsigned char timecount;
- bit flag;
- unsigned long x;
-
- void main(void)
- {
- unsigned char i;
-
- TMOD=0x15;
- TH0=0;
- TL0=0;
- TH1=(65536-5000)/256;
- TL1=(65536-5000)%256;
- TR1=1;
- TR0=1;
- ET0=1;
- ET1=1;
- EA=1;
-
- while(1)
- {
- if(flag==1)
- {
- flag=0;
- x=T0count*65536+TH0*256+TL0;
- for(i=0;i<8;i++)
- {
- temp[i]=0;
- }
- i=0;
- while(x/10)
- {
- temp[i]=x%10;
- x=x/10;
- i++;
- }
- temp[i]=x;
- for(i=0;i<6;i++)
- {
- dispbuf[i]=temp[i];
- }
- timecount=0;
- T0count=0;
- TH0=0;
- TL0=0;
- TR0=1;
- }
- }
- }
-
- void t0(void) interrupt 1 using 0
- {
- T0count++;
- }
-
- void t1(void) interrupt 3 using 0
- {
- TH1=(65536-5000)/256;
- TL1=(65536-5000)%256;
- timecount++;
- if(timecount==200)
- {
- TR0=0;
- timecount=0;
- flag=1;
- }
- P2=0xff;
- P0=dispcode[dispbuf[dispcount]];
- P2=dispbit[dispcount];
- dispcount++;
- if(dispcount==8)
- {
- dispcount=0;
- }
- }
復制代碼 |
|