Автор: Пользователь скрыл имя, 09 Марта 2013 в 13:21, реферат
За последние десятилетия электронная промышленность развивалась опережающими темпами в сравнении с любой другой отраслью. Появление недорогих интегральных схем высокой и сверхвысокой степени интеграции, ориентированных на решение всевозможных задач, позволило разработать принципиально новые подходы к проектированию электронных устройств. Появившийся в конце 70-хг. XX века новый класс полупроводниковых приборов, являющихся полностью укомплектованной управляющей ЭВМ на одном кристалле, вызвал настоящую революцию в мире электроники. Подобные устройства получили название микроконтроллеров (в русскоязычной литературе микроконтроллеры достаточно часто называют однокристальными ЭВМ – ОЭВМ) и нашли широкое применение в системах управления различными объектами в реальном масштабе времени.
ВВЕДЕНИЕ…………………………………………………………………….3
МИКРОКОНТРОЛЛЕР PIC16F62X…………………………………...4
2.       ТЕРМОМЕТР НА PIC16F62X………………………………………...10
2.1.  Программа цифрового термометра…………………………………14
ЗАКЛЮЧЕНИЕ……………………………………………………………….31
ЛИТЕРАТУРА………………………………...................................................32
Рис.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 | ; Сигнал сброса микросхем  | 
| 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АА – Температура | ||
| ; Прочитанное значение (только старший байт) | ||
|  ; загружается в регистр " | ||
| 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 и третьих производителей.
ЛИТЕРАТУРА