cleverguyYV 2023-04-06 18:12 采纳率: 100%
浏览 39
已结题

一旦使用调用一个数的方式选择蜂鸣器的频率,蜂鸣器噼里啪啦地响,但直接赋值的话正常

问题如下:

#include <REGX52.H>

sbit Buzzer=P2^5;

void Delay(unsigned int xms)
{
    unsigned char i,j;
    while(xms--)
    {
        i=2;
        j=239;
        do
        {
            while(--j);
        } while (--i);
    }
}

/**
   * @brief  定时器0初始化,1毫秒@12.000Mhz
   * @param  无
   * @retval 无
   */
void Timer0_Init()
{
    TMOD = TMOD & 0xF0; //低四位清零,高四位不变
    TMOD = TMOD | 0x01; //低四位赋值,高四位不变
    TL0 = 0x18; //设置定时初值
    TH0 = 0xFC; //设置定时初值
    TF0 = 0; //清除TF0溢出中断标志,加到65536后TF0会被置为1
    TR0 = 1; //允许定时器0计时
    ET0 = 1;
    EA  = 1;
    PT0 = 0;
}

//FrequencyTable 频率表
unsigned int FreqTable[]=
(     
     63461,63578,63688,63791,63889,63981,64069,64151,64229,64302,64371,64436,
     64498,64556,64611,64663,64712,64758,64802,64843,64882,64918,64953,64986,
     65017,65046,65073,65099,65124,65147,65168,65189,65208,65227,65244,65260
);

问题出在接下来的函数中

//频率选择
unsigned char FreqSelect;

void main()
{
    Timer0_Init();
    FreqSelect=1;
    while(1)
    {
        
    }
}

void Timer0_Routine() interrupt 1
{
    TL0 =FreqTable[FreqSelect]%256; //设置定时初值
    TH0 =FreqTable[FreqSelect]/256; //设置定时初值
    Buzzer=!Buzzer;
}

此处我通过从数组中调用定时器初值的方式来选择蜂鸣器的频率,但烧录到板子里后,蜂鸣器不正常响而是噼里啪啦地响。
或者直接赋值FreqSelect=63578;也是同样的效果


//FrequencyTable 频率表
unsigned int FreqTable[]=
(     
     63461,63578,63688,63791,63889,63981,64069,64151,64229,64302,64371,64436,
     64498,64556,64611,64663,64712,64758,64802,64843,64882,64918,64953,64986,
     65017,65046,65073,65099,65124,65147,65168,65189,65208,65227,65244,65260
);

//频率选择
unsigned char FreqSelect;

void main()
{
    Timer0_Init();
    FreqSelect=63578;
    while(1)
    {
        
    }
}

void Timer0_Routine() interrupt 1
{
    TL0 =FreqSelect%256; //设置定时初值
    TH0 FreqSelect/256; //设置定时初值
    Buzzer=!Buzzer;
}

若我直接给定时器赋初值,也赋上63578,如一下代码,蜂鸣器就能正常响

//FrequencyTable 频率表
unsigned int FreqTable[]=
(     
     63461,63578,63688,63791,63889,63981,64069,64151,64229,64302,64371,64436,
     64498,64556,64611,64663,64712,64758,64802,64843,64882,64918,64953,64986,
     65017,65046,65073,65099,65124,65147,65168,65189,65208,65227,65244,65260
);

//频率选择
unsigned char FreqSelect;

void main()
{
    Timer0_Init();
    FreqSelect=1;
    while(1)
    {
        
    }
}

void Timer0_Routine() interrupt 1
{
    TL0 =63578%256; //设置定时初值
    TH0 63578/256; //设置定时初值
    Buzzer=!Buzzer;
}
  • 写回答

4条回答 默认 最新

  • qllaoda 2023-04-06 18:26
    关注

    FreqSelect=63578;不行吧,FreqSelect是表的索引值,那个表可没那么长。而且FreqSelect只是个unsigned char。
    另外试试FreqTable定义到code里,这个表默认是data类型,要占72个字节,有点大了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 创建了问题 4月6日

悬赏问题

  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法