Автор: Пользователь скрыл имя, 09 Марта 2013 в 13:31, курсовая работа
За последние десятилетия электронная промышленность развивалась опережающими темпами в сравнении с любой другой отраслью. Появление недорогих интегральных схем высокой и сверхвысокой степени интеграции, ориентированных на решение всевозможных задач, позволило разработать принципиально новые подходы к проектированию электронных устройств. Появившийся в конце 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 и третьих производителей.
ЛИТЕРАТУРА