1、南湖学院课程设计报告课程名称:单片机原理及应用课程设计 系 部:机建系 专业班级:电气 N112 学生姓名:冯倬程 完成时间:2013-7-10 报告成绩: 评阅意见:考勤20 分设计完成度30 分设计难度20 分报告说明书30 分总分100 分评阅教师 日期 2音阶演奏一、任务设计:1、设计任务:以 51 单片机为核心,输出一段有 14 个音的音阶,音阶演奏由定时器控制完成。2、设计要求:在输出声音时如果连接了虚拟示波器,可观察到脉宽逐步减小,频率不断升高,如果 CPU 会因连接虚拟示波器而过载,导致声音播放失帧,这时可断开示波器再播放。二、方案论证:1、蜂鸣器:发音是蜂鸣器振动引起的,而振
2、动则是对蜂鸣器电压断通引发的,控制电压的频率就是蜂鸣器振动的频率,取非则是对电压控制的断通控制,先是1,非后是 0,再非又继续循环。有两种蜂鸣器,一种无源蜂鸣器吗,一种是有源,有源是指给它通上直流电,它就按本身固有的频率响(本身有震荡电路比如 3K),而无源则相反,相当于喇叭,给喇叭通上直流电,是不会响的,需要交变的电压,这就是以上问题的蜂鸣器,这种蜂鸣器的振动频率是外部电路控制的,音调也即是可控的。改变高低电平的频率就是蜂鸣器的频率,可以通过定时器来改变。32、显示部分:采用 LCD 显示。LCD 液晶显示具有丰富多样性、灵活性、电路简单、易于控制而且功耗小等优点,对于信息量多的系统,是比较
3、适合的。3、单片机 AT89C51:AT89C51 是一种带 4K 字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8 位微处理器,俗称单片机。AT89C2051 是一种带 2K 字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除 100 次。4该器件采用 ATMEL 高密度非易失存储器制造技术制造,与工业标准的 MCS-51指令集和输出管脚相兼容。由于将多功能 8 位 CPU 和闪烁存储器组合在单个芯片中,ATMEL 的 AT89C51 是一种高效微
4、控制器,AT89C2051 是它的一种精简版本。AT89C 单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。89C51 仿真图三、总体方案:1. 单片机唱歌的基本原理:声音是空气的振荡,不同的振荡频率我们就可以听到不同声调的声音。音的频谱范围约在几十到几千赫兹。利用程序来控制单处机某个口线出一定频率的方波到蜂鸣器,蜂鸣器就可以发出一定音调的声音,若再利用不同的延时程序改变输出频率,就可以改变音调,进而就可让单片机发出“1” 、 “2”, “3”, “4”, “5”, “6”, “7”的音乐。 52. 软件设计:一、音调:输出不同频率的方波,以实现 1、2、3、4 等的不同音调;比如,
5、发出 200HZ 的音频,其周期为 1/200 秒,即 5ms。这样,当 P3.2的高电平或低电平的持续时间为 2.5ms 时,就能发出 200HZ 的音调。我们可以写一个延时子程序,用 R3 来提供参数,R3=1 时,延时为 20us,那么 R3取 2500/20=125(7DH)时,就可以发出 200Hz 的音调,提供不同的 R3 常数,可以得到不同的音调变化。附表给出了不同音阶对应的频率。类 型 1 2 3 4 5 6 7音符 C5 D5 E5 F5 G5 A5 B5频率/HZ 523 587 659 698 784 880 987二、节拍:控制一个音符输出的时间,比如 1 拍、1/4
6、拍。仅上所叙还不够,要准确奏出一首曲子,必须准确地控制乐曲节奏,即一音符的持续时间。例如,一首曲子的节奏为每分种 94 拍,那么一拍就为60/94=0.64 秒。音乐的节拍我们可用定时器来控制,简单的说,一个一拍的音符唱 0.64秒,我们就设置一个定时器定时 0.64 秒,时间一到就换下一个音符。但是,由于单片机的 T0,在 12MHz 晶振下最大定时时间只能为 65 毫秒,因此不可能直接用改变 T0 的时间初值来实现不同节拍。如何定时一个更大的时间,上节课我们已经讲了一个方法。我们可以用 T0 来产生 10 毫秒的时间基准,然后设置 一个中断计数器,通过判别中断计数器的值来控制节拍时间的长短
7、。表 2 中也给出了各种节拍所对应的时间常数。例如对 1/4 拍音符,定时时间为 0.16 秒,相应的时间常数(中段计数器)为 16(即 10H) ;对 3拍音符,定时时间为 1.92 秒,相应时间长数为 192(即 C0H) 。HI=(8192-count)/32LO=(8192-count)%326方波宽度:t=1/f*1000000(us)定时器计数值: count=t/2程序中的数组 HI_LIST 和 LO_LIST 所保存的就是为产生频率为523HZ.587HZ分别需要的定时器的高字节和低字节。三、说明:本例的代码核心在于 T0_INT 定时器中断函数,从代码中可以看到,TH0 与
8、TL0 是由音阶 i 决定的,需要播出不同频率的声音时,通过改变 i 值即可改变 TH0 与 TL0 的取值,这也同时影响了该函数的时间间隔,触发时间间隔越短,SPK=!SPK 输出的频率越高。主程序中的 for 循环控制了 14 个音符的播放,TR0 取 1 或 0 控制了声音的输出与暂停,delay(500)导致的主程序时延间,定时器会以一定的时间间隔持续触发,它使某个频率的音符输出能持续一定的时间,后一个 delay(50)在一个音符输出结束后,形成一个较短的暂定间隔。四、仿真实图:7等待时波形:播放时波形:五、源程序:/说明:本实验使用定时器演奏一段音阶,播放由 K1 控制。/#inc
9、lude#include#define uchar unsigned char#define uint unsigned int8uchar i=0;/i:音符索引sbit SPK=p34;sbit K1=p10;/14 个音符在方式 2 下的定时器值(TH0,YL0)uchar code HI_LIST=0,226,229,232,233,236,238,240,241,244,245,246,247,248;uchar code LO_LIST=0,4,13,10,20,3,8,6,2,23,5,26,1,4,3;/定时器 0 中断/viod T0_INT() interupt 1TL0=HI_LISTi;TH0=HI_LISTi;SPK=!SPK;/延时/void delay(uint ms)uchar t;while(me-) for(t=0;t120;t+);/主程序/void main()9IE=0x82;TMOD=0x00;while(1)while (k1=1);/未按键等待while(k1=0);/等待结束for(i=1;i15;i+);TR0=1;/播放一个音符delay(500);/播放时延TR0=0;/停止播放delay(50);/停止后的时延