单片机音乐盒程序相关问题,附程序,困扰我几个月了,真的是跪求解答啊!! 20

#include<reg51.h>//包含51单片机寄存器定义的头文件sbitsound=P2^0;//将sound位定义为P3.7unsignedintC;//储存定时... #include<reg51.h> //包含51单片机寄存器定义的头文件
sbit sound=P2^0; //将sound位定义为P3.7
unsigned int C; //储存定时器的定时常数
void delay() //200MS
{
unsigned char i,j;
for(i=0;i<250;i++)
for(j=0;j<250;j++);
}
void main(void)
{
unsigned char i,j;
unsigned int code f[]={311,293,311,311,293,311,0xff}; //以0xff作为音符的结束标志
//以下是简谱中每个音符的节拍
//"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位
unsigned char code JP[ ]={4,1,1,4,1,1,10};
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TMOD=0x00; // 使用定时器T0的模式1(13位计数器)
while(1) //无限循环
{
i=0; //从第1个音符f[0]开始播放
while(f[i]!=0xff) //只要没有读到结束标志就继续播放
{
C=460830/f[i];
TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法
TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法
TR0=1; //启动定时器T0
for(j=0;j<JP[i];j++) //控制节拍数
delay(); //延时1个节拍单位
TR0=0; //关闭定时器T0
i++; //播放下一个音符
}
}
}
void Time0(void ) interrupt 1 using 1
{
sound=!sound; //将P3.7引脚输出电平取反,形成方波
TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法
TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法
}
以上就是程序,这个程序我用Proteus仿真过,可以用,是我改自别人的程序的。
程序中我有几个不明白的地方:
while(f[i]!=0xff) //只要没有读到结束标志就继续播放
{
C=460830/f[i];
TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法
TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法
TR0=1; //启动定时器T0
for(j=0;j<JP[i];j++) //控制节拍数
delay(); //延时1个节拍单位
TR0=0; //关闭定时器T0
i++; //播放下一个音符
}
就这一个不明白,其它都明白。
1.首先那个C被赋予一个值,这个值是460830,不明白这个值是什么。
2.这个中断信号溢出时,TR0=1,开中断,就进入了interrupt 1中吗?
3.在interrupt中给中断重装了值,然后回到主函数中,是回到哪个位置?继续执行哪个位置?照理来说,应该是回到TR0=1,那么继续执行下面的节拍延时模块的话,那Sound=!sound就只执行了一次,就是电平翻转一次,也不能持续发音啊,为什么,这边是我最不了解,最疑惑的。
回答出任何一题都给分,全部回答出来给高分!分固然不是最重要的,但我也只有这个了,先谢过!!!!
展开
 我来答
414631675
2011-12-03 · 贡献了超过114个回答
知道答主
回答量:114
采纳率:0%
帮助的人:40.9万
展开全部
e,,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式