资源描述
电子综合设计与制作实践设计报告
摘要
摘要:在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作等优点。
在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的智能密码锁,它除具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。
本次设计使用 STC公司的STC89C52实现一基于单片机的电子密码锁的设计,其主要具有如下功能:
1.密码通过键盘输入,若密码正确,则将锁打开,语音提示开锁,蜂鸣器播放一段开锁音乐。
2.密码可由管理员修改设定,锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时需要二次确认,以防止误操作。
3.报警、锁定键盘功能。密码输入错误,LCD液晶显示器会出现错误提示,同时语音提示错误信息,蜂鸣器鸣响;若密码输入错误次数达到3次,蜂鸣器报警并且锁定键盘,蜂鸣器播放一段报警音乐。
主要的设计过程:
首先,选用STC公司的单片机STC89C52,以及选用其他电子元器件。
第二步,使用Alitm Designer 设计硬件电路原理图,完成人工布线。
第三步,使用 Keil C51 软件编写单片机的 C 语言程序、仿真、软件调试。最后,联合软、硬件调试电路板,完成本次电子综合设计。
关键词:4×4矩阵键盘;STC89C52;ISD1760;LCD液晶显示器;密码二次确认
目录
第一部分 总 述 4
一.引言 4
二.课题内容及要求 4
第二部分 硬件设计部分 5
一.设计总框图 5
二.单片机STC89C52介绍 5
三.输入键盘 6
四.LCD液晶显示 8
五.ISD1760语音提示 9
六.蜂鸣器发声 10
第三部分 软件设计部分 11
一.程序流程图 11
二.键盘扫描设计 11
三.液晶显示设计 13
四.语音提示设计 18
五.蜂鸣器发声设计 9
第四部分 调试报告 20
一.硬件调试 24
二.软件调试 24
三.调试心得 24
总结 25
参考资料 25
附录 26
一.元器件清单 26
二.工具 27
三.硬件设计总图 27
四.源程序 28
第一部分 总 述
一.引言
科技的发展是电子产品的应用越来越广泛,电子电路的设计也越来越重要。随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于结构简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的青睐。同时随着电子产品向智能化和微型化的不断发展,数字逻辑电路电子芯片已成为电子产品研制和开发的首选控制器。用电子逻辑电路设计的密码锁经实际操作表明,该密码锁具有安全、实用、成本低等优点,符合一般锁的需要,具有一定的现实意义。
本系统采用STC公司的单片机STC89C52作为主控芯片,结合外围的矩阵键盘输入、LCD显示、报警系统和开锁等电路,用C语言编写主控芯片的控制程序,设计了一款可以多次更改密码且具有报警功能的电子密码锁。用户想要打开锁,必先通过提供的键盘输入正确的密码才能将锁打开,且密码输入错误时有提示,为了提高安全性,当密码连续输入错误三次将报警。密码只可以由管理员自己修改、设定,锁打开后只有管理员才能修改密码。修改之前必须先输入管理员登录密码,然后再次输入旧密码,在输入新密码时需要二次确认,以防止误操作。
二.课题内容及要求
1.设计内容:
采用LCD液晶显示,4*4的矩形键盘输入的基于单片机的电子密码锁,能够实现修改密码,纠错,确认的功能。
2.基本要求:
硬件布局基本合理,焊接比较美观,器件运用基本合理,用比较简单的电路实现修改密码、纠错、确认等基本功能。
3. 提高部分:
电子密码锁能够实现管理员登陆、动态显示登陆密码、登陆密码验证,登陆成功与否给出提示、超次锁定并报警鸣示、在登陆成功的情况下管理员可以进行修改和确认密码,新密码位数不够或太简单给出提示,能在修改密码成功的情况下给出提示。
另外,可以用语音发声芯片发出相应的提示信息,并用蜂鸣器报警,播放简单的音乐段。
本方案采用一种以STC89C52为核心的单片机控制方案。利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能,以及一些扩展功能。
第二部分 硬件设计部分
一.设计总框图
图一 总体设计框图
二. 单片机STC89C52介绍
STC89C52是一种带8K字节闪烁可编程可檫除只读存储器(FPEROM-Flash Programable and Erasable Read Only Memory )的低电压,高性能COMOS8的微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
STC89C52具体介绍如下:
① 主电源引脚(2根)
VCC(Pin40):电源输入,接+5V电源
GND(Pin20):接地线
②外接晶振引脚(2根)
XTAL1(Pin19):片内振荡电路的输入端
XTAL2(Pin20):片内振荡电路的输出端
③控制引脚(4根)
RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。
ALE/PROG(Pin30):地址锁存允许信号
PSEN(Pin29):外部存储器读选通信号
EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。
④可编程输入/输出引脚(32根)
STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。
P0口(Pin39~Pin32):8位双向I/O口线,名称为P0.0~P0.7
P1口(Pin1~Pin8):8位准双向I/O口线,名称为P1.0~P1.7
P2口(Pin21~Pin28):8位准双向I/O口线,名称为P2.0~P2.7
P3口(Pin10~Pin17):8位准双向I/O口线,名称为P3.0~P3.7
STC89C52主要功能如表二所示。
表二 STC89C52主要功能
主要功能特性
兼容MCS51指令系统
8K可反复擦写Flash ROM
32个双向I/O口
256x8bit内部RAM
3个16位可编程定时/计数器中断
时钟频率0-24MHz
2个串行中断
可编程UART串行通道
2个外部中断源
共6个中断源
2个读写中断口线
3级加密位
低功耗空闲和掉电模式
软件设置睡眠和唤醒功能
三. 输入键盘
由于本设计所用到的按键数量较多而不适合用独立按键式键盘。采用的是矩阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多I/O口。本设计中使用的这个4*4键盘不但能完成密码的输入还能作特别功能键使用,比如清空显示功能等。键盘的每个按键功能在程序设计中设置。其原理图如下:
图二 矩阵键盘
每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N×M个按键的键盘。
在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。
当确认有按键按下后,下一步就要识别哪一个按键按下。对键的识别通常有两种方法:一种是常用的逐行扫描查询法;另一种是速度较快的线反转法。
对照图四所示的4×4键盘,说明线反转法工作原理:
首先辨别键盘中有无键按下,有单片机I/O口向键盘送全扫描字,然后读入行线状态来判断。方法是:向行线输出全扫描字00H,把全部列线置为低电平,然后将列线的电平状态读入累加器A中。如果有按键按下,总会有一根行线电平被拉至低电平从而使行线不全为1。
判断键盘中哪一个键被按下使通过将列线逐列置低电平后,检查行输入状态来实现的。方法是:依次给列线送低电平,然后查所有行线状态,如果全为1,则所按下的键不在此列;如果不全为1,则所按下的键必在此列,而且是在与零电平行线相交的交点上的那个键。
图三 按键操作面板示意图
(顺序以实际电路为准)
10个数字键用来输入密码,0键有切换模式的功能,另外6个功能键分别是:权限键、退出键、清零键、开启键、删除键、确定键。其中权限键的功能是设置密码修改权限,只有管理员可以登录修改密码。退出键的功能是退出当前程序。清零键键的功能是当前输入数据清零。开启键的功能是退出屏幕保护界面,开启LCD显示功能:未按下时LCD动态显示屏保图形,需要开锁时按下此键,LCD上会显示“Hello Enter your code”。未输入密码时,单独按下0键具有切换模式功能,密码输入后0作为数字键。
四. LCD液晶显示
为了提高密码锁的密码显示效果能力。本设计的显示部分由液晶显示器LCD1602取代普通的数码管来完成。只有按下键盘上的开启按键后,显示器才处于开启状态。同理只有按下退出按键后显示器才处于屏保状态。否则显示器将一直处于开启状态,当需要对密码锁进行开锁时,按下键盘上的开启按键后利用键盘上的数字键0-9输入密码,每按下一个数字键后在显示器上显示一个*,输入多少位就显示多少个*(设定为6个)。当密码输入完成时,按下确认键,如果输入的密码正确的话, LCD上显示“Successfully Lock Is Opened”,单片机其中P3.1引角会输出低电平,使三极管Q1导通,电磁铁吸合,电子密码锁被打开,如果密码不正确,LCD显示屏会显示“Code Error”,P3.1输出的是高电平,电子密码锁不能被打开。若连续三次密码输入错误,则密码所被锁定,LCD上显示“Please Wait….”。若密码修改太简单,则显示“Code Is Too Simple”。若输入的密码大于原密码,则LCD上显示“Large”,若输入的密码小于原密码,LCD上显示“Small”。通过LCD显示屏,可以清楚的判断出锁所处的状态。其显示部分引脚接口如图六所示:
图四 显示电路原理图
五. ISD1760语音提示
本设计采用ISD760单片60秒高保真语音录放电路进行语音操作,实时提示当前状态。当密码连续输入3次错误之后语音芯片给出语音提示“连续3次密码输入错误,键盘已锁定”。语音电路如图:
图五 语音电路原理图
六. 蜂鸣器发声
报警模块由蜂鸣器和单片机组成。选择一只压电式蜂鸣器,压电式蜂鸣器工作时约需要100mA驱动电流。蜂鸣器电路如图七所示。当89C52的P3.1口输出为低电平时,蜂鸣器产生蜂鸣音,89C52输出为高电平时,蜂鸣器不发声。
图六 报警电路原理图
第三部分 软件设计部分
一.程序流程图
图七 程序流程图
二.键盘扫描设计
键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦有按键按下,便转向相应的子程序处理,处理结束再返回。
主要程序如下:
uchar KeyScan(void) //键盘扫描函数,使用行列逐级扫描法
{
uchar Val;
KeyPort=0xf0; //高四位置高,低四位拉低
if(KeyPort!=0xf0) //表示有按键按下
{
delay(10); //去抖
if(KeyPort!=0xf0)
{ //表示有按键按下
KeyPort=0xfe; //检测第一行
if(KeyPort!=0xfe)
{
Val=KeyPort&0xf0;
Val+=0x0e;
while(KeyPort!=0xfe);
delay(10); //去抖
while(KeyPort!=0xfe);
return Val;
}
KeyPort=0xfd; //检测第二行
if(KeyPort!=0xfd)
{
Val=KeyPort&0xf0;
Val+=0x0d;
while(KeyPort!=0xfd);
delay(10); //去抖
while(KeyPort!=0xfd);
return Val;
}
KeyPort=0xfb; //检测第三行
if(KeyPort!=0xfb)
{
Val=KeyPort&0xf0;
Val+=0x0b;
while(KeyPort!=0xfb);
delay(10); //去抖
while(KeyPort!=0xfb);
return Val;
}
KeyPort=0xf7; //检测第四行
if(KeyPort!=0xf7)
{
Val=KeyPort&0xf0;
Val+=0x07;
while(KeyPort!=0xf7);
delay(10); //去抖
while(KeyPort!=0xf7);
return Val;
}
}
}
return 0xff;
}
/**********************按键值处理函数,返回扫键值******************/
uchar KeyPro(void)
{
switch(KeyScan())
{
case 0xee:return 1;break;//1按下相应的键显示相对应的码值
case 0xde:return 2;break;//2
case 0xbe:return 3;break;//3
case 0xed:return 4;break;//4
case 0xdd:return 5;break;//5
case 0xbd:return 6;break;//6
case 0xeb:return 7;break;//7
case 0xdb:return 8;break;//8
case 0xbb:return 9;break;//9
case 0xe7:return 10;break;//删除
case 0xd7:return 0;break;//0模式
case 0xb7:return 11;break;//确定
case 0x7e:return 13;break;//开启
case 0x7d:return 14;break;//清零
case 0x7b:return 15;break;//退出
case 0x77:return 16;break;//权限
default:return 12;break;
}
}
三.液晶显示设计
由于是显示数据,所以就要用到如下几个显示子程序,分别是:开锁状态显示子程序、密码输入及修改状态显示子程序、密码输入错误后的提示子程序。密码在规定的时间内输入错误次数超过3次后的锁定状态显示子程序,输入密码错误的情况下清除密码子程序等。
动态显示主要程序:
void delay_gd(int ms)
{ // 延时子程序
int i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
bit lcd_bz()
{ // 测试LCD忙碌状态
bit result;
rs = 0;
lcdrw = 1;
lcden = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P0 & 0x80);
lcden = 0;
return result;
}
void lcd_wcmd(uchar cmd)
{ // 写入指令数据到LCD
while(lcd_bz());
rs = 0;
lcdrw = 0;
lcden = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
lcden = 1;
_nop_();
_nop_();
_nop_();
_nop_();
lcden = 0;
}
void lcd_pos(uchar pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
void lcd_wdat(uchar dat)
{ //写入字符显示数据到LCD
while(lcd_bz());
rs = 1;
lcdrw = 0;
lcden = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
lcden = 1;
_nop_();
_nop_();
_nop_();
_nop_();
lcden = 0;
}
void lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay_gd(1);
lcd_wcmd(0x0c); //显示开,关光标
delay_gd(1);
lcd_wcmd(0x06); //移动光标
delay_gd(1);
lcd_wcmd(0x01); //清除LCD的显示内容
// delay_gd(1);
}
void lcd_gundong(uchar *dis1)
{
uchar i;
lcd_init(); // 初始化LCD
display2(date);
delay_gd(10);
lcd_wcmd(0x06); //向右移动光标
lcd_pos(0); //设置显示位置为第一行的第1个字符
i = 0;
while(dis1[ i ] != '\0')
{ //显示字符"CQ University"
lcd_wdat(dis1[ i ]);
i++;
temp=KeyPro();
if(temp==13) break;
delay_gd(30); //控制两字之间显示速度
}
delay_gd(200); //控制停留时间
lcd_wcmd(0x01); //清除LCD的显示内容
display2(date);
}
静态显示主要程序:
void write_com(uchar com)
{
P0=com;
rs=0;
lcden=0;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
P0=date;
rs=1;
lcden=0;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcden=0;
write_com(0x38);
delay(10);
write_com(0x0c);
delay(10);
write_com(0x06);
delay(10);
write_com(0x01);
delay(10);
}
/************************定时中断***********************/
void intrupt()
{ TMOD=0X10;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET1=1;
TR1=1;
}
void w_cht(uchar dat)
{
uchar dat1,dat2;
dat1=dat/10;
dat2=dat%10;
write_com(0x80+0x40+0x06);
write_date(0x30+dat1);
write_date(0x30+dat2);
}
void T_rupt() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
t0++;
if(t0==20)
{
t0=0;
miao--;
if(miao>0)
w_cht(miao);
else
TR1=0;
}
}
/**********************显示部分************************/
void display1(uchar *tab)
{
uchar i;
write_com(0x80);
for(i=0;i<16;i++)
{write_date(*tab);
tab++;
}
}
void display2(uchar *tab)
{
uchar i;
write_com(0x80+0x40);
for(i=0;i<16;i++)
{write_date(*tab);
tab++;
}
}
四.语音提示设计
使用独立按键模式,将需要播放的录音录入ISD1760芯片内部,再使用SPI程序控制方式将ISD1760芯片内部的指定地址的录音播放出来。
void Play(uchar num) //形参=1放1段,2放2段,3放3段,4放4段。16个地址是2秒。
{
if(num==0x01){StartAdr=0x001e;EndAdr=0x0028;}
else if(num==0x02){StartAdr=0x0029;EndAdr=0x0033;}
else if(num==0x03){StartAdr=0x0034;EndAdr=0x003c;}
else if(num==0x04){StartAdr=0x003d;EndAdr=0x0045;}
else if(num==0x05){StartAdr=0x0046;EndAdr=0x004f;}
else if(num==0x06){StartAdr=0x0050;EndAdr=0x005b;}
else if(num==0x07){StartAdr=0x005f;EndAdr=0x006b;}
else if(num==0x08){StartAdr=0x006c;EndAdr=0x0079;}
else if(num==0x09){StartAdr=0x007a;EndAdr=0x0087;}
else if(num==0x0a){StartAdr=0x0088;EndAdr=0x0095;}
else if(num==0x0b){StartAdr=0x0097;EndAdr=0x00a2;}
else if(num==0x0c){StartAdr=0x00a3;EndAdr=0x00b1;}
else if(num==0x0d){StartAdr=0x00b2;EndAdr=0x00c0;}
else if(num==0x0e){StartAdr=0x00c5;EndAdr=0x00d6;}
else if(num==0x0f){StartAdr=0x00d7;EndAdr=0x00e4;}
else if(num==0x10){StartAdr=0x00e7;EndAdr=0x00f6;}
else if(num==0x11){StartAdr=0x00f7;EndAdr=0x0107;}
else if(num==0x12){StartAdr=0x0108;EndAdr=0x0120;}
else if(num==0x13){StartAdr=0x0123;EndAdr=0x0140;}
ISD_SendData(0x03);//RESET 复位
ISD_SendData(0x00);//
SS=1;
delay_ms(50);
ISD_SendData(0x01);//PU 上电
ISD_SendData(0x00);
SS=1;
delay_ms(50);
ISD_SendData(0x65);//WR_APC1
ISD_SendData(0xa8);//RD_REC_PTR 录音寄存器
ISD_SendData(0x0C);
SS=1;
delay_ms(50);
statu=0;
while((statu&0x01)==0x00)
{
ISD_SendData(0x05);//RD_STATUS 状态寄存器
ISD_SendData(0x00);
statu=ISD_SendData(0x00);
SS=1;
}
delay_ms(50);
ISD_SendData(0x80);//SETPLAY 从起始地址开始播放到结束地址
ISD_SendData(0x00);
ISD_SendData(StartAdr&0x00ff);
ISD_SendData(StartAdr>>8);
ISD_SendData(EndAdr&0x00ff);
ISD_SendData(EndAdr>>8);
ISD_SendData(0x00);
SS=1;
ISD_SendData(0x05);//RD_STATUS 状态寄存器
ISD_SendData(0x00);
statu=ISD_SendData(0x00);
SS=1;
while((statu&0x04)==0x04)
{
ISD_SendData(0x05);//RD_STATUS 状态寄存器
ISD_SendData(0x00);
statu=ISD_SendData(0x00);
SS=1;
}
ISD_SendData(0x07);//PD 掉电
ISD_SendData(0x00);
SS=1;
}
//******************功 能: 发送数据 返回接收数据
uchar ISD_SendData(uchar BUF_ISD)
{
uchar i,dat=BUF_ISD;
SCLK=1;
SS=0;
for(i=0;i<8;i++)
{
SCLK=0;
I_delay();
if(dat&0x01)
{
MOSI=1;
}
else
{
MOSI=0;
}
dat>>=1;
if(MISO)
{
dat|=0x80;
}
SCLK=1;
I_delay();
}
MOSI=0;
return(dat);
}
五.蜂鸣器发声设计
蜂鸣器的工作原理
蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机 IO 引脚输出的电流较小,单片机输出的 TTL 电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路,一多半采取一个三极管来放大驱动蜂鸣器。蜂鸣器的正极接到 Q1 的集电极 C 极上面,蜂鸣器的负极地,三极管发射极 E 极接电源 VCC,基极 B 经过限流电阻 R33 后由单片机的P3.1引脚控制,当P3.1输出高电平时,三极管 T1 截止,没有电流流过线圈,蜂鸣器不发声;当P3.1输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。因此,我们可以通过程序控制P3.1脚的电平来使蜂鸣器发出声音和关闭声音。程序中改变单片机P3.1引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色音调的声音,另外改变P3.1输出电平的高低电平占空比则可以控制蜂鸣器的声音大小。
蜂鸣器简单发声程序:
void beep_( uint frq,uint time)
{
uint tt1,tt2;
for(tt1=time;tt1>0;tt1--)
{ beep=0;
for(tt2=frq;tt2>0;tt2--);
beep=1;
for(tt2=frq;tt2>0;tt2--);
}
}
蜂鸣器播放歌曲
首先,蜂鸣器按其结构可分为两种蜂鸣器:压电式、电磁式。有源蜂鸣器内部带振荡源,无源蜂鸣器内部不带振荡源。这里所说的“源”不是指“电源”,而是指“振荡源”。 有源蜂鸣器直接接上额定电源就可连续发声;而无源的需要在其供电端上加上高低不断变化的电信号才可以驱动发出声音。对于无源的我们可以先让 BUZZ=1 接着延时一小段时间,在又关闭 BUZZ(即 BUZZ=0);这样才能听到连续变化的声音。
蜂鸣器播放歌曲程序:
unsigned char timer0h, timer0l, time;
//--------------------------------------
//单片机晶振采用12MHz
//频率-半周期数据表 高八位 本软件共保存了四个八度的28个频率数据
code unsigned char FREQH[] = {
0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567
0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i
0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567
//频率-半周期数据表 低八位
code unsigned char FREQL[] = {
0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567
0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F,//1,2,3,4,5,6,7,i
0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567
0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567
//--------------------------------------
//世上只有妈妈好 数据表 要想演奏不同的乐曲, 只需要修改这个数据表
code unsigned char sszymmh5[] = {
6, 2, 3, 5, 2, 1, 3, 2, 2, 5, 2, 2, 1, 3, 2, 6, 2, 1, 5, 2, 1, 6, 2, 4,
3, 2, 2, 5, 2, 1, 6, 2, 1, 5, 2, 2, 3, 2, 2, 1, 2, 1, 6, 1, 1, 5, 2, 1, 3, 2, 1, 2, 2, 4,
2, 2, 3, 3, 2, 1, 5, 2, 2, 5, 2, 1, 6, 2, 1, 3, 2, 2, 2, 2, 2, 1, 2, 4,
5, 2, 3, 3, 2, 1, 2, 2, 1, 1, 2, 1, 6, 1, 1, 1, 2, 1, 5, 1, 6,
0, 0, 0};
//--------------------------------------
//可惜不是你 数据表
code unsigned char sszymmh1[] = {
6,2,1, 5,3,
展开阅读全文