单片机舵机与超声波

作为一个51单片机初学者,我用的是普中科技V2.0的板子 我和队友分别学习超声波舵机 和 红外模块 开学组装小车 但是现在我的代码应该能够执行 但是不可行 数码管可以显示超声波测出的距离 但之后的for控制的舵机不会转动 不知道为什么 我把数码管显示距离和for控制舵机转动放在了一个case里面 数码管可以执行 但是 for控制的舵机不会转动 求大神看看 指导一下 第一次发帖子
代码如下
#include"reg52.h"
#include <intrins.h>

#define stop 0
#define zhuandong 1
int n=0;
int z=0;
unsigned int s;
sbit trig=P2^0;
sbit echo=P2^1;
sbit pwm = P1^0;
unsigned char cishu = 0,mingling=2;

void delay50ms(void) //50ms延时
{
unsigned char a,b;
for(b=173;b>0;b–)
for(a=143;a>0;a–);
}

void delay10ms(void)
{
unsigned char a,b;
for(b=249;b>0;b–);
for(a=17;a>0;a–);
}

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay(unsigned int i)
{
while(i–);
}

void DigDisplay(int i)
{
int k,m=0;
while(i>0)
{
k=i%10;
switch(m)
{
case(0): LSA=0;LSB=0;LSC=0;P0=smgduan[k]; break;
case(1): LSA=1;LSB=0;LSC=0;P0=smgduan[k]; break;
case(2): LSA=0;LSB=1;LSC=0;P0=smgduan[k]; break;
case(3): LSA=1;LSB=1;LSC=0;P0=smgduan[k]; break;
case(4): LSA=0;LSB=0;LSC=1;P0=smgduan[k]; break;
case(5): LSA=1;LSB=0;LSC=1;P0=smgduan[k]; break;
case(6): LSA=0;LSB=1;LSC=1;P0=smgduan[k]; break;
case(7): LSA=1;LSB=1;LSC=1;P0=smgduan[k]; break;
}
i=i/10;
m++;
delay(100);
P0=0x00;
}
}

void InitialTimer ( void )
{
TMOD|=0x91; //0.1Ms进入中断
TH0 = 0xFF;
TL0 = 0xA4;
EA=1;
ET0=1;
TR0=1;
}

void duojikongzhi ( void ) //计算距离的函数和控制舵机的函数
{ //放在了一起
unsigned int s=0;
unsigned int time=0;
time=TH1256+TL1;
TH1=0;
TL1=0;
s=(long)(time
1.8)/100; //s是距离 单位是cm
delay10ms();
if(s<=35) //距离较小舵机转动
{
mingling=zhuandong;
}
else //否则数码管显示111
{
mingling=stop;
DigDisplay(111);
}
switch(mingling)
{ //这里是switch
case(0):
{
n=15;
break;
}
case(1):
{ for(z=0;z<=100;z++)
{
DigDisplay(s);
}
for(n=15;n<=22;n++)
{
delay50ms();
}
delay(5000);
for(n=22;n>=8;n–)
{
delay50ms();
}
delay(5000);
for(n=8;n<=15;n++)
{
delay50ms();
}
break;
}
default: break;
}
mingling=2;

}

void startmodule()
{
int i;
trig=1;
for(i=0;i<20;i++)
{
nop();
}
trig=0;

}

void main( void )
{
TMOD|=0x91; //这里是初始化定时器
TH1=0;
TL1=0;
ET1=1;
EA=1;
InitialTimer();

while(1)	
{
	unsigned int time=0;
 	startmodule();
 	while(!echo);
	TR1=1;
	while(echo);
	TR1=0;
	duojikongzhi();
}

}

void Timer1 ( void ) interrupt 1
{
TH0 = 0xFF ; //0.1Ms
TL0 = 0xA4;
cishu ++;
if(cishu==200)
cishu=0;
if(cishu<n)
pwm=1;
else
pwm=0;
}```

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值