0x61, 0x71, 0x82, 0x71, 0x62, 0xA3, 0x73, 0x62, 0x53, //你留下的轮廓 指引我
0x42, 0x63, 0x83, 0x83, 0x91, 0x91, //黑夜中不寂寞
0x61, 0x71, 0x82, 0x71, 0x62, 0x0A2, 0x71, 0x76, //穿越千年的哀愁
0x61, 0x71, 0x82, 0x71, 0x62, 0x52, 0x31, 0x36, //是你在尽头等我
0x61, 0x71, 0x82, 0x71, 0x62, 0xA3, 0x73, 0x62, 0x53, //最美丽的感动 会值得
0x42, 0x82, 0x88, 0x02, 0x74, 0x93, 0x89, 0xff//结束标志 //用一生守候 }
4.3 源程序代码
见附录1
5 仿真
5.1 硬件电路的仿真
在PROTUES检查各硬件管脚是否连接正确,线路逻辑是否正确,例如:晶振电路的连接,复位电路是否设计正确。 5.2 软件电路的仿真
1.根据系统的原理结构检查各流程图是否正确,再根据流程图来检查程序是否也正确。
2.将所有程序组织起来,在软件环境下运行,检查程序是否正确。通过对硬件和软件系统的认真检查,反复测试,如果没有出现问题即可把源程序编译成HEX文件装载到单片机中,对硬件进行仿真
第 19 页 共 32 页
5.3 联调
在keil中, 在Debug中的Use选择Proteus VSM Simulator, 即使用Proteus进行调试。
在proteus中, 双击单片机芯片, 在程序文件选择keil生成的HEX文件的路径, 即把HEX文件装入单片机中, 点击运行, 进行仿真, 就实现了联调。在联调时, 点击功能键, 看程序所涉及的功能是否都能实现, 不能实现的功能, 检查修改相应的程序, 重复上述动作, 直至完成所有设计的功能。 5.4 仿真结果
proteus仿真结果如图5.1所示:
图5.1 proteus仿真结果示意图
单片机仿真结果如图5.2所示
第 20 页 共 32 页
图5.2 单片机仿真结果示意图
6 课设心得
设计简单原理介绍:一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系设置正确即可。
在这个程序中,弹奏音乐的程序是用定时/计数器T0来完成的,播放音乐程序则也是是用定时/计数器T0来完成的。
在调试成功后,可任意弹奏自己想要的旋律。同时可以播放和切换4首歌曲,但是也有不足之处的,声音杂音时而有点大,不稳定。
经过本次课程设计,我们对于C语言多了一层了解,其次,对单片机的学习更加深入,并加强了自身的动手能力。当然在这次课程设计活动中,经验才是对于我们最大的收获,而且还增强了自身对未知问题以及对知识的深化认识的能力,受益匪浅。
7 参考文献
1 高锋.单片微型计算机原理与接口技术[M].北京:科学出版社,2003 2 吴金戌,沈庆阳,郭庭吉.8051单片机实践与应用[M].北京:清华大学出版
第 21 页 共 32 页
社,2002
3 余文俊.8051C语言学习[M].北京:中国水利水电出版社,2003 4 贾金玲 .单片机原理及应用[M].成都:电子科技大学出版社 ,2004 5 王东峰,王会良,董冠强.单片机C语言应用百例[M].北京:电子工业出版社,2009
6 周润景.基于Protues的电路及单片机系统设计与仿真[M].北京:北京航空航天大学出版社,2006
第 22 页 共 32 页
附录1:
源程序代码:
#include
#define uchar unsigned char #define uint unsigned int //sbit duan=P3^6;
sbit key1=P3^2;//按key1可暂停歌曲 sbit key2=P3^3;//按key2可切换歌曲 sbit fm=P3^6;//蜂鸣器连续的IO口 sbit KK=P2^0; //点亮一个数码管 uchar count2=0;//歌曲标志 uchar timeh,timel,i;
/***********************************************************/
uchar code DSY_table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80, //0~8 0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8f}; //9,A~F
uint code tone_delay_table[]={ 64021,64103,64260,64400,64524,64580,64684,
64777,64820,64898,64968,65030,65058,65110,65157,65178}; //个音符对应的延时
uchar keyno; //定义按键得到的初值 void delay_ms(uchar x) //延时子函数 { uchar i; while(x--)
for(i=0;i<120;i++); }
void keys_scan() //键盘扫描子函数 { uchar tmp,k;
P1=0x0f; //高四位置0 ,放入四行 delay_ms(2);
//按键后00001111将变成0000xxxx,x中1个为0,3个仍为1 //下面的异或操作会把3个1变成0,唯一的0变成1 tmp=P1^0x0f;
//判断按键发生于0~3列中的哪一列 switch(tmp)
{case 1:k=0; break; case 2:k=1; break;
case 4:k=2; break; case 8:k=3; break;
default:return;//无按键按下 }
P1=0xf0; //低四位置0,放入四列 delay_ms(2);
tmp=(P1>>4)^0x0f; //按键后11110000将变成xxxx0000,x中1个为0,3个仍为1,
第 23 页 共 32 页