问题如下:
#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;
}