这是一开始用普通键盘做的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;
}
#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
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;
}
#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
694066619@qq.com
#3
哎,实在是不想再看51的代码了,比ARM的代码难看懂,宁愿去看伪代码。
#4
最后发现2个问题,TMOD=0x21,定时器中断里的初值与初始化的时候不一样了改改
#5
我也组装了一部。但是我不会编程。只是想圆孩时的梦。只能当‘摆设了!