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
}
发布了53 篇原创文章 · 获赞 14 · 访问量 7245

猜你喜欢

转载自blog.csdn.net/xiaob_8310/article/details/105530608