Ви памятаєте, що один з перших дослідів з роботом – це використання датчика відстані для управління рухом робота Чому б не спробувати поєднати програму ручного управління і програму руху з подолання перешкод Єдине, що може перешкодити – обмеження на використання памяті в середовищі MicroC Але без перевірки цього ми не визначимо, чи виникає це обмеження чи ні Візьмемо програму з попередньої глави, зєднавши рух вперед з програмою подолання перешкод

#include “motorh”

char * text = ER-4 Remote; / / Визначити повідомлення

unsigned char ir_cmd = 0 / / Отримає значення натиснутою кнопки для ПДУ ER-4

/ / Lcd завдання висновків sbit LCD_RS at RD2_bit sbit LCD_EN at RD3_bit sbit LCD_D7 at RD7_bit sbit LCD_D6 at RD6_bit sbit LCD_D5 at RD5_bit sbit LCD_D4 at RD4_bit

/ / Напрямок висновків

sbit LCD_RS_Direction at TRISD2_bit sbit LCD_EN_Direction at TRISD3_bit sbit LCD_D7_Direction at TRISD7_bit sbit LCD_D6_Direction at TRISD6_bit sbit LCD_D5_Direction at TRISD5_bit sbit LCD_D4_Direction at TRISD4_bit

int Adc / / Зберігає Аналогові Дані char Txt [6] / / Зберігає Строку

void Read_Adc()

{

ADCON0 = 0b11001001 / / Вибір Analog2 RC_Mode і ADON ADCON0GO = 1 / / Запуск перетворення

while (ADCON0GO) / / Чекаємо, доки перетворення завершиться Adc = (ADRESH * 4) + (ADRESL/64) / / 10 біт Даних ==> Adc

}

/ / —————— Сервісна підпрограма переривання INT —————–

//

void interrupt()

{

unsigned char i / / Зберігає значення лічильника

if (INTCONINTF) / / Перевіряє значення прапора переривання RB0 (спад імпульсу)

{

Delay_us (416) / / Затримка на час 1/2 або 1 біта (швидкість 1200 бод) for (i = 0 i <8; i + +) / / Цикл на 8 кроків для збереження даних від ПДУ ER-4

{

Delay_us (833) / / Затримка на час 1 біта (швидкість 1200 бод) ir_cmd = ir_cmd >> 1 / / Зрушення на 1 біт вправо

if ((PORTB & 0x01) == 1) / / Виконати логічне І RB0 = 1 ? ir_cmd = ir_cmd | 0x80 / / Вставити біт, якщо 1

}

Delay_us (833) / / Затримка на час 1 біта (швидкість 1200 бод) INTCONINTF = 0 / / Очищення прапора переривання

}

}

/ / —————— Функція отримання символу від ПДУ —————— / / unsigned char get_remote ()

{

unsigned char _key

_key = ir_cmd / / Записати символ в буфер ir_cmd = 0 / / Стерти старі дані return (_key) / / Повернути символ від ПДУ

}

/ / —————— Основна Програма —————————- —— / /

void main()

{

unsigned char key / / Зберігає значення натиснутою кнопки ПДУ ANSELHF4 = 0 / / RB0 ==> Цифровий Введення / Висновок

ANSEL=0xFF TRISA=0xFF

OPTION_REGINTEDG = 0 / / Полярність сигналу переривання INTCONINTE = 1 / / Дозволити INT/PB0

INTCONGIE = ​​1 / / Дозволити глобальні переривання

Lcd_Init () / / Ініціалізувати РКІ, приєднаний до порту PORTD Lcd_Cmd (_Lcd_CLEAR) / / Очистити дисплей

Lcd_Cmd (_Lcd_CURSOR_OFF) / / Заборонити курсор РКІ

Lcd_Out (1, 1, text) / / Вивести текст на РКІ, 2-й рядок, 1-й стовпець while (1) / / Нескінченний цикл

{

if (ir_cmd==0)

{

Motor_Stop()

}

else

{

key = get_remote () / / Прочитати дані з датчика ДУ if (key == a | | key == A) / / Натиснуто кнопка A

{

Lcd_Out (2, 1, Button A Press) / / Показати повідомлення

/ / Натиснуто кнопка A Backward (255) Delay_ms (50)

}

else if (key == b | | key == B) / / Натиснуто кнопка B

{

Lcd_Out (2, 1, Button B Press) / / Показати повідомлення

/ / Натиснуто кнопка B

S_Right(255)Delay_ms(50)

}

else if (key == c | | key == C) / / Натиснуто кнопка C

{

Lcd_Out (2, 1, Button C Press) / / Показати повідомлення

/ / Натиснуто кнопка C S_Left (255) Delay_ms (50)

}

else if (key == d | | key == D) / / Натиснуто кнопка D

{

Lcd_Out (2, 1, Button D Press) / / Показати повідомлення

/ / Натиснуто кнопка D

/**********************************************************/

/ ***** Робот з Обнаружитель Обєктів *************************** /

/**********************************************************/ while(key==’d’ || key==’D’)

{

key = get_remote () / / Прочитати дані з датчика ДУ Read_Adc () / / Читання сигналу з Analog2 WordToStr (Adc, Txt) / / Перетворення Даних в Рядок Lcd_Out (1,1, Txt) / / Відображення на РКІ

if (Adc> 200) / / Якщо виявлений обєкт в допустимому діапазоні відстаней

{

Backward (255) Delay_ms (500) / / Рух Назад і поворот Ліворуч S_left (255) Delay_ms (400)

}

else

{

Forward (255) Delay_ms (50) / / Обєкт поза діапазону ВПЕРЕД

}

}

}

}

}

}

Тепер по команді «Вперед» з пульта управління робот їде вперед (батарейки я так і не поміняв), а зустрічаючи перешкоду, намагається його обїхати

Джерело: Гололобов ВН, – Самовчитель гри на паяльнику (Про електроніці для школярів і не тільки), – Москва 2012