#include <reg52.h>
#include <intrins.h>
void Delay10ms();
void Delay5ms();
void Delay1ms();
#define uchar unsigned char
#define uint unsigned int
sbit a=P1^0; //电机信号输入
sbit b=P1^1;
sbit c=P1^2;
sbit d=P1^3;
sbit pwm1=P1^4;
sbit pwm2=P1^5;
sbit buzz=P2^7;
uchar cishu; //中断次数
uchar p1; //p1占空比
uchar p2; //p2占空比
void qian() //方向控制
{
a=1;b=0;c=1;d=0;
}
void hou() //方向控制
{
a=0;b=1;c=0;d=1;
}
void zuo() //方向控制
{
a=1;b=0;c=0;d=1;
}
void you() //方向控制
{
a=0;b=1;c=1;d=0;
}
void ting() //方向控制
{
a=0;b=0;c=0;d=0;
}
void jia()
{
if(p1>29)
{
p1=30;p2=30; buzz=0;
}
else
{
p1++; p2++; buzz=1;
}
}
void jian()
{
if(p1<21)
{
p1=20;p2=20;buzz=0;
}
else
{
p1--; p2--; buzz=1;
}
}
uchar RxData()
{
uchar tmp; //定义一个临时变量,用来保存接收到的数据
while (!RI);//等待数据接收完,接收完后时RI会自动置1
RI = 0; //清中断标志
tmp = SBUF; //将接收到的数据保存到tmp中
return tmp; //返回接收到的数据
}
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x00; //清除定时器1模式位
TMOD |= 0x21; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
TL0 = 0xF1; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
ES=1;
}
void main()
{
UartInit();
RI = 1;
p1=25;p2=25;
while(1)
{
// switch(RxData())
// {
// case 0x01: qian(); Delay1ms(); p1=30;p2=30; break;
// case 0x02: hou(); Delay1ms(); p1=30;p2=30; break;
// case 0x03: zuo(); Delay1ms(); p1=21;p2=21; break;
// case 0x04: you(); Delay1ms(); p1=21;p2=21; break;
// case 0x00: ting(); Delay1ms(); p1=0;p2=0; break;
// default : ;
// }
}
}
void es () interrupt 4
{
uchar tmp; //定义一个临时变量,用来保存接收到的数据
if(RI==1)
{
tmp = SBUF; //将接收到的数据保存到tmp中
switch(tmp)
{
case 0x01: qian(); Delay1ms(); break; //p1=30;p2=30;
case 0x02: hou(); Delay1ms(); break; //p1=30;p2=30;
case 0x03: zuo(); Delay1ms(); break; //p1=21;p2=21;
case 0x04: you(); Delay1ms(); break; //p1=21;p2=21;
case 0x00: ting(); Delay1ms(); break; //p1=0;p2=0;
case 0x09: buzz=~buzz; break;
case 0x06: jia(); buzz=0;Delay1ms();buzz=1; break;
case 0x07: jian(); buzz=0;Delay1ms();buzz=1; break;
default : ;
}
}
RI=0;
}
void T_0 () interrupt 1
{
TR0=0;
TL0 = 0xF1; //设置定时初值
TH0 = 0xFF; //设置定时初值
if(cishu<=30)
{
cishu++;
}
else
{
cishu=0;
}
if(cishu<=p1)
{
pwm1=1;
}
else
{
pwm1=0;
}
if(cishu<=p2)
{
pwm2=1;
}
else
{
pwm2=0;
}
TR0=1;
}
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
void Delay5ms() //@11.0592MHz
{
unsigned char i, j;
i = 54;
j = 199;
do
{
while (--j);
} while (--i);
}
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
|