微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > (求看下音阶部分哪里错了)键控流水灯加音阶(音阶无法播放)

(求看下音阶部分哪里错了)键控流水灯加音阶(音阶无法播放)

时间:10-02 整理:3721RD 点击:
新人刚学单片机
电路图如图,应该接线没问题。
主要是仿真运行的时候蜂鸣器只会发出“tutututu”的声音,而不是do,re,mi,fa,so,la,xi。流水灯没什么问题。其实一开始只是做流水灯,做完流水灯想试下加音阶。
代码如下:
#include<reg51.h>
#include<intrins.h>
void delay(unsigned int time);
sbit test=P1^4;
sbit test2=P1^5;
sbit test3=P1^6;
sbit test4=P1^7;
sbit beep=P3^4;
bit time = 0, order = 0,re=0;
unsigned int i=0;    //音符索引
//7 个音符放在方式 2 下的定时寄存器 (TH0,TL0)
unsigned char code HI_LIST[]={0,226,229,232,233,236,238};
unsigned char code LO_LIST[]={0,4,13,10,20,3,8};
key() interrupt 0//INT0中断函数
{
        delay(20);
        switch (P1 & 0x0f)
        {
        case 0x07:
        {
        time = 1;
        order = 0;
        test2=~test2;
        break;
        }//S4下到上,间隔0.1s。
        case 0x0b:
        {
        time = 1;
        order = 1;
        test2=~test2;
        break;
        }//S3上到下,间隔0.1s。
        case 0x0d:
        {
        time = 0;
        order = 1;
        test2=~test2;
        break;
        }//S2下到上,间隔0.5s。
        case 0x0e:
        {
        time = 0;
        order = 0;
        test2=~test2;
        break;
        }//关
        default:break;
        }
test=~test;//测试是否进入中断函数
}
void T0_INT() interrupt 1 //定时器 0 中断函数
{
TL0=LO_LIST[i];
TH0=HI_LIST[i];
beep=~beep;
}
void main()
{
    unsigned char temp = 0xff;
        unsigned int i = 0;
        beep=0;
        EX0=1;
        IP=0x02;//IT0优先
        IE=0x83; //开中断,IT0=1,ET0=1
        TMOD=0x00;
        while(1)
        {
        if (time)
        {
                if (order)
                {
                        temp = 0xfe;//s3
                        for (i=8;i>0;i--)
                        {
                                P0 = temp;
                                TR0=1;
                                delay(50);
                                temp = _crol_(temp, 1);
                TR0=0; //播放一个音符
                                delay(50);
                                if(re)
                    {
                      P0=0xff;
                          re=0;
                          break;
                    }
                        }
                }
                else
                {
                        temp = 0x7f;//s4
                        for (i=8;i>0;i--)
                        {
                                P0 = temp;
                                TR0=1;
                                delay(50);
                                temp = _cror_(temp, 1);
                TR0=0; //播放一个音符
                                delay(50);
                                if(re)
        {
            P0=0xff;
                re=0;
                break;
        }
                        }
                }
        }
        else
        {
                if (order == 1)
                {
                        temp = 0x7f;//s2
                        for (i=8;i>0;i--)
                        {
                                P0 = temp;
                                TR0=1;
                                delay(250);
                                temp = _cror_(temp, 1);  
                TR0=0; //播放一个音符
                delay(250);                               
                                if(re)
        {
            P0=0xff;
                re=0;
                break;
        }
                        }
                }
                else
                {
                        P0 = 0xff;//s1
                        test4=~test4;
                       
                }
        }
        test3=~test3;
}
}

void delay(unsigned int time)
{
        unsigned int x, y;
        for (x = time; x>0; x--)
        {
                for (y = 120; y>0; y--);
        }
}

电路图


下面的四只led只是我用来调试程序用的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top