|
1.串口通信時(shí)候發(fā)送“t”,電機(jī)停止,需要串口設(shè)置定時(shí)1ms連續(xù)發(fā)送才可以停止,不能單點(diǎn)擊一下停止,而正轉(zhuǎn)和反轉(zhuǎn)單點(diǎn)都正常
2.加速和減速也需要設(shè)置定時(shí)1ms才可以實(shí)現(xiàn)。不知道為什么。代碼如下
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
//------8拍-----
uchar code zz[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //正轉(zhuǎn)
uchar code fz[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //反轉(zhuǎn)
sbit K1=P2^0; //停止
sbit K2=P2^1; //正轉(zhuǎn)
sbit K3=P2^2; //反轉(zhuǎn)
sbit K4=P2^3; //加速
sbit K5=P2^5; //減速
uchar state=0; //狀態(tài)變量
uint Time=60; //延時(shí)時(shí)間,用于調(diào)速
unsigned char receiveData='0';
void UsartConfiguration(); //初始化串口
void delay(uint ms) //延時(shí),用于調(diào)速
{
uint t;
while(ms--)
for(t=0;t<120;t++);
}
void motor_zz() //正傳函數(shù)
{
uint j;
for(j=0;j<8;j++)
{
if(P1==0xfb)
break;
P1=zz[j];
delay(Time);
}
}
void motor_fz() //反轉(zhuǎn)函數(shù)
{
uint j;
for(j=0;j<8;j++)
{
if(P1==0xfb)
break;
P1=fz[j];
delay(Time);
}
}
void main()
{
UsartConfiguration();
while(1)
{
while(state==0) //狀態(tài)0,停止
{
if((K2==0)||(receiveData=='z')) //按下K2或串口接收到'z',電機(jī)正轉(zhuǎn)
{
state=1;
receiveData='0';
break;
}
if((K3==0)||(receiveData=='f')) //按下K3或串口接收到'f',電機(jī)反轉(zhuǎn)
{
state=2;
receiveData='0';
break;
}
P0=0xfb;
P1=0x03;
}
while(state==1) //狀態(tài)1,正轉(zhuǎn)
{
if((K1==0)||(receiveData=='t')) //按下K1或串口接收到'f',電機(jī)反轉(zhuǎn)
{
state=0;
receiveData='0';
break;
}
if((K2==0)||(receiveData=='z')) //按下K2或串口接收到'z',電機(jī)正轉(zhuǎn)
{
state=1;
receiveData='0';
break;
}
if((K3==0)||(receiveData=='f')) //按下K3或串口接收到'f',電機(jī)反轉(zhuǎn)
{
state=2;
receiveData='0';
break;
}
if((K4==0)||(receiveData=='+')) //按下K4或串口接收到'+',電機(jī)加速
{
Time=Time-5;
if(Time<20)
Time=20;
while(K4==0);
}
if((K5==0)||(receiveData=='-')) //按下K5或串口接收到'-',電機(jī)減速
{
Time=Time+5;
if(Time>100)
Time=100;
while(K5==0);
}
motor_zz(); //狀態(tài)1,正轉(zhuǎn)
}
while(state==2) //狀態(tài)2,反轉(zhuǎn)
{
if((K1==0)||(receiveData=='t')) //按下K1或串口接收到'f',電機(jī)反轉(zhuǎn)
{
state=0;
receiveData='0';
break;
}
if((K2==0)||(receiveData=='z')) //按下K2或串口接收到'z',電機(jī)正轉(zhuǎn)
{
state=1;
receiveData='0';
break;
}
if((K3==0)||(receiveData=='f')) //按下K3或串口接收到'f',電機(jī)反轉(zhuǎn)
{
state=2;
receiveData='0';
break;
}
if((K4==0)||(receiveData=='+')) //按下K4或串口接收到'+',電機(jī)加速
{
Time=Time-5;
if(Time<20)
Time=20;
while(K4==0);
}
if((K5==0)||(receiveData=='-')) //按下K5或串口接收到'-',電機(jī)減速
{
Time=Time+5;
if(Time>100)
Time=100;
while(K5==0);
}
motor_fz(); //狀態(tài)2,反轉(zhuǎn)
}
}
}
/************************************************************************
* 函數(shù)名 :UsartConfiguration()
* 函數(shù)功能 :設(shè)置串口
* 輸入 : 無(wú)
* 輸出 : 無(wú)
*************************************************************************/
void UsartConfiguration()
{
SCON=0X50; //設(shè)置為工作方式1
//TMOD=0X20; //設(shè)置計(jì)數(shù)器工作方式2
TMOD=0X21; //設(shè)置計(jì)數(shù)器工作方式2 和定時(shí)器0
PCON=0X80; //波特率加倍
//TH1=0XF4; //計(jì)數(shù)器初始值設(shè)置,注意波特率是4800的
//TL1=0XF4;
TH1=0XFA; //計(jì)數(shù)器初始值設(shè)置,注意波特率是9600的
TL1=0XFA;
ES=1; //打開(kāi)接收中斷
EA=1; //打開(kāi)總中斷
TR1=1; //打開(kāi)計(jì)數(shù)器
}
void Usart() interrupt 4
{
receiveData=SBUF;//出去接收到的數(shù)據(jù)
RI = 0;//清除接收中斷標(biāo)志位
}
|
|