基于51单片机--spp蓝牙串口(蓝)控制小车

/*
晶振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;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值