2018-02-10@keil与proteus

生日快乐

[(⊙o⊙)…额!哈哈!]昨天晚上好不容易搞好软件问题【(~ ̄(OO) ̄)ブ】,那不得趁热打铁赶紧整一下使自己玩玩,就照书打了代码花了原理图,成功听到仿真声音,不觉有些小激动

电路图

书中代码区

#include <reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit BEEP=P1^0;         //定义喇叭输出端口
uchar tick,t1,th;           //定义节拍和T0初始变量
uchar TABLE[]={         //音符节拍码表
    0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0X04,
    0X82,0X01,0X81,0X94,0X84,0XC4,0XB4,0X04,
    0X82,0X01,0X81,0XF4,0XD4,0XB4,0XA4,0X94,
    0XE2,0X01,0XE1,0XD4,0XB4,0XC4,0XB4,0X04,
    0X82,0X01,0X81,0X94,0X84,0XB4,0XA4,0X04,
    0X82,0X01,0X81,0X94,0X84,0XC4,0XB4,0X04,
    0X82,0X01,0X81,0XF4,0XD4,0XB4,0XA4,0X94,
    0XE2,0X01,0XE1,0XD4,0XB4,0XC4,0XB4,0X04,
    0X00,
};

uchar TABLE1[]={                                                    //音符对应的定时器初始表
    0xfd,0x04,0xfd,0x90,0xfc,0x09,0xfc,0x44,
    0xfc,0xac,0xfb,0x09,0xfb,0x34,0xfb,0x82,
    0xfb,0xc8,0xfe,0x06,0xfe,0x22,0xfe,0x56,
    0xfe,0x85,0xfe,0x9a,0xfe,0xc1,  
};

/********************************T0中断服务函数    *******************************/
timer0() interrupt 1 using 1{
    TL0=t1;TH0=th;  //重装定时初值
    BEEP=~BEEP;     //喇叭输出定时取反
}
/***************************基本单位延时函数*************************/
void delay1(){
    uint i;
    for(i=0;i<20000;i++);
}

/*****************************节拍延时函数**************************/

void delay(tt){

    uchar i;
    for (i=0;i<=tt;i++) delay1();
}

/***********************************主函数******************************/
void main(){

    uchar t,t1,k=0;
    while(1){
        TMOD=0X01;IE=0X82;          //定义T0工作方式,开中断
        while (TABLE[k]!=0){            //判断节拍码是否为结束码
            tick=(TABLE[k])&0x0f;   //不是则取节拍码
            t=(_crol_(TABLE[k],4))&0x0f;//取音符码
            if(t!=0){                   //判断取得的音符码是否为0
                t1=--t*2+1;             //不是根据取得的音符码计算T0初值
                t=t*2;
                t1=TL0=TABLE1[t1];
                th=TH0=TABLE1[t];
                TR0=1;                  //启动T0
            }
            else TR0=0;                 //取得音符码为0则停止T0
            delay(tick);                //根据节拍码延时
            k++;
        }
        TR0=0;                          //取得结束码则停止T0
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容