找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1401|回复: 1
收起左侧

基于51单片机电子琴的设计 求程序

[复制链接]
ID:836951 发表于 2020-11-2 15:47 | 显示全部楼层 |阅读模式
该系统由延时子函数、初始化子函数、数码管显示子函数、高低音选择子函数、播放音乐子函数、演奏模式子函数、定时器0中断子函数、外部0中断子函数、定时器1中断子函数、主函数和数据定义这几部分组成。
3.2  各部分软件分析3.2.1  延时子函数
//延时子函数
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=340;y>0;y--);               
}
3.2.2  初始化子函数
//初始化子函数
void init()
{
        beep=0;
        D1=1;
        D2=0;
        EA=1;//开总中断
        TCON=0x01;//外部中断0设置为边沿触发
        EX0=1;//开外部中断0
        ET0=1;
        ET1=1;
        TMOD=0x11;//定时器0,1工作在定时状态,均为方式1
}
3.2.3  数码管显示子函数
//数码管显示子函数
void display1()
{
        in(table1[aa]);  //再传段码
        out();
        W1=0;;
        delay(1);             //延迟时间2ms以内
        W1=1;
        in(table1[cc+1]);  //再传段码
        out();
        W2=0;
        delay(1);             //延迟时间2ms以内
        W2=1;
}
3.2.4  高低音选择子函数
//高低音选择子函数
void yinjie()
{
        if(k10==0)
        {        
                delay(5);
                if(k10==0)
                {   
                        aa=10;
                        bb=0;//返回10为seg[10]显示C
                }
        }
        if(k9==0)
        {        
                delay(5);
                if(k9==0)
                {        
                        aa=11;
                        bb=1;//返回11为seg[11]显示L
                }
        }
        if(k11==0)
        {        
                delay(5);
                if(k11==0)
                {        
                        aa=12;
                        bb=2;//返回12为seg[12]显示H
                }
        }
        if(aa==0)
        {
                aa=13;
        }
}
3.2.5  播放音乐子函数
//播放音乐子函数
void display_music()
{        
        TH0=table2[table4-1];
        TL0=table3[table4-1];
        while(flag==0)
        {        
                if(i<32)
                {
                        TR0=1;
                        delay(57*table5);
                        i++;
                }
                if(i==32)
                {
                        i=0;
                }
        }        
}
3.2.6 演奏模式子函数
//演奏模式子函数
void display_play()
{
        TR0=0;
        TR1=0;
        yinjie();
        WE2=1;//关数码管2
        WE1=0;//开数码管1
        P0=table1[aa];
        if(aa!=13&&flag==1)
        {        
                if(k1==0)
                {        
                        TH1=table2[7*bb+cc];
                        TL1=table3[7*bb+cc];
                        TR1=1;        
                        while(k1==0)
                        {        
                                cc=0;
                                display1();
                        }
                }
                if(k2==0)
                {        
                        TH1=table2[7*bb+cc];
                        TL1=table3[7*bb+cc];
                        TR1=1;
                        while(k2==0)
                        {        
                                cc=1;
                                display1();
                        }
                }        
                if(k3==0)
                {               
                        TH1=table2[7*bb+cc];
                        TL1=table3[7*bb+cc];
                        TR1=1;
                        while(k3==0)
                        {        
                                cc=2;
                                display1();
                        }
             3.2.7 外部0中断子函数
//外部0中断子函数
void wb0() interrupt 0
{
        if(k8==0)
        {
                delay(5);
                while(k8==0);
                flag=~flag;
                D1=~D1;
                D2=~D2;
        }               
}
3.2.8 定时器0中断子函数
//定时器0中断子函数
void t0() interrupt 1
{        
        TR0=0;
        TH0=table2[table4-1];
        TL0=table3[table4-1];
        beep=~beep;
        TR0=1;
}
3.2.9  定时器1中断子函数
//定时器1中断子函数
void t1() interrupt 3
{        
        TR1=0;
        TH1=table2[7*bb+cc];
        TL1=table3[7*bb+cc];
        beep=~beep;
        TR1=1;
}
3.2.10  主函数
//主函数
void main()
{
        init();
        while(1)
        {        
                if(flag==0)
                        display_music();
                else
                        display_play();
        }
}
3.3  总源程序
#include<reg51.h>
#include<intrins.h>
typedef unsigned int  uint;   
typedef unsigned char uchar;
sbit SDA1=P0^2;//串行数据输入,对应595的14脚SER
sbit SCL1=P0^1;//移位寄存器时钟输入,对应595的11脚SCK
sbit SCL2=P0^0;//存储寄存器时钟输入,对应595的12脚RCK
sbit W1=P0^3;
sbit W2=P0^4;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit D1=P2^6;//播放音乐模式
sbit D2=P2^7;//弹奏模式
sbit k8=P3^2;//功能切换键
sbit k9=P3^3;//低音
sbit k10=P3^4;//中音
sbit k11=P3^5;//高音
sbit beep=P2^2;//蜂鸣器接口
uchar code table1[]={   
                                                0x3F,/*0*/
                                                0x06,/*1*/
                                                0x5B,/*2*/
                                                0x4F,/*3*/
                                                0x66,/*4*/
                                                0x6D,/*5*/
                                                0x7D,/*6*/
                                                0x07,/*7*/
                                                0x7F,/*8*/
                                                0x6F,/*9*/
                                                0x37,/*N*///中音        
                                                0x38,/*L*///低音
                                                0x76,/*H*///高音
                                                0x79 /*E*/
                                        };//共阴极数码管
uchar code table2[]={                 
                                                0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,//中音
                                                0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,//低音的高8位
                                                0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
                        };//音阶频率表 低八位
uchar code table3[]={               
                                                0x8E,0xED,0x44,0x6B,0xB4,0xF4,0x2D,//中音
                                                0x21,0xDB,0x87,0xD7,0x68,0xE8,0x5B,//低音的低8位
                                                0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
                                        };
uchar code table4[]={
                                                1,2,3,1,      
                                                1,2,3,1,      
                                                3,4,5,   
                                                3,4,5,     
                                                5,6,5,4,3,1,   
                                                5,6,5,4,3,1,   
                                                1,12/*低音5*/,1,     
                                                1,12,1
                                        };
uchar code table5[]={
                                                4,4,4,4,   
                                                4,4,4,4,     
                                                4,4,8,   
                                                4,4,8,     
                                                2,1,2,1,4,4,   
                                                2,1,2,1,4,4,   
                                                4,4,6,      
                                                4,4,6
                                        };
uchar i;
uchar key,aa=0;
uchar bb,cc;
bit flag=0;
//延时子函数
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=340;y>0;y--);               
}
void in(uchar Data)
{
        uchar i;
        for(i=0;i<8;i++)   //循环8次,刚好移完8位
        {
              Data<<=1;
                  SCL1=CY;
                  SDA1=1;        //先将移位寄存器控制引脚置为低   
              _nop_();
                  _nop_();
              SDA1=0;
        }
}
void out()
{
        SCL2=0;   //先将存储寄存器引脚置为低
        _nop_();
        SCL2=1;    //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
        _nop_();
        SCL2=0;
}
//初始化子函数
void init()
{
        beep=0;
        D1=1;
        D2=0;
        EA=1;//开总中断
        TCON=0x01;//外部中断0设置为边沿触发
        EX0=1;//开外部中断0
        ET0=1;
        ET1=1;
        TMOD=0x11;//定时器0,1工作在定时状态,均为方式1
}
//数码管显示子函数
void display1()
{
        in(table1[aa]);  //再传段码
        out();
        W1=0;;
        delay(1);             //延迟时间2ms以内
        W1=1;
        in(table1[cc+1]);  //再传段码
        out();
        W2=0;
        delay(1);             //延迟时间2ms以内
        W2=1;
}
/部分代码在压缩包

PCB

PCB

元器件

元器件

简易电子琴设计.rar

413.22 KB, 下载次数: 13, 下载积分: 黑币 -5

回复

使用道具 举报

ID:626355 发表于 2020-12-21 11:07 | 显示全部楼层
程序根本看不起
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表