PWM控制小车车速

//初始小车以 20%占空比速度前进运行,K1 键可加速,K2 键可减速。最大可以 100%占空比速度运行。

#include "reg52.h"

typedef unsigned char u8;
typedef unsigned int u16;


//定义电机控制管脚
sbit MOTOA=P1^0;
sbit MOTOB=P1^1; //右侧电机
sbit MOTOC=P1^2;
sbit MOTOD=P1^3; //左侧电机

//定义按键管脚
sbit k1=P1^4;
sbit k2=P1^5;


u16 time_cnt=0; //定时器中断计数次数
u16 freq=100; //PWM 输出频率 100HZ
u8 duty_cycle=20; //占空比 20%


//延时函数 10*us(us)

void delay_10us(u16 us)

{
    while(us--);
}



//ms 延时函数 ms

void delay_ms(u16 ms)

{
    u16 i,j;
    for(i=ms; i>0; i--)
        for(j=110; j>0; j--);
}
//定时器 0 初始化函数


//定时时间:0.1ms

void Time0_Init()

{
    TMOD|=0x01;
    TH0 = 0XFF;
    TL0 = 0X9C; //定时 0.1ms TR0 = 1;
    ET0 = 1;
    EA = 1;
}

void Car_ForwardRun()//前进
{
    MOTOA=1;
    MOTOB=0;
    MOTOC=1;
    MOTOD=0;
}

void Car_StopRun()//停止
{
    MOTOA=0;
    MOTOB=0;
    MOTOC=0;
    MOTOD=0;
}



//主函数 

void main()
{
    Time0_Init();
    
    while(1)
    {
        if(k1==0) //加速
        {
            delay_10us(1000);
            if(k1==0)
            {
                if(duty_cycle<100)
                    duty_cycle+=10;
            }
            while(!k1);
        }
        else if(k2==0) //减速
        {
            delay_10us(1000);
            if(k2==0)
            {
                if(duty_cycle>0) duty_cycle-=10;
            }
            while(!k2);
        }
    }
}
//定时器 0 中断函数



void Time0_Isr() interrupt 1
{
    TR0 = 0; //关闭定时器 0
    TH0 = 0XFF;
    TL0 = 0X9C; //定时 0.1ms
    time_cnt++;    

    if(time_cnt>=freq)
        time_cnt=0;

    else if(time_cnt<=duty_cycle)
    {
        Car_ForwardRun();
    }

    else
    {
        Car_StopRun();
    }
    TR0 = 1;//开启定时器 0
}
  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值