#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char//宏定义,用uchar表示unsigned char,叫无符号字符型数据类型,取值范围为:0到255。
#define uint unsigned int//宏定义,用uint表示unsigned int,叫无符号整数型数据类型,取值范围为:0到65535。
sbit k1=P1^0;
sbit k2=P1^5;
sbit led=P3^4;
uchar count,pwm,flag;
void delay(uint z)//延时程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void keyscan()//按键扫描函数
{
if(k1==0)
{
delay(5);
if(k1==0)
{
pwm++;
if(pwm>=20)
pwm=0;
}
while(!k1);
}
if(k2==0)
{
delay(5);
if(k2==0)
{
if(pwm>0)
pwm--;
if(pwm<=0)
pwm=0;
}
while(!k2);
}
}
void TimerInit()//定时器0初始化函数
{
TMOD=0x01;//设定定时器0,工作模式为模式1。
TH0=(65536-50000)/256;//TH0重新装值
TL0=(65536-50000)%256;//TL0重新装值
// TH1=0xfc;//TH1装初值
// TL1=0x66;//TL1装初值
EA=1;//开启定时器总中断
ET0=1;//开启定时器0中断开关
TR0=1;//启动定时器0
// ET1=1;//开启定时器1中断开关
// TR1=1;//启动定时器1
}
void timer0() interrupt 1//定时器0中断函数
{
TH0=(65536-50000)/256;//中断定时50毫秒,表示高低电平占用周期50毫秒,也表示高低电平频率(计算工式:F=1/T,其中F单位为赫兹,即Hz,而T单位为秒,即s。)为1/0.05s(由50毫秒除以1000求得0.05秒)=20Hz。
TL0=(65536-50000)%256;//
count++;
if(count>=20)//中断次数变量达到20次,表示1秒(即中断次数变量20次X中断定时50毫秒)时间到 ,也表示高低电平占用周期1秒,另外表示高低电平频率(计算工式:F=1/T,其中F单位为赫兹,即Hz,而T单位为秒,即s。)为1/1s=1Hz。
{
count=0;
}
if(count<pwm)
{
led=0;//led为低电平
}
else
{
led=1;//led为高电平
}
}
void main()//主函数
{
TimerInit();
while(1)
{
keyscan();//按键扫描函数
}
}