首页 > 其他分享 >蜂鸣器播放DOREMI+普中51单片机+江科大自化协

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

时间:2022-12-30 11:01:14浏览次数:41  
标签:delayms 定时器 蜂鸣器 普中 void 51 unsigned include FreqSelect

现象

  在无源蜂鸣器上循环演奏低音“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中断优先级
}

 

标签:delayms,定时器,蜂鸣器,普中,void,51,unsigned,include,FreqSelect
From: https://www.cnblogs.com/zclv/p/17014348.html

相关文章

  • 郭东白的架构课51
    你好,我是郭东白。上节课我们提到了要和有优秀思考力的人碰撞,从而提升自己的思考质量。那么怎么识别一个人的思考质量呢?在认识了优秀的人后,怎么才能跟他建立长期的信任关系......
  • [51Nod 1383] 整数分解为2的幂
    Description任何正整数都能分解成2的幂,给定整数N,求N的此类划分方法的数量!由于方案数量较大,输出Mod1000000007的结果。比如N=7时,共有6种划分方法。7=1+1+1+1+1+1+1=......
  • [JZOJ5177]【NOIP2017提高组模拟6.28】TRAVEL
    DescriptionSolution显然,答案的L和R一定是某两个边权那么可以直接把边按R排序。枚举L,二分R判断所有的边是否合法,合法的用并查集连起来判断1和N是否在一个集合中即可Co......
  • [51Nod 1223] 分数等式的数量
    Description有这样一个分数等式:1/X+1/Y=1/N,(X,Y,N>0)。给出L,求有多少满足X<Y<=L的等式。例如:L=12,满足条件的等式有3个,分别是:1/3+1/6=1/2,1/4+1/12=1......
  • [JZOJ5165] 小W的动漫
    Description小W最近迷上了日本动漫,每天都有无数部动漫的更新等着他去看,所以他必须将所有的动漫排个顺序,当然,虽然有无数部动漫,但除了1号动漫,每部动漫都有且仅有一部动漫是它......
  • 48.TNS-12518、TNS-00517和 Linux Error:32:Broken pipe
    现象:使用sqlplus登录oracle时出现如下报错:ERROR:ORA-12537:TNS:connectionclosed查看监听日志: log.xmlTNS-12547:TNS:lostcontactTNS-12560:T......
  • P5137 题解
    前言首先感谢所有帮助我卡常的大佬们。题意求\((\sum_{i=0}^{n}a^ib^{n-i})\modp\)的值(\(n\leq10^{18}\),\(p\)不一定为质数)。分析看到数据范围,首先想到快......
  • Hi3516开发笔记(十一):通过HiTools使用网口将uboot、kernel、roofts烧写进eMMC
    前言  前面烧写一直时烧写进入flush,是按照分区烧写。定制的板子挂的是eMMC,前面的烧写步骤一致,但是在烧写目标则时烧写eMMC了。  重新走一遍从无到有通过网口刷定制板......
  • Hi3516开发笔记(十一):通过HiTools使用网口将uboot、kernel、roofts烧写进eMMC
    前言  前面烧写一直时烧写进入flush,是按照分区烧写。定制的板子挂的是eMMC,前面的烧写步骤一致,但是在烧写目标则时烧写eMMC了。  重新走一遍从无到有通过网口刷定制......
  • 【51Nod1133】不重叠的线段
    DescriptionX轴上有N条线段,每条线段有1个起点S和终点E。最多能够选出多少条互不重叠的线段。(注:起点或终点重叠,不算重叠)。例如:[15][23][36],可以选[23][36],这2条线段互......