#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^3;
sbit led1=P0^0;
sbit led2=P0^1;
u16 freq; //频率
float fosc=12000000; //系统时钟频率12MHz
u8 TIMER0_L,TIMER0_H;
//声明函数写在前面
/*延时函数*/
void delay(u16 i)
{
while(i--);
}
/*初始化*/
void chushihua()
{
TIMER0_L=0x18; //定时变量,定时器1初始时间高8位赋值,具体定时时间自己查资料 10000
TIMER0_H=0xFC; //方波初始频率 = 500Hz
}
/*外部中断0初始化函数*/
void int0_init()
{
EX0=1; // 开启外部中断0
IT0=1; //设置外部中断触发方式 下降沿触发 P3.2广脚 key1
EA=1; //开总中断
}
/*外部中断1初始化函数*/
void int1_init()
{
EX1=1; // 开启外部中断1
IT1=1; //设置外部中断触发方式 下降沿触发 P3.3广脚 key2
EA=1; //开总中断
}
/*定时器T1初始化函数*/
void T0_init()
{
TMOD=0X10;//选择定时器T1,工作方式1,仅用TR1打开启动
ET1=1; //开定时器T1中断
TR1=1; //启动定时器T1
EA=1; //开总中断
}
/*主函数*/
void main()
{
led1=0;
led2=0;
freq=500;
int0_init();
int1_init();
T0_init();
chushihua();
while(1);
}
//定时器T1的中断服务函数
void T1_time() interrupt 3//定时器T1的中断序号为3
{
TH1=TIMER0_H; //2^16=65536 2^8=256 TH0=0Xdc
TL1=TIMER0_L; //取余 TL0=0x00
Waveout=!Waveout; //取反,产生50HZ方波
}
//外部中断0的中断服务函数
void int0() interrupt 0 //外部中断的中断序号为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的中断序号为0
{
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; //取余
}
}
|