找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2174|回复: 0
收起左侧

基于51单片机定时器制作生日快乐歌

[复制链接]
ID:595359 发表于 2020-5-20 15:10 | 显示全部楼层 |阅读模式
一、  实验项目名称:实验九        定时器实验        
二、  实验目的
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
五、  实验所用器材(列表)
  
分类
  
位号
数量(个)
  
电容
  
C3
1uF
1
  
电容
  
C1,C2
22pF
2
  
电阻
  
R4
10R
1
  
电阻
  
R3
10K
1
  
电阻
  
R1,R2,R21
1K
3
  
集成电路
  
U1
AT89C51
1
  
发光二极管
  
D2
LED-YELLOW
1
  
杂项
  
X1
CRYSTAL
1
  
杂项
  
LS1
SOUNDER
1
六、  实验程序流程图:
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);//播放完后暂停一段时间
  }
}
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表