您的当前位置:首页正文

按键控制蜂鸣器播放多段音乐的设计论文

2022-06-22 来源:意榕旅游网


《单片机原理及应用》课程设计

基于按键控制蜂鸣器播放多段音乐的设计

姓 名: X X X 任课教师: X X

院 系: X X X

专 业: 电子信息工程

提交日期: 2012年6月25日

基于按键控制蜂鸣器播放多段音乐的设计

引言

这学期我们学习了单片机原理及接口技术这一门实用而又生动的课程,初次接触到它就被它丰富的内容所吸引。

单片机自20世纪70年代问世以来,已得到了十分广泛的应用。随着单片机 的集成度越来越高以及单片机系统的广泛应用,对软件编程的要求也越来越高,要求编程人员在短时间内编写出执行效率高、运行可靠的程序代码。单片机具有一些突出的有点:体积小、重量轻、耗电少、电源单一、功能强、价格低、运行速度较快、抗干扰能力强、可行性高,所以在如今的绝大数的领域中都能够看到单片机的身影。

本次设计是基于AT89C51芯片的电路为基础,外加上三极管的放大、放音设备蜂鸣器,以此来实现音乐硬件控制器的硬件电路,通过软件程序来控制单片机内部的定时器使其播放出优美的音乐。此次设计共写进了三首歌曲程序,分别是《仙剑》、《月亮代表我的心》和《小星星》。

关键字:单片机 蜂鸣器 AT89C51芯片 音乐

Based on the button control play more paragraphs music of the buzzer design

Instruction

This term we have learnt the digital image processing which is a practical and vivid course, First contact to it, I was attractive by its rich content.

Since the 1970 s, the single chip microcomputer appeared has been a wide range of applications. With the integration of single chip more and more high and the wide application of single—chip microcomputer system, the software programming requirement also more and more high, requesting programming staff in a short time, writing executive high efficiency and reliable operation program code。 SCM has some prominent a bit: small volume, light weight, less consumption, and the power of a single, the function is strong, price low, the process is fast and strong anti—interference ability, feasibility is high, so in most of the number now in your field you can see the figure of single chip microcomputer。

This design is based on AT89C51 chips based circuit, and the transistor amplifier and let the sound equipment, so as to realize music hardware hardware circuit, through the software program to control of the single chip microcomputer timer internal plays beautiful music。 The design of three songs were written into the program, it is respectively xianjian, the moon represents my heart, little star.

Keywords: Single-chip microcomputer ,buzzer,AT89C51 chip,music

目 录

第一章 绪论 ................................................................ 1 1.1课程设计目的 ........................................................... 1 1。2课程设计任务 .......................................................... 1 1。3课程设计的意义 ........................................................ 1 第二章 设计原理 ............................................................ 2 2。1 设计原理 .............................................................. 2 2.1。1 基本原理简述 ...................................................... 2 2.1。2 关于音乐的原理知识概况 ............................................ 2 第三章 ATMEL 89C51 简介 .................................................... 5 3.1 ATMEL 89C51简介 ....................................................... 5 3.1.1 AT89C51单片机 ..................................................... 5 3。1.2 单片机CPU结构 .................................................... 5 3。1。3 AT89C51用户系统 ................................................. 6 3。1。4 引脚介绍 ......................................................... 7 3.1。5 蜂鸣器原理 ........................................................ 7 第四章 软件编程设计 ....................................................... 8 4.1 编程思路 ............................................................... 8 4.2 编程方案的设计 ......................................................... 9 4。2.1 软件功能选择 ...................................................... 9 4。2。2 综合调试 ......................................................... 9 4.2。3 程序清单 .......................................................... 9 心得体会 .................................................................. 16 致谢 ...................................................................... 17 参考文献 .................................................................. 17

第一章 绪论

1.1课程设计目的

应用单片机,基于按键控制蜂鸣器播放多段音乐,利用它的原理组成一个简单的音乐盒。

1。2课程设计任务

1)以单片机为核心部件组成一个简单音乐播放器;

2)利用单片机的定时器产生乐谱的各种频率方波,信号经过放大后由蜂鸣

器发出声音;

3)自行定义按键盘,当有键按下时,能相应的播放出歌曲。有一个停止键

能控制音乐的播放;

1。3课程设计的意义

利用开发板及组成的器件,在软件及硬件上进一步了解单片机的原理,深入了解了单片机C51语言的实际应用,能更深地理解课堂上所学的内容,巩固C语言程序编写,亲身体会作为一名设计人员所需要具备的各种能力,学会理论知识联系实际,提高我们发现问题,分析问题,解决问题和实践动手的能力。

第二章 设计原理

2.1 设计原理 2.1。1 基本原理简述

声音是通过振动产生的。单片机对某一引脚以一定的频率循环置1置0,该引脚便产生一定频率的方波,方波通过放大,作用于一定的物理实件(蜂鸣器),就产生了一定频率的声音.若改变输出方波的频率,产生的声音随之改变.通过控制输出方波的时间长短,声音的长短也可以得到控制,因此,根据乐谱,以类似的音节及同样的节拍,单片机就可以产生电子音乐。音乐的播放选择可以通过按键的输入得以实现。

为简便起见,以一定的频率方波产生的音在其每个周期内高低幅值得时间各占一半因此,输出引脚在每个方波周期内要动作两次:一次升高,一次降低。即输出引脚的频率是原音频率的两倍。

方波的产生由定时器控制.定时器T0工作在定时方式1,改变TH0及TL0,产生不同的音频频率。必须考虑到中断响应时间的影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十Hz,相当于1/4音程,很容易听出来,对低音部分影响不大。一般中断响应时间为3~6个机器周期,经过反复试验取5个机器周期作为校正最为恰当,表1中所给的定时初值就是考虑中断响应后的定时常数.另外,为避免T1中断可能引起杂音,应将定时器T0中断设为高优先级.这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。

音乐播放器的基本硬件电路有六部分组成:单片机、时钟与复位电路、选择按键输入电路、音频发生器、音频放大器和扬声器。

2.1。2 关于音乐的原理知识

在音乐中使用的各个固定频率的音叫音级[1].常用符号C、D、E、F、G、A、B、

c、d、e、……a1、b1、c2、d2……表示,它们对应于钢琴上的白键。两音之间音高的距离叫音程。在上述音级中,E与F、B与C之间音高的距离仅为其它相邻音级之间距离的一半,称它们之间的音程为半音音程,而称其它相邻各音之间的距离为全音音程。在这些全音音程之间又加入新的半音音级,用符号﹟C、﹟D、﹟F、﹟G、﹟A、﹟c、﹟d、﹟f、……表示,对应于钢琴上的黑键。音持续时间的长短

即时值,一般用拍数表示.休止符表示暂停发音。下面分别是各音符及对应频率(表2.1)与节拍表(表2.2)

表2。1 各音符及对应频率

音符 简谱码 频率 音符 简谱码 频率 音符 简谱码 频率 音符 简谱码 频率 音符 简谱码 频率 音符 简谱码 频率

低DO DO_L 262HZ 低#FA FA#_L 370HZ 中DO DO 523HZ 中#FA FA# 740HZ 高DO DO_H 1047HZ 高#FA FA#_H 1480HZ 低#DO DO#_L 277HZ 低SO SO_L 393HZ 中#DO DO# 554HZ 中SO SO 785HZ 高#DO DO#_H 1109HZ 高SO SO_H 1568HZ 低RE RE_L 294HZ 低#SO SO#_L 415HZ 中RE RE 587HZ 中#SO SO# 831HZ 高RE RE_H 1174HZ 高#SO SO#_H 1661HZ 低#RE RE#_L 311HZ 低LA LA_L 440HZ 中#RE RE# 622HZ 中LA LA 880HZ 高#RE RE#_H 1245HZ 高LA LA_H 1760HZ 低MI MI_L 330HZ 低#LA LA#_L 466HZ 中MI MI 659HZ 中#LA LA# 932HZ 高MI MI_H 1318HZ 高#LA LA#_H 1865HZ 低EA FA_L 349HZ 低SI SI_L 494HZ 中EA FA 698HZ 中SI SI 988HZ 高EA FA_H 1397HZ 高SI SI_H 1976HZ 每个音符分为简谱码和节拍码。简谱码为D0-L到SI—H,节拍码为1到16.对应的节拍表如表2.2所示。

对应的拍子:

2/2。。。。。。。。。。.以二分音符为一拍,每小节有两拍(二分音符代表一拍) 2/4.。。。。。。。。。.以四分音符为一拍,每小节有两拍(四分音符代表一拍) 3/4.。.。。。.。。。。以四分音符为一拍,每小节有三拍(四分音符代表一拍) 4/4.。。.。。。。.。.以四分音符为一拍,每小节有四拍(四分音符代表一拍)

表2.2 节拍表

拍数 1/8 1/4 1/2 3/4 1 5/4 3/2 7/4 字符 00H 01H 02H 03H 04H 05H 06H 07H 拍数 2 5/2 3 7/2 4 5 6 8 字符 08H 09H 0AH 0BH 0CH 0DH 0EH 0FH

第三章 ATMEL 89C51概况

3.1 ATMEL 89C51简介 3.1.1 AT89C51单片机

AT89C51是美国ATMEL公司推出的系列单片机,将多种功能的8位CPU与FPEROM(快闪可编程/擦除只读存储器)结合在一个芯片上,是一种低功耗、高性能的CMOS控制器,为很多嵌入式控制应用提供了非常灵活而又价格适宜的方案,其性能价格比远高于同类芯片。它与MCS-51指令系统兼容,片内FPEROM允许对程序存储器在线重复编程,也可用常规的EPROM编程器编程,可循环写入/擦除1000次。89C51内含4KB的FPEROM,一般的EEPROM的字节擦除时间和写入时间基本上均为10ms,对于任一个实时控制系统来说,这样长的时间是不可能在线修改程序的。

3。1.2 单片机CPU结构(如图3.1)

图3.1单片机CPU结构

3.1.3 AT89C51用户系统

 CPU为Atmel公司生产的89C51/89C52/89C55等.出厂所配晶振频率为

11.0592MH,每个机器周期为1.085us,用户更换晶振以提高速度;  存贮器为64K,前4K/8K20K在CPU内部,其它程序在EPR0M27512中;  数据存贮器为32K(62256),地址为8000—FFFFH;  Ⅰ/O扩展8155,片内RAM地址∶200O-20FFH ;  8155命令口地址为∶2100H ;

 A口地址∶21O1H B口地址:2102H C口地址:2103H ;  T低八位∶2104H T高八位∶2105H ;  多路模拟开关的使用∶

IN0∶P1=0F8H IN4:P1=0FCH IN1∶P1=0F9H IN5:P1=OFDH IN2∶P1=0FAH IN5:P1=0FEH IN3∶P1=0FBH IN7:P1=0FFH  不掉电数据存贮器为∶500EH—507FH ;

 控制板∶160x1O9(mm) 供电∶+5V300mA +12V100mA —12V100mA ;  AT89C51是一种低功耗、高性能的片内含有4KB快闪可编程/擦除只读存储器

(FPEROM—Flash Programmable and Eraseable Read Only Memory)的8位CMOS微控制器,使用高密度、非易失存储技术制造,并且与80C51引脚和指令系统完全兼容;  主要性能:

与MCS—51 微控制器产品系列兼容;

片内有4KB可在线重复编程的快闪擦写存储器 。

3。1.4 引脚分布如图(3。2)

图3。2 89C51引脚图

3.1.5 蜂鸣器原理如图(3。3)

图3.3 蜂鸣器原理图

第四章 软件编程设计

4。1 编程思路

想要产生音频信号,只要算出某一音频的周期(频率的倒数),将此周期除以2即为半周期的时间,利用定时器计时此半周期时间,计时到后取反输出,重复此过程即得到此频率的声音信号。此信号从P3.0脚输出。

定时器T0工作在定时方式1,改变TH0及TL0,产生不同的音频频率.必须考虑到中断响应时间的影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十Hz,相当于1/4音程,很容易听出来,对低音部分影响不大。一般中断响应时间为3~6个机器周期,经过反复试验取5个机器周期作为校正最为恰当,表2。1中所给的定时初值就是考虑中断响应后的定时常数.另外,为避免T1中断可能引起杂音,应将定时器T0中断设为高优先级。这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。本设计中单片机晶振频率为11.0592MHz。

每个音符使用两个字节。低位字节(偶地址)代表音级,00H表示不发音(休止符),01H~30H依次表示的音级为c、﹟c、d、﹟d、e、f、……a3、﹟a3、b3 ,详见表2.1。高位字节(奇地址)代表音符的时值(拍数),00H~0FH依次表示拍数为1/8拍(0.10s)~8拍(6。40s),见表2.2。乐曲的结束标志是两个字节:0FFH,0FFH。

设计延时程序125ms,来控制节拍,并在延时中判断是否有停止键按下,以便随时停止音乐.改变延时程序的延迟时间,即可实现歌曲的快慢演奏.

主程序的任务是按顺序读取数据表中的字节,根据情况调用音级子程序和演唱子程序,启动定时器T0;通过延时控制节拍,并循环回音级子程序,等待演唱完毕。

要编写的乐谱按要求以音符字节数据表的形式存放在程序中,改变乐曲就是通过改变该数据表的内容来实现的。

主程序的任务是按顺序读取数据表中的字节,根据情况调用音级子程序和音长子程序,启动定时器T0;根据定时器T1应中断的次数,启动定时器T1。数据表读完后,根据所设置的循环演奏次数决定是否结束程序.音级子程序的任务是取出字节中的音级部分,分析TH0和TL0中应送入何值,送给33H,34H.演唱子

程序的任务是取出对应频率值,并乘以2,启动T0,实现发音.之后执行延时程序,体现节拍,依此循环,直到音乐结束。

当乐曲较长时(超过254个字节),数据表指针溢出,应及时修改基址寄存器DPTR内容,即数据表的表头指针。

4.2 编程方案的设计 4.2。1 软件功能选择

对于4个按键的功能设计,一个停止键P2.5,其余三个键(P1。0,P1.2,P1.3)分别对应三首歌曲.演奏过程中,按停止键可使乐曲停止,继续按其他键继续选择其他歌曲演奏.选歌的按键使用8279键盘扫描以获得键值.停止键使用的单片机的外部中断1实现其功能的。

4。2。2 综合调试

在开发板上进行调试,先是进行单个模块调试,在开发板上进行播放歌曲

的调试,使其能单曲循环播放,当有开关键按下时,就停止播放歌曲,再按下时,又重新播放歌曲。最终实现当有控制键按下时,能够演奏对应的歌曲,再按播放下一首,当停止键按下时,停止播放歌曲。

4。2。3程序清单

#define uchar unsigned char //定义一下方便使用 #define uint unsigned int #define ulong unsigned long

#include //包括一个52标准内核的头文件 char code dx516[3] _at_ 0x003b;//这是为了仿真设置的 sbit BEEP=P3^7; //喇叭输出脚 sbit P10=P1^0;

sbit K1= P1^0; //播放仙剑 sbit K2= P1^2;//播放月亮 sbit K3= P1^3;//播放小星星

sbit K4= P2^5;//停止播放

uchar th0_f; //在中断中装载的T0的值高8位 uchar tl0_f; //在中断中装载的T0的值低8位 //T0的值,及输出频率对照表 uchar code freq[36*2]={ 0xA9,0xEF,//00220HZ ,1 //0 0x93,0xF0,//00233HZ ,1# 0x73,0xF1,//00247HZ ,2 0x49,0xF2,//00262HZ ,2# 0x07,0xF3,//00277HZ ,3 0xC8,0xF3,//00294HZ ,4 0x73,0xF4,//00311HZ ,4# 0x1E,0xF5,//00330HZ ,5 0xB6,0xF5,//00349HZ ,5# 0x4C,0xF6,//00370HZ ,6 0xD7,0xF6,//00392HZ ,6# 0x5A,0xF7,//00415HZ ,7 0xD8,0xF7,//00440HZ 1 //12 0x4D,0xF8,//00466HZ 1# //13 0xBD,0xF8,//00494HZ 2 //14 0x24,0xF9,//00523HZ 2# //15

0x87,0xF9,//00554HZ0xE4,0xF9,//00587HZ 4 //17 0x3D,0xFA,//00622HZ 4# //18 0x90,0xFA,//00659HZ 5 //19 0xDE,0xFA,//00698HZ 5# //20 0x29,0xFB,//00740HZ 6 //21 0x6F,0xFB,//00784HZ 6# //22 0xB1,0xFB,//00831HZ 7 //23 0xEF,0xFB,//00880HZ `1

0x2A,0xFC,//00932HZ `1# 0x62,0xFC,//00988HZ `2 0x95,0xFC,//01046HZ `2# 0xC7,0xFC,//01109HZ `3 0xF6,0xFC,//01175HZ `4 0x22,0xFD,//01244HZ `4# 0x4B,0xFD,//01318HZ `5 0x73,0xFD,//01397HZ `5# 0x98,0xFD,//01480HZ `6 0xBB,0xFD,//01568HZ `6# 0xDC,0xFD,//01661HZ `7 //35 };

//定时中断0,用于产生唱歌频率 timer0() interrupt 1 {

TL0=tl0_f;TH0=th0_f; //调入预定时值 BEEP=~BEEP; //取反音乐输出IO }

//****************************** //音乐符号串解释函数

//入口:要解释的音乐符号串,输出的音调串,输出的时长串 changedata(uchar *song,uchar *diao,uchar *jie) {

uchar i,i1,j;

char gaodi; //高低+/—12音阶 uchar banyin;//有没有半个升音阶 uchar yinchang;//音长

uchar code jie7[8]={0,12,14,16,17,19,21,23}; //C调的7个值 *diao=*song;

for(i=0,i1=0;;) {

gaodi=0; //高低=0 banyin=0;//半音=0 yinchang=4;//音长1拍

if((*(song+i)=='|’) || (*(song+i)==' ')) i++; //拍子间隔和一个空格过滤 switch(*(song+i)) {

case ’,’: gaodi=—12;i++;//低音 break;

case '`’: gaodi=12;i++; //高音 break; }

if(*(song+i)==0) //遇到0结束 {

*(diao+i1)=0; //加入结束标志0 *(jie+i1)=0; return; }

j=*(song+i)-0x30; i++; //取出基准音 j=jie7[j]+gaodi; //加上高低音 yinc: switch(*(song+i)) {

case ’#': //有半音j加一个音阶 i++;j++; goto yinc;

case '—': //有一个音节加长

yinchang+=4; i++; goto yinc;

case ’_': //有一个音节缩短 yinchang/=2; i++; goto yinc;

case '。’: //有一个加半拍 yinchang=yinchang+yinchang/2; i++; goto yinc; }

*(diao+i1)=j; //记录音符 *(jie+i1)=yinchang; //记录音长 i1++; } }

//****************************************** //奏乐函数

//入口:要演奏的音乐符号串 void play(uchar *songdata) {

uchar i,c,j=0; uint n;

uchar xdata diaodata[112]; //音调缓冲 uchar xdata jiedata[112]; //音长缓冲

changedata(songdata,diaodata,jiedata); //解释音乐符号串 TR0=1;

for(i=0;diaodata[i]!=0;i++) //逐个符号演奏

{

tl0_f=freq[diaodata[i]*2]; //取出对应的定时值送给T0 th0_f=freq[diaodata[i]*2+1];

for(c=0;c〈jiedata[i];c++) //按照音长延时 {

for(n=0;n〈32000;n++);

if((!K1)||(!K2)||(!K3)||(!K4))//发现按键,立即退出播放 { TR0=0; return; } } TR0=0;

for(n=0;n<500;n++); //音符间延时 TR0=1; } TR0=0; } //仙剑

uchar code xianjian[]={

”|3_3_3_2_3-|2_3_2_2_,6,6_,7_|12_1_,7,6_,5_|,6---|\" ”3_3_3_2_3。6_|5_6_5_5_22_3_|45_4_32_1_|3。--3_|” \"67_6_55_3_|5—-3_5_|26_5_32_3_|3-—-|\" ”26_6_6-|16_6_66_7_|`17_6_76_7_|3.—-3_|” \"67_6_55_3_|5—-3_5_|67_6_76_7_|3---|\" \"26_6_6-|16_6_66_7_|`17_6_7。5_|6—-—|” };

//月亮代表我的心 uchar code song3[]={

\"5—5_3_2_1_|3-—-|6—6_4_2_1_\" ”,7—-,5_|1。3_5.1_|,7.3_5 5_|” \"6.7_`1。6_|6_5_5-3_2_|1。1_13_2_|\" \"1.1_12_3_|2。1_,62_3_|2—— ,5_|\" \"1。3_5.1_|,7.3_55_|6.7_`1。6_|\" ”6_5_5—3_2_|1.1_13_2_|1。1_12_3_” ”2。,6_,71_2_|1—-” }; //小星星

uchar code mamahao[]={ \"1155|665—|4433|221—|” \"5544|332-|5544|332-|\" \"1155|665—|4433|221—|” };

//三个按键选择三首不同的音乐播放,一个键停止播放 void main(void) // 主程序 {

TMOD = 0x01; //使用定时器0的16位工作模式 TR0 = 0;

ET0 = 1; //定时器0中断 EA = 1; //打开总中断 while(1) { if(!K1) {

while(!K1);

play(xianjian); //播放音乐 } if(!K2)

while(!K2);

play(song3); //播放音乐 } if(!K3) {

while(!K3);

play(mamahao);} } }

播放音乐

//

心得体会

此次课程设计培养了学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在.因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。

回顾起此次单片机课程设计,我仍感慨颇多,的确,从选题到定稿,从理论到实践,在接近四星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。

通过这次单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。

我们花费了大量的时间和精力,更重要的是,我们在学会创新的基础上,同时还懂得合作精神的重要性,学会了与他人合作.学习单片机这门课程要掌握单片机指令系统中汇编语言各种基本语句的意义及汇编语言程序设计的基本知识和方法,以及单片机与其他设备相连接的输入输出中断等接口技术。使学生从硬件软件的结合上理论联系实际,提高动手能力,从而全面掌握单片机的应用。

致谢

本文的撰写是在老师、同学和朋友的支持下完成的,在此向他们表示衷心的感谢,首先感谢我们的XX老师,X老师作为我们专业课的任教老师具有广博的专业知识,超前的学术思维,指引着我们在学术研究中前进的方向,正是在X老师的悉心授课下,我们从对单片机这门课的一无所知到受益匪浅.X老师在工作中治学严谨、踏实认真;在生活中态度和蔼、平易近人,在平时的交谈中总可以从他的话语中得到思维上的启迪,他不仅是我们的良师更是我们的益友。在此真诚的感谢他!

另外还要感谢我们的同学和朋友们,他们给了我许多的建议和帮助,帮助我们查漏补缺,真得很感激他们。

最后感谢在我们背后默默支持我们的家人,在他们的关爱和鼓励下,我们体会到了前所未有的动力,让我们能够克服重重的困难完成任务。

参考文献

[1]孙毅刚,彭宇,赵光权,《单片机原理及接口技术》,人民邮电出版社,2011.08 [2] 马忠梅,籍顺心,张凯,马岩,《单片机的C语言应用程序设计》,北京航空航天大学出版社,2003年

[3]李朝青,《单片机原理及接口技术》,北京航空航天大学出版社.1998年 [4] 赵建领,《51系列单片机开发宝典》,电子工业出版社.2007年

因篇幅问题不能全部显示,请点此查看更多更全内容