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日

悬赏问题

  • ¥15 求TYPCE母转母转接头24PIN线路板图
  • ¥100 国外网络搭建,有偿交流
  • ¥15 高价求中通快递查询接口
  • ¥15 解决一个加好友限制问题 或者有好的方案
  • ¥15 急matlab编程仿真二阶震荡系统
  • ¥20 TEC-9的数据通路实验
  • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型