51单片机+PWM脉冲宽度调制+直流电机加减速

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

sbit K1=P3^1; //按键1
sbit K2=P3^2; //按键2
sbit fm=P3^7; //蜂鸣器,最高速或者最低速时,蜂鸣器响起

uchar pwm,num;

void delay_ms(uint ms) //ms级延时
{
uchar i;
while(ms–)
{
for(i=0;i<120;i++);
}
}

void delay_us(uchar t) //us级延时
{
while(t–);
}

void bee() //蜂鸣器响函数
{
uint i;
for(i=0;i<10000;i++)
{
fm=1;
delay_us(10);
fm=0;
delay_us(10);
}
}

void keyscan() //判断是否有按键按下
{
if(K10) //判断K1按键是否按下,K1按下的话,pwm加
{
delay_ms(50); //延时消抖
if(K1
0) //确认K1按键是否按下
{
if(pwm<32) //如果K1按下,电机加速,pwm表示输出高电平的次数,调节pwm就是调节占空比
{
pwm++;
delay_ms(100);
}
else
{
bee(); //电机加速到最大速度pwm=32,蜂鸣器响起
}
}
}
if(K20) //判断K2按键是否按下,K2按下的话,pwm减
{
delay_ms(50); //延时消抖
if(K2
0) //确认K2按键是否按下
{
if(pwm>1) //如果K2按下,电机减速,pwm表示输出高电平的次数,调节pwm就是调节占空比
{
pwm–;
delay_ms(100);
}
else
{
bee(); //如果减速到最小速度pwm=1;蜂鸣器响起
}
}
}
}

void init_t0() //对定时器T0初始化,500ms中断一次
{
TMOD=0x01; //方式1,16位的定时器
TH0=(65536-500)/256; //定时器装初值
TL0=(65536-500)%256; //定时器装初值
EA=1; //开总中断
ET0=1; //设置IE寄存器中ET0位,打开中断
TR0=1; //设置TCON寄存器TR0位,启动定时器T0
}

void t0() interrupt 1
{
TR0=0; //关闭定时器T0
TH0=(65536-500)/256; //定时器装初值
TL0=(65536-500)%256; //定时器装初值
num++;
if(num>32)
{
num=0;
}
if(num<pwm) //P1口得到随pwm的值变化而变化的脉冲波形,pwm表示输出高电平的次数,调节pwm就是调节占空比
{
P1=0xff; //LED小灯接P1口
P2=0x00; //直流电机不转
}
else
{
P1=0x00; //LED小灯接P1口
P2=0xff; //直流电机转
}
TR0=1; //打开定时器T0
}

void main()
{
P0=0xfe;
init_t0(); //初始化定时器T0
num=0; //计算中断次数,500ms中断一次,中断32次即用了16ms,16ms为一个脉冲周期
pwm=16; //pwm表示输出高电平的次数,调节pwm就是调节占空比,pwm=16,占空比为50%
while(1)
{
keyscan(); //扫描是否有按键按下,当K1按下,pwm增加,增加了P0输出高电平的时间,占空比增加,当K2按下,pwm减小,占空比减小
}
}

  • 7
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值