基于51计
单片机的电子琴课程设
摘要
本设计主要研究基于AT89C52单片机的简易电子琴设计。
它是以单片机作为主控核心,设置键盘、蜂鸣器等外围器件;另外还用到一些简单器件如:NPN型三极管及电阻等。利用按键实现音符和音调的输入;用NPN型三极管8550实现低音频功率放大;最后用蜂鸣器进行播放“送别”。
本设计硬件部分主要由最小系统,按键系统模块和蜂鸣器模块组成。其软件部分主要有主程序模块、定时中断程序、定时计数程序。
(1)最小系统:它是单片机应用系统的设计基础。它包括单片机的选择、时钟系统设计、复位电路设计、简单的I/O口扩展、掉电保护等。
(2)按键系统模块:本设计采用10个按键,其中7个按键用来显示7个音调,其它3个按键可以进行高低中音的切换,并自动播放已存歌曲。
(3)蜂鸣器模块:此电子琴发音电路是通过三极管驱动蜂鸣器发音,经过上拉电阻提高驱动能力。
本次设计首先对单片机设计简易电子琴仔细分析,接着制作硬件电路和编写软件的程序,最后进行软硬件的调试运行。并且从原理图,主要芯片,各模块的原理和各个模块的程序调试来阐述。利用单片机产生不同频率来获得我们要求的音阶,实现高、中、低共21个音符的发音和音乐播放时的控制,并且能自动播放程序中编排的音乐。系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比高等,具有一定的使用和参考价值。
目录
1.概述 ..................................................................... 0
1.1设计背景 .................................................. 0 1.2设计意义 .................................................. 0 1.3 设计任务 ................................................. 0 2.系统总体方案及硬件设计 ................................. 1
2.1总体设计 .................................................. 1 方案一:采用单个的逻辑器件组合 ............ 1 方案二:用VHDL语言编程来实现 .............. 1 2.2单片机选型 .............................................. 2 2.3单片机的最小工作系统 .......................... 2
................................................................ 2 ................................................................ 3 2.4 原理框图 ................................................. 3 2.5 按键部分设计 ......................................... 4
2.5.1操作键设计 ................................... 4 ................................................................ 4 ................................................................ 5 2.6发音部分设计 .......................................... 6 3.系统软件设计 ..................................................... 6
3.1系统分析 .................................................. 6
................................................................ 6
................................................................ 7 3.2 参数计算 ................................................. 9
................................................................ 9 ................................................................ 9 ................................................................ 9 3.3程序设计 ................................................ 12
.............................................................. 12 .............................................................. 13
4. Proteus软件仿真 ............................................ 15
4.1硬件调试 ................................................ 15 4.2 软件调试 ............................................... 15 4.3 仿真结果(任举一例) ....................... 16 4.4 结果分析 ............................................... 16 5. 课程设计体会 ................................................. 17 参考文献 .............................................................. 18 附1 源程序代码 ............................................... 19 附2 系统原理图 ............................................. 27
1.概述
1.1设计背景
随着电子科学技术的飞速发展,电子技术正在逐渐改善着人们的学习、生活、工作,因此开发本系统希望能够给人们带来更多的生活乐趣。
基于当前市场上的玩具需求量增大,其中电子琴就是一个很好的应用方面。单片机技术使我们可以利用软硬件来实现电子琴的功能,从而可以实现电子琴的微型化,可以用作玩具琴、音乐转盘以及音乐童车等等。并且可以进行一定的功能扩展。鉴于传统电子琴可以用键盘上的“1”到“A”键演奏从低So到高DO等11个音,从而也可以通过单片机实现对十个按键的扩展,实现七个音符键的高、中、低21个音调的显示播放和任意音乐的自动播放。该设计将十个音键制作成独立键盘,其中七个为音符键,三个为控制键,使电子琴的功能更加完美。不但可以实现对按键的控制,而且可以实现对音乐的自动存储和播放,使该设计功能更加完善。 1.2设计意义
该设计具有以下优点: ①可以方便更换音符和音调; ②比传统电子琴功能更完善; ③制作简单,成本低; 1.3 设计任务
实现电子琴发声控制系统;要求电路实现如下功能:
利用蜂鸣器作为发声部件,设置10个按键,实现高音、中音、低音的1、2、3、4、5、6、7的发音。并在存储一首歌曲的内容,可以实现自动播放。 用PROTEUS实现的电子琴仿真设计
说明:单片机的工作时钟频率为11.0592MHz。
1
0
2.系统总体方案及硬件设计
2.1总体设计
实现本次设计的方案有多种,下面比较说明一下最佳方案的选择。 方案一:采用单个的逻辑器件组合
音乐是有由不同的音阶组成的,而不同的音阶又是由不同的频率发出的,那么利用不同的频率,就可以发出不同的音乐了。
我们知道计数器8253可以产生任意频率的方波频率信号,因此,我们只要把一首歌曲的音阶对应频率与计数器的频率对应起来就可通过计数器产生音乐了。根据本实验要求,采用8279将键扫得到的键值通过查表得到相应的8253的频率值,将从8253得到相对应的按键弹奏信号经过LM386进行放大,再用喇叭输出,就实现了简易电子琴的基本功能,也就完成了实验的要求。 方案二:用VHDL语言编程来实现
系统整体基本原理图如下:
图1、系统整体基本原理图
利用我们实验室先进的数字电路实验设备,我们可以采用VHDL语言编程来实现。我们可以通过VDHL语言,对实验原理图的各个部分进行设计,通过编译,可以在计算机上下载此实验原理图,利用电路学习机上的芯片。我们很快就可以设计出一个简单的电子琴。并实现其功能。
方案三:采用AT89S52单片机作为主控芯片,设置键盘、蜂鸣器等外围器件,另外还用到一些简单器件如:NPN型三极管及电阻等。利用按键实现音符和音调的输入;用NPN型三极管8550实现低音频功率放大;最后用蜂鸣器发音。
1
1
三种方案的比较:
方案一采用单个的逻辑器件组合实现。这样虽然比较直观,逻辑器件分工鲜明,思路也比清晰,一目了然,但是由于元器件种类、个数繁多,而过于复杂的硬件电路也容易引起系统的精度不高、体积过大等不利因素。例如七个不同的音符是由七个不同的频率来控制发出的,所用仪器之多显而易见。方案二采用VHDL语言编程来实现电子琴的各项功能。系统主要由电子琴发声模块、选择控制模块和储存器模块组成。和方案一相比较,方案二就显得比较笼统,虽然我们可以看到用超高速硬件描述语言VHDL的优势,但本质上它只是把整个系统分为了若干个模块,而不牵涉到具体的硬件电路。方案三与前两种方案相比,主控芯片采用AT89S52单片机,它是大规模集成电路技术发展的产物,具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。同时具有强大的控制功能和灵活的编程实现特性,由于本设计主要用于人们娱乐方面,因此在设计上尽量使其安全以及简单易操作。而第三种方案具有经济可行性、技术可行性、实物应用性。
综上所述,本次课程设计采用第三种方案。 2.2单片机选型
硬件电路要以单片机作为主控芯片,实现按键输入音符和音调,两位数码管的显示以及低音频功率放大和蜂鸣器发音。针对本设计的功能和用途,采用AT89S51单片机更好,实现功能完全,性价比较高,更适合本设计。 2.3单片机的最小工作系统
单片机加上适当的外围器件和应用程序,构成的应用系统称为最小系统。
单片机内部具有一个高增益反相放大器,用于构成振荡器。通常在引脚XTALl和XTAL2跨接石英晶体和两个补偿电容构成自激振荡器,结构图2 中X1、C1、C2。可以根据情况选择6MHz、12MHz或24MHz等频率的石英晶体,补偿电容通常选择30pF左右的瓷片电容。
1
2
图2、时钟电路
单片机小系统常采用上电自动复位和手动按键复位两种方式实现系统的复位操作。上电复位要求接通电源后,自动实现复位操作。手动复位要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机复位。其结构如下图。上电自动复位通过电容C3充电来实现。手动按键复位是通过按键将电阻R1与VCC接通来实现。
图3、复位电路
2.4 原理框图
本系统有主控芯片89S52、发音单元、显示模块、按键模块组成。
发音单元按键模块89S52单片机显示模块 1
3
图4、原理框图
2.5 按键部分设计 2.5.1操作键设计
常用的按键有三种:机械触点式按键、导电橡胶式和柔性按键(又称触摸式键盘)。
机械触点式按键是利用机械弹性使键复位,手感明显,连线清晰,工艺简单,适合单件制造。但是触点处易侵入灰尘而导致接触不良,体积相对较大。
导电橡胶按键是利用橡胶的弹性来复位,通过压制的方法把面板上所有的按键制成一块,体积小,装配方便,适合批量生产。但是时间长了,橡胶老化而使弹力下降,同时易侵入灰尘。
柔性按键是近年来迅速发展的一种新型按键,可以分为凸球型和平面型两种。柔性按键最大特点是防尘、防潮、耐蚀,外形美观,装嵌方便。而且外形和面板的布局、色彩、键距可按照整机的要求来设计。
但是由于客观条件与经济能力有限,本系统采用机械触点式按键。 2.5.2键盘设计
键盘在单片机应用系统中是一个关键的部件,它能实现向计算机输入数据,传送命令等功能,是人工干预计算机的主要手段。
键盘可以分为2类:独立连接式键盘和矩阵式键盘。 (1)矩阵式键盘
单片机系统中,若按键较多时,通常采用矩阵式(也称行列式)键盘。矩阵式键盘由行线和列线组成,按键位于行、列线的交叉点上。显然,在按键数量较多时,矩阵式键盘较之独立式按键键盘要节省很多I/O口。
矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻
1
4
接到+5V上.当无键按下时,行线处于高电平状态;当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定。这是识别按键是否按下的关键。 (2)独立连接式键盘
独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,然而,在按键较多时,I/O口线浪费较大,不宜采用。
独立式按键软件常采用查询式结构。先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。由于本程序较为简单,为了使用方便及节省资源,选择独立式键盘。下图为独立式键盘电路图:
图6、独立式键盘电路图
2.5.3去抖动
键盘编程中主要考虑去抖动的问题。
当测试表明有键被按下之后,紧接着就进行去抖动处理。因为键是机械开关结构,由于机械触点的弹性及电压突跳等原因,在触点闭合或断开的瞬间会出现电压抖动。为保证键识别的准确,在电压信号抖动的情况下不能进行行状态输入。为此需进行去抖动处理。去抖动有硬件和软件两种方法。硬件方法就是加去抖动电路,从根本上避免抖动的产生。软件消抖,在第一次检测到有键按下时,执行一段延时程序之后,再检测此按键,如果第二次检测结果仍为按
1
5
下状态,CPU便确认此按键己按下,消除了抖动。 2.6发音部分设计
如下图所示,发音电路是由蜂鸣器、三极管、上拉电阻构成。由三极管来驱动扬声器发音的,同时加上拉电阻增强驱动电流,提高驱动能力。
图7、发音部分电路图
3.系统软件设计
3.1系统分析
(1)键盘扫描程序:检测是否有按键按下,有按键按下则记录按下键的键值,并跳转至功能转移程序;无按键按下,则返回键盘扫描程序继续检测。
(2)功能转移程序:对检测到的按键值进行判断,是琴键则跳转至琴键处理程序,是功能键则跳转至相应的功能程序,我们设计的功能程序有两种,即音色调节功能和自动播放乐曲的功能。
(3)琴键处理程序:根据检测到的按键值,查询音调表,给计时器赋值,使发出相应频率的声音。
(4)自动播放歌曲程序:检测到按键按下的是自动播放歌曲功能键后执行该程序,电子琴会自动播放事先已经存放的歌曲,歌曲播放完毕之后自动返
1
6
回至键盘扫描程序,继续等待是否有按键按下。
开始 音阶初始化T0 键按得到高中低键盘扫描N 判断p0口输自动播入,设定键值 键值关闭b0++ 根据7个键值和工作方式确定T0 B0/2==0 启动T0 播放内 部存储1 音乐播7
N
NY
Y
1
Y
8
3.2 参数计算
若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止后就将P1.0反相,然后重复计时再反相。就可在P1.0引脚上得到此频率的脉冲。利用AT89C51的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶。
例如,频率为523Hz,其周期T=1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。计数脉冲值与频率的关系式是:N=fi÷2÷fr,式中,N是计数值;fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz);fr是想要产生的频率。其计数初值T的求法如下:T=65536-N=65536-fi÷2÷fr
例如:设K=65536,fi=1MHz,求中音DO(261Hz)。T=65536-N=65536-fi÷2÷fr=65536-1000000÷2÷fr=65536-500000/fr,中音DO的T=65536-500000/523=64580。
(1)单片机12MHZ晶振,中音符与计数T0相关的计数值如表所示:
音符 频率计数值音符 频率计数值T值) (HZ) (T值) 低1DO #1DO# 277 63737
1
(HZ) (#4FA740 # 中784 262 63628 64860 64898 9
5SO 低2RE #2RE# 311 低3MI 330 低4FA 349 #4FA# 370 低SO 392 #5SO# 415 低6LA #6LA# 466 低7SI 494 中1DO 1
294 63835 63928 64021 64103 64185 64260 64331 64400 64463 64524 64580 #5SO831 # 中6LA #6LA932 # 中7SI 968 低1DO #1DO1109 # 高2RE 1175 1046 880 94934 64968 64994 65030 65058 65085 65110 65134 65157 65178 65198 10
440 #2RE1245 # 高3MI 高4FA 1397 1318 523 #4FA1490 #
#1DO# 554 64633 高5SO 1568 65217 中2RE 587 64633 64884 64732 64820 #5SO1661 # 高6LA 1760 65235 65252 65268 65283 #2RE# 622 中3MI 659 中4FA 698 #6LA1865 # 高7SI 1967 采用查表程序进行查表时,可以为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据:低音0-19之间,中音在20-39之间,高音在40-59之间。用单片机播放音乐,或者弹奏电子琴,实际上是按照特定的频率,输出一连串的方波。为了输出合适的方波,首先应该知道音符与频率的关系。 (2)音调数据表 曲调值 调4/4 调3/4 调2/4
DELAY 125ms 187ms 250ms
曲调值 调4/4 调3/4 调2/4
DELAY 62ms 94ms 125ms
上表中的频率数值,有些过多,去掉不常用的黑键频率,只是把白键对应的数据存放在单片机中,即可满足绝大部分的应用需求。 定义音调数据表的程序如下:
DW 63628,63835,64021,64103,64260,64400,64524 ;64580,低音区:1 2 3 4 5 6 7
DW 64580,64671,64777,64820,64898,64968,65030 65058中音区:1 2 3 4 5 6 7
DW 65058,65110,65157,65178,65217,65252,65283 65312高音区:1 2 3 4 5 6
1
11
7
把这个数据表,放在程序中,需要播音的时候,就从表中取出一个数据送到定时器,当定时器溢出中断的时候,再对输出引脚取反,那么,在扬声器中,即可听到上表中频率的声音。 3.3程序设计
在软件设计中采用yinjie代表音阶,如下图所示 音阶 高 中 低 Yinjie值 2 1 0 初始化状态为中音(yinjie=1),电路中设计高、低两个音阶键。上电后,若无按键按下,则为中音模式。若音阶键被按下,则如下流程图所示,初始化后进行按键扫描,在高音键按下,若初始yinjie不为2,则另yinjie=2,进入高音工作模式,若初始yinjie为2,则对yinjie进行初始化,即另yinjie=1,重新进入进入中音工作模式,这样即实现了高音键切换高、中音方式的转换。同理,用低音键实现中、低音的切换。
1
12
开始初始化设定yinjie=1,即方式为中音判断工作方式Y高音选择按下N低音选择按下Y判断yinjie值判断yinjie值yinjie=2yinjie=0NN设定yinjie=2设定yinjie=0图9、判断音阶(高中低音)子程序
1
13
开始开中断并设定工作方式寄存器有键按下自动播放键按N下进入中断Y根据yinjie和工作进入中断方式取值,并在数组中查找相应音律根据乐谱在数组中查找相应给定时器T0赋音律值给定时器T0赋值播放键值对应的音符播放音乐图10、播放子程序
1
14
4. Proteus软件仿真
4.1硬件调试
硬件调试主要是针对单片机部分进行的调试。
在上电之前,先确保电路中不存在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况的任务。注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。
在确保硬件电路正常且无异常情况(断路或短路)的情况下方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确,在本次设计中,上电调试主要是检测单片机控制部分、音频转换电路硬件调试。 键盘单片机控制部分调试:上电后,随机按动键盘可以发现各个按键对应的音正确。 4.2 软件调试
调试主要方法和技巧:通常一个调试程序应该具备至少四种性能:跟踪、断点、查看变量、更改数值。整个程序是一个主程序调用各个子程序实现功能的过程,要使主程序和整个程序都能平稳运行,各个模块的子程序的正确与平稳运行必不可少,所以在软件调试的最初阶段就是把各个子程序模块进行分别调试。
1
15
4.3 仿真结果(任举一例)
图10、低音音符DO仿真图
4.4 结果分析
根据仿真结果可知,本次课程设计能够准确并彻底的完成设计要求。分别按下左侧的七个按键,蜂鸣管会依次发出DO、RE、MI、FA、SO、LA、SI七种音符。右侧前两个按键可以改变音调,能够进行高、中、低音的自由切换。最下面的按键是预存音乐“送别”的控制开关,可以进行音乐的播放与暂停。
1
16
5. 课程设计体会
总体来说,此次单片机课程设计使我们收获良多,虽然课程设计的过程中遇到了很多困难与问题,但我们最终还是完成了设计的任务及要求。具体来说可以分为以下几点:第一,不够细心,不够严谨(如因为粗心大意而焊错线);第二,因对课本理论的掌握度不够导致编程出现错误;第三,硬件方面,刚开始有的程序模块不能实现预期的效果,对于有的硬件,在实物制作过程中焊了比较多的排线,同时对于整体各元器件的布局都有很高的要求。不过在向同学请教,各方面都有了不同程度的改善;第四,在做人方面,我认识到,无论做什么事情,只要你足够坚强,有足够的毅力和决心,有足够的挑战困难的勇气,就没有什么办不到的。
这次课程设计中,经过我们的努力,在仿真软件和实物上都实现了高、中、低21个音符的发声和音乐的自动播放,使我们有了一定的成就感,也使我们进一步熟悉和掌握了单片机的内部结构和工作原理,了解了单片机应用系统设计的基本方法和步骤, 掌握了单片机仿真软件Proteus的使用方法和键盘、显示器在的单片机控制系统中的应用,同时也掌握了撰写课程设计报告的方法。总之,通过这次课程设计,我们都清楚明白了自己的能力有多深,想提高还得归于多锻炼,多动手,多向别人学习。
1
17
参考文献
【1】徐泳龙·单片机及原理及应用·北京:机械工业出版社,2013
【2】胡学海·单片机原理及应用系统设计·北京:北京电子工业出版社,2005
【3】高伟·.AT89单片机原理及应用·北京:国防工业出版社,2008
1
18
附1 源程序代码 #include #define uchar unsigned char #define uint unsigned int uchar high,low; //定时器预装值的高8位和低8位 sbit speak=P3^0; sbit gao=P3^5; sbit di=P3^6; sbit zdbf=P3^7; uchar yinjie=1; uchar time; uchar n=0; uchar bo=0; uchar code fre[][2]= { 0x8c,0xf8, 0x5b,0xf9, 0x15,0xfa, 0x67,0xfa, 0x90,0xfb, 0xae,0xfb, 1 19 0x0c,0xfc, //低音 0x44,0xfc, 0xac,0xfc, 0x09,0xfd, 0x34,0xfd, 0x82,0xfd, 0xc2,0xfd, 0x06,0xfe, 0x22,0xfe, 0x56,0xfe, 0x85,0xfe, 0x9a,0xfe, 0xc1,0xfe, 0xe4,0xfe, 0x03,0xff, }; void delay(uint ); void ITimer0(void);//定时器初始化 void key(void); void dtxs(int,int); void song() { //中音 //高音 1 20 TH0=high; TL0=low; TR0=1; delay(time*240); } void yinyue() { uchar code hls[]={ 5,2,2, 3,2,1, 5,2,1, 1,3,4, 6,2,2, 1,3,2, 5,2,4, 5,2,2, 1,2,1, 2,2,1 ,3,2,2 ,2,2,1, 5,2,2, 1,2,1 ,2,2,6, 5,2,2, 3,2,1, 5,2,1, 1,3,3, 7,2,1, 6,2,2, 1,3,2, 5,2,4, 2,2,1, 3,2,1, 4,2,3, 7,1,1, 1,2,6, 6,2,2, 1,3,2, 1,3,4, 7,2,2, 6,2,1, 7,2,1, 1,3,4 ,6,2,1, 7,2,1, 1,3,1 ,6,2,1, 6,2,1 ,5,2,1 ,3,2,1, 1,2,1, 2,2,6, 5,2,2, 3,2,1, 7,1,1, 1,2,6 1,2,1, 1,3,3, 7,2,1, 6,2,2, 1,3,2, 5,2,4, 5,2,2, 2,2,1, 3,2,1, 4,2,3, }; uchar m; n=0; while(n<174) { m=hls[n]+7*(hls[n+1]-1)-1; high=fre[m][1]; 1 21 low=fre[m][0]; time=hls[n+2]; n=n+3; song(); } } void main (void) { uchar num; ITimer0(); speak=0; while(1) { key(); switch(keyport) { case 0xfe:num=1;break; case 0xfd:num=2;break; case 0xfb:num= 3;break; case 0xf7:num= 4;break; case 0xef:num= 5;break; case 0xdf:num= 6;break; 1 22 case 0xbf:num= 7;break; case 0x7f:num= 8;break; default:num= 0;break; } void ITimer0(void) { TMOD |= 0x01; //使用模式1,16位定时器,使用\"|\"符号可以在使用多个定时器时不受影响 1 23 } } if(num==0) { } else { } dtxs(yinjie,num); high=fre[7*yinjie+num-1][1]; low=fre[7*yinjie+num-1][0]; TR0=1; TR0=0; speak=0; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 } void Timer0_isr(void) interrupt 1 { TH0=high; TL0=low; speak=!speak; if(zdbf==0) { delay(100); if(zdbf==0) { bo++; if(bo/2==1) { delay(100); if(n<174)n=500; 止音乐 else n=0; dtxs(3,0); } //n赋值大于174,跳出while,停 24 1 if(bo%2==0) { delay(100); n=500; //n赋值大于174,跳出while,停止音乐 } } }/**/ } void key() { if(zdbf==0) {delay(100); if(zdbf==0) yinyue(); } if(gao==0) { delay(100); if(gao==0) { delay(100); if(yinjie==2) yinjie=1; 1 25 else yinjie=2; } } if(di==0) { delay(100); if(di==0) { delay(100); if(yinjie==0) yinjie=1; else yinjie=0; } } } void delay(unsigned int x) { int a,b; for(a=x;a>0;a--) for(b=110;b>0;b--); } void dtxs(k,l) 1 26 { char seg[14]={0x6f,0x0a,0xe3,0xcb,0x8e,0xcd, 0xed,0x0b,0xef,0xcf,0xaf,0xec,0x65,0xea}; P2=0x01; P0=seg[l]; delay(4); P2=0x02; P0=seg[k+10]; delay(4); } 附2 系统原理图 1 27 因篇幅问题不能全部显示,请点此查看更多更全内容