摘 要
本作品利用单片机的IO口对蜂鸣器输送不同频率的信号,让单片机发出不同音调的声音。以“新年好”曲调为基础以C51为语法编出51音乐盒的程序。根据电路图焊接了蜂鸣器模块与TX-1C51开发板用杜邦线进行连接。除了蜂鸣器外接模块外还使用了1602液晶显示模块作为外设连接。
本人对单片机演奏音乐比较有兴趣。在此,本人将就这方面的知识做一些简介,但愿能对单片机演奏音乐比较有兴趣而又不知其解的朋友能有所启迪。 一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能象电子琴那样能奏出多种音色的声音。因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和“节拍”。音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。
一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能象电子琴那样能奏出多种音色的声音。因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和“节拍”。音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。
关键词: 51单片机 音乐盒 液晶屏幕显示模块 蜂鸣器模
块 C51
目 录
1 设计任务目的与要求 .................................................................................................................................................. 1
1.1
1.2 任务设计目的 ................................................................................................................................................... 1 任务要求 ........................................................................................................................................................... 1
2 模块及其原理介绍 ...................................................................................................................................................... 2
2.1 蜂鸣器模块 ............................................................................................................................................................. 2
2.2 1602液晶显示模块 ................................................................................................................................................. 2
3 设计方案 ...................................................................................................................................................................... 3
3.1 软件设计 ................................................................................................................................................................. 3
3.2 硬件设计 ................................................................................................................................................................. 3
4 实验结果与数据分析 .................................................................................................................................................. 4
4.1 测试步骤 ................................................................................................................................................................. 4
4.2 实验现象 ................................................................................................................................................................. 4
5 结论与问题讨论 .......................................................................................................................................................... 4
5.1 完成设计的要求程度 ............................................................................................................................................. 4
5.2 遇到的问题以及解决办法 ..................................................................................................................................... 4
5.3 存在的不足及改进思路 ......................................................................................................................................... 4
参考文献 ............................................................................................................................................................................ 5
附录 .................................................................................................................................................................................... 5
附录一:C51程序 ........................................................................................................................................................ 5
- 2 -
1 设计任务目的与要求
1.1 任务设计目的
本人对单片机演奏音乐比较有兴趣,所以选择51音乐盒的题目。本设计通过两个模块的制作并与开发板一并使用。通过本次设计不止熟悉焊接和熟悉各个电子元器件,而且还提高了对外设模块使用单片机编程的技能。
1.2 任务要求
设计任务要求有两个:
要求一:制作的蜂鸣器能正常发声,失真率小于5%;
要求二:液晶模块正常显示个歌曲名称以及设计的有关内容; 要求三:使用C51编程让蜂鸣器唱出新年好的歌曲;
1
2 模块及其原理介绍
2.1 蜂鸣器模块
蜂鸣器模块电路图如图2.1所示,该模块三个接口分别为P3.7、VCC、GND。P3.7通过与单片机IO口连接来接收51单片机的信号;VCC与5V电压连接;GND接地。
图2.1
2.2 1602液晶显示模块
液晶显示模块电路图如图2.2所示
图2.2
2
3 设计方案
3.1 软件设计
软件设计狂徒如图3.1.1,设计包括init(void)main(void)display(uint)bee(void)等功能函数以及delay(uint)write_com(uchar) write_data(uchar) 等调用多个辅助函数,具体程序见附录一。
3.1.1
3.2 硬件设计
模块及其原理介绍已经对各个模块电路进行介绍,接下来再介绍一下使用的电子元器件:
有源蜂鸣器:蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。 ;蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示;
NPN三极管:NPN型三极管,由三块半导体构成,其中两块N型和一块P型半导体组成,P型半导体在中间,两块N型半导体在两侧。三极管是电子电路中最重要的器件,它最主要的功能是电流 放大和开关作用;
10k电阻;
杜邦线:杜邦线可用于实验板的引脚扩展,增加实验项目等。可以非常牢靠地和插针连接,无需焊接,可以快速进行电路试验。
3
4 实验结果与数据分析
4.1 测试步骤
使用电脑com4口通过USB线下载程序,然后打开电源对现象进行观察,再对程序进行修改然后下载程序观察如此重复,直到实验目的功能。
4.2 实验现象
1602液晶显示模块正确显示”HAPPY NEW YSAR!! Will~~ 2014.12.27:”;
蜂鸣器正常发声,响起新年好旋律并重复歌唱。
5 结论与问题讨论
5.1 完成设计的要求程度
经过测试、修改等步奏后,实现液晶的正常显示完全达到目标;蜂鸣器正常歌唱,不过在部分会出现少许失真,不过失真率保证在5%以内。
5.2 遇到的问题以及解决办法
问题:蜂鸣器失真严重; 解决:导线以及焊接口出现接触问题,所以进行修复;npn三极管不适用故更换三极管;
5.3 存在的不足及改进思路
这次设计当中也有不足之处;
(1) 焊接比较差;
(2) 杜邦线与排针型号不吻合,连接不稳定。
4
参考文献
[1] 雷伏容、张小林、催浩.《51单片机常用模块设计查询手册》.北京:清华
大学出版社,2010.01:2-823.
[2] 郭天祥.《新概念51单片机入门、提高、开发、拓展全攻略》.哈尔滨:哈
尔滨工业大学出版社
[2] “科学男孩.51单片机音乐盒[word]. .”
续
void write_com(uchar com)//命令书写函数 { rs=0; P0=com; delay_1(5); lcden=1; delay_1(5); lcden=0; }
void write_date(uchar num)//数据书写函数 { rs=1; P0=num; delay_1(5); lcden=1; delay_1(5); lcden=0; }
uchar code T[49][2]={{0,0},
{0xF8,0x8B},{0xF8,0xF2},{0xF9,0x5B},{0xF9,0xB7},{0xFA,0x14},{0xFA,0x66},{0xFA,0xB9},{0xFB,0x03},{0xFB,0x4A},{0xFB,0x8F},{0xFB,0xCF},{0xFC,0x0B},
{0xFC,0x43},{0xFC,0x78},{0xFC,0xAB},{0xFC,0xDB},{0xFD,0x08},{0xFD,0x33},{0xFD,0x5B},{0xFD,0x81},{0xFD,0xA5},{0xFD,0xC7},{0xFD,0xE7},{0xFE,0x05},
{0xFE,0x21},{0xFE,0x3C},{0xFE,0x55},{0xFE,0x6D},{0xFE,0x84},{0xFE,0x99},{0xFE,0xAD},{0xFE,0xC0},{0xFE,0x02},{0xFE,0xE3},{0xFE,0xF3},{0xFF,0x02},
{0xFF,0x10},{0xFF,0x1D},{0xFF,0x2A},{0xFF,0x
5
附录
附录一:C51程序
/*******************************************/
/* 音乐:新年好 */ /* 日期:2014.12.27 */ /*******************************************/
#include<reg52.h> #include<intrins.h>
#define uint unsigned int #define uchar unsigned char uint count,bai,shi,ge,num_1; char num,distance; sbit Trig=P2^0; sbit Echo=P2^1; sbit dula=P2^6; sbit wela=P2^7; sbit rs=P3^5; sbit lcden=P3^4; sbit beepIO=P3^7; uchar m,n;
uchar code table_distance[]="Distance: cm"; uchar code table[]="HAPPY NEW YEAR!!"; uchar code table_num[]="0123456789";
void delay_1(uint ms)//液晶显示延时函数 { uint x,y; for(x=ms;x>0;x--) for(y=110;y>0;y--); }
36},{0xFF,0x42},{0xFF,0x4C},{0xFF,0x56},{0xFF,0x60},{0xFF,0x69},{0xFF,0x71},{0xFF,0x79},{0xFF,0x81} }; uchar code music[][2]={{0,4}, {19,4},{19,4},{19,8},{14,8},{23,4},{23,4},{23,8},{19,8}, {19,4},{23,4},{26,8},{26,8},{24,4},{23,4},{21,16},{21,4},{23,4},{24,8},{24,8}, {23,4},{21,4},{23,8},{19,8},{19,4},{23,4},{21,8},{14,8},{18,4},{21,4},{19,16}, {0xFF,0xFF}}; /*******************************************/ /* 音乐延时函数 */ /*******************************************/ void delay(uchar p)//音乐延时函数
{ uchar i,j; for(;p>0;p--) for(i=181;i>0;i--) for(j=181;j>0;j--); } void pause() { uchar i,j; for(i=150;i>0;i--) for(j=150;j>0;j--); } void T0_int() interrupt 1 { beepIO=!beepIO; TH0=T[m][0]; TL0=T[m][1]; } void main() { uchar i=0; TMOD=0x01; EA=1; ET0=1; wela=0;//嵌入液晶显示
dula=0; lcden=0;
write_com(0x38); write_com(0xf); write_com(0x6); write_com(0x80); for(num_1=0;num_1<16;num_1++) { write_date(table_distance[num_1]); delay_1(5); } write_com(0x80+0x40); for(num_1=0;num_1<16;num_1++) { write_date(table[num_1]); delay_1(5); }//液晶初始显示结束 while(1) //音乐播放 { m=music[i][0];n=music[i][1];
if(m==0x00) { TR0=0; delay(n); i++; } else if(m==0xFF) { TR0=0; delay(30); i=0; } else if(m==music[i+1][0]) { TR0=1; delay(n); TR0=0; pause(); i++; } else { TR0=1; delay(n); i++; } } }
2