找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1571|回復: 0
打印 上一主題 下一主題
收起左側(cè)

基于單片機做的回放電子琴程序問題

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:741837 發(fā)表于 2020-5-4 23:53 來自手機 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
不想用芯片實現(xiàn)回放功能,我想用數(shù)組來存放按過的鍵號,實現(xiàn)回放,寫了個程序沒有錯誤和警告,但是仿真的時候沒有按鍵音,也不能回放,不知道是不是哪里沒有出來
請大佬看看,指點迷津
#include<reg51.h>
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
unsigned char keyval;
sbit sound=P3^0;
sbit P31=P0^0;
sbit P34=P3^4;
sbit P35=P3^5;
unsigned int C;
unsigned int f;
unsigned int s;
//低音的音頻
#define l_dao 262
#define l_re 286
#define l_mi 311
#define l_fa 349
#define l_sao 392
#define l_la 440
#define l_xi 494
//中音的音頻
#define dao 523
#define re 587
#define mi 659
#define fa 698
#define sao 784
#define la 880
#define xi 987
//高音的音頻
#define h_dao 1046
#define h_re 1174
#define h_mi 1318
#define h_fa 1396
#define h_sao 1567
#define h_la 1760
#define h_xi 1975
/**延時子程序函數(shù)*/
void delay20ms(void)
{
        unsigned char i,j;
    for(i=0;i<100;i++)
        for(j=0;j<60;j++)
        ;
}
//延時200ms
void delay()
{
        unsigned char i,j;
    for(i=0;i<100;i++)
        for(j=0;j<60;j++)
        ;
}
//輸出音階
void Output_Sound(void)
{
        C=(50000/f)*10;
        TH0=(8192-C)/32;
        TL0=(8192-C)%32;
        TR0=1;
        for(s=0;s<2;s++)
        delay();
        TR0=0;
        sound=1;
        keyval=0xff;
}
//主程序
void main()
{
        unsigned char n,m,k,x,z;
        unsigned char pu[41];
        while(1)
        {
                m=0;
                n=0;
                k=0;
                x=0;
                EA=1;
                ET0=1;
                ET1=1;
        
                TMOD=0x10;
                TH1=(65536-500)/256;
                TL0=(65536-500)%256;
               
                while(n!=1&&m<40)
                {                TR1=1;
                        P34=0;
                        P35=1;
                        switch(keyval)
                        {
                                case 1:f=dao;
                                Output_Sound();
                                pu[m]=dao;
                                m++;
                                break;
                                case 2:f=l_xi;
                                Output_Sound();
                                pu[m]=l_xi;
                                m++;
                                break;
                                case 3:f=l_la;
                                Output_Sound();
                                pu[m]=l_la;
                                m++;
                                break;
                                case 4:f=l_sao;
                                Output_Sound();
                                pu[m]=l_sao;
                                m++;
                                break;
                                case 5:f=sao;
                                Output_Sound();
                                pu[m]=sao;
                                m++;
                                break;
                                case 6:f=fa;
                                Output_Sound();
                                pu[m]=fa;
                                m++;
                                break;
                                case 7:f=mi;
                                Output_Sound();
                                pu[m]=mi;
                                m++;
                                break;
                                case 8:f=re;
                                Output_Sound();
                                pu[m]=re;
                                m++;
                                break;
                                case 9:f=h_dao;
                                Output_Sound();
                                pu[m]=h_dao;
                                m++;
                                break;
                                case 10:f=h_dao;
                                Output_Sound();
                                pu[m]=h_dao;
                                m++;
                                break;
                                case 11:f=xi;
                                Output_Sound();
                                pu[m]=xi;
                                m++;
                                break;
                                case 12:f=la;
                                Output_Sound();
                                pu[m]=la;
                                m++;
                                break;
                                case 13:f=h_la;
                                Output_Sound();
                                pu[m]=h_la;
                                m++;
                                break;
                                case 14:f=h_sao;
                                Output_Sound();
                                pu[m]=h_sao;
                                m++;
                                break;
                                case 15:f=h_fa;
                                Output_Sound();
                                pu[m]=h_fa;
                                m++;
                                break;
                                case 16:f=h_mi;
                                Output_Sound();
                                pu[m]=h_mi;
                                m++;
                                break;
                                case 17:n=1;
                                break;

                        }
                        

                }
        while(pu[k]!=0)
                {
                        P34=1;
                        P35=0;
                        f=pu[k];
                        Output_Sound();
                        k++;
                }
                for(z=0;z<41;z++)
                {
                pu[z]=0;
                }
        }
}
void Time0_serve(void) interrupt 1 using 1
{
    TH0=(8192-C)/32;
        TL0=(8192-C)%32;
        sound=!sound;
}
//定時器t1中斷,進行掃描 判斷健位
void time1_serve(void) interrupt 3 using 2
{
        TR1=0;
        P1=0xf0;
        P2=0xff;
        if((P1&0xf0)!=0xf0)
        {
                delay20ms();
                if((P1&0xf0)!=0xf0)
                {
                        P1=0xfe;//第一行置位低電平
                        if(P14==0)
                        keyval=1;
                        if(P15==0)
                        keyval=2;
                        if(P16==0)
                        keyval=3;
                        if(P17==0)
                        keyval=4;
                        P1=0xfd;//第二行置位低電平
                        if(P14==0)
                        keyval=5;
                        if(P15==0)
                        keyval=6;
                        if(P16==0)
                        keyval=7;
                        if(P17==0)
                        keyval=8;
                        P1=0xfb;//disanhang
                        if(P14==0)
                        keyval=9;
                        if(P15==0)
                        keyval=10;
                        if(P16==0)
                        keyval=11;
                        if(P17==0)
                        keyval=12;
                        P1=0xf7;//dishihang
                        if(P14==0)
                        keyval=13;
                        if(P15==0)
                        keyval=14;
                        if(P16==0)
                        keyval=15;
                        if(P17==0)
                        keyval=16;
                }
        }
        if(P31==0)
        {
                delay20ms();
                if(P31==0)
                keyval=17;

        }
        TR1=1;
        TH1=(65536-500)/256;
        TL1=(65536-500)%256;
}






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

使用道具 舉報

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

本版積分規(guī)則

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

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

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