|
#include<reg51.h>
#include<math.h>
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
sbit led0=P1^0;
#define _debug 1
#define _fosc 6000000
code u16 fout[7]={262,294,330,349,392,440,494};
//低音1-7
u16 _f=262;//fout[0];//20-20000Hz
u8 bufTL0,bufTH0;
void interrupt0(void) interrupt 0 using 0
{
static u8 cnt=0;
u8 bai=0,ge=0,shi=0;
if(cnt==6)
cnt=0;
else
cnt++;
_f=fout[cnt];
bai=_f/100;
shi=_f/10%10;
ge=_f%10;
P3=(bai<<4)+0x0f;
P2=shi;
P2<<=4;
P2+=ge;
bufTL0 = (65536-_fosc/12*1/_f/1/2)%256;
bufTH0 = (65536-_fosc/12*1/_f/1/2)/256; //定時(shí)器賦予初值
//EX0 =1;
}
void timer0(void) interrupt 1 using 0
{
TL0 = bufTL0;//(65536-1000000*1/_f/1/2)%256;
TH0 = bufTH0;//(65536-1000000*1/_f/1/2)/256; //定時(shí)器賦予初值 led0=!led0;
led0=!led0;
}
void main(void)
{
u8 bai=0,ge=0,shi=0;
//bufTL0=log(bai);//測(cè)試運(yùn)行時(shí)長(zhǎng)
//bufTL0 = (65536-1000000*1/_f/1/2)%256; //--用了2ms
bai=_f/100;
shi=_f/10%10;
ge=_f%10;
P3=(bai<<4)+0x0f;
P2=shi;
P2<<=4;
P2+=ge;
EA = 1; //使能總中斷
EX0 = 1; //使能外部中斷0
IT0=1; //外部中斷0,采用下跳沿方式觸發(fā)
//
ET0 = 1; //允許定時(shí)器0中斷
TMOD = 1; //定時(shí)器工作方式選擇
//gate c/~t m1 m0
//0000 0001
bufTL0 = (65536-_fosc/12*1/_f/1/2)%256;//--用了2ms
bufTH0 = (65536-_fosc/12*1/_f/1/2)/256;//定時(shí)器賦予初值
TL0=bufTL0;
TH0=bufTH0;
TR0 = 1; //啟動(dòng)定時(shí)器
while(1);
//
}
|
|