|
#include<reg51.h>
#include<math.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit Waveout=P2^0; /*P2.0口輸出方波*/
sbit key1=P3^2;
sbit key2=P3^4;
sbit led1=P0^0;
sbit led2=P0^1;
u16 freq; //頻率
float fosc=12000000; //系統(tǒng)時(shí)鐘頻率12MHz
u8 TIMER0_L,TIMER0_H;
//聲明函數(shù)寫在前面
/*延時(shí)函數(shù)*/
void delay(u16 i)
{
while(i--);
}
/*初始化*/
void chushihua()
{
TIMER0_L=0x18; //定時(shí)變量,定時(shí)器1初始時(shí)間高8位賦值,具體定時(shí)時(shí)間自己查資料 10000
TIMER0_H=0xFC; //方波初始頻率 = 500Hz
}
/*外部中斷0初始化函數(shù)*/
void int0_init()
{
EX0=1; // 開啟外部中斷0
IT0=1; //設(shè)置外部中斷觸發(fā)方式 下降沿觸發(fā) P3.2廣腳 key1
EA=1; //開總中斷
}
/*外部中斷1初始化函數(shù)*/
void int1_init()
{
EX1=1; // 開啟外部中斷1
IT1=1; //設(shè)置外部中斷觸發(fā)方式 下降沿觸發(fā) P3.4廣腳 key2
EA=1; //開總中斷
}
/*定時(shí)器T1初始化函數(shù)*/
void T0_init()
{
TMOD=0X10;//選擇定時(shí)器T1,工作方式1,僅用TR1打開啟動(dòng)
ET1=1; //開定時(shí)器T1中斷
TR1=1; //啟動(dòng)定時(shí)器T1
EA=1; //開總中斷
}
/*主函數(shù)*/
void main()
{
led1=0;
led2=0;
freq=500;
int0_init();
int1_init();
T0_init();
chushihua();
while(1);
}
//定時(shí)器T1的中斷服務(wù)函數(shù)
void T0_time() interrupt 3//定時(shí)器T1的中斷序號(hào)為3
{
TH1=TIMER0_H; //2^16=65536 2^8=256 TH0=0Xdc
TL1=TIMER0_L; //取余 TL0=0x00
Waveout=!Waveout; //取反,產(chǎn)生50HZ方波
}
//外部中斷0的中斷服務(wù)函數(shù)
void int0() interrupt 0 //外部中斷的中斷序號(hào)為0
{
float TF0;
delay(1000);//10ms
if(key1==0)
{
delay(1000);
freq+=100;
led1=~led1;
TF0=(65536-fosc/(24.0*freq)); //2^16=65536 2^8=256 TH0=0Xdc
TIMER0_H=(u16)TF0/256;
TIMER0_L=(u16)TF0%256; //取余TL0=0x00
}
}
void int1() interrupt 2//外部中斷1的中斷序號(hào)為2
{
float TF0;
delay(1000);//10ms
if(key2==0)
{
delay(1000);
freq-=100;
led2=~led2;
TF0=(65536-fosc/(24.0*freq)); //2^16=65536 2^8=256
TIMER0_H=(u16)TF0/256;
TIMER0_L=(u16)TF0%256; //取余
}
}
|
|