找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2889|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

51單片機pwm測試源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:378322 發(fā)表于 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;                   //計數(shù)
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;                //設(shè)置定時器模式:定時器0方式1
        TMOD |= 0x01;                //設(shè)置定時器模式:定時器0方式1
        EA=1;                                   //開總中斷
        TH0=(65535-TIMER_DELAY)/256;   //設(shè)置初值
        TL0=(65535-TIMER_DELAY)%256;
        ET0=1;                                   //啟用定時器中斷
        TR0=1;                                   //開啟
}

//T0中斷服務(wù)子程序
void timer0_isr() interrupt 1
{
        TH0=(65535-TIMER_DELAY)/256;                //重新賦值
        TL0=(65535-TIMER_DELAY)%256;
        counter ++;                  
        //計數(shù)累加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()                   //左轉(zhuǎn)
{
        PWM[0]=motor_max;
        PWM[1]=0;
        PWM[2]=0;
        PWM[3]=0;
}
void motor_right()                  //右轉(zhuǎn)
{
        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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表