Создание устройства для удалённого мониторинга, состояния датчиков на основе микроконтроллеров

Автор: Пользователь скрыл имя, 15 Мая 2012 в 12:31, курсовая работа

Описание работы

Системы автоматического управления эффективно решают задачи на уровнях, начинающихся от управления отдельными узлами и устройствами и заканчивающихся управлением технологическими установками и целыми производствами. В системах автоматизации применяются различные средства реализации алгоритмов управления. В настоящее время, несмотря на определенные особенности применения, наиболее эффективными являются цифровые методы и средства.

Содержание

Введение 2
Теоретические сведения: 3
Цель работы: 5
Задание: 5
Ход работы: 6
1. Основные блоки функциональной схемы: 7
1.1 Микроконтроллер 7
1.2 Приёмо-передатчик 8
1.3 Цепи тактирования 9
1.4 Геркон 9
1.5 Клавиатура 10
1.6 Устройства вывода 10
2. Программная реализация алгоритма. 11
2.1 Алгоритм работы 11
2.2 Пульт оператора 11
Заключение 11
Приложение…………….………………………………………………………………………………………….12
3.1 Принципиальная схема…………………………………………………………………………………12
3.2 Листинг АРМ ..…………………….…………………………………………………………………………13
3.2 Листинг устройства низкого уровня ..…………………….…………….…………………...…23
Список литературы 29

Работа содержит 1 файл

Курсовичок 1.7.docx

— 291.97 Кб (Скачать)

    Кнопки  имеют такой недостаток как дребезг  контактов который затрудняет отслеживание  момента нажатия кнопки, так как контроллер может отследить не одно нажатия, что может привести к нежелательным последствия.  Есть несколько методов борьбы с этим. Один из них, который используется в данной системе - это введение временной задержки по появлению лог 0, которая должна быть больше времени дребезга контактов.

        1.6 Устройство вывода (LCD)

    В качестве устройства вывода информации был использован стандартный  LCD с двумя строками по шестнадцать символов в каждой строке на микроконтроллере hd44780, с стандартной схемой включения.

    2. Программная реализация алгоритма.

    2.1 Алгоритм работы

После нажатия кнопки «Считать» на АРМ формируется временная задержка для антидребезга, далее проверяется условие разрешения передачи данных (бит UDRE). После передаём символ G в устройство низкого уровня по интерфейсу RS485. После прихода символа G в устройство низкого уровня, считываем состояние всех датчиков в переменную  Data_Ger. Далее проверяем условие разрешения передачи данных . После передаём переменную Data_Ger  в АРМ.

По приходу  переменной в USART, присваиваем значение входного буфера данных переменной  Data_Ger и выводим эту переменную на LCD в двоичном виде.

    2.2 Пульт оператора

    Практически в любой системе управления необходимы функции настройки режимов работы. Как правило, функции настройки и отображения, доступны оператору системы управления жестко определяются при проектировании и строго ограничены. Это позволяет создать специализированный интерфейс оператора с заранее заданным набором функций и поэтому использовать для его реализации алгоритм «меню».

    В нашей системе управления в качестве пульта оператора выступает одна кнопка «Считать».

С которой и производится запуск обмена данных.

    Заключение

    В проделанной работе я ознакомилась с архитектурой микроконтроллера семейства AVR ATmega 8  и приобрела навыки разработки системы управления на основе микроконтроллера с использованием периферийных устройств. В итоге я получила алгоритм для проектирования устройства, основными задачами которого являются, отслеживание состояния датчиков, сбор данных, передача данных, приём данных, вывод данных на LCD. 
 
 

Приложение:

3.2Листинг  программы АРМ

 

include <mega8.h>

  #define RXB8 1

#define TXB8 0

#define UPE 2

#define OVR 3

#define FE 4

#define UDRE 5

#define RXC 7 

#define FRAMING_ERROR (1<<FE)

#define PARITY_ERROR (1<<UPE)

#define DATA_OVERRUN (1<<OVR)

#define DATA_REGISTER_EMPTY (1<<UDRE)

#define RX_COMPLETE (1<<RXC) 

// USART Receiver buffer

#define RX_BUFFER_SIZE 8

char rx_buffer[RX_BUFFER_SIZE]; 

#if RX_BUFFER_SIZE<256

unsigned char rx_wr_index,rx_rd_index,rx_counter;

#else

unsigned int rx_wr_index,rx_rd_index,rx_counter;

#endif 

// This flag is set on USART Receiver buffer overflow

bit rx_buffer_overflow; 

// USART Receiver interrupt service routine

interrupt [USART_RXC] void usart_rx_isr(void)

{

char status,data;

status=UCSRA;

data=UDR;

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)

   {

   rx_buffer[rx_wr_index]=data;

   if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;

   if (++rx_counter == RX_BUFFER_SIZE)

      {

      rx_counter=0;

      rx_buffer_overflow=1;

      };

   };

} 

#ifndef _DEBUG_TERMINAL_IO_

// Get a character from the USART Receiver buffer

#define _ALTERNATE_GETCHAR_

#pragma used+

char getchar(void)

{

char data;

while (rx_counter==0);

data=rx_buffer[rx_rd_index];

if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;

#asm("cli")

--rx_counter;

#asm("sei")

return data;

}

#pragma used-

#endif 

// USART Transmitter buffer

#define TX_BUFFER_SIZE 8

char tx_buffer[TX_BUFFER_SIZE]; 

#if TX_BUFFER_SIZE<256

unsigned char tx_wr_index,tx_rd_index,tx_counter;

#else

unsigned int tx_wr_index,tx_rd_index,tx_counter;

#endif 

// USART Transmitter interrupt service routine

interrupt [USART_TXC] void usart_tx_isr(void)

{

if (tx_counter)

   {

   --tx_counter;

   UDR=tx_buffer[tx_rd_index];

   if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;

   };

} 

#ifndef _DEBUG_TERMINAL_IO_

// Write a character to the USART Transmitter buffer

#define _ALTERNATE_PUTCHAR_

#pragma used+

void putchar(char c)

{

while (tx_counter == TX_BUFFER_SIZE);

#asm("cli")

if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))

   {

   tx_buffer[tx_wr_index]=c;

   if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;

   ++tx_counter;

   }

else

   UDR=c;

#asm("sei")

}

#pragma used-

#endif

// Alphanumeric LCD Module functions

#asm

   .equ __lcd_port=0x18 ;PORTB

#endasm

#include <lcd.h>       

void ZADERGKA_knopok (void){                                          // Функция формирования временной задержки для knopok

TCNT0=0x00;                                                        // Обнуление счётного регистра

while(TCNT0<0x32){};                                               // Условие значения счётного регистра

}                                                                  // Сидим здесь пока значение  счётного регистра не превысит  значение переменной   

// External Interrupt 0 service routine

interrupt [EXT_INT0] void ext_int0_isr(void)

{

ZADERGKA_knopok(); 

while (!(UCSRA.5));                                       // дожидаемся освобождение регистра  передачи  

UDR = 'G';                                                            // отправляем символ G 

} 

// Standard Input/Output functions

#include <stdio.h> 

// Declare your global variables here 

   unsigned char Data_Ger;        //Переменная состояния  всех датчиков

     unsigned char buffer_bin [7];

void main(void)

{

// Declare your local variables here 

// Input/Output Ports initialization

PORTB=0x00;

DDRB=0x00; 

PORTC=0x00;

DDRC=0x00; 

PORTD=0x04;

DDRD=0x00; 

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

TCCR0=0x00;

TCNT0=0x00; 

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 0,977 kHz

// Mode: Normal top=FFFFh

// OC1A output: Discon.

// OC1B output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer 1 Overflow Interrupt: On

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

TCCR1A=0x00;

TCCR1B=0x05;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer 2 Stopped

// Mode: Normal top=FFh

// OC2 output: Disconnected

ASSR=0x00;

TCCR2=0x00;

TCNT2=0x00;

OCR2=0x00; 

// External Interrupt(s) initialization

// INT0: On

// INT0 Mode: Low level

// INT1: Off

GICR|=0x40;

MCUCR=0x00;

GIFR=0x40;

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x00;

// USART initialization

// Communication Parameters: 8 Data, 1 Stop, No Parity

// USART Receiver: On

// USART Transmitter: On

// USART Mode: Asynchronous

// USART Baud Rate: 9600 (Double Speed Mode)

UCSRA=0x02;

UCSRB=0x18;

UCSRC=0x86;

UBRRH=0x00;

UBRRL=0x33;

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

SFIOR=0x00; 

// LCD module initialization

lcd_init(16); 

// Global enable interrupts

#asm("sei") 

while (1)

      {

      // Place your code here

          if (rx_counter) {

/* выполнить  ЭТОТ код если в буфере есть  не считанные символы, данные */   

Data_Ger = getchar();

                     

                lcd_clear();                                              // очистить экран

                lcd_gotoxy(0,0);                                          // установить координаты

                lcd_putsf("Сос-е датчиков");                               // выводим надпись на ЖКИ       

                sprintf (buffer_bin, %7b, Data_Ger);

                lcd_gotoxy(0,1);

                lcd_puts(buffer_bin);          

                };

      };

} 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

3.3Листинг  программы устройства низкого уровня

 

#include <mega8.h>

// Standard Input/Output functions

#include <stdio.h>

 bit dat_1;           //Переменные состояния датчиков

  bit dat_2;

  bit dat_3;  

  bit dat_4;

  bit dat_5; 

  bit dat_6;

  bit dat_7; 

  bit dat_8;

Информация о работе Создание устройства для удалённого мониторинга, состояния датчиков на основе микроконтроллеров