睡眠真重要 | 小车摇头测距

昨晚遇到的问题:小车一开始摇头了两三下就不摇了。

原因有4:

  1. 定时器没有配对。time = (TH0*256+TL0)*1.085;特别是这个,写成了TH1+TL0了
  2. 定时器1应该跟HC的代码放在一起,定时器0的应该跟SG90的代码放在一起。
  3. 没包含全头文件,头文件里的内容不全或者函数名写错。
//main

#include "reg52.h"
#include "intrins.h"
#include "hc04.h"
#include "delay.h"
#include "sg90.h"
#include "motor.h"

#define MIDDLE 0
#define RIGHT  1

void main()
{
	char dir;
	double LeftDis;
	double RightDis;
	double MiddleDis;
	
	Time0Init();	//定时器0初始化
	Time1Init();	//定时器1初始化
	sgMiddle();	//sg90舵机初始化,一开始角度为3
	dir = MIDDLE;
	Delay450ms();
	
	while(1){
		if(dir != MIDDLE){
			sgMiddle();
			dir = MIDDLE;
			Delay450ms();
		}
		MiddleDis = getDistance();
		if(MiddleDis > 35){
			goForward();
		}else if(MiddleDis < 10){
			goBack();
		}else{
			Stop();
			sgLeft();
			Delay450ms();
			LeftDis = getDistance();
			
			sgMiddle();
			Delay450ms();
			
			sgRight();                                                                                                                                                                                                                               
			dir = RIGHT;
			Delay450ms();
			RightDis = getDistance();
			
			if(LeftDis < RightDis){
				goRight();
				Delay200ms();
				Stop();
				}else if(LeftDis >= RightDis){
				goLeft();
				Delay200ms();
				Stop();
			}
		}
	}
}
//delay

void Delay200ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 2;
	j = 103;
	k = 147;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void Delay10us()		//@11.0592MHz
{
	unsigned char i;

	i = 2;
	while (--i);
}

void Delay450ms(void)	//@11.0592MHz
{
	unsigned char data i, j, k;

	_nop_();
	i = 4;
	j = 39;
	k = 209;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
//hc04
#include "reg52.h"
#include "intrins.h"
#include "delay.h"
#include "sg90.h"
#include "motor.h"

sbit Trig     = P1^2;
sbit Echo     = P1^3;

double time; 			//时间
double distance;	//距离

//定时器1初始化
void Time1Init()
{
	//配置定时器0工作模式为01,16位
	TMOD &= 0x0F;
	TMOD |= 0x10;
	//从0开始计数
	TH1 = 0;
	TL1 = 0;
}


void Star_HC()
{
	//怎么让HC_SR04发送波
	//Trig ,给Trig端口至少10us的高电平	
	Trig = 0;
	Trig = 1;
	Delay10us();
	Trig = 0;
}

double getDistance()
{
		//重置计数器
		TH1 = 0;
		TL1 = 0;	
		Delay200ms();	//给测距一点启动时间
		Star_HC();		//开始发波
		//怎么知道它开始发了
		//Echo信号,由低电平跳转到高电平,表示开始发送波
		while(Echo == 0);
		//波发出去的那一下,开始启动定时器
		TR1 = 1;
		//怎么知道接收了返回波
		//Echo,由高电平跳转回低电平,表示波回来了
		while(Echo == 1);
		//怎么算时间
		//Echo引脚维持高电平的时间!
		//波回来的那一下,我们开始停止定时器,计算出中间经过多少时间
		TR1 = 0;
		//time = (TH1*256+TL0)*1.085;典型错误啊,服了
        time = (TH1*256+TL1)*1.085;
		//怎么算距离
		//距离 = 速度 (340m/s)* 时间/2
		distance = 0.034*time/2;
		return distance;
}
//motor
#include "reg52.h"
#include "intrins.h"
#include "hc04.h"
#include "delay.h"
#include "sg90.h"

sbit RightCon1A = P3^2;
sbit RightCon1B = P3^3;
sbit LeftCon1A = P3^4;
sbit LeftCon1B = P3^5;

void goForward()
{
	LeftCon1A = 0;
	LeftCon1B = 1;
	RightCon1A = 0;
	RightCon1B = 1;
}

void goRight()
{
	LeftCon1A = 0;
	LeftCon1B = 1;
	RightCon1A = 1;
	RightCon1B = 1;
}
void goLeft()
{
	LeftCon1A = 1;
	LeftCon1B = 1;
	RightCon1A = 0;
	RightCon1B = 1;
}
void goBack()
{
	LeftCon1A = 1;
	LeftCon1B = 0;
	RightCon1A = 1;
	RightCon1B = 0;
}
void Stop()
{
	LeftCon1A = 1;
	LeftCon1B = 1;
	RightCon1A = 1;
	RightCon1B = 1;
}
//sg90
#include "reg52.h"
#include "intrins.h"
#include "hc04.h"
#include "delay.h"
#include "motor.h"

sbit sg90_con = P1^1;

char cnt = 0; 		//int改为char,节省内存空间
char angle;			 	//角度

char angle_bak;		//角度标记

//定时器0初始化
void Time0Init()
{
	//配置定时器1工作模式为01,16位
	TMOD &= 0xF0;
	TMOD |= 0x01;
	//从FE33开始计数
	TL0 = 0x33;
	TH0 = 0xFE;
	ET0 = 1;		//开定时器0中断
	EA = 1;			//开总中断
	TR0 = 1;		//开始计数
	TF0 = 0;		//溢出位置0
}


void sgMiddle()
{
	angle = 3;
	cnt = 0;
}

void sgLeft()
{
	angle = 5;
	cnt = 0;
}

void sgRight()
{
	angle = 1;
	cnt = 0;
}

//定时器0中断服务程序,控制20ms内的占空比
void Time0Handler() interrupt 1
{
	//爆表了
	cnt++; 
	TL0 = 0x33;
	TH0 = 0xFE;
	if(cnt < angle){
		sg90_con = 1;
	}else{
		sg90_con = 0;
	}
	
	//爆表40次,一次0.5ms,40次等于20ms
	if(cnt >= 40){	
		cnt = 0; //cnt从0开始,计算下一个20ms
		sg90_con = 1;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值