#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);
}
|