张林,20060710726电自0604,音乐卡设计

  • 格式:doc
  • 大小:817.50 KB
  • 文档页数:31

电子技术课程设计 实习报告

学院:电气与信息工程学院 班级:06级电自四班 姓名:张 林 学号:20060710726 设计名称:音乐卡设计 目录 一:任务与要求„„„„„„„„„„„„„3 二:设计目的„„„„„„„„„„„„3 三:设计原理与完成进度„„„„„„„„„„3 四:硬件原理图„„„„„„„„4 五:程序流程图„„„„„„„„„„„6 六:程序清单„„„„„„„„„„„13 七:课程设计心得体会„„„„„„„„„„„30 一、设计任务 这次我们组做的题目是音乐卡,作为音乐卡首先要能播放不同的声音,并且能与标准的声音频率相差不远,即所谓的音节、音阶,可以用定时器T0来实现;其次,能够控制每种声音发出时间的长度,即所谓的节拍,这需要一种精确的时钟做参考,可以由定时器T1来产生。具体任务与要求如下: 基本任务 1、要有音符的编码和解码规则,这里采用三个数表一个音符:如{2,2,2 },表2 第一个数表音符音节(do、lai、mi…….);第二个数表音符音阶1、2、2分别表第、中高音;第三个数表音符节拍 4、2、1 表一、半、四分之一拍。 2、要有显示部分,能够用数码管显示歌曲的播放时间。 3、对于按键部分,要设计下一曲、上一曲、暂停的按键。 4、应该有喇叭驱动电路,因为单片机管脚提供的电流只有一二十毫安,无法带动上百 安电流的喇叭。 拓展任务 因为现在,很多mp3都自带日历与时间,所以可以考虑在音乐卡的基础上,将电子日历也整合进去。于是 1、对于按键部分,多设一个切换键,用于各种界面如歌曲界面,日历界面的切换。 2、对于显示部分,能够显示歌曲当前位置,歌曲当前音符,以及日期,包括年月日及当前时间。 3,将歌曲数目,由五首增大到十二首。 二、设计目的 在现代绝大多数的场所,如交通灯,遥控器,温度传感器,电机控制,日历等都使用了单片机,所以,进行单片机课程设计对电气方向的学生意义重大。其具体的意义包括: 1、加深对C语言和汇编语言的理解与运用,能够用C语言编一些简单的函数,来控制所设计的音乐卡电路。 2、熟练掌握基本元器件的引脚图、功能,并能根据电路原理图用他们编辑组装、焊接,成相应的电路。 三、设计原理与完成进度 一般说来,单片机配合外接的蜂鸣器可以发出基本的单音频率。由于蜂鸣器发出的声音不包含相应幅度的谐波频率,因此采用这种方法不能演奏出多种音色的声音。使用单片机配合蜂鸣器来发音,只需弄清楚两个概念即可,也就是“音调”和“节拍”。 其中,音调表示一个音符唱多高的频率;节拍表示一个音符唱多长的时间。下面分别介绍音调和节拍的相关知识,以及如何使用单片机来实现音调和节拍。 节拍表示一个音符唱多长的时间,其同样是音乐学中的名词。在一张完整乐谱的开头,都有如1=C 、1=G …… 等的标识,这里的、用来表示节拍,而1=C、1=G表示一个乐谱的曲调,简单地说就是跟音调有关系。 前面介绍了基本音符的音调和节拍,并详细讲解了如何在单片机系统中来实现一个基本的音符。在单片机上实现音乐播放,一般只需逐个播放音符即可。用单片机播发音乐的方法如下: (1)初始化单片机定时器; (2)将乐谱中的每个音符的音调及节拍变换成相应的音调参数和节拍参数; (3)将乐谱中音符的参数做成数据表格,存放在存储器中; (4)通过程序取出一个音符的相关参数,驱动蜂鸣器播放该音符; (5)该音符唱完后,接着取出下一个音符的相关参数……,如此直到播放完毕最后一个音符,根据需要也可循环不停地播放整个乐曲。 为了吸取上次数电课程设计进度太慢的教训,我决定马上开始编程,而不是等过了四五天之后再行动,并且规定必须在五天内将软件程序编完。这次的流程是这样的: 第一天,从网上下了份单片机音乐卡的清单,用Keil软件编译,再放在Protues里仿真,由于我之前用过这些软件,所以不到一小时就完成;我还下了好几个音乐卡版本,反复比较后,采用了最后的那次版本,查表法。 第二天,我就编数码管驱动,由于我没选单片机课程,所以对数码管的工作方式及8255芯片了解不深,最后还是靠电子的一位同学帮忙,才把8255的用法真正弄清; 第三天,我把键盘驱动编完,仿真通过; 第四天,第五天分两次将拓展电路和芯片拿回,把它焊好,并当天晚上开始调试并成功; 之后不断的对编程文件进行增改,始功能不断扩大,性能越来越稳定,Bug越来越少,程序代码增了又减,减了有增,最后定在560多行。 四、硬件原理图 图上可分为晶振部分、复位部分、IO拓展部分、数码管显示部分、按键部分以及驱动部分。 晶振部分:由两个30pf的电容和一个晶体振荡器组成12MHz的时钟发生器。 复位部分:由一个10uf的电容和一个10k的电阻以及一个按键组成,通电瞬间产生上电复位,而后则可通过按键手动复位。 IO拓展:一块8255将单片机的一个P2口拓展至PA、PB、PC三个端口,从而使得单片机IO端口不够用的问题解决。 功率驱动部分:由一个三极管c9013,一个上拉电阻150欧,一个基集偏置电阻1000欧,及限流电阻150欧组成一个电流放大电路,已便很好的驱动喇叭。 数码管部分:由四个共阴极的八段数码管组成,并配置两块2803反向驱动芯片和两个220欧的排阻,以便更好的点亮数码管。 在本次试验中,IO口有32个,而实际只要17个,其中数码管12个,按键4个,喇叭一个,根本不用IO拓展,并且单片机的IO输出电流可达20多毫安,完全可以点亮数码管,也就是说,8255和2803及排阻是“多余”的。而我们只所以加上,是由于根据老师提供的PCB板,如果不加上则至少会引12根跳线到数码管,而且数码管的内部连接也相当复杂,为了改善PCB板美观,我们还是要8255与2803。 具体实物图如下:

While(1) Disp() 五、程序流程 Main函数

Delay_ms(20) TMOD=0X11 EA=1 ET0=ET1=1 CON8255=0X80 Song_start()

WHILE(1) Disp() Key_pro() Sec_change() Clock_change() F_2_() Noto_change()

Delay_ms(ucha t)函数 延时tms

功能描述:一个外循环,从1到t,一个内循环,从1到1000;由于单片机一个机器周期为1us,故可以产生1000* t us=t ms的延时程序

Song_start()函数 先延时30ms,将歌曲的时间变量全清零,再由flag变量提取播放第x曲,然后将音符指针指向tabx歌曲数组,接着提取当前音符指针的音频信息并暂存起来,再判断当前音符信息是否结束音符(0,0,0),休止符(0,1,x),或显示音符(x,x,x)并处理 Disp()函数 根据切换键按的次数和暂停键按的次数,分别显示歌曲界面1、歌曲界面2、音符界面、时钟界面、年份界面、日期界面 及各种界面下的闪烁与小数点情况 Key_pro()函数 按键处理:先判断是否有键,没有则返回;否则,延时1毫秒,来消抖;接着根据此时按键做相应处理,即调用key_alter_res()、key_change_res()、key_last_res()、key_next_res()子程序。

Key_alter_res() 切换键按键响应程序 Key_change_res() 停止键按键处理程序:

Key_last_res() 上翻键响应程序:在不同界面如歌曲界面1、歌曲界面2、音符界面、时钟界面、年份界面、月份日界面以及不同调整状态如小时显示在闪,分钟在闪,秒钟在动、年份在闪,月在闪、日在闪下所作出的响应 Key_next_pro() 下翻键响应程序:叙述同上,只是处理方向相反。 Sec_change()函数 歌曲秒触发函数:通常过一秒,即sec_count变量由0变到16是,秒钟会翻转,接着会对分产生影响。

clock_change()函数 时钟触发函数:通常过一秒,即clock_count变量由0变到16是,秒钟会翻转,接着会对分,小时,日,月,年产生影响。

F_2_()函数 每隔1秒,即f_2_count由0变到32时,f_2变量就翻转一次,即由全0变与全1间变化,从而实现在设定时间某位时某位闪烁 PA8255=seg_tab【x】| f_2

Noto_change()函数 音符跳转:当音符播放的时间达到音符节拍时间时,即noto_count>=time0,音符指针自动跳到下个音符,并提取相关音符信息,启动T0定时器。 六、程序清单 #include #include #define uchar unsigned char #define SONG_MAX 12

#define PA8255 XBYTE[0XF8FF] #define PB8255 XBYTE[0xFCFF] #define PC8255 XBYTE[0xFAFF] #define CON8255 XBYTE[0xFEFF]

sbit speaker=P3^5; sbit key_next=P1^3; sbit key_last=P1^2; sbit key_stop=P1^1; sbit key_alter=P1^0;