找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2532|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机pwm测试源程序

[复制链接]
跳转到指定楼层
楼主
ID:378322 发表于 2018-7-24 09:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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();
                }           
               
        
        }


}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表