<span style="" >#include "reg52.h"
#include <intrins.h>
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
code u8 sszymmh[]={
1,2,2, 2,2,2, 3,2,2, 1,2,2,
1,2,2, 2,2,2, 3,2,2, 1,2,2,
3,2,2, 4,2,2, 5,2,4,
3,2,2, 4,2,2, 5,2,4,
5,2,1, 6,2,1, 5,2,1,
4,2,1, 3,2,2, 1,2,2,
5,2,1, 6,2,1, 5,2,1,
4,2,1, 3,2,2, 1,2,2,
2,2,2, 5,1,2, 1,2,4,
2,2,2, 5,1,2, 1,2,4,
}; //音符
code u8 FREQH[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,
0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,} ;
// 音阶频率表 低八位(计时器初值)
code u8 FREQL[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,
0x8F,0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,};
sbit beep = P1^5;
sbit s1 = P1^6;
sbit led = P1^0;
u8 time,i = 3,k;
u8 t1;
void configure()
{
k=sszymmh[0]+7*sszymmh[1]-1;
TH0=FREQH[k];
TL0=FREQL[k];
TH1 = 0XFC;
TL1 = 0X18;
time=sszymmh[2];
TMOD |= 0x55;
ET0 = 1; // 输出频率
ET1 = 1;
TR0 = 1;
TR1 = 1;
}
void main()
{
configure();
while(1)
{
if(s1==0)
{
EA = 1;
}
}
}
void Time0() interrupt 1 using 0
{
while(i<100) //音乐数组长度 ,唱完从头再来 ? i 全局
{
k=sszymmh+7*sszymmh[i+1]-1;
TH0=FREQH[k];
TL0=FREQL[k];
time=sszymmh[i+2];
i=i+3;
beep=!beep;
led =0; //测试
TR1 = 1;
TH1 = 0XFC;
TL1 = 0X18;
TR0 = 0;
}
}
void Time1() interrupt 3 using 0 //优先级要高
{
TR1 = 0;
t1++;
TH1=0XFC;
TL1=0X18;
if(t1>=32*time)
{
TR0 = 1;
TR1 = 0;
}
}
我的思路是,先开启俩个定时器,先进入定时器0 控制频率 然后进入 定时器1 控制节拍,不知道是不是时序的问题还是用定时器延时不正确?
一周热门 更多>