发 帖  
[问答]

大佬们,看看我的代码有啥问题,找不出,哭了?

2209 51单片机
已退回1积分
2022-3-23 20:37:12   评论 分享淘帖 邀请回答 举报
3个回答
2022-3-24 13:11:47 1 评论

举报

1 条评论
  • 2022-3-24 14:50

    //下面是正确的代码,只用了void int0() interrupt 1这个函数,其他中断后代码显示现象在main主函数里面 我是想用void Timer0Init()+void Time0Init()interrupt 1,然后主函数直接调用void Timer0Init()就行了
    /**********************************************************************/
    #include <REG52.H>
    #include <INTRINS.H>
    //本例晶振为12MHZ
    //关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.
    //频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;
    //所以拿出谱子, 试探编吧!

    sbit Beep = P1^5 ;

    unsigned char n=0; //n为节拍常数变量
    unsigned char code music_tab[] ={
    0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,
    0x20, 0x40, 0x1C , 0x10,
    0x18, 0x10, 0x20 , 0x10,
    0x1C, 0x10, 0x18 , 0x40,
    0x1C, 0x20, 0x20 , 0x20,
    0x1C, 0x20, 0x18 , 0x20,
    0x20, 0x80, 0xFF , 0x20,
    0x30, 0x1C, 0x10 , 0x18,
    0x20, 0x15, 0x20 , 0x1C,
    0x20, 0x20, 0x20 , 0x26,
    0x40, 0x20, 0x20 , 0x2B,
    0x20, 0x26, 0x20 , 0x20,
    0x20, 0x30, 0x80 , 0xFF,
    0x20, 0x20, 0x1C , 0x10,
    0x18, 0x10, 0x20 , 0x20,
    0x26, 0x20, 0x2B , 0x20,
    0x30, 0x20, 0x2B , 0x40,
    0x20, 0x20, 0x1C , 0x10,
    0x18, 0x10, 0x20 , 0x20,
    0x26, 0x20, 0x2B , 0x20,
    0x30, 0x20, 0x2B , 0x40,
    0x20, 0x30, 0x1C , 0x10,
    0x18, 0x20, 0x15 , 0x20,
    0x1C, 0x20, 0x20 , 0x20,
    0x26, 0x40, 0x20 , 0x20,
    0x2B, 0x20, 0x26 , 0x20,
    0x20, 0x20, 0x30 , 0x80,
    0x20, 0x30, 0x1C , 0x10,
    0x20, 0x10, 0x1C , 0x10,
    0x20, 0x20, 0x26 , 0x20,
    0x2B, 0x20, 0x30 , 0x20,
    0x2B, 0x40, 0x20 , 0x15,
    0x1F, 0x05, 0x20 , 0x10,
    0x1C, 0x10, 0x20 , 0x20,
    0x26, 0x20, 0x2B , 0x20,
    0x30, 0x20, 0x2B , 0x40,
    0x20, 0x30, 0x1C , 0x10,
    0x18, 0x20, 0x15 , 0x20,
    0x1C, 0x20, 0x20 , 0x20,
    0x26, 0x40, 0x20 , 0x20,
    0x2B, 0x20, 0x26 , 0x20,
    0x20, 0x20, 0x30 , 0x30,
    0x20, 0x30, 0x1C , 0x10,
    0x18, 0x40, 0x1C , 0x20,
    0x20, 0x20, 0x26 , 0x40,
    0x13, 0x60, 0x18 , 0x20,
    0x15, 0x40, 0x13 , 0x40,
    0x18, 0x80, 0x00
    };

    void int0() interrupt 1 //采用中断0 控制节拍
    { TH0=0xd8;
    TL0=0xef;
    n--;
    }

    void delay (unsigned char m) //控制频率延时
    {
    unsigned i=3*m;
    while(--i);
    }

    void delayms(unsigned char a) //豪秒延时子程序
    {
    while(--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!
    }

    void main()
    { unsigned char p,m; //m为频率常数变量
    unsigned char i=0;
    TMOD&=0x0f;
    TMOD|=0x01;
    TH0=0xd8;TL0=0xef;
    IE=0x82;
    play:
    while(1)
    {
    a: p=music_tab;
    if(p==0x00) { i=0; delayms(1000); goto play;} //如果碰到结束符,延时1秒,回到开始再来一遍
    else if(p==0xff) { i=i+1;delayms(100);TR0=0; goto a;} //若碰到休止符,延时100ms,继续取下一音符
    else {m=music_tab[i++]; n=music_tab[i++];} //取频率常数 和 节拍常数
    TR0=1; //开定时器1
    while(n!=0) Beep=~Beep,delay(m); //等待节拍完成, 通过P1口输出音频(可多声道哦!)
    TR0=0; //关定时器1
    }
    }

2022-3-24 14:47:31 评论

举报

2022-3-24 15:49:51 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
快速回复 返回顶部 返回列表
关注微信公众号

电子发烧友网

电子发烧友论坛

社区合作
刘勇
联系电话:15994832713
邮箱地址:liuyong@huaqiu.com
社区管理
elecfans短短
微信:elecfans_666
邮箱:users@huaqiu.com
关闭

站长推荐 上一条 /6 下一条

快速回复 返回顶部 返回列表
kUrl+"'"+',\'get\', 0)">发私信' : "" )+ '') } }); })(jQuery);