二、 實驗?zāi)康?/div>
1、掌握單片機(jī)定時器/計數(shù)器定時模式的使用及編程。
三、 實驗要求
1、利用片內(nèi)定時器/計數(shù)器來進(jìn)行定時,定時時間間隔為1秒。單片機(jī)的P1.0腳接1個發(fā)光二極管,控制發(fā)光二極管閃爍,時間間隔1秒。
2、當(dāng)按下某一I/O口線上的按鍵操作時,發(fā)光二極管按設(shè)定時間1秒定時閃爍。
3、附加功能:同時可以設(shè)定任一I/O口接一個蜂鳴器,在按下按鍵的同時,控制蜂鳴器按1秒間隔發(fā)出“嘟--嘟”警報聲。(選做)
四、 實驗電路原理圖及仿真過程截圖:
1、 原理圖:
file:///C:/Users/HP/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
2、 仿真結(jié)果圖
(1) 定時器0:file:///C:/Users/HP/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
(2) 定時器1:
file:///C:/Users/HP/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg
五、 實驗所用器材(列表)
分類 | | | |
電容 | | | |
電容 | | | |
電阻 | | | |
電阻 | | | |
電阻 | | | |
集成電路 | | | |
發(fā)光二極管 | | | |
雜項 | | | |
雜項 | | | |
六、 實驗程序流程圖:
file:///C:/Users/HP/AppData/Local/Temp/msohtmlclip1/01/clip_image008.png
七、 實驗結(jié)論及實驗現(xiàn)象小結(jié):
在定時器進(jìn)行定時1sLED閃爍實驗中,在開啟定時器中斷之前需要進(jìn)行TOMD的配置,再對THX,TLX進(jìn)行賦值。明白定時器的4種工作方式,簡單步驟如下:
1、 對TMOD進(jìn)行賦值,以確定T0和T1的工作方式。
2、 計算初值,并將初值寫入THX和TRX。
3、 中斷方式時,則對IE進(jìn)行賦值,開放中斷。
4、 使TR0或TR1置位,啟動定時器進(jìn)行定時計數(shù)。
八、 對本實驗過程及方法、手段的改進(jìn)建議:
實驗中,用喇叭發(fā)聲,在網(wǎng)上找到了“生日快樂歌”的數(shù)組加上去,使得實驗變得更加有趣。在剛開始學(xué)習(xí)定時器時,學(xué)會計算初值,牢記公式,我們也可以通過“單片機(jī)小精靈”等輔助工具來開放我們的C代碼。
附錄:實驗程序:
#include <reg52.h>
/************ 定時器+中斷控制led翻轉(zhuǎn) ***********/
sbit LED = P1^0;
sbit beep = P1^4;
#define u16 unsigned int
#define u8 unsigned char
u16i ;
u16 flag=0;
void DelayMS(u16 x)
{
u8 t;
while(x--) for(t=0;t<120;t++);
}
u8 codeSONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
212,212,106,126,159,169,190,119,119,126,159,142,159,0};
u8 code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
9,3,12,12,12,12,12,9,3,12,12,12,24,0};
void PlayMusic()//生日快樂
{
u16 a=0,j,k;
while(SONG_LONG[a]!=0||SONG_TONE[a]!=0)
{ //播放各個音符,SONG_LONG 為拍子長度
for(j=0;j<SONG_LONG[a]*20;j++)
{
beep=~beep;
//SONG_TONE 延時表決定了每個音符的頻率
for(k=0;k<SONG_TONE[a]/3;k++);
}
DelayMS(10);
a++;
}
}
void timer_init()
{
TMOD = 0x01; //定時器工作方式1,啟用T0定時器, GATE位為0,用TCON的TR0控制T0定時器的啟動
//設(shè)置定時器的初始計數(shù)值
TH0 = 0xFC;
TL0 = 0x18;
EA = 1; //總中斷開關(guān)
ET0 = 1; //T0中斷
TR0 = 1;//啟動T0定時器
}
void trigger_timer0() interrupt 1
{
TH0 = 0xFC;
TL0 = 0x18;
i++;
if( i == 1000)
{//1秒
i = 0;
LED = ~LED;
}
}
void init_tx()
{
EA=1;
EX0=1;
EX1=1;
PX1=1;
PX0=1;
IT0=1; //下降沿觸發(fā)
IT1=1; //1邊沿觸發(fā)
}
void tx0() interrupt 0
{
timer_init();
}
void tx1() interrupt 2
{
if(P3^3==0)
flag=1;
}
void main()
{
init_tx();
beep=0;
while(1)
{
if(flag==1)
{
PlayMusic(); //播放生日快樂
DelayMS(500);//播放完后暫停一段時間
}
}
}