标题: 51单片机pwm测试源程序 [打印本页]

作者: cjxpdsxxx    时间: 2018-7-24 09:48
标题: 51单片机pwm测试源程序
#include "reg52.h"                           
#include "main.h"
#include "distance_measure.h"
#define TIMER_DELAY                (500) //定时器定时500us=0.5ms
uint counter = 0;                   //计数
uchar PWM[4]={8,8,8,8};         
uchar motor_max=5;                  //pwm最大值

//四路马达
//    1   3
//          2          4
sbit ENA = P1^5;
sbit motor1 = P1^4;
sbit motor2 = P1^3;
sbit motor3 = P1^2;
sbit motor4 = P1^1;
sbit ENB = P1^0;

//STC89系列单片机延时1ms
void delay_ms(unsigned int x)
{
        char j=0;
        while(x--)
                for(j=0;j<125;j++)
                        ;
}

//定时器初始化
void timer_init()
{
    //AUXR &= 0x7F;                //定时器时钟12T模式
    TMOD &= 0xF0;                //设置定时器模式:定时器0方式1
        TMOD |= 0x01;                //设置定时器模式:定时器0方式1
        EA=1;                                   //开总中断
        TH0=(65535-TIMER_DELAY)/256;   //设置初值
        TL0=(65535-TIMER_DELAY)%256;
        ET0=1;                                   //启用定时器中断
        TR0=1;                                   //开启
}

//T0中断服务子程序
void timer0_isr() interrupt 1
{
        TH0=(65535-TIMER_DELAY)/256;                //重新赋值
        TL0=(65535-TIMER_DELAY)%256;
        counter ++;                  
        //计数累加1ms清零
        if(counter == 20)
        {
                counter = 0;        
        }
        //比较输出PWM
        motor1 = PWM[0] > counter;
        motor2 = PWM[1] > counter;
        motor3 = PWM[2] > counter;
        motor4 = PWM[3] > counter;

}
void motor_up()                                 //前进
{
        PWM[0]=motor_max;
        PWM[1]=0;
        PWM[2]=motor_max;
        PWM[3]=0;

}
void motor_stop()                   //后退
{
        PWM[0]=0;
        PWM[1]=motor_max;
        PWM[2]=0;
        PWM[3]=motor_max;
}
void motor_left()                   //左转
{
        PWM[0]=motor_max;
        PWM[1]=0;
        PWM[2]=0;
        PWM[3]=0;
}
void motor_right()                  //右转
{
        PWM[0]=0;
        PWM[1]=0;
        PWM[2]=motor_max;
        PWM[3]=0;
}
void main()
{
        timer_init();         //定时器初始化
        ENA=1;
        ENB=1;
        motor_up();
        while(1)
        {
                if(get_distance() <= 50)                 //判断是否有障碍物
                {
                        delay_ms(10);                                //消抖
                        if(get_distance() <= 50)   //确实有障碍物
                        {
                                motor_left();
                                delay_ms(500);
                        }
                }
                else
                {
                        motor_up();
                }           
               
        
        }


}








欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1