Устройство измерения температуры окружающей среды, напряжения на выходах потенциометра, управление звуковым излучателем и часы

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

µго времени, соответственно секунд, минут и часов

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);

}

 <