Термометр на PIC контроллере

Автор: Пользователь скрыл имя, 09 Марта 2013 в 13:31, курсовая работа

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

За последние десятилетия электронная промышленность развивалась опережающими темпами в сравнении с любой другой отраслью. Появление недорогих интегральных схем высокой и сверхвысокой степени интеграции, ориентированных на решение всевозможных задач, позволило разработать принципиально новые подходы к проектированию электронных устройств. Появившийся в конце 70-хг. XX века новый класс полупроводниковых приборов, являющихся полностью укомплектованной управляющей ЭВМ на одном кристалле, вызвал настоящую революцию в мире электроники. Подобные устройства получили название микроконтроллеров (в русскоязычной литературе микроконтроллеры достаточно часто называют однокристальными ЭВМ – ОЭВМ) и нашли широкое применение в системах управления различными объектами в реальном масштабе времени.

Содержание

ВВЕДЕНИЕ…………………………………………………………………….3
МИКРОКОНТРОЛЛЕР PIC16F62X…………………………………...4
2. ТЕРМОМЕТР НА PIC16F62X………………………………………...10
2.1. Программа цифрового термометра…………………………………14
ЗАКЛЮЧЕНИЕ……………………………………………………………….31
ЛИТЕРАТУРА………………………………...................................................32

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

курсач.doc

— 1.29 Мб (Скачать)

Рис.2.2. Печатная плата цифрового термометра

 
       При разработке печатной платы, которая изображена на рис.2.2, ставилась цель добиться минимальных габаритов прибора. Это удалось сделать благодаря использованию пассивных элементов типоразмера 0805 для поверхностного монтажа и установке микросхем DD2, DD3 под индикатором HG1. Микроконтроллер DD1 в малогабаритном корпусе SO. 
Катушка L1 намотана на высокоомном (более 2 МОм) резисторе МЛТ-0,125 обмоточным проводом диаметром 0,4 мм. Число витков — 17. Ее можно заменить унифицированной индуктивностью 10...47 мкГн, рассчитанной на ток не менее 1 А. 
        Рекомендуется элементы преобразователя напряжения устанавливать на плату первыми. К сожалению, микросхему МАХ1674 выпускают только в малогабаритном корпусе с шагом выводов 0,5 мм. Паять их следует маломощным паяльником с тонким заостренным жалом, набирая минимальное количество припоя. 
        Лишь убедившись, что преобразователь работоспособен и его выходное напряжение не отличается от номинального (3,3 В) более чем на 5 %, можно продолжать монтаж. Установив запрограммированный микроконтроллер, проверяют работу автоматического выключателя питания на транзисторе VT1 и наличие импульсных сигналов на выводах 10,11 и 18 микроконтроллера. 
        После этого можно монтировать микросхемы DD2, DD3 и в последнюю очередь — индикатор HG1. Выводы датчика ВК1 могут быть соединены с соответствующими контактными площадками на плате жгутом проводов длиной до нескольких метров.

2.1. Программа  цифрового термометра

 

ORG 0

data                 H'A',H'A',H'B'

goto                 Program

 

; ----------------- Прерывание -----------------

 

 

movwf

W_copy

 

movf

STATUS,w

 

movwf

STATUS_copy

 

bcf

INTCON,T0IF

 

movlw

B'00000001'  ; Меняем полярность напряжения

 

xorwf

FLAGS,f          ; возбуждения  ЖКИ с частотой

 

bcf

PORTA,Flcd   ; Fosc/4/256/16, что составляет

 

btfsc

FLAGS,RA1    ; порядка 240 Гц

 

bsf

PORTA,Flcd

     

ShowOne

btfss

FLAGS,One    ; Если нужно,

 

goto

NotShow_One  ; выводим цифру "1"

 

bsf

PORTB,BC2    ; во втором разряде

 

btfsc

FLAGS,RA1

 

bcf

PORTB,BC2

 

goto

ShowMin

NotShow_One

   
 

bcf

PORTB,BC2

 

btfsc

FLAGS,RA1

 

bsf

PORTB,BC2

     

ShowMin

btfsc

FLAGS,Sign   ; Если нужно, выводим  знак "-"  в первом разряде

 

goto

NotShow_Min 

 

bsf

PORTB,G1   

 

btfsc

FLAGS,RA1

 

bcf

PORTB,G1

 

goto

ENDINT

NotShow_Min

   
 

bcf

PORTB,G1

 

btfsc

FLAGS,RA1

 

bsf

PORTB,G1

ENDINT

   
 

movf

STATUS_copy,w

 

movwf

STATUS

 

swapf

W_copy,f

 

swapf

W_copy,w

 

retfie

 
     

; ------------ Основные переменные ------------

     
 

CBLOCK  H'26'

 

STATUS_copy

 

; Копии содержимого

W_copy

 

; регистров W и STATUS

Ind1

 

; Цифры для вывода на индикатор

Ind2

 

; (Ind1 - левая цифра, т.е. десятки)

CLK_count

 

; Счетчик тактовых импульсов  для загрузки цифр в К176ИЕ4

FLAGS

 

; Различные флаги

Temperature    

 

; Показания температуры

DELAY_reg_1

 

; Регистры для

DELAY_reg_2

 

; подпрограмм задержки

 

ENDC

 
     

; ------------ Для шины I2C ------------

 
     

Bus_Status

equ  H'21'

; Регистр состояния шины I2C

_Bus_Busy

equ  0    

; Если "1" - шина занята

_Txmt_Progr

equ  1   

; Если "1" - выполняется передача данных

_Rcv_Progr

equ  2   

; Если "1" - выполняется прием  данных

_Txmt_Success

equ  3    

; Если "1" - передача данных  успешно завершена

_Rcv_Success

equ  4   

; Если "1" - прием данных успешно  завершен

_ACK_Error

equ  5    

; Если "1" - не получено подтверждение от ведомого

     

Bus_Control

equ  H'22'

; Регистр управления шиной I2C

_Slave_RW

equ  0   

; "1" - операция чтения, "0" - операция записи

_Last_Byte

equ  1    

; "1" означает, что читаем последний  байт

     

DataByte

equ  H'23'

; Данные для записи и после  чтения

LSB

equ  0    

; Младший разряд

     

DataByteCopy

equ  H'24'

 

BitCount

equ  H'25'

; Счетчик битов передаваемого  или принимаемого байта

     

; -------- Разряды регистра FLAGS --------

     

RA1  

equ  0

; Для формирования напряжения возбуждения ЖКИ

One  

equ  1

; Если "1" - в первом разряде  должна быть единица

Sign 

equ  2

; Знак температуры (0 - минус, 1 - плюс)

     

; ----------- Описание порта А -----------

     

Flcd

equ  1

; Напряжение возбуждения ЖКИ

_SDA

equ  6

; Шина I2C

_SCL

equ  7

 
     

; ----------- Описание порта B -----------

     

CLK1

equ  1

; Тактовые входы

CLK2

equ  2

; микросхем К176ИЕ4

RST

equ  3

; Сигнал сброса микросхем К176ИЕ4

BC2

equ  4

; Сегменты В и С 2-го разряда  (цифра 1)

G1

equ  5

; Сегмент G 1-го разряда (минус)

PWD

equ  6

; Управление питанием (включено  при "0")

     

; ----------- Макрос, отправляющий команду  ----------

; ------------ в регистр CONFIG в DS1631 ------------

; Так можно отправлять команды "Начать преобразование" (51h),

; "Остановить преобразование" (22h), "Программный сброс" (54h)

; и "Доступ к регистру Config" (АСh)

 
     

Command_to_DS1631   macro   Command,Config

   

    local   Stop

     
 

bcf

Bus_Control,_Slave_RW  ; Операция записи

 

call

TxmtStartBit

     
 

movlw

B'10011111'  ; Адрес для датчика  DS1631 при А0..А2 = 111

 

movwf

DataByte ; нагрузка на адрес DataByte для передачи

 

bcf

DataByte,LSB

 

btfsc

Bus_Control,_Slave_RW  ; если пропустить то операции записи

 

bsf

DataByte,LSB ; Операция чтения

 

call

Send_data ; В случае успеха, то _Txmt_Success бит

 

btfsc

Bus_Status,_ACK_Error  ; пропустить, если NACK, устройство отсутствует или не отвечает

 

goto

BUS_ERROR

     
 

movlw

Command   ; Загружаем команду

 

movwf

DataByte

 

call

Send_data

 

btfsc

Bus_Status,_ACK_Error

 

goto

BUS_ERROR

     
 

movlw

Command   ; Если передали команду  0хАС

 

xorlw

H'AC'     ; (доступ к регистру "Config"),

 

BZ

$+2       ; записываем  туда необходимое значение

 

goto

Stop

     
 

movlw

Config    ; Загружаем число, которое

 

movwf

DataByte  ; надо записать в регистр  "Config"

 

call

Send_data

 

btfsc

Bus_Status,_ACK_Error

 

goto

BUS_ERROR

Stop

   
 

call

TxmtStopBit

endm

   
     

; ----------- Макрос для чтения из  регистров -----------

; ----------- Тн, ТL и регистров температуры -----------

; "Command_byte" определяет, из каких  регистров будут прочитаны данные:

; 0xA1 - Тн, 0xA2 - ТL, 0xАА – Температура

; Прочитанное значение (только  старший байт)

; загружается в регистр "Temperature"

     

Read_from_DS1631   macro   Command_byte

     
 

bcf

Bus_Control,_Slave_RW    ; Набор для операции записи

 

call

TxmtStartBit

     
 

movlw

B'10011111'  ; Адрес для датчика  DS1631 при А0..А2 = 111

 

movwf

DataByte ; нагрузка на адрес DataByte для передачи

 

bcf

DataByte,LSB

 

btfsc

Bus_Control,_Slave_RW    ; если пропустить то операции записи

 

bsf

DataByte,LSB  ; Операция чтения

 

call

Send_data ; В случае успеха, то _Txmt_Success бит

 

btfsc

Bus_Status,_ACK_Error    ; пропустить, если NACK, устройство отсутствует или не отвечает

 

goto

BUS_ERROR

     
 

movlw

Command_byte ; Команда чтения температуры

 

movwf

DataByte

 

call

Send_data  ; В случае успеха, то _Txmt_Success бит

 

btfsc

Bus_Status,_ACK_Error; пропустить, если NACK, устройство отсутствует или не отвечает

 

goto

BUS_ERROR

     
 

call

TxmtStartBit

     
 

bsf

Bus_Control,_Slave_RW    ; Набор для операции чтения

 

movlw

B'10011111'              ; Адрес для датчика DS1631 при  А0..А2 = 111

 

movwf

DataByte ; нагрузка на адрес DataByte для передачи

 

bcf

DataByte,LSB

 

btfsc

Bus_Control,_Slave_RW    ; если пропустить то операции записи

 

bsf

DataByte,LSB  ; Операция чтения

 

call

Send_data       ; В случае успеха, то _Txmt_Success бит

 

btfsc

Bus_Status,_ACK_Error    ; пропустить, если NACK, устройство отсутствует или не отвечает

     
 

goto

BUS_ERROR

     
 

bsf

Bus_Control,_Last_Byte   ; Принимаем последний  байт

 

call

Get_data

 

movfw

DataByte

 

movwf

Temperature

     
 

call

   TxmtStopBit

endm

   
     

; ----------------- Инициализация -----------------

     

Program

   
 

clrf

PORTB

 

clrf

PORTA

 

movlw

B'00000111'    ; Отключаем компараторы

 

movwf

CMCON

 

bsf

STATUS,RP0     ; Банк 1

 

bsf

PCON,OSCF      ; Устанавливаем  частоту внутреннего генератора 4 МГц

       

 

clrf

TRISB          ; Весь  порт B - на вывод

 

clrf

TRISA          ; Весь порт A - на вывод

      

 

bcf    

OPTION_REG,T0CS; Таймер 0 - к кварцевому  генератору

          

 

bcf

OPTION_REG,PSA ; Предделитель - к таймеру  0

 

bcf

OPTION_REG,PS0 ; Коэффициент деления - 16 (PS2..PS0 = 011)

 

bcf

OPTION_REG,PS1

 

bcf

OPTION_REG,PS2

 

bcf

STATUS,RP0     ; Банк 0

 

clrf

FLAGS

 

clrf

Bus_Control

 

clrf

Bus_Status

 

clrf

BitCount

 

bsf

PORTA,_SDA     ; Устанавливаем  исходное

 

bsf

PORTA,_SCL     ; состояние шины I2C

           

 

bsf

INTCON,T0IE    ; Разрешение прерываний  от таймера 0

     

; *************************************************************************

;                        ОСНОВНАЯ ПРОГРАММА

; *************************************************************************

     

; Сначала записываем в регистр  "Config" датчика число 00000001,

; устанавливая разрешение 9 бит  и режим однократного преобразования

; Максимальное время измерения  - 93,75 мс.

     
 

Command_to_DS1631 H'AC',01

 

Command_to_DS1631 H'51',00 ; Подаем команду "Start Convert"

 

call

DELAY_100ms        ; и ждем примерно 100 мс.

 

Read_from_DS1631  H'AA'    ; Читаем  показания датчика

     
 

bcf

FLAGS,Sign; Определяем знак температуры

 

btfss

Temperature,7   ; и если нужно,  выведем на индикатор минус

 

bsf

FLAGS,Sign    

     
 

btfsc

FLAGS,Sign      ; Если температура ниже нуля, инвертируем

 

goto

$+3             ; показания и увеличиваем их  на единицу,

 

comf

Temperature,f   ; потому что DS1631 выдает  значение

 

incf

Temperature,f   ; температуры в коде  с дополнением до двух

     
 

call

BIN_to_BCD      ; Преобразуем двоичное значение температуры

 

call

LOAD_to_LCD     ; в десятичный  код и загружаем его в DD2, DD3

 

bsf

INTCON,GIE; Включаем индикатор

 

goto

POWER_DOWN

     

BUS_ERROR

   
 

movlw

0 ; Если датчик DS1631 не обнаружен,

 

movwf

Ind1 ; на индикатор выводим символы "- 00"

 

movwf

Ind2

 

bcf

FLAGS,Sign

 

call

LOAD_to_LCD

 

bsf

INTCON,GIE

 

goto

POWER_DOWN

     

POWER_DOWN

   
 

movlw

D'30'; Ждем 3 секунды

 

movwf

Temperature; Показания температуры

 

call

DELAY_100ms; больше не нужны

 

decfsz

Temperature,f

 

goto

$-2

 

bsf

PORTB,PWD; Выключаем питание!

     

; **************** Подпрограммы для шины I2C ****************

     

TxmtStartBit

   
     
 

bsf

PORTA,_SDA

 

bsf

PORTA,_SCL

 

call

Delay50uSec

 

bcf

PORTA,_SDA

 

call

Delay50uSec

 

bsf

Bus_Status,_Bus_Busy

 

return

 
     

; ---------------------------------------------------

     

TxmtStopBit

   
     
 

bcf

PORTA,_SDA

 

bcf

PORTA,_SCL

 

bsf

PORTA,_SCL

 

call

Delay50uSec

 

bsf

PORTA,_SDA

 

call

Delay50uSec

 

bcf

Bus_Status,_Bus_Busy

 

return

 
     

; ---------------------------------------------------

     

Send_data

   
     
 

movfw

DataByte

 

movwf

DataByteCopy ; сделать копию DataByte

 

bsf

Bus_Status,_Txmt_Progr     ; set Bus status for txmt progress

 

bcf

Bus_Status,_Txmt_Success   ; сбросить бит статуса

 

movlw

8

 

movwf

BitCount

TxmtNextBit

   
 

bcf

PORTA,_SCL

 

rlf    

DataByteCopy,f; MSB-первых, заметим DataByte теряетс

 

bcf

PORTA,_SDA

 

btfsc

STATUS,C

 

bsf

PORTA,_SDA

 

call

Delay50uSec; guareentee min LOW TIME tLOW & Setup time

 

bsf

PORTA,_SCL; установить часы высокой, проверить, если часы высокой, иначе часы растягивается

 

call

Delay50uSec; guareentee min HIGH TIME tHIGH

 

decfsz

BitCount,f

 

goto

TxmtNextBit; Проверьте Ack

 

 
   
 

bcf

PORTA,_SCL

 

bsf

PORTA,_SDA; Release SDA line for Slave to pull down

 

call

Delay50uSec; guareentee min LOW TIME tLOW & Setup time

 

bsf

PORTA,_SCL; clock for slave to ACK

 

call

Delay50uSec; guareentee min HIGH TIME tHIGH

 

btfsc

PORTA,_SDA; SDA should be pulled low by slave if OK

       

 

goto

TxmtErrorAck

 

bcf

PORTA,_SCL

     
 

bcf

Bus_Status,_Txmt_Progr   ; reset TXMT bit in Bus Status

 

bsf

Bus_Status,_Txmt_Success ; transmission successful

 

bcf

Bus_Status,_ACK_Error    ; ACK OK

 

return

 

_TxmtErrorAck

   
 

bsf

PORTA,_SDA               ; tristate SDA

 

bsf

PORTA,_SCL               ; tristate SCL

 

bcf

Bus_Status,_Bus_Busy     ; Bus Not Busy, TEMP ????, set/clear on Start &

Stop

   
 

bcf

Bus_Status,_Txmt_Progr   ; reset TXMT bit in Bus Status

 

bcf

Bus_Status,_Txmt_Success ; transmission NOT successful

 

bsf

Bus_Status,_ACK_Error    ; No ACK From Slave

 

return

 
     

; ---------------------------------------------------

     

Get_data

   
     
 

bsf

Bus_Status,_Rcv_Progr; set Bus status for txmt progress

 

bcf

Bus_Status,_Rcv_Success; reset status bit

     
 

movlw

8

 

movwf

BitCount

RcvNextBit

   
 

bcf

PORTA,_SCL

 

bsf

PORTA,_SDA; can be removed from loop

 

call

Delay50uSec; guareentee min LOW TIME tLOW & Setup time

 

bsf

PORTA,_SCL; clock high, data sent by slave

 

call

Delay50uSec; guareentee min HIGH TIME tHIGH

     
 

bcf

STATUS,C

 

btfsc

PORTA,_SDA

 

bsf

STATUS,C

   

; TEMP ???? DO 2 out of 3 Majority detect

 

rlf

DataByte,f; left shift data (MSB first)

 

decfsz

BitCount,f

 

goto

RcvNextBit

     

; Generate ACK bit if not last byte to be read,

; if last byte generate NACK

 

; do not send ACK on last byte, main routine will send a STOP bit

     
 

bcf

PORTA,_SCL

 

bcf

PORTA,_SDA              ; ACK by pulling SDA low

 

btfsc

Bus_Control,_Last_Byte

 

bsf

PORTA,_SDA              ; if last byte, send NACK by setting SDA high

 

call

Delay50uSec             ; guareentee min LOW TIME tLOW & Setup time

 

bsf

PORTA,_SCL

 

call

Delay50uSec             ; guareentee min HIGH TIME tHIGH

RcvEnd

   
 

bcf

PORTA,_SCL              ; reset clock

 

bcf

Bus_Status,_Rcv_Progr; reset TXMT bit in Bus Status

 

bsf

Bus_Status,_Rcv_Success; transmission successful

 

bcf

Bus_Status,_ACK_Error; ACK OK

 

return

 
     

; **************** Прочие подпрограммы ****************

; -------------- Вывод цифр на индикатор  --------------

     

LOAD_to_LCD

   
 

bsf

PORTB,RST   ; Импульс сброса счетчиков

 

bcf

PORTB,RST

K176IE4_1

   
 

movfw

Ind1        ; Загружаем  первую цифру в первый счетчик

 

movwf

CLK_count

 

xorlw

0

 

BZ

K176IE4_2

 

bsf

PORTB,CLK1

 

bcf

PORTB,CLK1

 

decfsz

CLK_count,f

 

goto

$-3

K176IE4_2

   
 

movfw

Ind2        ; Загружаем  вторую цифру во второй счетчик

 

movwf

CLK_count

 

xorlw

0

 

BZ

Go_back

 

bsf

PORTB,CLK2

 

bcf

PORTB,CLK2

 

decfsz

CLK_count,f

 

goto

$-3

Go_back

   
 

return

 
     

; ----------- Преобразование двоичного  кода в десятичный -----------

     

BIN_to_BCD

   
 

clrf

Ind1

 

movfw

Temperature

 

movwf

Ind2

GTENTH

   
 

movlw

D'10'

 

subwf

Ind2,w

 

btfss

STATUS,C

 

goto

GHUNDRED

 

movwf

Ind2

 

incf

Ind1,f

 

goto

GTENTH

GHUNDRED

   
 

movlw

D'10'

 

subwf

Ind1,w

 

btfss

STATUS,C

 

goto

OVER

 

bsf

FLAGS,One

 

movwf

Ind1

OVER

return

 
     

; ------------ Задержка около 100 мс ------------

     

DELAY_100ms

   
 

movlw

D'130'

 

movwf

DELAY_reg_1

 

movlw

H'FF'

 

movwf

DELAY_reg_2

LOOP

   
 

decfsz

DELAY_reg_2,f

 

goto

LOOP

 

decfsz

DELAY_reg_1,f

 

goto

LOOP

 

return

 
     

; --------------- Задержка 50 мкс ---------------

     

Delay50uSec

   
 

movlw

D'15'

 

movwf

DELAY_reg_1

 

decfsz

DELAY_reg_1,f

 

goto

$-1

 

return

 
     

  END

   

 

 

 

 

 

 

 

 

 

 

 

 

 

ЗАКЛЮЧЕНИЕ

В данном курсовом проекте мы подробнее познакомились  с семейством микроконтроллеров PIC, а в частности с PIC16F628. Это одни из самых доступных и простых микроконтроллеров. Основной целью работы являлось  разработка программы для микроконтроллера PIC16F628 на базе которого был собран цифровой термометр. Основной средой программирования MPLAB IDE.

MPLAB IDE – бесплатная  интегрированная среда разработки  для микроконтроллеров PICmicro фирмы Microchip Technology Incorporated. MPLAB IDE позволяет писать,  отлаживать  и оптимизировать  текст программы.

MPLAB IDE включает в себя  редактор текста,  симулятор и менеджер  проектов, поддерживает работу эмуляторов (MPLAB-ICE, PICMASTER) и программаторов (PICSTART plus, PRO MATE) фирмы Microchip и других  отладочных средств фирмы Microchip и третьих производителей.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ЛИТЕРАТУРА

    1. MPLAB IDE: Интегрированная среда разработки для микроконтроллеров PICmicro компании Microchip Technology Incorporated.-Москва: Микро-Чип,2001.
    2. PIC16F62F: Однокристальные 8-разрядные FLASH CMOS микроконтроллеры компании Microchip Technology Incorporated.-Москва: Микро-Чип,2001.
    3. Экономичный цифровой термометр : [Электронный ресурс]. -Режим доступа .: http://eldigi.ru/site/house/11.php

 

 

 

 

 

 


Информация о работе Термометр на PIC контроллере