標(biāo)題:
串口控制直流電機(jī)程序 80C51單片機(jī) L298N 普中51-單核-A4
[打印本頁(yè)]
作者:
KeepYn
時(shí)間:
2021-4-11 14:37
標(biāo)題:
串口控制直流電機(jī)程序 80C51單片機(jī) L298N 普中51-單核-A4
本帖最后由 KeepYn 于 2021-4-12 21:41 編輯
/*1、串口發(fā)送00,電機(jī)停止轉(zhuǎn)動(dòng),指示燈1點(diǎn)亮;
2、串口發(fā)送01,電機(jī)全速正轉(zhuǎn),指示燈2點(diǎn)亮;
3、串口發(fā)送02,電機(jī)全速反轉(zhuǎn),指示燈3點(diǎn)亮;
4、串口發(fā)送03,電機(jī)50%速度正轉(zhuǎn),指示燈2閃爍;
5、串口發(fā)送04,電機(jī)50%速度反轉(zhuǎn),指示燈3閃爍;
數(shù)碼管代替指示燈(數(shù)碼管的正向反向流動(dòng),流動(dòng)速度的快慢代替指示燈)指示燈不亮不閃爍
*/
#include <reg51.h> //頭文件 #預(yù)處理命令符 inclue預(yù)處理命令
#define uint unsigned int
#define uchar unsigned char
uchar a,b,i; //定義全局變量a的值域,以便下面函數(shù)使用
uchar SendBuf[]="The signal is normal";
//定義數(shù)組,儲(chǔ)存返回語(yǔ)句
uchar code DMZ50[]={0x01,0x01,0x01,0x01,0x02,0x04,0x08,0x08,0x08,0x08,0x10,0x20}; //流水顯示的段碼,定義為正
uchar code DMF50[]={0x20,0x10,0x08,0x08,0x08,0x08,0x04,0x02,0x01,0x01,0x01,0x01}; //流水顯示的段碼,定義為反
uchar code DM0[]={0x49,0x36,0x49,0x36,0x49,0x36,0x49,0x36,0x49,0x36,0x49,0x36,0x49,0x36,0x49,0x36};
//流水顯示的段碼,停
uchar code DMZ[] = {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x04,
0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x20};
uchar code DMF[] = {0x20,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
0x04,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01};
sbit WA=P2^2;
sbit WB=P2^3; //74HC138譯碼器位選管腳(數(shù)碼管用)
sbit WC=P2^4;
/*蜂鳴器*/
sbit BZ=P2^5;
//L298N引腳定義
sbit ena = P1^0; //l298n電機(jī)驅(qū)動(dòng)的相關(guān)引腳
sbit in1 = P1^1;
sbit in2 = P1^2;
sbit in3 = P1^3;
sbit in4 = P1^4;
sbit enb = P1^5;
uchar MA = 0,MB = 0; //pwm控制用
uchar PWMA = 20;
uchar PWMB = 20;
uchar cmd; //串口接收的命令sbuf
void delay(uint z); //聲明延時(shí)函數(shù)
/*數(shù)碼管*/
void showDigital()
{
switch(cmd)
{
case(0):
for(i=0;i<16;i++)
{
switch(i)
{ case(8):
WA = 0;WB = 0;WC = 0;break;
case(9):
WA = 1;WB = 0;WC = 0;break;
case(10):
WA = 0;WB = 1;WC = 0;break;
case(11):
WA = 1;WB = 1;WC = 0;break;
case(12):
WA = 0;WB = 0;WC = 1;break;
case(13):
WA = 1;WB = 0;WC = 1;break;
case(14):
WA = 0;WB = 1;WC = 1;break;
case(15):
WA = 1;WB = 1;WC = 1;break;
case(7):
WA = 0;WB = 0;WC = 0;break;
case(6):
WA = 1;WB = 0;WC = 0;break;
case(5):
WA = 0;WB = 1;WC = 0;break;
case(4):
WA = 1;WB = 1;WC = 0;break;
case(3):
WA = 0;WB = 0;WC = 1;break;
case(2):
WA = 1;WB = 0;WC = 1;break;
case(1):
WA = 0;WB = 1;WC = 1;break;
case(0):
WA = 1;WB = 1;WC = 1;break;
}
P0 = DM0[i];
delay(250);
}
break;
case(3):
for(i=0;i<12;i++)
{
switch(i)
{
case(11):
WA = 1;WB = 1;WC = 1;break;
case(10):
WA = 1;WB = 1;WC = 1;break;
case(9):
WA = 1;WB = 1;WC = 1;break;
case(8):
WA = 0;WB = 1;WC = 1;break;
case(7):
WA = 1;WB = 0;WC = 1;break;
case(6):
WA = 0;WB = 0;WC = 1;break;
case(5):
WA = 0;WB = 0;WC = 1;break;
case(4):
WA = 0;WB = 0;WC = 1;break;
case(3):
WA = 0;WB = 0;WC = 1;break;
case(2):
WA = 1;WB = 0;WC = 1;break;
case(1):
WA = 0;WB = 1;WC = 1;break;
case(0):
WA = 1;WB = 1;WC = 1;break;
}
P0 = DMZ50[i];
delay(50);
}
break;
case(4):
for(i=0;i<12;i++)
{
switch(i)
{
case(0):
WA = 1;WB = 1;WC = 1;break;
case(1):
WA = 1;WB = 1;WC = 1;break;
case(2):
WA = 1;WB = 1;WC = 1;break;
case(3):
WA = 0;WB = 1;WC = 1;break;
case(4):
WA = 1;WB = 0;WC = 1;break;
case(5):
WA = 0;WB = 0;WC = 1;break;
case(6):
WA = 0;WB = 0;WC = 1;break;
case(7):
WA = 0;WB = 0;WC = 1;break;
case(8):
WA = 0;WB = 0;WC = 1;break;
case(9):
WA = 1;WB = 0;WC = 1;break;
case(10):
WA = 0;WB = 1;WC = 1;break;
case(11):
WA = 1;WB = 1;WC = 1;break;
}
P0 = DMF50[i];
delay(50);
}
break;
case(1):
for(i=0;i<20;i++)
{
switch(i)
{ case(19):
WA = 1;WB = 1;WC = 1;break;
case(18):
WA = 1;WB = 1;WC = 1;break;
case(17):
WA = 1;WB = 1;WC = 1;break;
case(16):
WA = 0;WB = 1;WC = 1;break;
case(15):
WA = 1;WB = 0;WC = 1;break;
case(14):
WA = 0;WB = 0;WC = 1;break;
case(13):
WA = 1;WB = 1;WC = 0;break;
case(12):
WA = 0;WB = 1;WC = 0;break;
case(11):
WA = 1;WB = 0;WC = 0;break;
case(10):
WA = 0;WB = 0;WC = 0;break;
case(9):
WA = 0;WB = 0;WC = 0;break;
case(8):
WA = 0;WB = 0;WC = 0;break;
case(7):
WA = 0;WB = 0;WC = 0;break;
case(6):
WA = 1;WB = 0;WC = 0;break;
case(5):
WA = 0;WB = 1;WC = 0;break;
case(4):
WA = 1;WB = 1;WC = 0;break;
case(3):
WA = 0;WB = 0;WC = 1;break;
case(2):
WA = 1;WB = 0;WC = 1;break;
case(1):
WA = 0;WB = 1;WC = 1;break;
case(0):
WA = 1;WB = 1;WC = 1;break;
}
P0 = DMZ[i];
delay(25);
}
break;
case(2):
for(i=0;i<20;i++)
{
switch(i)
{ case(0):
WA = 1;WB = 1;WC = 1;break;
case(1):
WA = 1;WB = 1;WC = 1;break;
case(2):
WA = 1;WB = 1;WC = 1;break;
case(3):
WA = 0;WB = 1;WC = 1;break;
case(4):
WA = 1;WB = 0;WC = 1;break;
case(5):
WA = 0;WB = 0;WC = 1;break;
case(6):
WA = 1;WB = 1;WC = 0;break;
case(7):
WA = 0;WB = 1;WC = 0;break;
case(8):
WA = 1;WB = 0;WC = 0;break;
case(9):
WA = 0;WB = 0;WC = 0;break;
case(10):
WA = 0;WB = 0;WC = 0;break;
case(11):
WA = 0;WB = 0;WC = 0;break;
case(12):
WA = 0;WB = 0;WC = 0;break;
case(13):
WA = 1;WB = 0;WC = 0;break;
case(14):
WA = 0;WB = 1;WC = 0;break;
case(15):
WA = 1;WB = 1;WC = 0;break;
case(16):
WA = 0;WB = 0;WC = 1;break;
case(17):
WA = 1;WB = 0;WC = 1;break;
case(18):
WA = 0;WB = 1;WC = 1;break;
case(19):
WA = 1;WB = 1;WC = 1;break;
}
P0 = DMF[i];
delay(25);
}
break;
}
}
/*全速正轉(zhuǎn)*/
void forward()
{
in1=1; //l298n手冊(cè),真值
in2=0;
in3=1;
in4=0;
PWMA = 20;
PWMB = 20;
}
/*全速反轉(zhuǎn)*/
void fallback()
{
in1=0;
in2=1;
in3=0;
in4=1;
PWMA = 20;
PWMB = 20;
}
/*50占空比正轉(zhuǎn)*/
void quick()
{
in1=1;
in2=0;
PWMA = 10;
in3=1;
in4=0;
PWMB = 10;
}
/*50占空比反轉(zhuǎn)*/
void slow()
{
in1=0;
in2=1;
PWMA = 10;
in3=0;
in4=1;
PWMB = 10;
}
/*停*/
void stop()
{
in1=0;
in2=0;
in3=0;
in4=0;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=115;y>0;y--);
}
void SendOneByte(uchar *str) //串口發(fā)送數(shù)據(jù)
{
while(*str !='\0')
{
SBUF=*str;
while(!TI);
TI=0;
str++;
}
}
void main() //定義主函數(shù),返回值為空
{
//串口定時(shí)器 定時(shí)器T0
TMOD = 0x21; //T0定時(shí)器為工作方式一,T1定時(shí)器為工作方式二
PCON = 0x00; //串口初始化相關(guān),波特率
SCON = 0x50; //串口初始化相關(guān),串口工作方式一,允許接收
TH1 = 0xFD; //設(shè)置初值
TL1 = 0xFD; //設(shè)置初值
TR1 = 1; //開(kāi)啟定時(shí)器T1
TH0 = 0xF4; //設(shè)置初值
TL0 = 0x48; //設(shè)置初值
TR0 = 1; //開(kāi)啟定時(shí)器T0
ES = 1; //開(kāi)放串口中斷
PT0 = 1; //定時(shí)器0中斷優(yōu)先
ET0 = 1; //開(kāi)放定時(shí)器T0中斷
EA = 1; //開(kāi)放總中斷
SendOneByte("Receiving from 8051...\r\n"); //發(fā)送字符串,結(jié)尾回車(chē)換行
while(1)
{
showDigital();
SendOneByte("\r\n");
delay(500);
SendOneByte(SendBuf);
}
}
void time0_int() interrupt 1
{
TR0 = 0;
TH0 = (65536-500)/256;
TL0 = (65536-500)%256;
MA++;
if(MA < PWMA)
{
ena = 1; //使用ena來(lái)產(chǎn)生pwm波控制A端電機(jī)
}
else
ena = 0;
if(MA == 40)
{
MA = 0;
}
MB++;
if(MB < PWMB)
{
enb = 1; //使用enb來(lái)產(chǎn)生pwm波控制B端電機(jī)
}
else
enb = 0;
if(MB == 40)
{
MB = 0;
}
TR0 = 1;
}
void UARTInterrupt(void) interrupt 4
{
if(RI)
{
RI = 0;
cmd = SBUF;
switch(cmd)
{
case 1:
forward();
break;
case 2:
fallback();
break;
case 3:
quick();
break;
case 4:
slow();
break;
case 0:
stop();
default:
break;
}
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1