找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1579|回复: 0
打印 上一主题 下一主题
收起左侧

基于单片机做的回放电子琴程序问题

[复制链接]
跳转到指定楼层
楼主
ID:741837 发表于 2020-5-4 23:53 来自触屏版 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不想用芯片实现回放功能,我想用数组来存放按过的键号,实现回放,写了个程序没有错误和警告,但是仿真的时候没有按键音,也不能回放,不知道是不是哪里没有出来
请大佬看看,指点迷津
#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
/**延时子程序函数*/
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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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