3582|5

85

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

用单片机实现乐曲的输出,急求!! [复制链接]

这是用单片机实现乐曲的输出程序  运行时有错误 但我已经检查不出错误了 另外一下程序也有不懂的地方,各位高手 帮帮忙  看看 如何改正  如何实现  急啊 谢了


#include
#include
#define uchar unsigned char
#define uint  unsigned int
  
void PORT_Init(void)
{
P2MDOUT=0xFF;
XBR2=0x40;
}




soundoff(void)
{
TR0=0;ET0=0;
}





unit code notefreq[]={21_6_11_6_1_1_3_2_1_1;}   //这四句是写简谱的吗?格式对吗?
unit code notename[]={3_3_3_2_2_2_2_2_1_3_2;}
unit code half note freq[]={5_6_3_5_5_3_5_5_3_2_2_1_1;}
unit code half note name[]={2_1_6_1_1_6_1_1_6_1_6_5;}








unit GetFreq (uchar ch,ucharflg)  // 这是干什么用的啊 不太明白
{
uchar *pn,i=0;
unit *pf;
if(flg){pn=halfnotename;pf=halfnotefreq;}
else {pn=notename;pf=notefreq;}
while(1)
  {
   if(pn==0)return 0;
     if(ch==pn)return pf;
         i++;
  }
}




void play(char *str)  
{
uchar i=0,ch,halfflg=0;
uchar lasttime;
uint freq;
WDTCN=0xDE;
WDTCN=0xAD;
PORT_Init();
OSCICN=0x14;
while(1) //  这个循环 是乐曲的播放吗? 怎么看不懂啊 ???
   {
   for (;;i++)
     {
           ch=str;
           if((ch==' ')||(ch=='|')||(ch=='\n')||(ch=='\r'))  {i++;continue;}
           if(!ch) {soundoff();return;}
           if(ch=='#'){halfflg=1;continue;}
           if(isdigit(ch)||isalpha(ch))
             {
          freq=GetFreq(ch,halfflg);
          lasttime=16;break;
             }
       else {halfflg=0;continue;}
     }
         i++;
         ch=str;
     while(1)
          {
           if(!ch)break;
           if(isdigit(ch)||isalpha(ch))break;
           if(ch='-')lasttime+=8;
       if(ch='-')lasttime+=4;
       if(ch='_')lasttime/=2;
       if(ch='=')lasttime/=4;
           i++;
           ch=str;
           if(freq!=0)sound(freq);
           else sound off();
           delay(1);
          }
   }
}










void sound (unit freq)
{
unit timereg;
timereg=65536-(OSKREQ/(24(*freq)));
freqsound H= timereg/256;
freqsound L= timereg&0x00ff;
TR0=1;ET0=1;
}






void delay(uchar time)
{
uchar i;
uint j;
for(i=0;i     for(j=0;j<0x100;j++)
}













void main(void)  //  主函数   调用的怎么那么难受啊
{ int c;
  TMOD=0x01;
  TR0=0;
  ET0=0;
  EA=1;
for (c=0;ch!=0;c++)

{ch=0;}
while(1)
  { play();}
}




void timer0int() interrupt 1
{
TH0=freqsound H;
TL0=freqsound L;
P5=P5^0x10;
}



最新回复

while(1) // 这个循环 是乐曲的播放吗? 怎么看不懂啊 ???{   for (;;i++)     { 复制代码 这是条件始终成立的意思,而里面没有结束语句,死循环了。  详情 回复 发表于 2010-7-1 10:19
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
乱78糟..........
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
大概是通过定时器发出不同频率和时间长度的信号,来产生歌曲。给一点资料:
低0C调=131HZ标准C调=262HZ高1C调=523HZ高2C调=1047HZ(每8度,频率高1倍)
标准D调=294HZ(每8度,频率高1倍)
标准E调=330HZ(每8度,频率高1倍)
标准F调=349HZ(每8度,频率高1倍)
标准G调=392HZ(每8度,频率高1倍)
标准A调=440HZ(每8度,频率高1倍)
标准B调=494HZ(每8度,频率高1倍)
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

4
 
upupupupupupupupupupupupupupupupupup
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
没有自己弄过 道是见过别人弄 对曲那块不懂
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
  1. while(1) // 这个循环 是乐曲的播放吗? 怎么看不懂啊 ???{
  2.   for (;;i++)  
  3.   {
复制代码

这是条件始终成立的意思,而里面没有结束语句,死循环了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表