一、 實驗項目名稱:實驗九 定時器實驗 二、 實驗目的 1、掌握單片機定時器/計數器定時模式的使用及編程。 三、 實驗要求 1、利用片內定時器/計數器來進行定時,定時時間間隔為1秒。單片機的P1.0腳接1個發光二極管,控制發光二極管閃爍,時間間隔1秒。 2、當按下某一I/O口線上的按鍵操作時,發光二極管按設定時間1秒定時閃爍。 3、附加功能:同時可以設定任一I/O口接一個蜂鳴器,在按下按鍵的同時,控制蜂鳴器按1秒間隔發出“嘟--嘟”警報聲。(選做) 四、 實驗電路原理圖及仿真過程截圖: 1、 原理圖: file:///C:/Users/HP/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg 2、 仿真結果圖 (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 五、 實驗所用器材(列表) 分類 | | | | 電容 | | | | 電容 | | | | 電阻 | | | | 電阻 | | | | 電阻 | | | | 集成電路 | | | | 發光二極管 | | | | 雜項 | | | | 雜項 | | | |
六、 實驗程序流程圖: file:///C:/Users/HP/AppData/Local/Temp/msohtmlclip1/01/clip_image008.png 七、 實驗結論及實驗現象小結: 在定時器進行定時1sLED閃爍實驗中,在開啟定時器中斷之前需要進行TOMD的配置,再對THX,TLX進行賦值。明白定時器的4種工作方式,簡單步驟如下: 1、 對TMOD進行賦值,以確定T0和T1的工作方式。 2、 計算初值,并將初值寫入THX和TRX。 3、 中斷方式時,則對IE進行賦值,開放中斷。 4、 使TR0或TR1置位,啟動定時器進行定時計數。 八、 對本實驗過程及方法、手段的改進建議: 實驗中,用喇叭發聲,在網上找到了“生日快樂歌”的數組加上去,使得實驗變得更加有趣。在剛開始學習定時器時,學會計算初值,牢記公式,我們也可以通過“單片機小精靈”等輔助工具來開放我們的C代碼。 附錄:實驗程序: #include <reg52.h> /************ 定時器+中斷控制led翻轉 ***********/ 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定時器的啟動 //設置定時器的初始計數值 TH0 = 0xFC; TL0 = 0x18; EA = 1; //總中斷開關 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; //下降沿觸發 IT1=1; //1邊沿觸發 } 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);//播放完后暫停一段時間 } } }
|