欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于51單片機PWM調速L298芯片控制兩選一直流電機正反運轉的項目工程
[打印本頁]
作者:
51黑電子會員
時間:
2020-5-19 21:47
標題:
基于51單片機PWM調速L298芯片控制兩選一直流電機正反運轉的項目工程
#include"reg52.h"//單片機頭文件
#define uchar unsigned char//宏定義,用uchar表示unsigned char,叫無符號字符型數據類型,取值范圍為:0到255。
#define uint unsigned int//宏定義,用uint表示unsigned int,叫無符號整數型數據類型,取值范圍為:0到65535。
sbit qitingjian=P1^0;//位定義啟停鍵
sbit zhengzhuan=P1^1;//位定義正轉鍵
sbit fanzhuan=P1^2;//位定義反轉鍵
sbit jiasujian=P1^3;//位定義加速鍵
sbit jiansujian=P1^4;//位定義減速鍵
sbit xuanze=P1^5;//位定義選擇鍵
sbit IN1=P2^0;//位定義L298M芯片IN1端口
sbit IN2=P2^1;//位定義L298M芯片IN2端口
sbit IN3=P2^2;//位定義L298M芯片IN3端口
sbit IN4=P2^3;//位定義L298M芯片IN4端口
sbit ENA=P2^4;//位定義L298M芯片使能端ENA
sbit ENB=P2^5;//位定義L298M芯片使能端ENB
//sbit duan=P3^0;//位定義L298M芯片控制端IN1
//sbit wei=P3^1;//位定義L298M芯片控制端IN2
sbit qitingled=P3^4;//位定義啟停指示燈
sbit zhengzhuanled=P3^5;//位定義正轉指示燈
sbit fanzhuanled=P3^6;//位定義反轉指示燈
sbit xuanzeled=P3^7;//位定義選擇指示燈
uchar xuanzenum;//選擇次數變量
uchar motor1flag;//電機1啟動標志位變量
uchar motor2flag;//電機2啟動標志位變量
uchar motor1_pwm_flag;//電機1脈沖寬度調制標志位變量
uchar motor2_pwm_flag;//電機2脈沖寬度調制標志位變量
//sbit waibuzhongduanling=P3^2; //外部中斷0端口
//uint qian,bai,shi,ge,zhuansu;//數碼管千位變量、百位變量、十位變量、個位變量以及轉速變量
//uint maichongcount,Time0num,Time1num,pwm,qitingnum,zhengzhuanflag,fanzhuanflag;//脈沖計數變量、定時器0定時計數變量、定時器1定時計數變量、脈沖寬度調制變量、啟停鍵按下數次變量、正轉標志位變量、反轉標志位變量
uint Time0num,pwm,qitingnum,zhengzhuanflag,fanzhuanflag;//定時器0定時計數變量、脈沖寬度調制變量、啟停鍵按下數次變量、正轉標志位變量、反轉標志位變量
//uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x40,0x7c,0x39,0x5e,0x79,0x71,0x00};//共陰數碼管段碼,高電平點亮段碼,低電平熄滅段碼。
//uchar code weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};//共陰數碼管位碼,低電平點亮位碼,高電平熄滅位碼。
//void delay(uint jishi);//毫秒延時函數
//void TimerInit();//定時器初始化函數
//void Time0();//定時器0定時函數
//void Time1();//定時器1定時函數
//void KeyScan();//按鍵掃描函數
//void waibuzhongduanlingjishu();//外部中斷0計數函數
//void shumaguandisplay(uint qian,uint bai,uint shi,uint ge);//數碼管顯示函數
//void shumaguannodisplay(uint qian,uint bai,uint shi,uint ge);//數碼管無顯示函數
void delay(uint jishi)//延時函數
{
uint i,j;
for(i=jishi;i>0;i--)
for(j=110;j>0;j--);
}
void TimerInit()//定時器初始化函數
{
TMOD=0x01;//設定定時器為定時器0和定時器1,工作模式都為1。
TH0=(65536-1000)/256;//TH0裝初值為65536-1000=64536,即定時1000微妙,相當于1毫秒。
TL0=(65536-1000)%256;//TL0裝初值為65536-1000=64536
// TH1=(65536-50000)/256;//TH1裝初值為65536-50000=15536,即定時50000微妙,相當于50毫秒。
// TL1=(65536-50000)%256;//TL1裝初值為65536-50000=15536
EA=1;//全局中斷允許
ET0=1;//打開定時器0中斷允許
TR0=0;//關定時器0
// EX0=1;//開外部中斷0允許
// IT0=1;//設置外部中斷0下降觸發中斷
// ET1=1;//打開定時器1中斷允許
// TR1=1;//開定時器1
}
void Time0() interrupt 1//定時器0定時函數,每1毫秒產生PWM波一次。
{
TH0=(65536-1000)/256;//TH0重裝初值為65536-1000=64536,即定時1000微妙,相當于1毫秒。
TL0=(65536-1000)%256;//TH0重裝初值為65536-1000=64536
Time0num++;//定時器0定時計數變量先賦值再自加
if(motor1_pwm_flag==1&&motor2_pwm_flag==0)
{
if(Time0num==20)//判斷定時器0定時計數變量是否大于等于20,PWM波完整周期為20ms,定時器0定時計數變量Time0num數值越大,電機運轉越快。
{
Time0num=0;//定時器0定時計數變量等于0
}
if(Time0num<pwm)//判斷定時器0定時計數變量還否小于脈沖寬度調制變量
{
ENA=1;//L298M芯片使能端ENA置高電平,電機運轉。
// zhuansuled=0;//開轉速指示燈
}
else
{
ENA=0;//L298M芯片使能端ENA置低電平,電機不運轉。
// zhuansuled=1;//關轉速指示燈
}
}
if(motor1_pwm_flag==0&&motor2_pwm_flag==1)
{
if(Time0num==20)//判斷定時器0定時計數變量是否大于等于20,PWM波完整周期為20ms,定時器0定時計數變量Time0num數值越大,電機運轉越快。
{
Time0num=0;//定時器0定時計數變量等于0
}
if(Time0num<pwm)//判斷定時器0定時計數變量還否小于脈沖寬度調制變量
{
ENB=1;//L298M芯片使能端ENA置高電平,電機運轉。
// zhuansuled=0;//開轉速指示燈
}
else
{
ENB=0;//L298M芯片使能端ENA置低電平,電機不運轉。
// zhuansuled=1;//關轉速指示燈
}
}
}
// void Time1() interrupt 3//定時器1定時函數,定時50ms,采集電機轉速。
//{
// TH1=(65536-50000)/256;//TH1裝初值為65536-50000=15536,即定時50000微妙,相當于50毫秒。
// TL1=(65536-50000)%256;//TH1裝初值為65536-50000=15536
// Time1num++;//定時器1定時計數變量先賦值再自加
// if(Time1num==20)//判斷定時器1定時計數變量是否等于20,即每1秒測速一次。
// {
// Time1num=0;//定時器1定時計數變量等于0
// EX0=0;//關外部中斷0
// zhuansu=55*maichongcount/24;//電機轉速=每分鐘X脈沖計數變量/每轉一圈需要的脈沖個數,即55*maichongcount/24,其中的55表示55秒,為什么不是一分鐘60秒?由于Protues仿真電路圖中的MOTOR-ENCODER仿真件存在誤差,為了讓MOTOR-ENCODER仿真件顯示的轉速達到數碼管顯示轉速的效果,進行了一定秒數的修改,不過實際運用要以一分鐘60秒為準,maichongcount為單片機從外部中斷0端口處獲取MOTOR-ENCODER仿真件旋轉生產的脈沖計數變量,24為MOTOR-ENCODER仿真件每旋轉一圈產生的脈沖個數。
// qian=zhuansu/1000;//數碼管千位顯示
// bai=zhuansu%1000/100;//數碼管百位顯示
// shi=zhuansu%100/10;//數碼管十位顯示
// ge=zhuansu%10;//數碼管個位顯示
// maichongcount=0;//脈沖計數變量歸零
// EX0=1;//開外部中斷0
// }
//}
// void waibuzhongduanlingjishu() interrupt 0 using 1//外部中斷0計數函數,外部脈沖計數。
//{
// maichongcount++ ;//脈沖計數變量先賦值再自加
// }
void KeyScan()//按鍵掃描函數
{
if(qitingjian==0)//判斷啟停鍵是否按下
{
// shumaguandisplay(qian,bai,shi,ge);//數碼管顯示函數做延時
delay(5);
if(qitingjian==0)//再次判斷啟停鍵是否按下
{
// shumaguandisplay(qian,bai,shi,ge);//數碼管顯示函數
qitingnum++;//啟停鍵按下數次變量先賦值再加加
qitingled=0;//開啟停指示燈
while(!qitingjian);//啟停鍵釋放
if(qitingnum==2)//判斷啟停鍵按下數次變量是否為2
{
TR0=0;
qitingnum=0;//啟停鍵按下數次變量歸零
xuanzenum=0;//選擇次數變量清0
Time0num=0;//定時器0定時計數變量清0
pwm=0;//脈沖寬度調制變量清0
qitingled=1;//關啟停指示燈
zhengzhuanled=1;//關正轉指示燈
fanzhuanled=1;//關反轉指示燈
xuanzeled=1;//關選擇指示燈
zhengzhuanflag=0;//正轉標志位變量為0
fanzhuanflag=0;//反轉標志位變量為0
motor1flag=0;//電機1啟動標志位變量置0
motor2flag=0;//電機2啟動標志位變量置0
motor1_pwm_flag=0;//電機1脈沖寬度調制標志位變量
motor2_pwm_flag=0;//電機2脈沖寬度調制標志位變量
IN1=0;//L298M芯片控制端IN1置低電平,電機不運轉。
IN2=0;//L298M芯片控制端IN2置低電平,電機不運轉。
IN3=0;//L298M芯片控制端IN3置低電平,電機不運轉。
IN4=0;//L298M芯片控制端IN4置低電平,電機不運轉。
// shumaguannodisplay(qian,bai,shi,ge);//數碼管無顯示函數
}
}
}
if(qitingnum==1)//判斷啟停鍵是否第一次按下
{
if(xuanze==0)//判斷選擇鍵是否第一次按下
{
delay(5);
if(xuanze==0)//再次判斷選擇鍵是否按下
{
TR0=1;
xuanzeled=0;//選擇指示燈
xuanzenum++;//選擇次數變量自加
motor1flag=1;//電機1啟動標志位變量置1
motor2flag=0;//電機2啟動標志位變量置0
motor1_pwm_flag=1;//電機1脈沖寬度調制標志位變量置1
motor2_pwm_flag=0;//電機1脈沖寬度調制標志位變量置0
zhengzhuanled=1;//關正轉指示燈
fanzhuanled=1;//關反轉指示燈
IN3=0;//L298M芯片控制端IN3置低電平,電機不運轉。
IN4=0;//L298M芯片控制端IN4置低電平,電機不運轉。
while(!xuanze);//選擇鍵釋放
}
}
if(xuanzenum==2)//判斷選擇次數變量是否為2
{
// TR0=0;
// Time0num=0;//定時器0定時計數變量清0
// pwm=0;//脈沖寬度調制變量清0
xuanzenum=0;//選擇次數變量清0
motor1flag=0;//電機1啟動標志位變量置1
motor2flag=1;//電機2啟動標志位變量置0
motor1_pwm_flag=0;//電機1脈沖寬度調制標志位變量置0
motor2_pwm_flag=1;//電機1脈沖寬度調制標志位變量置1
xuanzeled=1;//關選擇指示燈
zhengzhuanflag=0;//正轉標志位變量為0
fanzhuanflag=0;//反轉標志位變量為0
zhengzhuanled=1;//關正轉指示燈
fanzhuanled=1;//關反轉指示燈
IN1=0;//L298M芯片控制端IN1置低電平,電機不運轉。
IN2=0;//L298M芯片控制端IN2置低電平,電機不運轉。
}
if(motor1flag==1&&motor2flag==0&&motor1_pwm_flag==1)//判斷電機1啟動標志位變量是否置1,電機2啟動標志位變量是否置0 ,電機1脈沖寬度調制標志位變量置1,此處為電機1正反轉。
{
if(zhengzhuan==0)//判斷是否按下正轉鍵
{
// shumaguandisplay(qian,bai,shi,ge);//數碼管顯示函數做延時
delay(5);
if(zhengzhuan==0)//再次判斷是否按下正轉
{
// shumaguandisplay(qian,bai,shi,ge);//數碼管顯示函數做延時
zhengzhuanled=0;//開正轉指示燈
fanzhuanled=1;//關反轉指示燈
zhengzhuanflag=1;//正轉標志位變量為1
fanzhuanflag=0;//反轉標志位變量為0
IN1=0;//L298N芯片控制端IN1置高電平
IN2=1;//L298N芯片控制端IN2置低電平
while(!zhengzhuan);//正轉鍵釋放
}
}
if(fanzhuan==0)//判斷是否按下反轉鍵
{
// shumaguandisplay(qian,bai,shi,ge);//數碼管顯示函數做延時
delay(5);
if(fanzhuan==0)//再次判斷是否按下反轉鍵
{
// shumaguandisplay(qian,bai,shi,ge);//數碼管顯示函數做延時
zhengzhuanled=1;//關正轉指示燈
fanzhuanled=0;//開反轉指示燈
zhengzhuanflag=0;//正轉標志位變量為0
fanzhuanflag=1;//反轉標志位變量為1
IN1=1;//L298N芯片控制端IN1置低電平
IN2=0;//L298N芯片控制端IN2置高電平
while(!fanzhuan);//反轉鍵釋放
}
}
}
if(motor1flag==0&&motor2flag==1&&motor2_pwm_flag==1)//判斷電機1啟動標志位變量是否置0,電機2啟動標志位變量是否置1 ,電機2脈沖寬度調制標志位變量置1,此處為電機2正反轉。
{
if(zhengzhuan==0)//判斷是否按下正轉鍵
{
// shumaguandisplay(qian,bai,shi,ge);//數碼管顯示函數做延時
delay(5);
if(zhengzhuan==0)//再次判斷是否按下正轉
{
// shumaguandisplay(qian,bai,shi,ge);//數碼管顯示函數做延時
zhengzhuanled=0;//開正轉指示燈
fanzhuanled=1;//關反轉指示燈
zhengzhuanflag=1;//正轉標志位變量為1
fanzhuanflag=0;//反轉標志位變量為0
IN3=0;//L298N芯片控制端IN3置高電平
IN4=1;//L298N芯片控制端IN4置低電平
while(!zhengzhuan);//正轉鍵釋放
}
}
if(fanzhuan==0)//判斷是否按下反轉鍵
{
// shumaguandisplay(qian,bai,shi,ge);//數碼管顯示函數做延時
delay(5);
if(fanzhuan==0)//再次判斷是否按下反轉鍵
{
// shumaguandisplay(qian,bai,shi,ge);//數碼管顯示函數做延時
zhengzhuanled=1;//關正轉指示燈
fanzhuanled=0;//開反轉指示燈
zhengzhuanflag=0;//正轉標志位變量為0
fanzhuanflag=1;//反轉標志位變量為1
IN3=1;//L298N芯片控制端IN3置低電平
IN4=0;//L298N芯片控制端IN4置高電平
while(!fanzhuan);//反轉鍵釋放
}
}
}
if(zhengzhuanflag==1||fanzhuanflag==1)//判斷電機是否為正轉或反轉
{
if(jiasujian==0)//判斷是否按下加速鍵
{
// shumaguandisplay(qian,bai,shi,ge);//數碼管顯示函數做延時
delay(5);
if(jiasujian==0)//再次判斷是否按下加速鍵
{
// shumaguandisplay(qian,bai,shi,ge);//數碼管顯示函數做延時
if(pwm < 20)//判斷脈沖寬度調制變量是否小于20
pwm++;//脈沖寬度調制變量先賦值再加加
if(pwm >= 20)//判斷脈沖寬度調制變量是否大于等于20
pwm = 19;//脈沖寬度調制變量等于20
while(!jiasujian);//加速鍵釋放
}
}
if(jiansujian==0) //判斷是否按下減速鍵
{
// shumaguandisplay(qian,bai,shi,ge);//數碼管顯示函數做延時
delay(5);
if(jiansujian==0)//再次判斷是否按下減鍵
{
// shumaguandisplay(qian,bai,shi,ge);//數碼管顯示函數做延時
if(pwm > 0)//判斷脈沖寬度調制變量是否大于0
pwm--;//脈沖寬度調制變量先賦值再減減
if(pwm <= 0)//判斷脈沖寬度調制變量是否小于等于0
pwm = 0;//脈沖寬度調制變量等于0
while(!jiansujian);//減速鍵釋放
}
}
}
}
}
// void shumaguandisplay(uint qian,uint bai,uint shi,uint ge)//數碼管顯示函數
//{
// duan=1;//開數碼管段碼端口
// P0=table[qian];//數碼千位顯示
// duan=0;//關數碼管段碼端口
// P0=0x00;//關數碼管段碼顯示
// wei=1;//開數碼管位碼端口
// P2=weima[0];//第1位數碼管顯示
// wei=0;//關數碼管位碼端口
// delay(1);//延時
//
// duan=1;//開數碼管段碼端口
// P0=table[bai];//數碼百位顯示
// duan=0;//關數碼管段碼端口
// P0=0x00;//關數碼管段碼顯示
// wei=1;//開數碼管位碼端口
// P2=weima[1];//第2位數碼管顯示
// wei=0;//關數碼管位碼端口
// delay(1);//延時
//
// duan=1;//開數碼管段碼端口
// P0=table[shi];//數碼管十位顯示
// duan=0;//關數碼管段碼端口
// P0=0x00;//關數碼管段碼顯示
// wei=1;//開數碼管位碼端口
// P2=weima[2];//第3位數碼管顯示
// wei=0;//關數碼管位碼端口
// delay(1);//延時
//
// duan=1;//開數碼管段碼端口
// P0=table[ge];//數碼管個位顯示
// duan=0;//關數碼管段碼端口
// P0=0x00;//關數碼管段碼顯示
// wei=1;//開數碼管位碼端口
// P2=weima[3];//第4位數碼管顯示
// wei=0;//關數碼管位碼端口
// delay(1);//延時
// }
// void shumaguannodisplay(uint qian,uint bai,uint shi,uint ge)//數碼管顯示函數
//{
// duan=1;//開數碼管段碼端口
// P0=table[qian];//數碼千位顯示
// duan=1;//關數碼管段碼端口
// P0=0x00;//關數碼管段碼顯示
// wei=1;//開數碼管位碼端口
// P2=weima[0];//第1位數碼管顯示
// wei=1;//關數碼管位碼端口
// delay(1);//延時
//
// duan=1;//開數碼管段碼端口
// P0=table[bai];//數碼百位顯示
// duan=1;//關數碼管段碼端口
// P0=0x00;//關數碼管段碼顯示
// wei=1;//開數碼管位碼端口
// P2=weima[1];//第2位數碼管顯示
// wei=1;//關數碼管位碼端口
// delay(1);//延時
//
// duan=1;//開數碼管段碼端口
// P0=table[shi];//數碼管十位顯示
// duan=1;//關數碼管段碼端口
// P0=0x00;//關數碼管段碼顯示
// wei=1;//開數碼管位碼端口
// P2=weima[2];//第3位數碼管顯示
// wei=1;//關數碼管位碼端口
// delay(1);//延時
//
// duan=1;//開數碼管段碼端口
// P0=table[ge];//數碼管個位顯示
// duan=1;//關數碼管段碼端口
// P0=0x00;//關數碼管段碼顯示
// wei=1;//開數碼管位碼端口
// P2=weima[3];//第4位數碼管顯示
// wei=1;//關數碼管位碼端口
// delay(1);//延時
// }
void main()//主函數
{
TimerInit();//定時器初始化函數
ENA=0;
ENB=0;
IN1=0;//L298M芯片控制端IN1置低電平,電機不運轉。
IN2=0;//L298M芯片控制端IN2置低電平,電機不運轉。
IN3=0;//L298M芯片控制端IN3置低電平,電機不運轉。
IN4=0;//L298M芯片控制端IN4置低電平,電機不運轉。
while(1)//死循環
{
KeyScan();//按鍵掃描函數
// if(qitingnum==1)//判斷啟停鍵是否第一次按下
// shumaguandisplay(qian,bai,shi,ge);//數碼管顯示函數
}
}
復制代碼
圖片111.png
(188.23 KB, 下載次數: 47)
下載附件
2020-5-19 21:47 上傳
圖片112.png
(185.7 KB, 下載次數: 38)
下載附件
2020-5-19 21:47 上傳
作者:
muzhi
時間:
2020-5-19 22:53
這注釋,太到位了
作者:
kofok1331
時間:
2020-6-6 02:27
樓主問一下l298n驅動7.2 300ma的馬達會不會過載
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1