找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1843|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

基于51單片機電子琴的設(shè)計 求程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:836951 發(fā)表于 2020-11-2 15:47 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
該系統(tǒng)由延時子函數(shù)、初始化子函數(shù)、數(shù)碼管顯示子函數(shù)、高低音選擇子函數(shù)、播放音樂子函數(shù)、演奏模式子函數(shù)、定時器0中斷子函數(shù)、外部0中斷子函數(shù)、定時器1中斷子函數(shù)、主函數(shù)和數(shù)據(jù)定義這幾部分組成。
3.2  各部分軟件分析3.2.1  延時子函數(shù)
//延時子函數(shù)
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=340;y>0;y--);               
}
3.2.2  初始化子函數(shù)
//初始化子函數(shù)
void init()
{
        beep=0;
        D1=1;
        D2=0;
        EA=1;//開總中斷
        TCON=0x01;//外部中斷0設(shè)置為邊沿觸發(fā)
        EX0=1;//開外部中斷0
        ET0=1;
        ET1=1;
        TMOD=0x11;//定時器0,1工作在定時狀態(tài),均為方式1
}
3.2.3  數(shù)碼管顯示子函數(shù)
//數(shù)碼管顯示子函數(shù)
void display1()
{
        in(table1[aa]);  //再傳段碼
        out();
        W1=0;;
        delay(1);             //延遲時間2ms以內(nèi)
        W1=1;
        in(table1[cc+1]);  //再傳段碼
        out();
        W2=0;
        delay(1);             //延遲時間2ms以內(nèi)
        W2=1;
}
3.2.4  高低音選擇子函數(shù)
//高低音選擇子函數(shù)
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  播放音樂子函數(shù)
//播放音樂子函數(shù)
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 演奏模式子函數(shù)
//演奏模式子函數(shù)
void display_play()
{
        TR0=0;
        TR1=0;
        yinjie();
        WE2=1;//關(guān)數(shù)碼管2
        WE1=0;//開數(shù)碼管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中斷子函數(shù)
//外部0中斷子函數(shù)
void wb0() interrupt 0
{
        if(k8==0)
        {
                delay(5);
                while(k8==0);
                flag=~flag;
                D1=~D1;
                D2=~D2;
        }               
}
3.2.8 定時器0中斷子函數(shù)
//定時器0中斷子函數(shù)
void t0() interrupt 1
{        
        TR0=0;
        TH0=table2[table4-1];
        TL0=table3[table4-1];
        beep=~beep;
        TR0=1;
}
3.2.9  定時器1中斷子函數(shù)
//定時器1中斷子函數(shù)
void t1() interrupt 3
{        
        TR1=0;
        TH1=table2[7*bb+cc];
        TL1=table3[7*bb+cc];
        beep=~beep;
        TR1=1;
}
3.2.10  主函數(shù)
//主函數(shù)
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;//串行數(shù)據(jù)輸入,對應(yīng)595的14腳SER
sbit SCL1=P0^1;//移位寄存器時鐘輸入,對應(yīng)595的11腳SCK
sbit SCL2=P0^0;//存儲寄存器時鐘輸入,對應(yīng)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*/
                                        };//共陰極數(shù)碼管
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;
//延時子函數(shù)
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++)   //循環(huán)8次,剛好移完8位
        {
              Data<<=1;
                  SCL1=CY;
                  SDA1=1;        //先將移位寄存器控制引腳置為低   
              _nop_();
                  _nop_();
              SDA1=0;
        }
}
void out()
{
        SCL2=0;   //先將存儲寄存器引腳置為低
        _nop_();
        SCL2=1;    //再置為高,產(chǎn)生移位時鐘上升沿,上升沿時移位寄存器的數(shù)據(jù)進入數(shù)據(jù)存儲寄存器,更新顯示數(shù)據(jù)。
        _nop_();
        SCL2=0;
}
//初始化子函數(shù)
void init()
{
        beep=0;
        D1=1;
        D2=0;
        EA=1;//開總中斷
        TCON=0x01;//外部中斷0設(shè)置為邊沿觸發(fā)
        EX0=1;//開外部中斷0
        ET0=1;
        ET1=1;
        TMOD=0x11;//定時器0,1工作在定時狀態(tài),均為方式1
}
//數(shù)碼管顯示子函數(shù)
void display1()
{
        in(table1[aa]);  //再傳段碼
        out();
        W1=0;;
        delay(1);             //延遲時間2ms以內(nèi)
        W1=1;
        in(table1[cc+1]);  //再傳段碼
        out();
        W2=0;
        delay(1);             //延遲時間2ms以內(nèi)
        W2=1;
}
/部分代碼在壓縮包

PCB圖.png (23.63 KB, 下載次數(shù): 29)

PCB

PCB

元件清單.png (11.85 KB, 下載次數(shù): 44)

元器件

元器件

簡易電子琴設(shè)計.rar

413.22 KB, 下載次數(shù): 13, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:626355 發(fā)表于 2020-12-21 11:07 | 只看該作者
程序根本看不起
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表