单片机课程设计报告.docx
《单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告.docx(17页珍藏版)》请在冰豆网上搜索。
单片机课程设计报告
单片机课程设计
报告
课程名称:
单片机课程设计报告
课设题目:
基于单片机的音乐盒设计
专业班级:
电子科学与技术0902班
姓名:
徐万利学号:
090403038
课设时间:
2012年3月批阅时间:
指导教师:
朱建光成绩:
目录
摘要
时间安排
第一部分:
设计要求………………………………………3
第二部分:
方案设计………………………………………3
第三部分:
硬件介绍及原理图……………………………4
第四部分:
程序流程图……………………………………12
第五部分:
系统调试………………………………………12
第六部分:
总结……………………………………………13
参考文献……………………………………………………14
附录:
程序………………………………………………15
摘要
本设计是一个基于STC12C5410AD单片机的音乐盒,依据单片机技术原理,通过硬件电路制作以及软件编译,设计制作出一个多功能音乐盒。
该音乐盒主要由按键电路、复位电路、数码管显示电路以及蜂鸣器组成。
本设计利用KEIL编程软件对音乐盒源程序进行编程并调试。
时间安排:
第一周:
周一至周三确定设计方案
周四至周五画程序流程图
第二周:
周一至周二编写程序
周三下载仿真调试程序
周四撰写课程设计报告
周五答辩
一、课程设计要求
利用I/O口产生一定频率的方波,驱动蜂鸣器,根据按键发出不同的音调,并能播放一首歌。
二、设计方案
要想发出声音,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。
具体做法如下所示。
例如:
高音(DO)的音频=1109HZ,周期T=1/1109s=901μs
定时器/计数器0的定时时间为:
T/2=901/2μs=450μs定时器450μs的计数值=定时时间/机器周期=450μs/0.54μs=833(时钟频率=22.1184MHZ)装入计数器初值为65536-833=64703,将64703装入T寄存器中,启动定时/计数器工作后,每计数833次时将产生溢出中断,进入中断服务时,每次对P2.6引脚的输出值进行取反,就可得到高音DO(1109HZ)的音符音频。
不同的初值可以产生不同的频率。
把DOREMIFASOLASI分别编码为1—7,把计算出的对应音调初值储存在一个数据类型为unsignedint的数组中。
歌曲播放的设计。
先将歌曲的简谱进行编码,储存在一个数据类型为unsignedchar的数组中。
程序从数组中取出一个数,查找到对应的音调初值赋给定时器,使之定时操作蜂鸣器,得出相应的音调。
三、硬件介绍及原理图
硬件原理框图:
1、stc12c5410ad
其中,其工作电压为3.5V到5.5V。
RAM是512字节,PWM是4路,程序空间大小是10K字节,有A/D转换功能,工作频率可得35M赫兹,工作温度范围-40--85摄氏度。
其管脚说明如下所示:
2、CH451
CH451是一个整合了数码管显示驱动和键盘扫描控制以及μP监控的多功能外围芯片。
CH451内置RC振荡电路,可以动态驱动8位数码管或者64位LED,具有BCD译码、闪烁、移位等功能;同时还可以进行64键的键盘扫描;CH451通过可以级联的串行接口与单片机等交换数据;并且提供上电复位和看门狗等监控功能。
其管脚说明如下:
Ch451的操作命令均为12位,操作命令如下:
3、按键连接方式如下:
按键代码如下:
4、数码管显示电路连接如下:
5、内部晶振电路连接如下:
机器周期=12/22.1184μs
6、扬声器链接电路如下:
四、程序流程图
演奏歌曲
转向不同音调
五、程序调试
Keil软件。
我们写的汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编。
目前已极少使用手工汇编的方法了。
机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。
运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP等操作系统。
六、总结
将程序导入芯片,调试成功后,可任意弹奏自己想要的旋律。
本课题通过制作电子琴,将几个模块很好的融合起来,对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。
利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。
说明一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,于是我们可以利用单片机的定时/计数器来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可,然后我们利用功放电路来将音乐声音放大,同时通过显示模块来确知自己所弹的音符。
通过这次课程设计,我感觉收获了很多:
第一,通过实践,加深对单片机系列知识及其系统的认识。
这个设计题目并不是新的,但从中能体现到一个系统开发设计的过程,足于让我们受益。
第二,通过设计学习到了很多软件的使用。
本次设计,软件部分用到了protues进行硬件设计,用keil进行程系编译。
第三,提高了自己的动手能力。
动手在一定程度上反映了一个人的能力,作为当代大学生,社会要求的我们不是只能说而不能做的人才。
参考文献
[1]谭浩强著、C程序设计教程、北京:
清华大学出版社、2007.7
[2]李群芳,张士军,黄建编著、单片微型计算机、北京:
电子工业出版社、2008.5
附录:
程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitdout=P2^2;
sbitload=P2^3;
sbitdin=P3^3;
sbitdclk=P3^4;
unsignedcharcodetable[]={0xbe,0x24,0xea,0xe6,0x74,0xd6,0xde,0xa4,0xfe,0xf6};
unsignedintcodeMusic_FreQ[]=
{65536,64703,64749,64835,64874,64948,65011,65066};//DO,RE,MI,FA,SO,LA,SI高音,对应频率的定时器初值
/**********************乐谱******************************/
unsignedcharcodeTabMusic[]=
{1,1,5,5,6,6,5,4,4,3,3,2,2,1,5,5,4,4,3,3,2,5,5,4,4,3,3,2,4,4,3,3,2,2,1};//一闪一闪亮晶晶
sbitspeak=P2^6;//音频输出端口
unsignedcharm=0,tt=0,tl=0,m0;
ucharFlag=1;//电子琴与音乐盒切换标志位
/************************延时函数*****************************/
voiddelay(uinta)
{while(a--);
}
voidTimer0Init()
{TMOD=0x11;
TH1=Music_FreQ[TabMusic[tl]]/256;
TL1=Music_FreQ[TabMusic[tl]]%256;
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;
EA=1;ET0=1;TR0=0;ET1=1;TR1=0;
}
/**************************************************
函数名称:
外部中断0初始化说明:
下降沿触发
****************************************************/
unsignedcharch451_read()
{uchari,value=0;
uchartemp=0x07;
if(dout==0)
{load=0;
for(i=0;i<4;i++)
{din=temp&0x01;
dclk=0;
temp>>=1;
dclk=1;
}
load=1;
for(i=0;i<7;i++)
{if(dout)value|=0x01;
value<<=1;
dclk=0;
dclk=1;
}
switch(value>>1)
{case0x40:
return1;break;
case0x43:
return2;break;
case0x41:
return3;break;
case0x42:
return4;break;
case0x48:
return5;break;
case0x4b:
return6;break;
case0x49:
return7;break;
case0x4a:
return8;break;
}
}
return0;
}
voidch451_write(uintcommad)
{uchari;
load=0;
for(i=0;i<12;i++)
{din=commad&0x01;
dclk=0;
commad>>=1;
dclk=1;
}
load=1;
}
voidch451_set_mode()
{ch451_write(0x0201);//
ch451_write(0x0403);//0x0403,开显示,开键盘
ch451_write(0x0500);//
}
voiddisplay()
{ch451_write(0x0f00|table[m]);}
voiddelayms(uinta)
{while(a--);}
//主函数
voidmain()
{unsignedcharGetVal=0;
Timer0Init();
ch451_set_mode();
while
(1)
{GetVal=ch451_read();
if((GetVal!
=8)&&(GetVal!
=0))
{m=GetVal;
TR1=1;
delayms(50000);delayms(50000);delayms(50000);delayms(50000);
TR1=0;
speak=1;
}
if(GetVal==8)
{TR0=!
TR0;TR1=!
TR1;Flag=!
Flag;
}
display();
}
}
/******************************************************
函数名称:
定时器0服务函数
*******************************************************/
voidTimer0_ISR()interrupt1
{tt++;
if(tt==10)
{tt=0;tl++;tl%=28;TR1=0;
delay(5000);
TR1=1;
}
TL0=(65536-50000)%256;TH0=(65536-50000)/256;
}
/******************************************************
函数名称:
定时器1服务函数
*******************************************************/
voidTimer1_ISR()interrupt3
{speak=!
speak;
switch(Flag)
{case0:
TH1=Music_FreQ[TabMusic[tl]]/256;TL1=Music_FreQ[TabMusic[tl]]%256;break;
case1:
TH1=Music_FreQ[m]/256;TL1=Music_FreQ[m]%256;break;
}
}