微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 源码 4 -- 喇叭播放插曲 You

源码 4 -- 喇叭播放插曲 You

时间:11-17 来源:互联网 点击:

间,保证按键与按键之间能分得清楚

/*********************************************************************************************************************
定时时间 time 的计算:

以 中央 C 为例:频率为 261.6 Hz,就是每秒 261.6 下,倒数就是 每下 1/261.6 s,
换成 us 就是 1,000,000/261.6,每响一次是一个上升沿加一个下降沿,
因此,变换的次数应该是 2 倍,每次变换所花时间是一半,
即:1,000,000/(2*261.6)
**********************************************************************************************************************/

time = (unsigned int)(1000000 / (2 * PIANO_F[PITCH[i]]));

time_h = (65536 - time) / 256;
time_l = (65536 - time) % 256;

TH0 = time_h;// 定时器赋值
TL0 = time_l;

TR0 = 1;// 开 定时器0

/****************************************************************************************************************
如果音高是 0,说明是 八分休止符,关定时器,定时器不驱动喇叭,也就没有声音了
****************************************************************************************************************/

if(PITCH[i] == 0) TR0 = 0;

/********************************************************************************************************
相当重要的延时!节拍全部由它控制,不是很精确,其实用 定时器 1 可能更好
********************************************************************************************************/

Delay_ms(BEAT[i] * 30);
}

TR0 = 0;// 音乐播放完后,关定时器,收尾

/*****************************************************************************************************************
相当重要!没有此语句将导致循环执行 main 函数!

详细讨论参见:http://gaebolg.blog.163.com/blog/static/19826906820122254823928/
*****************************************************************************************************************/

while(1);
}

voidInit_Timer0(void)
{
TMOD = 0x01;// 定时器 0,模式1
EA = 1;// 开 总中断
ET0 = 1;// 开 定时器 0 中断
}

voidTimer0_ISR(void)interrupt1
{
TH0 = time_h;// 重装初值
TL0 = time_l;

SPK = !SPK;// 产生方波,驱动喇叭发声
}

voidDelay(unsigned intt)
{
while(t--);
}

voidDelay_ms(unsigned intt)// 根据测试,可以相当近似的表示 t ms
{
while(t--) {
Delay(245);
Delay(245);
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top