单片机C语言程序问题

用C语言写《小星星》这首歌曲,放在单片机程序里。谢谢!... 用C语言写《小星星》这首歌曲,放在单片机程序里。谢谢! 展开
 我来答
11kxmx
2014-06-06 · TA获得超过1.4万个赞
知道大有可为答主
回答量:1.2万
采纳率:70%
帮助的人:2466万
展开全部

我有程序,你只需把乐谱按要求翻译成表格MUSIC[]内数据即可

1/4节拍,一拍4个音符

若曲谱里面有半音,则应调整为一拍8个音符,

显示进度的程序可以去掉

//主程序查音符码,将不同的初值装入定时器,定时器每中断一次,P3.7取反一次,形成不同频率的方波

//11代表低音哆 21代表高音哆 1代表中音哆

#include<reg52.h>

sbit SPK = P3^7;  //P3.7外接耳机

sbit dula=P2^6;

sbit wela=P2^7;

#define uint unsigned int;

#define uchar unsigned char;

unsigned char x,y; 

unsigned char m,n;             

uchar bai_c,shi_c,ge_c;

uchar a,b,c;

uchar i1,i2,i3;

uchar code MUSIC[]={ 0,0,0,0,16,16,1,1,  15,15,16,16,1,1,1,1,      5,5,6,6,4,4,3,3,       2,2,2,2,2,2,5,5,       5,5,2,2,4,4,3,3,      2,2,1,2,4,4,4,4, 

                  16,16,1,1,2,2,4,4,    2,1,16,1,15,15,15,15,    16,16,16,16,15,15,15,15,  15,15,15,15,15,15,15,15,  0,0,5,5,5,5,0,0,  5,5,5,5,4,4,4,4,

                5,5,5,5,2,2,2,2,      2,2,5,5,4,4 ,4,4,         16,16,1,1,2,2,2,2,      4,4,2,2,2,2,4,4,     5,5,5,5,5,5,6,6,   21,21,21,21,6,6,21,21, 

        21,21,6,6,5,5,5,5,    5,5,6,6,5,5,4,4,          2,2,2,2,2,2,5,5,       5,5,2,2,4,4,3,3,    2,2,1,2,4,4,4,4,    16,16,1,1,2,2,4,4, 

            2,1,16,1,15,15,15,15,  16,16,16,16,15,15,15,15,  5,5,6,6,5,5,6,6,       5,5,4,4,5,5,5,5};

uchar code table[] = { 0,0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfe,0,0,0,    //0-10定时半周期的初始值中音123 4 5 67高8位,为了使表格有规律8,9,10为补位码

                         0xf8,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc,0,0,0,    //低音1 2 3 4 5 67高8位

                         0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,          //高音1 2 3 4 5 67高8位    

                       0,0x44,0xad,0x0a,0x34,0x82,0xc8,0x06,0,0,0,    //中音123 4 5 67低8位

                         0x89,0x59,0x13,0x68,0x04,0x90,0x0c,0 ,0,0,   //低音1 2 3 4 5 6 7低8位

                         0x22,0x56,0x85,0x9a,0xc1,0xe4,0x03};        //高音1 2 3 4 5 6 7低8位

uchar code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,          //数码管显示数字码

                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

uint i,j,k;

void delay(i) //晶振12MHZ时延时1ms

{

  for(j=i;j>0;j--)

    for(k=121;k>0;k--);

}

void display(bai_c,shi_c,ge_c)//3位显示程序

   P0=table1[bai_c];  //显示百位

   dula=1;

   dula=0;

   P0=0xf7;

   wela=1;

   wela=0;

   delay(2);

   P0=table1[shi_c];  //显示十位

   dula=1;

   dula=0;

   P0=0xef;

   wela=1;

   wela=0;

   delay(2);

  P0=table1[ge_c];  //显示个位

   dula=1;

   dula=0;

   P0=0xdf;

   wela=1;

   wela=0;

   delay(1);

   P0=0xff;  //显示完毕后关闭最后一位显示

   wela=1;

   wela=0;

}

void TIM0_ISR() interrupt 1

 SPK=!SPK;

 TH0=m;               //载入定时半周期的初始值

 TL0=n;

  }

 void main(void)

 {   

  TMOD|=0x01; 

  EA=1;       

  ET0=1;     

 while(1)

      {

       y=0;  

       while(y<224)//y代表该首乐曲总音符个数,若歌曲较长,可以把y设成uint型

        { 

            i1=y/100;

          i2=y/10%10;

      i3=y%10;

             x=MUSIC[y];

            m=table[x];               //载入定时半周期的初始值

             n=table[x+28];

             TR0=1;       //打开定时器

            for(a=25;a>0;a--)   //延时125ms

    {

    display(i1,i2,i3);

    }

     y++;

   TR0=0;

           }

       } 

  }

追问
请问你的QQ是多少?我还有一些问题,可否问你?
追答
530422951
血色有爱1208
2014-06-05 · 超过54用户采纳过TA的回答
知道答主
回答量:105
采纳率:33%
帮助的人:105万
展开全部
int main(void)
{
while(1)
{

}
}
void other(void)
{
.......................................
}
注意单片机程序是从main函数开始执行的,如果你的子函数没有在main函数中那么程序是不会被执行的,除非你把子函数放入中断内部才会被执行。
追问
呃,这个我也会写啊,我就是不知道歌的代码。do.re.mi.fa.so.la.xi代码是多少?这首歌又该怎么写我不知道是。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
廖元洪
2014-06-06 · TA获得超过114个赞
知道答主
回答量:188
采纳率:80%
帮助的人:42万
展开全部
哥,要泡那个妹子吧。自己去学吧。自己做出来的就是最好的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式