标题:
红外小车加超声波测距
[打印本页]
作者:
xudawei
时间:
2016-11-12 18:09
标题:
红外小车加超声波测距
红外小车加超声波测距
程序哪里有错误?
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
sbit hw=P3^0;
sbit tr=P3^4;
sbit ec=P3^5;
sbit wela=P2^7;
sbit dula=P2^6;
uint distance,time,tl,th;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay_20us(void )
{
uchar a ;
for(a=0;a<100;a++);
}
void delay(uint a )
{
while(a--);
}
void delaym(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uint temp)
{
uint ge,shi,bai;
bai=temp/100;
shi=(temp%100)/10;
ge=temp%10;
wela=1;
P0=0xfe;
wela=0;
dula=1;
P0=table[bai];
dula=0;
delaym(1);
dula=1;
P0=0x00; //关位码
dula=0;
wela=1;
P0=0xfd;
wela=0;
dula=1;
P0=table[shi];
dula=0;
delaym(1);
dula=1;
P0=0x00; //关位码
dula=0;
dula=1;
P0=table[ge];
dula=0;
wela=1;
P0=0xfb;
wela=0;
delaym(1);
dula=1;
P0=0x00; //关位码
dula=0;
}
void forward() //左右轮都正转,前进 //speed>=0&&speed<=100; time=speed*200us
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
void backward() //左右轮都后转,后退
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
void main()
{ TMOD=0X10;
while(1)
{
if(hw==1)
{
forward();
}
else
{
backward();
}
tr=1; //超声波输入端
delay_20us(); //延时20us
tr=0; //产生一个20us的脉冲
while(ec==0); //等待Echo回波引脚变高电平
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //计数溢出标志
TR1=1; //启动定时器1
while(ec==1);
th=TH1;
tl=TL1;
TL1=0;
TH1=0;
TR1=0; //关闭定时器1
time=th*256+tl;
distance=time*0.017; //厘米
display(distance+1);
}
}
作者:
dmgy343
时间:
2016-11-14 21:59
你感觉哪里有问题呢,这样让人看一堆代码 谁愿意看啊
作者:
chen46900374
时间:
2016-11-14 22:29
#include <AT89X51.H>
#include <intrins.h>
#include <STDIO.H>
#define uchar unsigned char
#define uint unsigned int
#define RX P1_6
#define TX P1_5
unsigned int time=0;
unsigned int timer=0;
float S=0;
bit flag =0;
/********************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.87)/100; //算出来是CM
if(flag==1) //超出测量
{
flag=0;
printf("-----\n");
}
printf("S=%f\n",S);
}
/********************************************************/
void delayms(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
/********************************************************/
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
/********************************************************/
void StartModule() //T1中断用来扫描数码管和计800MS启动模块
{
TX=1; //800MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
/********************************************************/
void main(void)
{
TMOD=0x21; //设T0为方式1,GATE=1;
SCON=0x50;
TH1=0xFD;
TL1=0xFD;
TH0=0;
TL0=0;
TR0=1;
ET0=1; //允许T0中断
TR1=1; //开启定时器
TI=1;
EA=1; //开启总中断
while(1)
{
StartModule();
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
delayms(100); //100MS
}
}
测距模块加进去就好了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1