/*
晶振Fosc: 11.0592Mhz ,{ Tm = 12 * T(晶振) =====>>>> Fm = Fosc/12 }
芯片:STC89C52
*/
#include <reg52.h>
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
char buffer = 0; //从蓝牙处接受数据
int demu = 7,num; //demu是设置占空比的参数
void init() //初始化:波特率的设置与要蓝牙的波特率一致
{
SCON =0x50; //10位串口,可变波特率
TMOD =0x20;
//PCON=0x00; //SMOD == 0,波特率不加倍
TH1=0xfd; //9600bps
TL1=0xfd;
//TH0=0xff;
//TH0=0x17;
TH0 = (65536 - 461)/256; //定时500us,发生PWM
TL0 = (65536 - 461)%256; //T0计数器的初始值是多少,不用太关心
EA=1;
ES=1;
ET0=1;
TR0=0; //刚上电时避免转动
TR1=1;
}
void adjust() //控制方向
{
switch(buffer)
{
case 'S': //停止
IN1=0;
IN2=0;
IN3=0;
IN4=0;
TR0 = 0;
break;
case 'G': //前进
TR0 = 1;
IN1=1;
IN2=0;
IN3=1;
IN4=0;
break;
case 'B': //后退
TR0 = 1;
IN1=0;
IN2=1;
IN3=0;
IN4=1;
break;
case 'L': //左转
TR0 = 1;
IN1=1;
IN2=0;
IN3=0;
IN4=0;
break;
case 'R': //右转
TR0 = 1;
IN1=0;
IN2=0;
IN3=1;
IN4=0;
break;
case '1': //档位
TR0 = 1;
demu = 7;
IN1=0;
IN2=0;
IN3=0;
IN4=0;
break;
case '2':
TR0 = 1;
demu = 10;
IN1=0;
IN2=0;
IN3=0;
IN4=0;
break;
case '3':
TR0 = 1;
demu = 14;
IN1=0;
IN2=0;
IN3=0;
IN4=0;
break;
}
}
main()
{
init();
while(1)
{
adjust();
}
}
void UartIsr() interrupt 4
{
if(RI) //TI和RI只能用软件清零
{
RI=0;
buffer = SBUF; //SBUF是数据缓存寄存器
}
}
void timer0() interrupt 1
{
TH0 = (65536 - 461)/256; // 461 * Tm = 500us
TL0 = (65536 - 461)%256;
++num;
if(num<=demu) //高电平由adjust函数来决定
{
}
else
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
if(num==20) //周期:10ms
num=0;
}
/*
晶振Fosc: 11.0592Mhz ,{ Tm = 12 * T(晶振) =====>>>> Fm = Fosc/12 }
芯片:STC89C52
*/
#include <reg52.h>
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
char buffer = 0; //从蓝牙处接受数据
int demu = 7,num; //demu是设置占空比的参数
void init() //初始化:波特率的设置与要蓝牙的波特率一致
{
SCON =0x50; //10位串口,可变波特率
TMOD =0x20;
//PCON=0x00; //SMOD == 0,波特率不加倍
TH1=0xfd; //9600bps
TL1=0xfd;
//TH0=0xff;
//TH0=0x17;
TH0 = (65536 - 461)/256; //定时500us,发生PWM
TL0 = (65536 - 461)%256; //T0计数器的初始值是多少,不用太关心
EA=1;
ES=1;
ET0=1;
TR0=0; //刚上电时避免转动
TR1=1;
}
void adjust() //控制方向
{
switch(buffer)
{
case 'S': //停止
IN1=0;
IN2=0;
IN3=0;
IN4=0;
TR0 = 0;
break;
case 'G': //前进
TR0 = 1;
IN1=1;
IN2=0;
IN3=1;
IN4=0;
break;
case 'B': //后退
TR0 = 1;
IN1=0;
IN2=1;
IN3=0;
IN4=1;
break;
case 'L': //左转
TR0 = 1;
IN1=1;
IN2=0;
IN3=0;
IN4=0;
break;
case 'R': //右转
TR0 = 1;
IN1=0;
IN2=0;
IN3=1;
IN4=0;
break;
case '1': //档位
TR0 = 1;
demu = 7;
IN1=0;
IN2=0;
IN3=0;
IN4=0;
break;
case '2':
TR0 = 1;
demu = 10;
IN1=0;
IN2=0;
IN3=0;
IN4=0;
break;
case '3':
TR0 = 1;
demu = 14;
IN1=0;
IN2=0;
IN3=0;
IN4=0;
break;
}
}
main()
{
init();
while(1)
{
adjust();
}
}
void UartIsr() interrupt 4
{
if(RI) //TI和RI只能用软件清零
{
RI=0;
buffer = SBUF; //SBUF是数据缓存寄存器
}
}
void timer0() interrupt 1
{
TH0 = (65536 - 461)/256; // 461 * Tm = 500us
TL0 = (65536 - 461)%256;
++num;
if(num<=demu) //高电平由adjust函数来决定
{
}
else
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
if(num==20) //周期:10ms
num=0;
}