欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1827|回復: 1
打印 上一主題 下一主題
收起左側

基于51單片機電子琴的設計 求程序

[復制鏈接]
跳轉到指定樓層
樓主
該系統由延時子函數、初始化子函數、數碼管顯示子函數、高低音選擇子函數、播放音樂子函數、演奏模式子函數、定時器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圖.png (23.63 KB, 下載次數: 29)

PCB

PCB

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

元器件

元器件

簡易電子琴設計.rar

413.22 KB, 下載次數: 13, 下載積分: 黑幣 -5

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表