MCS-51單片機定時器/計數(shù)器常見習題解答
1、根據定時器/計數(shù)器0方式1邏輯結構圖,分析門控位GATE取不同值時,啟動定時器的工作過程。
答:當GATE=0:軟件啟動定時器,即用指令使TCON中的TR0置1即可啟動定時器0。
GATE=1:軟件和硬件共同啟動定時器,即用指令使TCON中的TR0置1時,只有外部中斷INT0引腳輸入高電平時才能啟動定時器0。
2、當定時器/計數(shù)器的加1計數(shù)器計滿溢出時, 溢出標志位TF1由硬件自動置1,簡述對該標志位的兩種處理方法。
答:一種是以中斷方式工作,即TF1置1并申請中斷,響應中斷后,執(zhí)行中斷服務程序,并由硬件自動使TF1清0;另一種以查詢方式工作,即通過查詢該位是否為1來判斷是否溢出,TF1置1后必須用軟件使TF1清0。
3、設MCS-51單片機fosc=12MHz,要求T0定時150µs,分別計算采用定時方式0、方式1和方式2時的定時初值。
答:方式0的定時初值:IF6AH
方式1的定時初值:FF6AH
方式2的定時初值:6AH
4、 設MCS-51單片機fosc=6MHz,問單片機處于不同的工作方式時,最大定時范圍是多少?
答:方式0的最大定時范圍:131,072µs
方式1的最大定時范圍:16,384µs
方式2的最大定時范圍:512µs
5、設MCS-51的單片機晶振為6MHZ,使用T1對外部事件進行計數(shù),每計數(shù)200次后,T1轉為定時工作方式,定時5ms后,又轉為計數(shù)方式,如此反復的工作,試編程實現(xiàn)。
答:
#include <reg52.h>
bit F0=0;
void main()
{
TMOD=0x60;
TL1=56;
TH1=56;
TR1=1;
ET1=1;
EA =1;
While(1);
}
void serve() interrupt 3
{
if (!F0)
{ TMOD=0x10;
TL1=63036%16;
TH1=63036/16;
F0=~F0;
}
else
{
TMOD=0x60;
TL1=56;
TH1=56;
F0=~F0;
}
}
6、 用方式0設計兩個不同頻率的方波,P1.0輸出頻率為200Hz,P1.1輸出頻率為 100Hz,晶振頻率12MHz。
#include <at89x52.h>
void main()
{
TMOD=0x00;
TL0=0x1c;
TH0=0xb1;
TR0=1;
F0=0;
ET0=1;
EA =1;
While(1);
}
void serve() interrupt 1
{
TL0=0x1c;
TH0=0xb1;
P1_0=~P1_0;
if(F0==0)
F0=1;
else
{
F0=0;
P1_1=~P1_1;
}
}
7、定時器T0已預置為156,且選定用于方式2的計數(shù)方式,現(xiàn)在T0輸入周期為1ms的脈沖,問此時T0的實際用途是什么?在什么情況下計數(shù)器0溢出?
答:T0的實際用途是定時1s,每隔1s計數(shù)器0溢出一次。
8、P1.0輸出脈沖寬度調制(PWM)信號,即脈沖頻率為2kHz、占空比為7:10的矩形波,晶振頻率12MHz。
#include <at89x52.h>
unsigned char data count;
void main()
{
TMOD=0x02;
TL0=206;
TH0=206;
TR0=1;
ET0=1;
EA =1;
count=0;
While(1);
}
void serve() interrupt 1
{
count++;
if(count<=7)
P1_0=1;
else
P1_0=0;
if(count==10)
count=0;
}
9、兩只開關分別接入P3.0、P3.1,在開關信號4種不同的組合邏輯狀態(tài),使P1.0分別輸出頻率0.5kHz、1kHz、2kHz、4kHz的方波,晶振頻率為12MHz。
#include <at89x52.h>
unsigned char data sta;
unsigned char data cou;
unsigned char data mag;
void main()
{
TMOD=0x02;
TL0=131;
TH0=131;
TR0=1;
ET0=1;
EA =1;
cou=0;
While(1);
}
void serve() interrupt 1
{
unsigned char temp;
P3=0xff;
temp=P3&0xfc;
if(temp!=sta)
{
sta=temp;
cou=0;
}
if(sta=0x00)
mag=7;
else if(sta=0x01)
mag=3;
else if(sta=0x10)
mag=1;
else if(sta=0x11)
mag=0;
if(cou==mag)
{
P1_0=~P1_0;
cou=0;
}
else
cou++;
}
10、MCS-51單片機P1端口上,經驅動器連接有8只發(fā)光二極管,若fosc=6MHz,試編寫程序,使這8只發(fā)光二極管每隔2s循環(huán)發(fā)光一次(要求T0定時)。
#include <at89x52.h>
unsigned char data cou;
unsigned int data tim;
void main()
{
TMOD=0x02;
TL0=16;
TH0=16;
TR0=1;
ET0=1;
EA =1;
P1=0;
cou=0;
tim=1;
While(1);
}
void serve() interrupt 1
{
tim++;
if(tim==500)
{
P1=0x01<<cou;
tim=1;
cou++;
if(cou==8)
cou=0;
}
}
15.設fosc=12MHz。試編寫一段程序,對定時器T1初始化,使之工作在模式2,產生200µs定時,并用查詢T1溢出標志的方法,控制P1.1輸出周期為2ms的方波。
#include <at89x52.h>
void main()
{
unsigned char i,j;
TMOD=0x20;
TL1=56;
TH1=56;
TR1=1;
while(1)
{
while(TF1=1)
{
TF1=0;
i++;
if(i==5)
{
P1_1=~P1_1;
i=0;
}
}
}
}
11、使用一個定時器,如何通過軟、硬件結合的方法,實現(xiàn)較長時間的定時?
答:先使用硬件實現(xiàn)單位時間的定時,通過軟件設置計數(shù)來實現(xiàn)較長時間的定時。