数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 1138|回复: 7

[C51] 这个利用定时器和蜂鸣器唱歌的程序,频率那么低怎么也可以?

[复制链接]
发表于 2022-8-30 21:00:06 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
#include "reg52.h"
unsigned char Count;
sbit _Speak =P2^3 ;                        //讯响器控制脚 

unsigned char code SONG[] ={      //祝你平安
0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,
                                  //路边的野华不要采
0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C,
0x20,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x80,0xFF,0x20,0x30,0x1C,0x10,0x18,0x20,
0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,
0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,
0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10,0x20,
0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15,0x1F,
0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,
0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,
0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20,
0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00,

};

void Time0_Init()
{
        TMOD = 0x01;
        IE          = 0x82;
        TH0  = 0xD8;
        TL0  = 0xEF;                //12MZ晶振,10ms
}

void Time0_Int() interrupt 1
{
        TH0 = 0xD8;
        TL0 = 0xEF;
        Count++;                        //长度加1
}

/*-------------------------------------------------
功能:1MS延时子程序
-------------------------------------------------*/
void Delay_xMs(unsigned int x)
{
    unsigned int i,j;
    for( i =0;i < x;i++ )
    {
        for( j =0;j<3;j++ );
    }
}

/*-------------------------------------------------
功能:歌曲播放子程序i为播放哪一段曲目
-------------------------------------------------*/
void Play_Song(unsigned char i)
{
        unsigned char Temp1,Temp2;
        unsigned int Addr;
        Count = 0;                                                //中断计数器清0
        Addr = i * 217;
        while(1)
        {
                Temp1 = SONG[Addr++];
            if ( Temp1 == 0xFF )          //休止符
            {
                    TR0 = 0;
                    Delay_xMs(100);
            }
            else if ( Temp1 == 0x00 )          //歌曲结束符
            {
                    return;
            }
            else
            {
                    Temp2 = SONG[Addr++];
                    TR0 = 1;
                          while(1)
                          {
                            _Speak = ~_Speak;
                            Delay_xMs(Temp1);
                            if ( Temp2 == Count )
                            {
                                    Count = 0;
                                    break;
                            }
                    }
            }
        }
}
/*-------------------------------------------------
功能:主程序
-------------------------------------------------*/
void main()
{
        Time0_Init();                        //定时器0中断初始化
        while(1)
        {
                Play_Song(0);                //播放
        }
}


 楼主| 发表于 2022-8-30 21:03:12 | 显示全部楼层
while(1)
                          {
                            _Speak = ~_Speak;
                            Delay_xMs(Temp1);
                            if ( Temp2 == Count )
                            {
                                    Count = 0;
                                    break;
                            }

第一个音符0x26,代入Delay_xMs(Temp1);语句,高电平延时38ms,低电平也是38ms,38+38=76ms,频率才13.16HZ,可是烧入单片机的确能发声。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-1 15:44:33 | 显示全部楼层
本帖最后由 这是我 于 2022-9-2 10:58 编辑

这个程序是买的郭天祥TX-1C试验板配套的例程。

板上用的居然是“”有源“”蜂鸣器,烧入程序后一度以为板子坏了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-1 21:38:52 | 显示全部楼层
/*-------------------------------------------------
功能:1MS延时子程序
-------------------------------------------------*/
void Delay_xMs(unsigned int x)
{
    unsigned int i,j;
    for( i =0;i < x;i++ )
    {
        for( j =0;j<3;j++ );
    }
}

看来问题出在这个延时程序上,这根本就不能延时Xms,好无语。
回复 支持 反对

使用道具 举报

发表于 2022-9-2 09:01:19 | 显示全部楼层
有源蜂鸣器,自带振荡电路,不支持pwm调音吧?
回复 支持 反对

使用道具 举报

发表于 2022-9-2 09:34:11 来自手机浏览器 | 显示全部楼层
这个要无源蜂鸣器才能喝歌吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-2 10:56:01 | 显示全部楼层
mousebat04 发表于 2022-9-2 09:01
有源蜂鸣器,自带振荡电路,不支持pwm调音吧?

仔细听,能听出来。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-2 10:57:19 | 显示全部楼层
860858828 发表于 2022-9-2 09:34
这个要无源蜂鸣器才能喝歌吧

正常是的,我并了一个无源的蜂鸣器效果就出来了。不知道为什么这个板子要配个有源的。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-22 20:38 , Processed in 0.187201 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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