生日快乐
[(⊙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
}
}