4 系统软件设计
本设计需要用到的软件都是大众一般使用的软件,具有方便简易快捷的优点,程序用C语言编程,也是编程的主流语言,方便日后修改与调试。 4.1 软件介绍
本系统程序开发需要用到keil、STC-ISP V35 软件以及郭天祥51开发板。以下是关于keil和STC-ISP的简介。
现代电子系统的基本核心是嵌人式计算机系统,而单片机是最典型、最广泛、最普及的嵌入式系统。学好单片机,灵活应用Keil软件在电子、科技领域灵活应用单片机技术,将是带动国家科技发展、增强国家综合实力的必经之路。
Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP等操作系统。
掌握Keil软件的使用对于使用51系列单片机是十分必要的,即使不使用c语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令单片机开发事半功倍。[12]
STC-ISP 是单片机下载编程烧录软件,是针对STC系列单片机而设计的,可下载STC89系列、12C2052 系列和12C5410等系列的STC单片机,使用简便,现已被广泛使用。
程序控制流程图如图4.1所示。
16
准备 调用初始化程序 读P3口,判断有无按键调用延时子程序 读P3口,判断有无按键按下调用播放子程序 读P3口,判断有无按键按下调用延时子程序 调用播放子程序 读P3口,判断有无按键按下读P3口,判断有无按键按下调用延时子程序 调用播放子程序 图4.1 程序控制流程图
读P3口,判断有无按键按下
17
4.2 主程序设计
本系统首先建立音乐,把音乐的音符找出,建立各个音符的常数表,如下图4.2:
图4.2 音符常数表
编写程序时,我们把表建立在一个数组内,每个发音符使用一个字节,字节高四位(简谱码)代表音符的高低,低四位(节拍码)代表音符的节拍。如果一拍为0.4秒,1/4秒就是0.1秒,只要设定延时时间就可以求得节拍的时间。假设1/4拍为1 DELAY,则1拍应该为4 DELAY,以此类推。所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数。1/4拍的延时时间在此我们设为125毫秒。
主文件程序由主程序、延时程序以及歌曲程序组成。
主程序首先对所有端口进行初始化操作,接着进入不断循环部分,直到按键按下,进入防止抖动程序,如果不是抖动,则进入音乐播放程序,直到音乐播放完毕,再次进入等待按键按下部分,直到第二次按键按下,再次进入防止抖动程序,如果不是抖动,则再次进入音乐播放程序,直到音乐播放完毕,直到第三次按键按下,最后一次次进入防止抖动程序,如果不是抖动,则最后一次次进入音乐播放程序,直到音乐播放完毕,回到循环起点,等待第四次按键按下部分,如此类推。程序如下: main() {
InitialSound(); while(1){
if(key==0)
18
} } } }
{
Delay1ms(10); if(key==0)
Play(Music_Girl,0,3,360); do {
}while(key==1); if(key==0) {
Delay1ms(10); if(key==0)
Play(Music_Same,0,3,360); {
}while(key==1); if(key==0) {
Delay1ms(10); if(key==0)
do
Play(Music_Two,0,3,360);}
延时程序部分。为防止按键抖动,对门铃进行有效保护,设计了防止抖动延时程序,程序如下:
void Delay1ms(unsigned int count) {
19
}
unsigned int i,j; for(i=0;i 4.3 播放文件程序设计 播放文件程序由初始化程序函数,音符发生中断函数,播放函数组成。 初始化函数是对芯片端口进行初始化操作,以确定中断模式以及端口初始值,程序如下: void InitialSound(void) { BeepIO = 0; Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; (10ms的初装值) // 计算TL1应 装入的初值 Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%6; // 计算TH1应 装入的初值 } 音符发生中断函数用于接收到中断信号时,进行的声音播放操作,程序如下: void BeepTimer0(void) interrupt 1 //音符发生中断 { BeepIO = !BeepIO; 20 TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TMOD |= 0x11; ET0 = 1; ET1 = 0; TR0 = 0; TR1 = 0; EA = 1;