Устройство измерения температуры окружающей среды, напряжения на выходах потенциометра, управление звуковым излучателем и часы
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
µго времени, соответственно секунд, минут и часов
4.3 Основные конструкции и процедуры, используемые для написания программы
При разработке проекта необходимо подключить заголовочные файлы:
1. #include - стандартный заголовочный файл с объявлением специальных регистров и битов микроконтроллера PIC18F4520;
2. #include - позволяет организовать задержки;
3. #include - позволяет использовать функции преобразующие целочисленные значения в символы, которые можно вывести на LCD;
. p18lcd.asm - набор стандартных функций для работы с LCD.
Примеры наиболее значащих для проекта функций приведены в таблице 4.2.
Таблица 4.2 Описание основных функций программы.
Имя функцииОписаниеmainТочка входа в программуstartВызывается первой, при входе в функцию main(). Выполняет настройку системы для дальнейшей работы. В частности, выполняет инициализацию экрана и интерфейса передачи данныхd_writeПроизводит автоматический вывод на экран содержимого глобальной переменной temp_wrLCDInitВыполняет настройку и разрешает доступ к LCDLCDLine_1, LCDLine_2Выполняет переход виртуального курсора на первую (вторую) строку экранаstan_char_1, stan_char_2Отображают на экране последовательность символов в зависимости от значения ptr_pos на соответственно 1ю и 2ю строках LCDitoaПреобразовывает целочисленные значения в символы, которые можно вывести на LCD
Разберем подробней наиболее важные функции.
void stan_char_1(void);stan_char_2(void);
(). Функция выполняет настройку необходимых для нормальной работы устройства модулей микроконтроллера. К таковым можно отнести модуль LCD-экрана,MSSP,USART и CCP.
Функция LCDInit() описана в файле p18LCD.ASM.
void start (void)
{();=0b10100100; //initialize USART=25;=0b10010000;
.TRISC2=0; // initialize CCP=0x80;L=0x80;CONbits.CCP1X=0;CONbits.CCP1Y=0;CON=0x05;
//initialize timer2.TRISA4=1; //knopki S1 I S2 aktivni.TRISB0=1;
}
itoa(). Функция преобразует, полученную в качестве параметра переменную типа int в переменную типа *char и помещает её в массив char который обрабатывается в зависимости от входного значения int. Это стандартная функция, для обращения к ней подключаем библиотеку stdlib.h.
menu(). Функция организует в бесконечном цикле вывод на LCD меню, которое позволяет выбрать подпрограммы реализующие вольтметр, звуко-излучатель, термометр и часы.
void menu(void)
{_count=16;_pos=5;_char_1();_pos=6;_char_2();KTCYx(900);(scroll==0){};(select==0){};
//------------------ VOLT MEASUREMENT ----------------------------(1){_pos=0;_char_1();_pos=4;_char_2();(scroll==1) {if (select==0) {voltmeter();break;}} ;(select==0){};while (scroll==0){};
……….
};}
(). Функция реализует работу вольтметра измеряющего напряжение на контактах потенциометра. Задавая необходимые значения регистрам управления модуля USART, получает значения с выхода АЦП в цифровом представлении. Преобразует числовое значение температуры в строку выводим на LCD. Повторяется в цикле пока не нажата S3.
void voltmeter(void)
{
….
bits.ADON=1;=0b00001110;=0x01;
_pos=10;_char_1();
{bits.GO=1;(ADCON0bits.GO==0){};=ADRESH;*=2;(temph,tempv_char);(temph<10) {temph_char[0]=zero[0]; temph_char[2]=zero[0]; temph_char[3]=tempv_char[0];}
….._2();(i=0;i<ptr_count;i++)
{_char=temph_char[i];_wr=temp_char;_write();
} //for i
}while(select==1);
}
buzzer().Функция реализует работу звуко-излучателя с помощью модуля широтно-импульсной модуляции. Нажатие S2 приводит к увеличению длительности импульса, соответственно значение хранится в CCPR1L. Нажатие S3 приводит к увеличению периода возникновения импульсов, соответственно значение хранится в PR2. Повторяется в цикле пока одновременно не нажаты S2 и S3.
void buzzer(void)
{
….=0x80;L=0x80;
….CON=0x0f; //включение(1){=0;(select==0)
{+=1;=5;=PR2;(scroll==0) goto end;
} //if select(scroll==0)
{//inc dcL+=1;=CCPR1L;=12;(select==0) goto end;
}(n!=0) {(temph,tempv_char);(temph<10) {tempb_char[n]=zero[0]; tempb_char[n+1]=zero[0]; tempb_char[n+2]=tempv_char[0];}
…._1();(i=0;i<ptr_count;i++)
{…._write();
} //for i
} //if n!=0
};//while: CCP1CON=0; //выключение}
(). Функция реализует работу термометра с помощью модуля SSP и термодатчика TC74. Сперва инициализируем MSSP после чего вносим последовательность изменений в управляющие регистры модуля SSP, ч то в свою очередь поток команд от MSSP к TC74 и обратно. В результате мы получаем текущее значение температуры, которое и выводим на LCD. Функция выполняется пока не нажата S3.
void temp (void)
{….
TRISCbits.TRISC3=1; //initialize MSSP module
TRISCbits.TRISC4=1;
SSPCON1=0b00101000;
SSPSTATbits.SMP=1;
SSPADD=0x05;{_temp:cmd_byte=0x01; //config register command byte_now:SSPSTATbits.CKE=1; //SMBUS spec for TC74bits.SEN=1;//write to TC74(SSPCON2bits.SEN==1){};=0b10011010;//send TC74 ADDRESS (write)();(SSPCON2bits.ACKSTAT==1) {};//ack?=cmd_byte;=WREG;//send COMMAND byte (config)();(SSPCON2bits.ACKSTAT==1) {};//ack?bits.RSEN=1;//send repeated start(SSPCON2bits.RSEN==1) {};=0b10011011;//send TC74 ADDRESS (read)();
//module idle?(SSPCON2bits.ACKSTAT==1) {};//ack?bits.RCEN=1;//enable receive mode(SSPCON2bits.RCEN==1) {};=SSPBUF; //retrieve config reg or temp regbits.ACKDT=1;
//send NOT-ACKbits.ACKEN=1;(SSPCON2bits.ACKEN==1){};bits.PEN=1; //stop(SSPCON2bits.PEN==1){};=WREG;(cmd_byte==1) { //config command OR temp command=tempw;
_asm 0x40 //is temp ready ??0x40
_endasm(STATUSbits.Z==0) {goto get_temp;}_byte=0x00;temp_now;
}
=tempw;(temperature,tempv_char);_char[6]=tempv_char[0];tempt_char[7]=tempv_char[1];_1();(i=0;i<ptr_count;i++)
{….._write();
} //for i_2();_pos=9;_char_2();
}while(select==1);
}
clock(). Функция реализующая работу часов с помощью таймера TMR1. Инициализируем TMR1 в режим синхронизации с внешнем генератором тактового сигнала. После генерации периферийного прерывания инкрементируется численное значение секунд. После чего текущее время выводится на LCD. Из функции происходит вызов двух подфункций:
clock_draw() - это функция, которая выводит на экран текущее значение времени;
clock_set() - это функция, которая позволяет установить текущее время.
void clock (void)
{…CON=0x0F;=0;minutes=0;hours=0;{bits.TMR1IF=0;H=0x68;L=0x00;++;(seconds-60==0) {minutes++;seconds=0;}(minutes-60==0){hours++;minutes=0;}(hours-13==0){hours=0;}(scroll==0) clock_set();_draw();_2();_pos=7;_char_2();(PIR1bits.TMR1IF==0){if (scroll==0) clock_set();};
} while (select==1);
}
<