#include "STC.H"
// sbit s=P1^0 ;
sbit pul=P0^0; //脉冲信号输出,LED0.0可显示状态
sbit dir=P0^1; //方向信号输出,LED0.1可显示状态
sbit ena=P0^2; //使能信号输出,LED0.2可显示状态
sbit lp0=P1^0;//
sbit lp1=P1^1;
int flag=0;
#define uchar unsigned char
#define uint unsigned int
//sbit S1=P1^4; // 方向控制 独立按键K5
//sbit S2=P1^5; // 使能控制 独立按键K6
unsigned char dat;
unsigned int v;
unsigned int x;
unsigned int k;
unsigned char light;
unsigned int sudu[9]={1,2,4,8,25,32,64,128,256};
int pos=0;
void delay_1ms(unsigned int i) //1MS 延时
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<125;j++)
{;}
}
void delay_40us(unsigned int i) //40usS 延时
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<5;j++)
{;}
}
void delay(unsigned int i)// us级延时
{
while(--i);
}
void sent_char(uchar i) //发送一个字符
{
SBUF=i;
while(!TI);
TI=0;
}
void sent_str(uchar *s) //发送字符串
{
while(*s!='\0')
{
sent_char(*s);
s++;
delay_1ms(5);
}
}
void cd() //每转一个角度,发送一个数据,用于计算长度;
{ if(dir==0&&ena==1&&lp0==0&&lp1==0)
sent_char('x');
else if(dir==1&&ena==1&&lp0==0&&lp1==0)
sent_char('y');
}
void dd() //到达端点,向电脑发送数据
{ if(dir==0&&ena==1&&lp0==1)
sent_char('e');
else if(dir==1&&ena==1&&lp1==1)
sent_char('f');
}
/*void keyscan() //键盘扫描
{
if(S2==0)
{
delay_1ms(10);//延时,防抖
if(S2==0)
ena=~ena;// 使能改变
}
if(S1==0)
{
delay_1ms(10);//延时,防抖
if(S1==0)
dir=~dir;// 方向改变
}
}
*/
void main(void)
{ SCON=0x40;
TMOD = 0x20;
TH0 = 0x3c;
TL0 = 0xb0;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
SM0 = 0;
SM1 = 1;
REN = 1;
EA = 1;
ES = 1;
RI = 0;
TI =0;
ena=0 ;//高电平使能,初始化为低电平。
delay(5) ;//使能信号要至少要早于方向信号5us建立
dir=1 ;//初始化转动方向
delay(5) ; //因为方向信号要至少要早于脉冲信号5us建立
v=4 ; // 速度初始化
P1=0xFF; // P1口置1,为写入端口
while(1)
{
if(RI==1)
{
dat=SBUF; //串口通信接受收据
RI=0;
}
if (dat=='a') //开关
{ena=0;pul=0;}
else if (dat=='b')
ena=1;
else if(dat=='c') //方向
{ena=1;dir=0;}
else if(dat=='d')
{ena=1;dir=1;}
if(ena==1)///电机打开才能进行加减速
{
if(dat=='0') //速度调节,dat从0~9,速度依次增大。
v=8;
else if(dat=='1')
v=7;
else if(dat=='2')
v=6;
else if(dat=='3')
v=5;
else if(dat=='4')
v=4;
else if(dat=='5')
v=3;
else if(dat=='6')
v=2;
else if(dat=='7')
v=1;
else if(dat=='8')
v=0;
}
x=sudu[v];
// keyscan();
// delay(5) ; //因为方向信号要至少要早于脉冲信号5us建立
if (lp0==1||lp1==1)
{ flag=1;
//dir=~dir;
}
if (flag==0)
{pul=0; //pul输出低电平
delay_40us(x); //周期的1/2时间
pul=1; //pul 输出高电平
delay_40us(x); //
cd();
}
else
{
flag=0;
dd() ;
dir=~dir;
for(k=0;k<5000;k++)
{pul=0; //pul输出低电平
delay_40us(x); //周期的1/2时间
pul=1; //pul 输出高电平
delay_40us(x);
if(dir==0)
sent_char('x');
else
sent_char('y');
}
}
}
}
// sbit s=P1^0 ;
sbit pul=P0^0; //脉冲信号输出,LED0.0可显示状态
sbit dir=P0^1; //方向信号输出,LED0.1可显示状态
sbit ena=P0^2; //使能信号输出,LED0.2可显示状态
sbit lp0=P1^0;//
sbit lp1=P1^1;
int flag=0;
#define uchar unsigned char
#define uint unsigned int
//sbit S1=P1^4; // 方向控制 独立按键K5
//sbit S2=P1^5; // 使能控制 独立按键K6
unsigned char dat;
unsigned int v;
unsigned int x;
unsigned int k;
unsigned char light;
unsigned int sudu[9]={1,2,4,8,25,32,64,128,256};
int pos=0;
void delay_1ms(unsigned int i) //1MS 延时
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<125;j++)
{;}
}
void delay_40us(unsigned int i) //40usS 延时
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<5;j++)
{;}
}
void delay(unsigned int i)// us级延时
{
while(--i);
}
void sent_char(uchar i) //发送一个字符
{
SBUF=i;
while(!TI);
TI=0;
}
void sent_str(uchar *s) //发送字符串
{
while(*s!='\0')
{
sent_char(*s);
s++;
delay_1ms(5);
}
}
void cd() //每转一个角度,发送一个数据,用于计算长度;
{ if(dir==0&&ena==1&&lp0==0&&lp1==0)
sent_char('x');
else if(dir==1&&ena==1&&lp0==0&&lp1==0)
sent_char('y');
}
void dd() //到达端点,向电脑发送数据
{ if(dir==0&&ena==1&&lp0==1)
sent_char('e');
else if(dir==1&&ena==1&&lp1==1)
sent_char('f');
}
/*void keyscan() //键盘扫描
{
if(S2==0)
{
delay_1ms(10);//延时,防抖
if(S2==0)
ena=~ena;// 使能改变
}
if(S1==0)
{
delay_1ms(10);//延时,防抖
if(S1==0)
dir=~dir;// 方向改变
}
}
*/
void main(void)
{ SCON=0x40;
TMOD = 0x20;
TH0 = 0x3c;
TL0 = 0xb0;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
SM0 = 0;
SM1 = 1;
REN = 1;
EA = 1;
ES = 1;
RI = 0;
TI =0;
ena=0 ;//高电平使能,初始化为低电平。
delay(5) ;//使能信号要至少要早于方向信号5us建立
dir=1 ;//初始化转动方向
delay(5) ; //因为方向信号要至少要早于脉冲信号5us建立
v=4 ; // 速度初始化
P1=0xFF; // P1口置1,为写入端口
while(1)
{
if(RI==1)
{
dat=SBUF; //串口通信接受收据
RI=0;
}
if (dat=='a') //开关
{ena=0;pul=0;}
else if (dat=='b')
ena=1;
else if(dat=='c') //方向
{ena=1;dir=0;}
else if(dat=='d')
{ena=1;dir=1;}
if(ena==1)///电机打开才能进行加减速
{
if(dat=='0') //速度调节,dat从0~9,速度依次增大。
v=8;
else if(dat=='1')
v=7;
else if(dat=='2')
v=6;
else if(dat=='3')
v=5;
else if(dat=='4')
v=4;
else if(dat=='5')
v=3;
else if(dat=='6')
v=2;
else if(dat=='7')
v=1;
else if(dat=='8')
v=0;
}
x=sudu[v];
// keyscan();
// delay(5) ; //因为方向信号要至少要早于脉冲信号5us建立
if (lp0==1||lp1==1)
{ flag=1;
//dir=~dir;
}
if (flag==0)
{pul=0; //pul输出低电平
delay_40us(x); //周期的1/2时间
pul=1; //pul 输出高电平
delay_40us(x); //
cd();
}
else
{
flag=0;
dd() ;
dir=~dir;
for(k=0;k<5000;k++)
{pul=0; //pul输出低电平
delay_40us(x); //周期的1/2时间
pul=1; //pul 输出高电平
delay_40us(x);
if(dir==0)
sent_char('x');
else
sent_char('y');
}
}
}
}