基于51单片机的蓝牙遥控小车 PWM控制

时间:2022-10-05 17:14:34
最近在做一个蓝牙控制的小车,说说自己遇到的问题,及自己学习到的东西,最后发现绕了好大的圈,这方面的资料也不全,现在说说我的小车之路!

 这是一开始用普通键盘做的PWM调速程序!可以正常运行:
 #include<reg51.h>
 #define uint unsigned int
 #define uchar unsigned char
 sbit in1=P1^1;
 sbit in2=P1^6;
 sbit in3=P1^2;
 sbit in4=P1^7;
 sbit ina=P1^3;
 sbit inb=P1^4;
 sbit key_jia=P2^3;
 sbit key_jian=P2^4;
 sbit key_dao=P2^5;
 sbit key_left=P2^6;
 uchar w=0,m=0,n=0;
 void init()       //定时器初始化,
 { TMOD=0x01;
   TH0=0xff;
   TL0=0x17;
   EA=1;
   ET0=1;
   TR0=1;
   P1=0x00;
 }
 void key()
 {
 if(key_jia==0)
 {
   while(key_jia==0);
   if(w==100)
   w=100;
   else
   w+=25;

 }
    if(key_jian==0)
 {
   while(key_jian==0);
     if(w==25)
   w=25;
   else
   w-=25;
   
    
 }
   if(key_dao==0)
 {
   while(key_dao==0);
   {
    m+=1;
    if(m==1)
    {
    in1=0;
    in2=1;
    in3=0;
    in4=1;
    
    }
    if(m==2)
    {
      in1=1;
     in2=0;
     in3=1;
     in4=0;
     m=0;   
    }
   }
 }
 if(key_left==0)
 {
   while(key_left==0);
   {
     n+=1;
    if(n==1)
    {
     in1=1;
     in2=0;
     in3=0;
     in4=0;
    }
    if(n==2)
    {
      in1=1;
     in2=0;
     in3=1;
     in4=0;
     n=0;
    } 
  }
 }
   
 }
 void main()
 {
 init();
 in1=1;
 in2=0;
 in3=1;
 in4=0;
 while(1)
 key(); 
}
 void time0() interrupt 1
 {   uchar tt;
    TH0=0xff;
    TL0=0x17;
   tt++;
 if(tt<w)
 {
 ina=1;
 inb=1;
 }
 else
 {
 ina=0;
 inb=0;
 }
 if(tt==100)
 tt=0;
 }
 这个PWM,浪费了我好多的时间,有看不懂的自己多看看书,望大神勿喷!
 这是一开始的想法,现在看来,好多都太麻烦了,但是很好理解!
 希望可以帮到一些想学习的人!

5 个解决方案

#1


接下来就是正式的蓝牙控制小车!
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit in1=P1^1;
sbit in2=P1^6;
sbit in3=P1^2;
sbit in4=P1^7;
sbit ina=P1^3;
sbit inb=P1^4;
uchar tmp,w,sudu;                      
void init()        //串口初始化
{                                                                       //关中断
    SCON =0x50;                        
    TMOD =0x20;
    PCON=0x00;
TH1=0xfd;
TL1=0xfd;
TH0=0xff;
TH0=0x17; 
 EA=1;
 ES=1;
 ET0=1; // T0中断允许
 TR0=1; // 启动T0定时器
 TR1=1; // 启动T1定时器                       
  P1=0x00;

}
void ctrl()                      //接收处理函数
{
   switch(tmp)
   {
 

    case 'A':
            {in1=1;in2=0;in3=1;in4=0;}                        //收到字符1,指示灯0灭
  break;                                           

       case 'B':                                         //收到字符2,指示灯1灭
              {in1=0;in2=1;in3=0;in4=1;}  
    break;
   case 'C':
               {in1=1;in2=0;in3=0;in4=0;}    
 break;
         case 'D':           
{in1=0;in2=0;in3=1;in4=0;}  
break;
case 'F':
 {in1=0;in2=0;in3=0 ;in4=0;}
                   break;
// case '1':
// {in1=0;in2=1;in3=0;in4=0;}
// break;
// case '2':
// {in1=0;in2=0;in3=0;in4=1;}
// break;
   }
}
void tiaosu ()
{
switch(sudu)
{
case '1': w=25; break;
case '2': w=50; break;
case '3': w=75; break;
case '4': w=100; break;
}
}
void main()
{
   init();
//   in1=1;
//   in2=0;
//   in3=1;
//   in4=0;
   while(1)
   {      
//     if(RI==1)                     //是否有数据到来
//       {
//
//              RI=0;
//              tmp=SBUF; 
//   ctrl() ;                  //暂存接收到的数据
//      } 
ctrl(); 
tiaosu();  
    }
}
void time0() interrupt 1
{   uchar tt;
   TH0=0xfd;
   TL0=0xfd;
  tt++;
if(tt<w)
{
ina=1;
inb=1;
}
else
{
ina=0;
inb=0;
}
if(tt==100)
tt=0;
}
void ckzd() interrupt 4
{
RI=0;
tmp=SBUF;
sudu=SBUF;
}

#2


有什么不懂的地方,可以发邮件给我
694066619@qq.com

#3


哎,实在是不想再看51的代码了,比ARM的代码难看懂,宁愿去看伪代码。

#4


最后发现2个问题,TMOD=0x21,定时器中断里的初值与初始化的时候不一样了改改

#5


我也组装了一部。但是我不会编程。只是想圆孩时的梦。只能当‘摆设了!

#1


接下来就是正式的蓝牙控制小车!
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit in1=P1^1;
sbit in2=P1^6;
sbit in3=P1^2;
sbit in4=P1^7;
sbit ina=P1^3;
sbit inb=P1^4;
uchar tmp,w,sudu;                      
void init()        //串口初始化
{                                                                       //关中断
    SCON =0x50;                        
    TMOD =0x20;
    PCON=0x00;
TH1=0xfd;
TL1=0xfd;
TH0=0xff;
TH0=0x17; 
 EA=1;
 ES=1;
 ET0=1; // T0中断允许
 TR0=1; // 启动T0定时器
 TR1=1; // 启动T1定时器                       
  P1=0x00;

}
void ctrl()                      //接收处理函数
{
   switch(tmp)
   {
 

    case 'A':
            {in1=1;in2=0;in3=1;in4=0;}                        //收到字符1,指示灯0灭
  break;                                           

       case 'B':                                         //收到字符2,指示灯1灭
              {in1=0;in2=1;in3=0;in4=1;}  
    break;
   case 'C':
               {in1=1;in2=0;in3=0;in4=0;}    
 break;
         case 'D':           
{in1=0;in2=0;in3=1;in4=0;}  
break;
case 'F':
 {in1=0;in2=0;in3=0 ;in4=0;}
                   break;
// case '1':
// {in1=0;in2=1;in3=0;in4=0;}
// break;
// case '2':
// {in1=0;in2=0;in3=0;in4=1;}
// break;
   }
}
void tiaosu ()
{
switch(sudu)
{
case '1': w=25; break;
case '2': w=50; break;
case '3': w=75; break;
case '4': w=100; break;
}
}
void main()
{
   init();
//   in1=1;
//   in2=0;
//   in3=1;
//   in4=0;
   while(1)
   {      
//     if(RI==1)                     //是否有数据到来
//       {
//
//              RI=0;
//              tmp=SBUF; 
//   ctrl() ;                  //暂存接收到的数据
//      } 
ctrl(); 
tiaosu();  
    }
}
void time0() interrupt 1
{   uchar tt;
   TH0=0xfd;
   TL0=0xfd;
  tt++;
if(tt<w)
{
ina=1;
inb=1;
}
else
{
ina=0;
inb=0;
}
if(tt==100)
tt=0;
}
void ckzd() interrupt 4
{
RI=0;
tmp=SBUF;
sudu=SBUF;
}

#2


有什么不懂的地方,可以发邮件给我
694066619@qq.com

#3


哎,实在是不想再看51的代码了,比ARM的代码难看懂,宁愿去看伪代码。

#4


最后发现2个问题,TMOD=0x21,定时器中断里的初值与初始化的时候不一样了改改

#5


我也组装了一部。但是我不会编程。只是想圆孩时的梦。只能当‘摆设了!