基于51單片機(jī)的PWM控制直流電機(jī)設(shè)計(jì)( proteus仿真+程序+報(bào)告+講解視頻)
仿真圖proteus 7.8及以上
程序編譯器:keil 4/keil 5
編程語言:C語言
設(shè)計(jì)編號(hào):S0031
視頻
主要功能:
1.設(shè)計(jì)要求
采用51單片機(jī)作為核心控制器,控制直流電機(jī)的正轉(zhuǎn),反轉(zhuǎn),制動(dòng),停止。
2.功能要求
1)數(shù)碼管顯示當(dāng)前轉(zhuǎn)動(dòng)方向和當(dāng)前的PWM占空比0~100%。
2)電機(jī)(L298n)轉(zhuǎn)速可以通過按鍵調(diào)整,也可以開始暫停,正轉(zhuǎn)和反轉(zhuǎn)。
3)按鍵可實(shí)現(xiàn)加速、減速、正轉(zhuǎn)、反轉(zhuǎn)、停止等功能。
1鍵:加速鍵,短按,占空比加1;
2鍵:減速鍵,短按,占空比減1;
3鍵:正反轉(zhuǎn)切換鍵,按下后電機(jī)正反轉(zhuǎn);
4鍵:按一下停止,PWM脈寬清零。
仿真
開始仿真后,用數(shù)碼管第一位顯示0表示正轉(zhuǎn)后面三位標(biāo)志PWM脈寬(0-100), 示波器實(shí)時(shí)檢測(cè)顯示脈寬黃線是正轉(zhuǎn)脈寬,藍(lán)線是反轉(zhuǎn)脈寬。
反轉(zhuǎn)脈寬如下所示
程序:
部分代碼:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/**********************************************************************
L298n接口定義
**********************************************************************/
sbit MOTOR_A_1=P3^6;
sbit MOTOR_A_2=P3^7;
sbit k1=P1^0; //定義k1為p1.0口
sbit k2=P1^1; //定義k2為p1.1口
sbit k3=P1^2; //定義k3為p1.2口
sbit k4=P1^3; //定義k4為p1.3口
uchar T=0; //定時(shí)標(biāo)記
uchar W=0; //脈寬值 0~100
uchar A=0; //方向標(biāo)記 0,1
uchar k=0; //按鍵標(biāo)記
uchar i=0; //計(jì)數(shù)變量
uchar code table1[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code table2[]={0xfe,0xfb,0xfd,0xf7};
void delayms(uint t);
/**********************************************************************
數(shù)碼管顯示
**********************************************************************/
void disp(void)
{
P2=table2[3];
P0=table1[W%10]; //顯示占空比個(gè)位
delayms(1); //延時(shí)1ms
P2=0xff; //P0清1
P2=table2[2];
P0=table1[W/100]; //顯示占空比百位
delayms(1); //延時(shí)1ms
P2=0xff; //P0清1
P2=table2[1];
P0=table1[W/10%10]; //顯示占空比十位
delayms(1); //延時(shí)1ms
P2=0xff; //P0清1
P2=table2[0];
P0=table1[A]; //顯示方向
delayms(1); //延時(shí)1ms
P2=0xff; //P0清1
}
/**********************************************************************
定時(shí)器變量定義
**********************************************************************/
void init(void)
{
//啟動(dòng)中斷
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
//設(shè)置定時(shí)時(shí)間
TH0=0xff;
TL0=0xf6;
}
/**********************************************************************
延時(shí)1ms
**********************************************************************/
void delayms(uint t)
{
uchar j;
while(t--)
{
for(j=0;j<250;j++) //循環(huán)250次
{
_nop_(); //系統(tǒng)延時(shí)
_nop_(); //系統(tǒng)延時(shí)
_nop_(); //系統(tǒng)延時(shí)
_nop_(); //系統(tǒng)延時(shí)
}
}
}
/**********************************************************************
獨(dú)立按鍵檢測(cè)
**********************************************************************/
void key(void) //按鍵判斷程序
{
if(k1==0) //按鍵1按下
{
while(k1==0); //按鍵1抬起
if(W==100) //如果脈寬為100
W=0; //脈寬置0
else
W+=1; //否則加1
}
else if(k2==0) //按鍵2按下
{
while(k2==0); //按鍵2抬起
if(W==0) //如果脈寬為0
W=100; //脈寬設(shè)置成100
else
W-=1; //否則減1
}
else if(k3==0) //按鍵3按下
{
while(k3==0); //按鍵3抬起
A=!A; //方向標(biāo)記取反
k=!k; //按鍵標(biāo)記取反
}
else if(k4==0) //按鍵4按下
{
while(k4==0); //按鍵4抬起
W=0; //脈寬清0
}
}
void main(void)
{
init(); /系統(tǒng)初始化
while(1)
{
if(k==0)
MOTOR_A_2=0;
else
MOTOR_A_1=0;
key(); 查詢按鍵
}
}
設(shè)計(jì)報(bào)告
資料清單:
下載方式見開頭的視頻
或下方百度云分享鏈接
https://docs.qq.com/doc/DS1RGSmxKQUZOa0dT