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

ZHILIN_KK 2014-10-11 08:57:31
最近在做一个蓝牙控制的小车,说说自己遇到的问题,及自己学习到的东西,最后发现绕了好大的圈,这方面的资料也不全,现在说说我的小车之路!

这是一开始用普通键盘做的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,浪费了我好多的时间,有看不懂的自己多看看书,望大神勿喷!
这是一开始的想法,现在看来,好多都太麻烦了,但是很好理解!
希望可以帮到一些想学习的人!
...全文
2114 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_39161671 2017-06-13
  • 打赏
  • 举报
回复
我也组装了一部。但是我不会编程。只是想圆孩时的梦。只能当‘摆设了!
ZHILIN_KK 2014-10-19
  • 打赏
  • 举报
回复
最后发现2个问题,TMOD=0x21,定时器中断里的初值与初始化的时候不一样了改改
lr2131 2014-10-11
  • 打赏
  • 举报
回复
哎,实在是不想再看51的代码了,比ARM的代码难看懂,宁愿去看伪代码。
ZHILIN_KK 2014-10-11
  • 打赏
  • 举报
回复
有什么不懂的地方,可以发邮件给我 694066619@qq.com
ZHILIN_KK 2014-10-11
  • 打赏
  • 举报
回复
接下来就是正式的蓝牙控制小车! #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; }

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧