蜂鸣器播放DOREMI+普中51单片机+江科大自化协

现象

  在无源蜂鸣器上循环演奏低音“DO、RE、MI、FA、SO、LA、SI”这7个音调。

参考程序

1 主函数

 

#include <REGX52.H>
#include "delayms.h"
#include "timer0.h"

sbit Buzzer = P2^5;

//音调与频率对照表,低中高:1,1#,2,2#,3,4,4#,5,5#,6,6#,7
//unsigned int FreqTable[]={
//    63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,
//    64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
//    65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283,
//};

//音调与频率对照表,低中高:1,2,3,4,5,6,7
unsigned int FreqTable[]={
    63628,63835,64021,64103,64260,64400,64528,
    64580,64684,64777,64820,64898,64968,65030,
    65058,65110,65157,65178,65217,65252,65283,
};

unsigned char FreqSelect;

void main()
{
    Timer0Init( );
    while(1)
    {
        if(FreqSelect>19)
            FreqSelect = 0;
        else
            FreqSelect++;
        delayms(500);
    }
}

//定时器中断函数
void timer0_routine() interrupt 1
{
    TL0 = FreqTable[FreqSelect]%256;
    TH0 = FreqTable[FreqSelect]/256;
    Buzzer = !Buzzer;
}

 

2 延时函数

#ifndef _delayms_h_
#define _delayms_h_

    void delayms(unsigned int xms);

#endif
#include <intrins.h>

void delayms(unsigned int xms)        //@11.0592MHz
{
    unsigned char i, j;
    while(xms--)
    {
        _nop_();
        i = 2;
        j = 199;
        do
        {
            while (--j);
        } while (--i);
    }
}

3 定时器函数

#ifndef _timer0_h_
#define _timer0_h_

    void Timer0Init(void);

#endif
#include <REGX52.H>

/**
  * @brief  定时器0初始化,1毫秒@11.0592MHz
  * @param  无
  * @retval 无
  */
void Timer0Init(void)        //1毫秒@11.0592MHz
{
    TMOD &= 0xF0;        //设置定时器模式
    TMOD |= 0x01;        //设置定时器模式
    TL0 = 0x66;            //设置定时初始值
    TH0 = 0xFC;            //设置定时初始值
    TF0 = 0;                //清除TF0标志
    TR0 = 1;                //定时器0开始计时
    ET0 = 1;                //打开定时器0中断
    EA  = 1;            //打开总中断开关
    PT0 = 0;                //设置定时器0中断优先级
}

 

posted @ 2022-12-30 10:51  豌豆茶  阅读(660)  评论(0编辑  收藏  举报