单片机电子琴设计报告
- 格式:doc
- 大小:276.50 KB
- 文档页数:44
河南理工大学《单片机应用与仿真训练》设计报告题目: 模拟电子琴发声控制系统姓名学号:专业班级:指导老师:所在学院:摘要本设计是用 AT89S52 单片机为核心控制元件,设计一个模拟电子琴发声控制系统。
以单片机作为主控核心,与键盘、扬声器、LED 显示器等模块组成核心主控制模块。
在主控模块上设有11个按键,其中7个按键控制7个音符,1个作为功能转换键使用,具有手动随意弹奏和自动播放乐曲的功能,另外3个按键用来实现高、中、低音的音符发音。
下面具体介绍一下单片机各端口的分配功能:单片机的 P2.0-P2.6 为输入端口,用来控制 7个音符的选择弹奏;P2.7 为功能转换键,它能切换手动随意弹奏和自动播放乐曲的功能;P3.0-P3.2 为单片机控制电子琴实现弹奏高、中、低的功能切换键;P0 端口通过上拉电阻接到+5V 上,然后接LED共阴数码管;P1.0 为单片机的输出端口,它通过限流电阻 R 与三极管级基极相接,三极管的发射极又接蜂鸣器。
本设计通过控制单片机定时器的定时时间产生不同频率的音频脉冲,经三极管放大信号后驱动蜂鸣器发出不同音节的声音。
要实现7个音符的各自的高、中、低音,需要建立三个表,分别存储高音、中音和低音的频率值;当三个拨码开关中某一个按下,通过软件选择相应的音频。
按下弹奏键就可弹奏出不同的声音。
另外用软件延时来控制发音时间的长短来控制节拍。
通过把乐谱中的音符和相应的节拍变换为定时常数和延时常数,作为数据表格存放在存储器中。
由程序查表得到定时常数和延时常数,分别用来控制定时器产生的脉冲频率和发出该音频脉冲的持续时间,这样就可以实现乐曲的演奏。
为了实现按键的准确判断和完善电子琴发声的效果,本设计采用了软件防抖的方法,有效的解决了按键抖动的问题。
另外当按下功能切换键,切换至音乐自动播放功能时,本系统能实现四首歌曲的有选择播放,另附带数码管显示提醒。
这样使得电子琴的功能变的更加强大。
本设计为实物电路板设计开发,报告中详细的阐述了电子琴设计的方法和过程。
电子琴设计报告一、实验目的1.更深刻的了解、学习8051单片机的发声原理,利用定时器可以发出不同频率的脉冲,不同频率的脉冲经喇叭驱动电路放大滤波后,就会发出不同的音调。
2.其次,定时器按设置的定时参数产生中断,这一次中断发出脉冲低电平,下一次反转发出脉冲高电平,由于定时参数不同,所以发出不同频率的脉冲。
3.进一步熟悉定时器的编程方法和定时初值的计算,进一步熟悉键盘扫描电路的工作原理和编程方法,了解单片机芯片的接口技术。
二、实验要求1.能够通过键盘演奏音符。
2.能够保存演奏的音乐,并实现回放。
3.有音调调整功能(如:C调,G调)。
4.自由发挥其他功能。
5.要求有单片机硬件系统框图,电路原理图,软件流程图。
三、实验基本原理简易电子琴有主控、蜂鸣器、键盘输入、电源四部分组成。
主控部分以AT89S52 为核心,用C 语言编程,充分运用AT89S52 的8k字节闪烁可编程可擦除只读存储器及其丰富的I/O 口,实现了对键盘数据的采集,和对蜂鸣器声音的控制;键盘输入部分采用4×4的键盘键盘输入,可以实现多个音调;供电部分可对整个电路进行供电。
经测试,整机基本实现预计功能,可以实现键盘演奏音符、调整音调、保存并回放的功能。
四、实验设计分析根据实验所要求实现的功能设计实现该项实验设计的软件电路及硬件电路。
五、实验要求实现A.电路设计1. 整体设计计划利用AT89S52 单片机的功能结合C 语言编程,实现电子琴播放音符等的简单功能,然后结合AT89S52 单片机的控制功能,利用蜂鸣器将输入表达出来,结合程序编制过程中,对各个I/O 的利用设置了键盘的扫描读入,结合电子琴需要多键位的现实,加入了4×4 键盘输入,达到了预期的效果。
2.分块设计1.控制模块AT89S52单片机是美国ATMEL公司生产的低功耗,高性能CMOS 8位单片机,片内含有8kb的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。
一、实训目的1. 熟悉单片机的基本原理和编程方法。
2. 学习电子琴的原理和结构。
3. 掌握基于单片机的电子琴设计方法。
4. 培养动手实践能力和创新意识。
二、实训内容1. 单片机原理与编程2. 电子琴原理与结构3. 单片机电子琴设计4. 单片机电子琴制作与调试三、实训过程1. 单片机原理与编程在实训初期,我们学习了单片机的基本原理和编程方法。
单片机是一种集成了CPU、存储器、输入/输出接口等功能的微型计算机,具有体积小、功耗低、成本低等特点。
我们学习了51系列单片机的结构、指令系统、程序设计方法等。
2. 电子琴原理与结构电子琴是一种通过电子电路发出不同音阶声音的乐器。
我们学习了电子琴的原理和结构,包括音源模块、键盘模块、音量控制模块等。
3. 单片机电子琴设计在设计阶段,我们根据所学知识,设计了基于单片机的电子琴。
具体如下:(1)硬件设计电子琴的硬件主要由单片机、键盘、蜂鸣器、音量控制模块等组成。
我们选择了STC89C51单片机作为核心控制单元,键盘采用矩阵键盘,蜂鸣器用于发出声音,音量控制模块用于调节音量。
(2)软件设计软件设计主要包括以下几个部分:1)初始化:设置单片机的工作模式、初始化定时器、初始化键盘扫描等。
2)键盘扫描:检测键盘是否被按下,并读取按键值。
3)音阶生成:根据按键值计算对应的频率,通过定时器产生PWM信号,驱动蜂鸣器发出声音。
4)音量控制:根据音量控制模块的输入,调节PWM信号的占空比,实现音量控制。
5)音乐播放:存储一首或多首歌曲,通过键盘控制播放、暂停、停止等操作。
4. 单片机电子琴制作与调试在制作阶段,我们根据设计方案,搭建了电子琴的硬件电路,并编写了相应的程序。
在调试过程中,我们遇到了以下问题:(1)键盘扫描不稳定:经过分析,发现是由于按键抖动引起的。
我们通过软件去抖动的方法解决了这个问题。
(2)音阶不准确:经过分析,发现是由于定时器设置不当引起的。
我们调整了定时器的计数值,使音阶更加准确。
随着科技的飞速发展,单片机技术已成为现代电子技术的重要分支。
为了更好地学习和掌握单片机编程及应用,我们设计并实现了一款基于单片机的简易电子琴。
本实验旨在通过设计一个简易电子琴,让学生深入了解单片机的原理和应用,提高动手实践能力。
二、实验目的1. 掌握单片机的基本原理和编程方法。
2. 学会使用定时器、中断、键盘扫描等技术。
3. 了解电子琴的工作原理和制作方法。
4. 培养学生的创新意识和团队协作能力。
三、实验原理本实验采用STC12C5A32S2单片机作为核心控制单元,通过定时器产生方波信号,驱动蜂鸣器发出不同频率的声音,实现电子琴的演奏功能。
具体原理如下:1. 单片机原理:STC12C5A32S2单片机是一款高性能、低功耗的单片机,具有丰富的片上资源,如定时器、中断、串口等。
2. 定时器:定时器用于产生固定频率的方波信号,驱动蜂鸣器发出不同频率的声音。
通过调整定时器的计数值,可以改变方波信号的频率,从而改变音调。
3. 中断:中断技术用于实现按键扫描功能。
当按键被按下时,单片机响应中断,读取按键状态,并产生相应的音调。
4. 键盘扫描:键盘扫描技术用于检测按键状态。
通过扫描键盘矩阵,可以判断哪个按键被按下,并产生相应的音调。
四、实验内容1. 硬件设计:主要包括单片机、蜂鸣器、键盘、电阻、电容等元器件。
将元器件按照电路图连接,形成电子琴的硬件电路。
2. 软件设计:主要包括主程序、定时器中断服务程序、按键扫描程序等。
通过Keil C编程,实现电子琴的演奏功能。
3. 调试与测试:对电子琴进行调试和测试,确保其能够正常工作。
1. 搭建电路:按照电路图连接元器件,形成电子琴的硬件电路。
2. 编写程序:使用Keil C编写主程序、定时器中断服务程序、按键扫描程序等。
3. 编译程序:将编写好的程序编译成HEX文件。
4. 烧录程序:将编译好的HEX文件烧录到单片机中。
5. 调试与测试:使用万用表测试电路是否正常工作,并对程序进行调试,确保电子琴能够正常演奏。
51单片机简易电子琴设计(总19页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--毕业设计(论文)课题名称:指导教师:系别:专业:班级:姓名:摘要音乐一直都是人类情感表达的一个重要媒介,随着社会的进步与发展,音乐在人类的生活与学习中的作用越发不可忽视。
电子琴也是实现播放音乐的一个途径。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器,它在音乐演奏中已成为不可缺少的一部分。
单片机是一个具有功能强大和编程灵活性的控制器,它已广泛应用于现代人们的生活中,扮演着重要的角色。
本设计主要是使用AT89C51单片机及单片机C语言,用AT89S51单片机为核心控制元件,设计一个电子琴。
以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。
在PROTEUS仿真平台上实现功能仿真,同时还增加了音乐播放功能。
本文中给出了该系统设计的硬件电路,软件设计等。
其次,详细阐述了程序的各个模块和实现过程。
本设计具有硬件电路简单、功能完善、控制可靠、运行稳定等特点,具有一定的实用性。
关键词: 单片机;电子琴;PROTEUS;KEIL;C语言1.引言单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。
它的应用必定导致传统的控制技术从根本上发生变革。
因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演着重要的角色。
简易电子琴是电声乐队的中坚力量,常用于独奏主旋律并伴以丰富的和声。
还常作为独奏乐器出现,具有鲜明时代特色。
但电子琴的局限性也是十分明显:旋律与和声缺乏音量变化,过于协和、单一;在模仿各类馆、弦乐器时,音色还不够逼真,模仿提琴类乐器的音色时,失真度更大,还需要不断改进。
基于单片机的电子琴设计一、引言二、总体设计方案(一)设计目标设计一款基于单片机的电子琴,能够实现基本的音符演奏、音色切换、节奏控制等功能,并且具有良好的音质和稳定性。
(二)系统组成本电子琴系统主要由单片机控制模块、键盘输入模块、音频输出模块、显示模块和电源模块等部分组成。
1、单片机控制模块选用 STM32 系列单片机作为控制核心,负责处理键盘输入信号、生成音频信号、控制显示等功能。
2、键盘输入模块采用矩阵键盘,通过扫描键盘获取用户的按键操作,将其转换为对应的音符编码发送给单片机。
3、音频输出模块使用DAC 芯片将单片机生成的数字音频信号转换为模拟音频信号,再通过放大器和扬声器输出声音。
4、显示模块采用液晶显示屏,用于显示当前的演奏状态、音色选择、节奏模式等信息。
5、电源模块为整个系统提供稳定的电源供应,可采用电池供电或外接电源适配器。
三、硬件设计(一)单片机最小系统STM32 单片机的最小系统包括时钟电路、复位电路和电源电路。
时钟电路为单片机提供工作时钟,复位电路用于系统初始化,电源电路为单片机提供稳定的电源。
(二)键盘电路矩阵键盘由行线和列线组成,通过逐行扫描的方式检测按键状态。
将键盘的行线和列线分别连接到单片机的 GPIO 引脚,通过编程实现键盘扫描和按键识别。
(三)音频输出电路选用高性能的 DAC 芯片,如 PCM1794,将单片机输出的数字音频信号转换为模拟音频信号。
为了提高音频输出的质量,还需要添加放大器和滤波电路,以增强信号的功率和去除噪声。
(四)显示电路液晶显示屏通过 SPI 接口或 I2C 接口与单片机连接,单片机通过发送指令和数据来控制显示屏的显示内容。
(五)电源电路根据系统的工作电压和电流需求,选择合适的电源芯片,如LM7805 等,将输入电源转换为所需的电压,并通过滤波电容等元件提高电源的稳定性。
四、软件设计(一)主程序流程主程序首先进行系统初始化,包括单片机初始化、键盘初始化、音频输出初始化、显示初始化等。
单片机课程设计报告电子琴一、选题背景随着数字技术的飞速发展和信息科学的快速推进,单片机作为信息处理的核心器件,正在得到越来越广泛的应用。
随着芯片技术的不断更新和改进,单片机应用领域的拓宽和深化,各行各业对单片机专业人才的需求也愈发迫切。
因此,在单片机课程的教学中,设计一些实用的小项目、小应用,既能提高学生的实践操作能力,又能激发其学习兴趣和学科热情,是非常有必要的。
二、课程目标通过设计电子琴这一实用项目,达到以下三个目标:(1)掌握单片机的基本知识和操作技巧。
在设计项目中,需要使用到很多单片机相关的知识和技术,如单片机的编程语言、端口连接、程序设计、调试样板、原理图设计等。
通过这些操作,学生可以对单片机的工作原理和编程方法有一个更加深入的理解。
(2)培养学生应用知识的能力。
设计电子琴,需要使用到单片机的定时器、PWM输出、按键检测、LED灯控制等相关知识。
学生需要将这些知识应用到实际操作中,才能真正掌握这些知识点,更好地了解单片机的工作原理和性能特点。
(3)激发学生的创造性思维和创新意识。
在设计电子琴的过程中,学生需要从众多课程内容和技能中选择并运用所学知识,遇到问题时需要有创造性解决的思维和意识。
此过程能够帮助学生提高独立思考和创新能力,将所学知识真正运用到实践中。
三、教学方法针对单片机课程设计中的三个目标,教学方法如下:1. 理论和实践相结合学生需要了解单片机的基本知识和操作技巧,包括单片机的性能特点、端口连接、程序设计、原理图设计等。
同时,为了更好地掌握实际操作,需要将理论知识与实践操作相结合,在课程中给予足够的操作机会和实践练习,让学生深刻感受到不同参数的变化对最终设备造成的影响。
2. 开放性思考学习单片机课程时,教师需要引导学生进行开放性思考。
鼓励学生发现问题、提出问题、寻找问题的解决方案,从而提高学生的创造性思维和创新意识。
3. 相互合作学习在课程设计中,可以采用分组方式,让学生互相合作、共同学习、共同探讨解决问题的方法和途径。
单片机电子琴的设计首先是硬件设计部分。
单片机电子琴所需的硬件主要包括按键、音频输出、显示器和电源等模块。
按键模块需要设计合适数量的按键,并使用矩阵键盘的方式将按键连接到单片机的IO口上,以实现按键的检测和输入。
音频输出模块通常采用DAC芯片来实现数字音频信号转换为模拟音频信号的功能,然后经过功放放大后输出到扬声器上。
显示器模块可以选择使用LCD液晶屏或LED数码管来显示琴键、音高等信息。
电源模块需要提供稳定的电源电压和电流,以供单片机和外围电路正常工作。
接下来是软件实现部分。
软件设计主要包括音符识别、声音发生和音效处理三个方面。
音符识别指的是按键被按下时,通过单片机程序判断出对应的音符,并通过输出特定的数字信号给DAC芯片生成对应的模拟音频信号。
声音发生部分需要设计合适的音色合成算法,将数字信号转化为合成的音乐音频信号,并通过DAC芯片输出到扬声器上。
音效处理部分可以实现对音频信号的各种音效处理,如混响、合唱、合成等效果,增强音乐的表现力。
在功能拓展方面,可以考虑添加MIDI接口,实现电子琴与其他音乐器材的连接和交互。
可以使用光敏电阻和温湿度传感器来实现环境音效的调整。
还可以设计一个简单的录音和播放功能,实现对演奏的录音和回放。
另外,还可以通过添加存储器模块,实现曲目的存储和选择功能。
总结起来,单片机电子琴的设计涉及到硬件设计、软件实现以及功能拓展等方面。
通过合理地设计硬件电路,采用适当的音符识别算法和声音合成算法,还可以扩展丰富的音效和功能,实现一个高性能的单片机电子琴。
单片机实验报告电子琴单片机实验报告电子琴引言:电子琴是一种流行的乐器,它通过电子元件产生声音,具有丰富的音色和音效。
在本次实验中,我们使用单片机来设计和制作一个简单的电子琴,通过按键触发不同的音调,实现基本的音乐演奏功能。
本文将介绍电子琴的原理、设计过程和实验结果。
一、原理电子琴的原理是基于音频合成技术,通过控制不同频率的声音波形来产生不同的音调。
而单片机作为电子琴的控制核心,负责接收按键信号,并通过输出引脚控制声音的发声。
具体来说,单片机通过读取按键的状态,判断按键是否按下,并根据按键的不同触发相应的音调发声。
二、设计过程1. 硬件设计在硬件设计方面,我们需要准备以下元件:单片机、按键、蜂鸣器、电阻、电容等。
首先,将按键连接到单片机的输入引脚上,以便检测按键的状态。
然后,将蜂鸣器连接到单片机的输出引脚上,以便通过控制引脚输出高低电平来实现声音的发声。
最后,根据需要添加电阻和电容等元件,以保证电路的稳定性和正确性。
2. 软件设计在软件设计方面,我们需要使用单片机的编程语言来实现电子琴的功能。
首先,我们需要设置单片机的输入引脚和输出引脚,并定义按键的状态和蜂鸣器的控制信号。
然后,我们需要编写程序来实现按键的检测和音调的控制。
具体来说,当按键按下时,单片机会读取按键的状态,并根据不同的按键触发不同的音调,同时控制蜂鸣器的输出信号,以实现声音的发声。
三、实验结果在实验过程中,我们成功地设计和制作了一个简单的电子琴。
通过按下不同的按键,我们可以听到不同的音调发声,从而演奏出简单的音乐。
实验结果表明,我们设计的电子琴具有良好的音效和音色,能够满足基本的音乐演奏需求。
结论:通过本次实验,我们深入了解了电子琴的原理和设计过程,并成功地制作了一个简单的电子琴。
通过单片机的控制,我们可以实现按键触发不同音调的发声,从而演奏出简单的音乐。
电子琴作为一种流行的乐器,具有广泛的应用和发展前景。
通过不断的学习和实践,我们相信可以设计出更加复杂和高级的电子琴,为音乐爱好者提供更多的乐器选择和音乐表达方式。
设计题目单片机电子琴摘要随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,有人曾说喜欢音乐的人不会向恶。
我们都会抽空欣赏世界名曲,作为对精神的洗礼。
本论文设计一个基于单片机的简易电子琴。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本系统是以51系列单片机AT89C51为主控制器,附有矩阵键盘、LED显示管、扬声器组成。
系统完成显示输入信息、播放相应音符等基本功能。
本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
关键词:AT89C51,矩阵键盘,LED显示管,蜂鸣器,1602液晶显示,1307时钟芯片。
目录第1章概述----------------------------------------------------------------------------------4第2章课程设计任务及要求-----------------------------------------------------------42.1 设计任务-------------------------------------------------------------------------------42.2 设计要求-------------------------------------------------------------------------------4第3章系统设计-----------------------------------------------------------------------------53.1设计方案-------------------------------------------------------------------------------53.2 系统设计--------------------------------------------------------------------------------53.2.2系统流程图-----------------------------------------------------------------------53.2.2 系统原理图 ------------------------------------------------------------------------73.3 文件程序代码---------------------------------------------------------------------------7第4章心得体会-----------------------------------------------------------------------------42第1章概述单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。
它的应用必定导致传统的控制技术从根本上发生变革。
因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本文的主要容是用单片机为核心控制元件,设计一个电子琴。
以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。
本文主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。
利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。
并且本文分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。
本系统是简易电子琴的设计,按下键盘矩阵中的按键会使数码管显示当前按键,扬声器播放器对应的音符。
通过设计本系统可了解单片机的基本功能。
对单片机的了解有一个小的飞跃。
第2章课程设计任务及要求2.1 设计任务1、任务设计一简易电子琴,要求能够发出1,2,3,4,5,6,7等7个音符,具有一般演奏功能。
2.2 设计要求1)具有一般演奏功能,利用所给键盘的1,2,3,4,5,6,7,8八个键,能够发出8个不同的音调,并且要求按下按键发声,松开延时一段时间停止,中间再按别的键则发另一个音调的声音2)具有自动播放已存曲目功能3)显示当前正在播放的歌曲的名称和歌词4)显示时间第3章系统设计3.1设计方案该电路由时钟模块,液晶模块,键盘扫描模块组成。
时钟模块:由时钟模块1307实现,能够正确显示时间,以及扩展显示星期等等。
液晶模块:将时钟模块的信息正确的显示到液晶显示屏上,使用1602的液晶。
键盘扫描模块:对十六个按键进行逐次扫描,扫描到前八个按键时,蜂鸣器依次发出1,2,3,4,5,6,7,8的音调声,岸其余按键时,可以跳转到不同的曲目以及液晶模块显示,保留几个按键做以后的扩展用。
3.2 系统设计3.2.1 系统流程图分析各项设计要求后,可绘制如下程序流程图3.2.2 系统原理图3.3文件程序代码(1).液晶模块头文件sbit LCD_RS = P3^6; sbit LCD_RW = P3^5; sbit LCD_EN = P3^3; sfr LCDData=0x80;void LCDWrite(bit cd,unsigned char input);void LCDWait(unsigned char CiShu);void LCDDelay();void LCDInitialize();void LCDPrintString(unsigned char x,unsigned char y,unsigned char *st ring);void LCDPrintNumber(unsigned char x,unsigned char y,unsigned char bit s,unsigned int number);unsigned char ReadState();void LCDInitialize(){LCDDelay();LCDWrite(0,0x38);LCDDelay();LCDWrite(0,0x38);LCDDelay();LCDWrite(0,0x38);LCDDelay();LCDWrite(0,0x38);LCDDelay();LCDWrite(0,0x08);LCDDelay();LCDWrite(0,0x01);LCDDelay();LCDWrite(0,0x06);LCDDelay();LCDWrite(0,0x0c);}void LCDWrite(bit cd,unsigned char DATA){LCDWait(20);LCD_RS=cd;LCD_RW=0;LCD_EN=0;LCDData=DATA;LCD_EN=1;LCD_EN=0;}void LCDPrintString(unsigned char x,unsigned char y,unsigned char *st ring){unsigned char address;address=x+(1-y)*0x40+0x80;LCDWrite(0,address);while(*string!='\0')LCDWrite(1,*string);string++;}}void LCDPrintNumber(unsigned char x,unsigned char y,unsigned char Wei Shu,unsigned int number){unsigned char address;unsigned char j,temp[5];address=x+(1-y)*0x40+0x80;LCDWrite(0,address);//if(number>0){temp[0]=(number%100000)/10000+48;temp[1]=(number%10000)/1000+48;temp[2]=(number%1000)/100+48;temp[3]=(number%100)/10+48;temp[4]=number%10+48;for(j=5-WeiShu;j<5;j++){LCDWrite(1,temp[j]);}}void LCDWait(unsigned char CiShu) {unsigned char i;for(i=0;i<CiShu;i++){if(ReadState()&0x80)continue; else break;}}unsigned char ReadState(){unsigned char temp;P0=0xff;LCD_EN=0;LCD_RS=0;LCD_RW=1;LCD_EN=1;temp=LCDData;LCD_EN=0;return temp;}void LCDDelay(){unsigned int a;for(a=0;a<1000;a++);}(2).时钟芯片模块头文件void iicdelay(unsigned int times); void iicstart(){MDE=1;MDO=1;iicdelay(2);MCO=1;iicdelay(2);MDO=0;iicdelay(2);}void iicstop(){MDE=1;MDO=0;iicdelay(2);iicdelay(2); MDO=1;}void iicack() {MDE=1;MCO=0;MDO=0;iicdelay(2); MCO=1;iicdelay(2); MCO=0;iicdelay(1); MDO=1;}void iicnack() {MDE=1;//MCO=0;MDO=1;iicdelay(2); MCO=1;iicdelay(2);}bit iicreadack(){bit ack;MCO = 0;iicdelay(2);MDE=1;MDO=1;MCO=1;iicdelay(2);MDE=0;ack=MDI;MCO=0;return ack;}void iicwriteda(unsigned char da) {unsigned char i;MDE=1;for(i=0;i<8;i++){MCO=0;iicdelay(0);if((da<<i)&0x80)MDO=1;elseMDO=0;iicdelay(2);MCO=1;iicdelay(3);}MCO=0;}unsigned char iicreadda() {unsigned char da;int i;da=0;MDE=1;MDO=1;MDE=0;for(i=0;i<8;i++){MCO=0;iicdelay(3);MCO=1;iicdelay(1);if(MDI==1){da=da<<1;da++;}elseda=da<<1;}MCO=0;return da;}void iicdelay(unsigned int t){unsigned int i,j;for(i=0;i<t;i++)for(j=5;j>0;j--);}void ReadTime(unsigned char TIME[7]) {bit EATemp;unsigned char temp;EATemp=EA;iicstart();iicwriteda(0xd0);iicreadack();iicwriteda(0x00);iicreadack();iicstop();iicdelay(1);iicstart();iicwriteda(0xd1);iicreadack();TIME[0]=iicreadda(); iicack();TIME[1]=iicreadda(); iicack();TIME[2]=iicreadda(); iicack();TIME[3]=iicreadda(); iicack();TIME[4]=iicreadda(); iicack();TIME[5]=iicreadda();iicack();TIME[6]=iicreadda();iicnack();iicstop();iicdelay(1);TIME[0]=((TIME[0]&0x7f)>>4)*10+(TIME[0]&0x0f); //secondTIME[1]=((TIME[1]&0x7f)>>4)*10+(TIME[1]&0x0f); //minuteif(TIME[2]&0x40){if(TIME[2]&0x20)temp=0x80;else temp=0x40;TIME[2]=((TIME[2]&0x1f)>>4)*10+(TIME[2]&0x0f); //hour TIME[2]|=temp;}else{TIME[2]=((TIME[2]&0x3f)>>4)*10+(TIME[2]&0x0f);}TIME[3]=TIME[3]&0x07; //weekTIME[4]=((TIME[4]&0x3f)>>4)*10+(TIME[4]&0x0f); //dateTIME[5]=((TIME[5]&0x1f)>>4)*10+(TIME[5]&0x0f); //monthTIME[6]=(TIME[6]>>4)*10+(TIME[6]&0x0f); //yearEA=EATemp;}void SetTime(unsigned char TIME[7]){bit EATemp;unsigned char temp=0;unsigned char TimeTemp[7];EATemp=EA;for(temp=0;temp<7;temp++)TimeTemp[temp]=TIME[temp];temp=0;TimeTemp[6]=((TimeTemp[6]/10)<<4)+(TimeTemp[6]%10);TimeTemp[5]=((TimeTemp[5]/10)<<4)+(TimeTemp[5]%10);TimeTemp[4]=((TimeTemp[4]/10)<<4)+(TimeTemp[4]%10);TimeTemp[3]=((TimeTemp[3]/10)<<4)+(TimeTemp[3]%10);if((TimeTemp[2]&0xc0)==0x00){TimeTemp[2]=((TimeTemp[2]/10)<<4)+(TimeTemp[2]%10); }else{if((TimeTemp[2]&0xc0)==0x01)temp=0x40;else temp=0x60; TimeTemp[2]&=0x3f;TimeTemp[2]=((TimeTemp[2]/10)<<4)+(TimeTemp[2]%10); TimeTemp[2]|=temp;}TimeTemp[1]=((TimeTemp[1]/10)<<4)+(TimeTemp[1]%10); TimeTemp[0]=((TimeTemp[0]/10)<<4)+(TimeTemp[0]%10);TimeTemp[0]&=0x7f;iicstart();iicwriteda(0xd0);iicreadack();iicwriteda(0x00);iicreadack();iicwriteda(TimeTemp[0]);iicreadack();iicwriteda(TimeTemp[1]);iicreadack();iicwriteda(TimeTemp[2]);iicreadack();iicwriteda(TimeTemp[3]);iicreadack();iicwriteda(TimeTemp[4]);iicwriteda(TimeTemp[5]);iicreadack();iicwriteda(TimeTemp[6]);iicreadack();iicstop();iicdelay(1);EA=EATemp;}void SwitchRTC(unsigned char SWITCH) {unsigned char temp;bit EATemp;EATemp=EA;iicstart();iicwriteda(0xd0);iicreadack();iicwriteda(0x00);iicreadack();iicstop();iicstart();iicwriteda(0xd1);iicreadack();temp=iicreadda();iicnack();iicstop();//iicdelay(1);if(SWITCH)temp&=0x7f; else temp|=0x80;iicstart();iicwriteda(0xd0);iicreadack();iicwriteda(0x00);iicreadack();iicwriteda(temp);iicreadack();iicstop();//iicdelay(1);EA=EATemp;(3)主体程序#include<aduc848.h>#include <INTRINS.H>#include<LCD1602.h>#include<rtc.h>sbit lie0=P2^3;sbit lie1=P2^2;sbit lie2=P2^1;sbit lie3=P2^0;sbit PWM1=P2^6;unsigned char temp;unsigned char key;unsigned char STH0,STL0;unsigned char jishi=0;unsigned char n=0; //n为节拍常数变量unsigned char a[7]={00,59,19,3,4,8,10}; unsigned char b[7];void delay1s(void){unsigned char i,k;for(k=100;k>0;k--)for(i=100;i>0;i--);}/*定时器0中断*/void TIMER0(void) interrupt 1{TH0=STH0;TL0=STL0;PWM1=~PWM1;}/*定时器1中断*/void int0() interrupt 3 //采用中断3 控制节拍节拍延时{ TH1=0xd8;TL1=0xef;n--;}/*定时器2中断*/void int1() interrupt 5 //采用中断3 控制节拍节拍延时{ TH2=0xd8;TL2=0xef;n--;}void delay (unsigned char m) //控制频率延时{unsigned i=3*m;while(--i);}void delayms(unsigned char a) //豪秒延时子程序{while(--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!}unsigned int codetab[]={0xfc43,0xfd08,0,0,0xfd08,0xfd32,0,0,0xfd81,0xfdc7,0,0,0xfe05,0 xfe21,0,0,};/*unsigned char code table[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0x63,0x85,0x61,0x71,0xff}; */unsigned char code music_tab_1[]={/*1*/0x20,0x20,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,0x20,0x20,0x24,0x20,0x26,0x20,0x1c,0x20,0x19,0x20,0x18,0x10,0x19,0x10,0x20,0x30,0x01,0x20,0x20,0x10,0x20,0x10,0x1c,0x20,0x30,0x20,0x30,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x01,0x20,0x20,0x20,0x24,0x20,0x20,0x20,0x26,0x10,0x2b,0x20,0x30,0x10,0x2b,0x60,/*2*/0x20,0x20,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,0x20,0x20,0x24,0x20,0x26,0x20,0x1c,0x20,0x19,0x20,0x18,0x10,0x19,0x10,0x20,0x30,0x01,0x20,0x20,0x10,0x20,0x10, 0x1c,0x20,0x30,0x20,0x30,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x01,0x20,0x20,0x20,0x24,0x20,0x20,0x20,0x26,0x10,0x2b,0x20,0x30,0x10, 0x2b,0x60,//550x30,0x40,0x18,0x20,0x19,0x20,0x1c,0x20,0x19,0x10, 0x18,0x10,0x18,0x20,0x2b,0x20,0x13,0x20,0x19,0x20, 0x19,0x20,0x20,0x10,0x20,0x10,//632211170x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20, 0x18,0x40,0x18,0x20,0x19,0x20,//67112377550x1c,0x20,0x19,0x10,0x18,0x10,0x18,0x20,0x15,0x20, 0x13,0x20,0x19,0x20,0x19,0x20,0x20,0x10,0x20,0x10,//6322110x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20,0x18,0x60,//000000x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x60,//1155555 5777550x18,0x10,0x18,0x10,0x10,0x20,0x10,0x10,0x10,0x10, 0x10,0x20,0x10,0x20,0x10,0x20,0x19,0x10,0x19,0x10, 0x19,0x20,0x20,0x10,0x20,0x10,//0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x0e,0x20, 0x10,0x20,0x18,0x10,0x18,0x10,0x18,0x20,0x18,0x10, 0x15,0x10,//32443324430x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20, 0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,//324430x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,//55110x10,0x40,0x10,0x20,0x18,0x10,0x18,0x10,//0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x10,0x20, 0x10,0x20,0x19,0x10,0x19,0x10,0x19,0x20,0x20,0x10, 0x20,0x10,//0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x0e,0x20, 0x10,0x20,0x18,0x10,0x18,0x10,0x18,0x20,0x18,0x10, 0x15,0x10,//32443321710x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20, 0x13,0x20,0x15,0x10,0x18,0x10,0x18,0x20,0x19,0x10, 0x18,0x60,0x01,0x40,0x01,0x40,//第二次/*3*/0x20,0x20,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20, 0x20,0x20,0x1c,0x20,0x20,0x20,0x24,0x20,0x26,0x20,0x1c,0x20,0x19,0x20,0x18,0x10,0x19,0x10,0x20,0x30,0x01,0x20,0x20,0x10,0x20,0x10, 0x1c,0x20,0x30,0x20,0x30,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x01,0x20,0x20,0x20,0x24,0x20,0x20,0x20,0x26,0x10,0x2b,0x20,0x30,0x10, 0x2b,0x60,/*4*/0x20,0x20,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20, 0x20,0x20,0x1c,0x20,0x20,0x20,0x24,0x20,0x26,0x20,0x1c,0x20,0x19,0x20,0x18,0x10,0x19,0x10,0x20,0x30,0x01,0x20,0x20,0x10,0x20,0x10, 0x1c,0x20,0x30,0x20,0x30,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x01,0x20,0x20,0x20,0x24,0x20,0x20,0x20,0x26,0x10,0x2b,0x20,0x30,0x10, 0x2b,0x60,//550x30,0x40,0x18,0x20,0x19,0x20,0x1c,0x20,0x19,0x10, 0x18,0x10,0x18,0x20,0x2b,0x20,0x13,0x20,0x19,0x20, 0x19,0x20,0x20,0x10,0x20,0x10,//632211170x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20,0x18,0x40,0x18,0x20,0x19,0x20,//67112377550x1c,0x20,0x19,0x10,0x18,0x10,0x18,0x20,0x15,0x20, 0x13,0x20,0x19,0x20,0x19,0x20,0x20,0x10,0x20,0x10,//6322110x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20, 0x18,0x60,//335350x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x60,//1155555 5777550x18,0x10,0x18,0x10,0x10,0x20,0x10,0x10,0x10,0x10, 0x10,0x20,0x10,0x20,0x10,0x20,0x19,0x10,0x19,0x10, 0x19,0x20,0x20,0x10,0x20,0x10,//0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x0e,0x20, 0x10,0x20,0x18,0x10,0x18,0x10,0x18,0x20,0x18,0x10, 0x15,0x10,//32443324430x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20, 0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,//324430x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,//55110x10,0x40,0x10,0x20,0x18,0x10,0x18,0x10,//0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x10,0x20, 0x10,0x20,0x19,0x10,0x19,0x10,0x19,0x20,0x20,0x10, 0x20,0x10,//0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x0e,0x20, 0x10,0x20,0x18,0x10,0x18,0x10,0x18,0x20,0x18,0x10, 0x15,0x10,//32443321710x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,0x13,0x20,0x15,0x10,0x18,0x10,0x18,0x20,0x19,0x10,0x18,0x60,0x01,0x40,0x01,0x40,//结尾//33420x13,0x20,0x15,0x20,0x18,0x30,0x19,0x10,0x18,0x10,0x15,0x10,0x18,0x40,0x13,0x40,0x13,0x40,0x12,0x40,0x15,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x60,0x00};unsigned char code music_tab_2[]={ 0x10,0x03, 0x11,0x03, 0x15,0x66, 0x11,0x03, 0x15,0x02,0x17,0x02, 0x11,0x01, 0x0D,0x02, 0x0D,0x02, 0x10,0x66,0x0F,0x03, 0x10,0x02, 0x15,0x02, 0x0F,0x15, 0x0D,0x03,0x0D,0x03, 0x0E,0x66, 0x0D,0x03, 0x0E,0x03, 0x15,0x66,0x0D,0x01, 0x15,0x02, 0x15,0x02, 0x15,0x02, 0x11,0x66,0x0E,0x03, 0x0E,0x02, 0x11,0x02, 0x11,0x15, 0x10,0x03,0x11,0x03, 0x15,0x66, 0x11,0x03, 0x15,0x02, 0x17,0x02,0x11,0x15, 0x0D,0x03, 0x0D,0x03, 0x10,0x66, 0x0F,0x03,0x10,0x02, 0x15,0x02, 0x0F,0x01, 0x0D,0x03, 0x0E,0x02,0x15,0x03, 0x11,0x03, 0x11,0x02, 0x15,0x02, 0x16,0x03,0x16,0x03, 0x17,0x03, 0x15,0x16, 0x15,0x02, 0x11,0x03,0x10,0x03, 0x10,0x03, 0x11,0x02, 0x0F,0x02, 0x10,0x15,0x15,0x03, 0x16,0x03, 0x17,0x66, 0x16,0x03, 0x17,0x02,0x19,0x02, 0x16,0x15, 0x0F,0x03, 0x0F,0x03, 0x15,0x03,0x11,0x03, 0x15,0x02, 0x17,0x02, 0x17,0x15, 0x10,0x03, 0x11,0x03, 0x15,0x02, 0x11,0x02, 0x16,0x03, 0x16,0x03, 0x15,0x66, 0x0F,0x03, 0x0F,0x16, 0x18,0x02, 0x17,0x02, 0x16,0x02, 0x15,0x02, 0x17,0x00, 0x17,0x02, 0x1A,0x01, 0x19,0x02, 0x19,0x02, 0x17,0x03, 0x16,0x03, 0x15,0x02, 0x15,0x02, 0x16,0x02, 0x15,0x03, 0x16,0x03, 0x16,0x03, 0x19,0x02, 0x17,0x15, 0x17,0x02, 0x1A,0x01, 0x19,0x01, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03, 0x16,0x03, 0x11,0x02, 0x10,0x01, 0x00,0x00};void main(void){unsigned char p,m; //m为频率常数变量unsigned char i=0;TMOD=0x11;IE=0xaa;TH1=0xd8;TL1=0xef;TH2=0xd8;TL2=0xef;P2=0xe0;P3=0x0f;I2CCON=0xE8;SetTime(a);SwitchRTC(1);LCDInitialize();while(1){P1=0xf0;P2=0xff;lie0=0;temp=P1;temp=temp & 0x0f;if (temp!=0x0f){delay1s();temp=P1;temp=temp & 0x0f;if (temp!=0x0f){temp=P1;temp=temp & 0x0f; switch(temp){case 0x0e:key=0;break;case 0x0d:key=4;break;case 0x0b:key=8;break;case 0x07:key=12;break;}P0=tab[key];STH0=tab[key]/256;STL0=tab[key]%256;TR0=1;temp=temp&0x0f;while(temp!=0x0f){temp=P1;temp=temp&0x0f;}TR0=0;} }P1=0xf0;P2=0xff;lie1=0;temp=P1;temp=temp & 0x0f;if (temp!=0x0f){delay1s();temp=P1;temp=temp & 0x0f;if (temp!=0x0f){temp=P1;temp=temp & 0x0f; switch(temp){case 0x0e:key=1;break;case 0x0d:key=5;break;case 0x0b:key=9;break;case 0x07:key=13;break;}P0=tab[key];STH0=tab[key]/256; STL0=tab[key]%256;TR0=1;temp=temp&0x0f;while(temp!=0x0f){temp=P1;temp=temp&0x0f;}TR0=0;}}P1=0xf0;P2=0xff;lie2=0;temp=P1;temp=temp & 0x0f;if (temp!=0x0f){delay1s();temp=P1;temp=temp & 0x0f;if (temp!=0x0f){temp=P1;temp=temp & 0x0f; switch(temp){case 0x0e:key=2;break;case 0x0d:key=6;break;case 0x0b:key=10;break;case 0x07:key=14;break;}P0=tab[key];}}P1=0xf0;P2=0xff;lie3=0;temp=P1;temp=temp & 0x0f;if (temp!=0x0f){delay1s();temp=P1;temp=temp & 0x0f;if (temp!=0x0f){temp=P1;temp=temp & 0x0f; switch(temp){case 0x0e:key=3;break;case 0x0d:key=7;break;case 0x0b:key=11;break;case 0x07:key=15;break;}P0=tab[key];}}switch(key){case 0,4,8,12,1,5,9,13,8,12,7,11,15:break;case 2:{play_1:{a_1: p=music_tab_1[i];if(p==0x00){ i=0, delayms(1000); goto play_1;} //如果碰到结束符,延时1秒,回到头再来一遍else if(p==0xff) { i=i+1;delayms(100),TR1=0; goto a_1;} //若碰到休止符,延时100ms,继续取下一音符else{m=music_tab_1[i++], n=music_tab_1[i++];} //取频率常数和节拍常数TR1=1; //开定时器1while(n!=0) PWM1=~PWM1,delay(m); //等待节拍完成, 通过P1口输出音频TR1=0; //关定时器1}break;}case 6:{play_2:{a_2: p=music_tab_2[i];if(p==0x00) { i=0, delayms(1000); goto play_2;} //如果碰到结束符,延时1秒,回到开始再来一遍else if(p==0xff){ i=i+1;delayms(100),TR2=0; goto a_2;} //碰到休止符,延时100ms,取下一音符else{m=music_tab_2[i++], n=music_tab_2[i++];} //取频率常数和节拍常数TR2=1; //开定时器2while(n!=0) PWM1=~PWM1,delay(m);//等待节拍完成, 通过P1口输出音频(TR2=0; //关定时器2} break;}case 3:{jishi=1; break;}default:break;}if(jishi==1){ReadTime(b);LCDPrintNumber(0,1,2,b[0]);//LCDPrintString(3,1,1,"-");LCDPrintNumber(4,1,2,b[1]);//LCDPrintString(6,1,1,":");LCDPrintNumber(7,1,2,b[2]);//LCDPrintString(9,1,1," ");LCDPrintNumber(10,1,2,b[4]);//LCDPrintString(12,1,,1," ");LCDPrintNumber(13,1,2,b[5]);//LCDPrintString(15,1," ");LCDPrintString(0,0,"HuNan University!");}}}第6章心得体会这次实验总共经历了两周的时间,从功能需求分析到功能分析,从程序的设计到程序的调试,下载,最后终于完成了这次具有实际使用价值的实验。