#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit S2=P3^4;   //S2按键位定义
sbit S3=P3^5;   //S3按键位定义
sbit fm=P2^3;   //蜂鸣器位定义
uchar pwm,num;  //定义两个变量

void delay(uint ms)  //延时函数
{
	uchar i;
	while(ms--)
	{
		for(i=0;i<120;i++);
	}
}

void bee()   // 蜂鸣器报警提示音函数
{
	fm=0;
	delay(100);
	fm=1;
	delay(100);
}

void keyscan()  //按键处理函数
{
	if(S2==0)  //S2按键检测处理
	{
		delay(50);  //按键消抖
		if(S2==0)
		{
			if(pwm<32)   
			{
				pwm++;    // 如果PWM值小于32，加速键S2按下，速度标记加1
				delay(100);
			}
			else
			{
				bee();   // 如果PWM值不小于32，蜂鸣器发出报警声
			}
		}
	}
	if(S3==0)  //S3按键检测处理
		{
			delay(50);   //按键消抖
			if(S3==0)
			{
				if(pwm>1)
				{
					pwm--;     //如果PWM值大于1，减速键S3按下，速度标记减1
					delay(100);
				}
				else
				{
					bee();   //如果PWM值不大于1，蜂鸣器发出报警声
			 }
		 }
   	}
}

void init_t0()  //定时器0初始化
{
	TMOD=0x01;
	TH0=(65536-500)/256;   //装初值, 0.5毫秒中断一次
	TL0=(65536-500)%256;
	EA=1;
	ET0=1;
	TR0=1;
}

void t0() interrupt 1  //定时器0的中断服务函数
{
	TR0=0;  //关闭定时器0
	TH0=(65536-500)/256;  //重新装初值
	TL0=(65536-500)%256;
	num++;   //定时器0每进入中断一次（即每间隔0.5毫秒）mum自身加1
	if(num>32)
	{
		num=0;  //如果num的值大于32，归0
	}
	if(num<=pwm)  
	{
		P0=0x00;  //如果num的值小于等于PWM的值，P0输出低电平
	}
	else
	{
		P0=0xff;   //否则，P0输出高电平
	}
	TR0=1;  //起启定时器0
}

void main()  //主函数
{
	init_t0();  //定时器0初始化
	num=0;   //给num赋初值0
	pwm=16;  //给pwm赋初值16
	while(1)   
	{
		keyscan();   //按键检测
	}
}