![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Программный код. //функции: программа для управления лазерным проектором
//******************************************************************** //имя файла: laser.с //функции: программа для управления лазерным проектором //контроллер: отладочная плата 68HC12B32 фирмы Motorola //Выводы отладочной платы микроконтроллера 68HC12B32 фирмы Motorola: //Port A: Конфигурирован как входной порт, активируемый нажатием // бездребезговых переключателей на каждом входе //Port B: Конфигурирован как выходной порт для управления светодиодным // индикатором //Port S: Конфигурирован как выходной порт, создающий двоичный код // на канале X ЦАП //Port T: Конфигурирован как выходной порт, создающий двоичный код // на канале Y ЦАП //Port P[0]: Конфигурирован как выходной порт, создающий TTL совместимый // сигнал для управления затвором //авторы: Steve Barrett and Daniel Pack //создан: февраль 20, 2003 //последняя редакция: март 3, 2004 //******************************************************************** //включенные файлы //******************************************************************** #include < 912b32.h>
//функции прототипов void initialize_ports(void); //инициализация портов void shutter(int); //открытие/закрытие створок void position_laser(unsigned char, unsigned char); // положение лазера void delay(void);
#define open 1 #define close 0
//main program************************************************************* //global variables unsigned char new_PORTA, old_PORTA = 0xFF; int i; int go; void main(void) { //инициализировать вектор reset B32 asm(".area vectors(abs)\n" ".org 0xFFF8\n" ".word 0x8000, 0x8000, 0x8000, 0x8000\n" ".text"); go = 1; //начало цикла while initialize_ports(); //инициализировать порты shutter(close); //закрыть створки position_laser(0x80, 0x80); //расположить луч в центре while(go) { //продолжать, пока не нажмут кнопку Stop new_PORTA = PORTA; //read PORTA input switches if (new_PORTA! = old_PORTA) switch(new_PORTA){ //формировать образ по значению //нажатой клавиши case 0x7F: //PA7 - Точка в центре экрана PORTB = 0x80; // подсвечивает светодиод порта PORTE position_laser(0x80, 0x80); shutter(open); delay(); shutter(close); PORTB=0x00; //включает красные светодиоды индикатора break; case 0xBF: //PA6- горизонтальная линия position_laser(0x00, 0x80); shutter(open); for{i=0; i< =255; i++) { i = (unsigned char)(i); position_laser(i, 0x80); delay(); } shutter(close); PORTB=0x00; //включает красные светодиоды индикатора break; case 0xDF: //PA5 - Вертикальная линия PORTB = 0x20; // подсвечивает светодиод порта PORTB position_laser(0x80, 0x00); shutter(open); for(i=0; i< =255; i++) { i=(unsigned char)(i); position_laser(0x80, i); delay(); } shutter(close); PORTB=0x00; //включает красные светодиоды индикатора break; case 0xFF: //PA4 - Правая пила под углом 45 градусов // с Юго-Запада на СВ PORTB = 0x10; // подсвечивает светодиод порта PORTB position_laser(0x00, 0x00); shutter(open); for(i=0; i< =255; i++) { i = (unsigned char)(i); position_laser(i, i); delay(); } shutter(close); PORTB=0x00; //включает красные светодиоды индикатора break; case 0xF7: //PA3 - Левая пила под углом 45 градусов //с ЮВ на СЗ PORTB = 0x08; // подсвечивает светодиод порта PORTB delay(); PORTB=0x00; // включает красные светодиоды индикатора break; case 0xFB: //PA2 Окружность PORTB = 0x04; // подсвечивает светодиод порта PORTB delay(); PORTB=0x00; //включает красные светодиоды индикатора break; case 0xFD: //PA1 Синусоида PORTB = 0x02; // подсвечивает светодиод порта PORTB delay(); PORTB=0x00; // включает красные светодиоды индикатора break; case 0xFE: //PA0 Остановка PORTB = 0x01; // подсвечивает светодиод порта PORTB position_laser(0x00, 0x00); shutter(close); delay(); PORTB=0x00; // включает красные светодиоды индикатора go = 0; break; case 0xFF: break; default: ; //все остальные случаи }//конец switch(new_PORTA) old_PORTA = new_PORTA; }//конец if(new_PORTA! = old_PORTA) }//конец while(go) }//конец main
//******************************************************************** // initialize_ports: производится конфигурация портов в качестве //входных/выходных //******************************************************************** void initialize_ports(void) { DDRA=0x00; //установить PORTA в качестве входного порта DDRB=0xFF; //установить PORTB в качестве выходного порта PORTB=0x00; //включить красные светодиоды индикатора DDRS=0xFF; //установить PORTT в качестве выходного порта DDRP=0xFF; //установить PORTP в качестве выходного порта } //******************************************************************** /// /shutter(int action): открытие и закрытие затвора //******************************************************************** void shutter(int action) { if (action == open) PORTP = 0x01; if (action == close) PORTP = 0x00; }
//******************************************************************** //position_laser(unsigned char x_pos, unsigned char y_pos): посылает //сигнал управления для каналов X и Y гальванометра из портов PORTS //и PORTT соответственно. //******************************************************************** void position_laser(char x_pos, char y_pos) { PORTS = x_pos; PORTT = y_pos; }
//******************************************************************** //delay(void): создает задержку //******************************************************************** void delay(void) { int j; for(j=0x0000; j< 0x1000; j=j+0x01) { asm(" nop"); } } //********************************************************************
|