基于51系列单片机的(循迹、避障、蓝牙)智能小车(2)源代码

主程序

main.c

/*************************************************************************************************
项目说明:
	本项目由粤嵌公司指导完成,能够实现循迹、避障、无线蓝牙遥控功能。循迹、避障均采用YL—70壁障传感
器,无线蓝牙遥控功能采用HC-05蓝牙模块。小车行走采用模拟PWM控制直流电机转速,行走稳定。

项目接线:
	1,左方直流电机-->P0^0、P0^1,右方直流电机-->P0^2、P0^3
	2,循迹中控板IN1-IN4-->P0^4-P0^7

项目实验功能:
	1,自主沿黑色电胶带循迹
	2,自主避障
	3,无线蓝牙遥控小车行走

*************************************************************************************************/
#include "motor.h"
#include "infrared.h"
#include "key.h"
#include "led.h"
#include "uart.h"
#include "delay.h"

unsigned char sendbuf[]={"AT+NAME=GEC_Liudehua\r\n"};
void main(void)
{
	TMOD |= 0x01;
	TH0=(65526-100)/256;
	TL0=(65526-100)%256;
	TR0 = 1;//启动定时器0
	ET0 = 1;//允许定时器0中断
	EA	= 1;//总中断允许
	
	uart_init();
	while(1)
	{
		if(key_status(KEY1) == KEY_DOWN) //循迹功能
		{
			led_ctrl(LED0,LED_ON);
			search_path();
		}
		else if(key_status(KEY2) == KEY_DOWN)//避障功能
		{
			led_ctrl(LED1,LED_ON);
			auto_avoid();
		}
		else if(key_status(KEY3) == KEY_DOWN)//蓝牙遥控功能
		{
			led_ctrl(LED2,LED_ON);
			remote_control();
		}
		else if(key_status(KEY4) == KEY_DOWN)//串口发送功能
		{
			uart_SendBytes(sendbuf,sizeof(sendbuf));
			delay_ms(200);
		}
	}
}

按键模块

key.h

#ifndef  __KEY_H__
#define  __KEY_H__

#include 
enum KEY_NUM{KEY1,KEY2,KEY3,KEY4};
enum KEY_STATUS{KEY_DOWN,KEY_UP,KEY_ERR};
/*
	@brief key_status: 判断指定的按键的状态
	@param key_num:    指定获取哪个按键的状态,可选择为KEY1,KEY2,KEY3,KEY4
	@retval:           KEY_DOWN 表示按键按下
	                   KEY_UP   表示按键松开
*/
extern int key_status(int key_num);
#endif


key.c

#include "key.h"

/*
	@brief key_status: 判断指定的按键的状态
	@param key_num:    指定获取哪个按键的状态,可选择为KEY1,KEY2,KEY3,KEY4
	@retval:           KEY_DOWN 表示按键按下
	                   KEY_UP   表示按键松开
*/
int key_status(int key_num)
{
	switch(key_num)
	{
		case KEY1: 
			return !!(P3&(1<<3));//!!的作用是把真变成 1
		case KEY2:
			return !!(P3&(1<<4));
		case KEY3:
			return !!(P3&(1<<6));
		case KEY4:
			return !!(P3&(1<<7));
		default:
			return KEY_ERR;
	}
}


LED模块

led.h

#ifndef __LED_H__
#define __LED_H__


#include 
#define LED P1
enum LED_NUM{LED0,LED1,LED2,LED3,LED4,LED5,LED6,LED7};//LED编号的枚举类型
enum LED_STATE{LED_ON,LED_OFF};//LED状态的枚举类型
/*
@brief led ctrl:	用来控制某盏LED灯的状态
@param led_num:		指定控制哪盏LED灯的状态,可选择为LEDO,LED1,LED2,...LED7
@param led _state:	指定LED灯的状态,可选择为LED_ON,LED_OFF
@retval:			None
*/
extern void led_ctrl(int led_num, int led_state);
#endif

led.c

#include 

#define LED P1

enum LED_NUM{LED0,LED1,LED2,LED3,LED4,LED5,LED6,LED7};//LED编号的枚举类型
enum LED_STATE{LED_ON,LED_OFF};//LED状态的枚举类型
/*
  @brief ledctrl: 用来控制某盏LED灯的状态
  @param led_num: 指定控制哪盏LED灯的状态,可选择为LED0,LED1,LED2,....LED7
  @param led_state: 指定LED灯的状态,可选择为LED_ON,LED_OFF
  @retval:    None
*/
void led_ctrl(int led_num,int led_state)
{
	if(led_state == LED_ON)
	{
		LED	&=~ (1<<led_num);
	}
	else if(led_state == LED_OFF)
    {
		LED |= 1<<led_num;
	}
}

延时子程序

delay.h

#ifndef  __DELAY_H__
#define  __DELAY_H__

#include 
/*
	@brief: C51毫秒级延时函数
	@param n: 指定延时多少毫秒
	@retval: None 
*/
extern void delay_ms(unsigned int n);
#endif

delay.c

#include "delay.h"

/*
	@brief: C51毫秒级延时函数
	@param n: 指定延时多少毫秒
	@retval: None 
*/
void delay_ms(unsigned int n)
{
	unsigned char i;
	while(n--)
	{
		for(i=0;i<113;i++);
	}
}

剩余代码见下篇

你可能感兴趣的:(单片机,单片机,c语言,嵌入式硬件)