一、 实验项目名称:实验九 定时器实验 二、 实验目的 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);//播放完后暂停一段时间 } } }
|