#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar time;
double count = 26; //定义占空比,并初始占空比为26%
sbit PWM = P2 ^ 0; //P2^0口输出PWM
sbit key_add = P3 ^ 4; //电机加速的按键 的I/O口
sbit key_dec = P3 ^ 5; //电机减速的按键 的I/O口
/************函数声明**************/
void delayxms(uint z); //延时
void Motor_add(); //电机加速,即增加占空比
void Motor_dec(); //电机减速,即减少占空比
void timer0_init(); //定时器0初始化
/*********主函数********************/
void main()
{
timer0_init();
delayxms(5);
while (1)
{
Motor_add();
Motor_dec();
}
}
/****************延时处理**********************/
void delayxms(uint z) //延时xms程序
{
uint x, y;
for (y = z; x > 0; x--)
for (y = 110; y > 0; y--);
}
void Motor_add() //电机加速
{
if (key_add == 0)
{
delayxms(2); //此处时间不能太长,否者会的中断产生冲突
if (key_add == 0)
{
count += 0.5; //每按一次加速按键占空比加0.5
if (count >= 32) //限定占空比上限
{
count = 32;
}
}
while (!key_add);
}
}
void Motor_dec() //电机减速
{
if (key_dec == 0)
{
delayxms(2); //此处时间不能太长,否者会的中断产生冲突
if (key_dec == 0)
{
count -= 0.5; //每按一次减速按键占空比减0.5
if (count <= 25) //限定占空比下限
{
count = 25;
}
}
while (!key_dec);
}
}
/***********定时器0初始化***********/
void timer0_init()
{
TMOD = 0x01; //定时器0工作于方式1
TH0 = (65536 - 10) / 256;
TL0 = (65536 - 10) % 256;
TR0 = 1;
ET0 = 1;
EA = 1;
}
/**************定时0中断处理******************/
void timer0_int() interrupt 1
{
TR0 = 0; //设置定时器初值期间,关闭定时器
TH0 = (65536 - 10) / 256;
TL0 = (65536 - 10) % 256;
TR0 = 1;
time++;
if (time < count) //count为占空比
{
PWM = 1; //输出高电平
}
else
PWM = 0;
if (time >= 100)
{
time = 0;
}
}