|
本帖最后由 KeepYn 于 2021-4-12 21:41 編輯
- /*1、串口發(fā)送00,電機停止轉(zhuǎn)動,指示燈1點亮;
- 2、串口發(fā)送01,電機全速正轉(zhuǎn),指示燈2點亮;
- 3、串口發(fā)送02,電機全速反轉(zhuǎn),指示燈3點亮;
- 4、串口發(fā)送03,電機50%速度正轉(zhuǎn),指示燈2閃爍;
- 5、串口發(fā)送04,電機50%速度反轉(zhuǎn),指示燈3閃爍;
- 數(shù)碼管代替指示燈(數(shù)碼管的正向反向流動,流動速度的快慢代替指示燈)指示燈不亮不閃爍
- */
- #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ù)組,儲存返回語句
- 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電機驅(qū)動的相關(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ù)碼管*/
- 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手冊,真值
- 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ù),返回值為空
- {
- //串口定時器 定時器T0
- TMOD = 0x21; //T0定時器為工作方式一,T1定時器為工作方式二
- PCON = 0x00; //串口初始化相關(guān),波特率
- SCON = 0x50; //串口初始化相關(guān),串口工作方式一,允許接收
- TH1 = 0xFD; //設(shè)置初值
- TL1 = 0xFD; //設(shè)置初值
- TR1 = 1; //開啟定時器T1
- TH0 = 0xF4; //設(shè)置初值
- TL0 = 0x48; //設(shè)置初值
- TR0 = 1; //開啟定時器T0
- ES = 1; //開放串口中斷
- PT0 = 1; //定時器0中斷優(yōu)先
- ET0 = 1; //開放定時器T0中斷
- EA = 1; //開放總中斷
- SendOneByte("Receiving from 8051...\r\n"); //發(fā)送字符串,結(jié)尾回車換行
- 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來產(chǎn)生pwm波控制A端電機
- }
- else
- ena = 0;
- if(MA == 40)
- {
- MA = 0;
- }
- MB++;
- if(MB < PWMB)
- {
- enb = 1; //使用enb來產(chǎn)生pwm波控制B端電機
- }
- 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ù)制代碼 |
評分
-
查看全部評分
|