Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа по микроконтроллерам.docx
Скачиваний:
27
Добавлен:
18.09.2019
Размер:
163.69 Кб
Скачать

8. Список литературы

1. Радио №1 2001г. с.21 "Частотомер на PIC-контроллере"

2. Угрюмов Е.П. Цифровая схемотехника.-СПб.:БХВ-Санкт-Петербург,2000.-528 с.: ил.

3. Микроконтроллеры. Выпуск 2:Однокристальные микроконтроллеры PIC12c5x, PIC16x8x, PIC14000, M16C/61/62. Перевод с англ.Б.Я.. Прокопенко/ Под ред.Б. Я. Прокопенко.- М.: ДОДЭКА, 2000.- 336 с.

Приложение 1. Структурная схема микроконтроллера pic16f84

Приложение 2. Принципиальная схема электронных часов

Приложение 3. Листинг программы для микроконтроллера

LIST p=16F84A ; указатель процессора

include <p16F84A.inc>

org 0x00 ; Вектор сброса

Goto Start

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

org 004 ;Начало процедуры обработки прерывания

movwf temp ; Сохранение рабочего регистра W в temp

clrw dt ;Очистка сторожевого таймера для

call Int1 ; сброса процессора каждый 18мс

movlw b'10100000' ; Перенос в аккумулятор значения

movwf INTCON ; Разрешаем прерывания от таймера

movf temp,w ;Восстанавливаем значение рабочего регистра

clrw dt ;Очистка сторожевого таймера

return ;Выход из процедуры обработки прерывания

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

org 0x10

segment ; Таблица преобразования DEC -> семисегментный код.

CLR F PCLATH ;очистка PCLATH

ADDWF PCL, F

dt 07E, b'00001100', 0B6, 09E, 0CC, 0DA, 0FA, 00E, 0FE, 0DE

Data1 ;*************единицы

CLR F PCLATH

ADDWF PCL, F

;0 1 2 3 4 5 6 7 8 9

dt 0,0,0,0,0,0,0,0,0,0

dt 1,1,1,1,1,1,1,1,1,1

dt 2,2,2,2,2,2,2,2,2,2

dt 3,3,3,3,3,3,3,3,3,3

dt 4,4,4,4,4,4,4,4,4,4

dt 5,5,5,5,5,5,5,5,5,5

Data2 ;***********десятки

CLR F PCLATH

ADDWF PCL, F

;0 1 2 3 4 5 6 7 8 9

dt 0,1,2,3,4,5,6,7,8,9 ;0

dt 0,1,2,3,4,5,6,7,8,9 ;10

dt 0,1,2,3,4,5,6,7,8,9 ;20

dt 0,1,2,3,4,5,6,7,8,9 ;30

dt 0,1,2,3,4,5,6,7,8,9 ;40

dt 0,1,2,3,4,5,6,7,8,9 ;50

; Программные регистры:

skan1 equ 20 ;рег хранения RB1,2

clok1 equ 21 ; хранение часов

sek equ 22 ;регистр хранения секунд

min equ 23 ;регистр хранения минут

cl_k equ 24

Dig_x equ 25 ; Значение X0:00 для индикации.

Dig_y equ 26 ; Значение 0X:00 для индикации.

Dig_z equ 27 ; Значение 00:X0 для индикации.

Dig_exp equ 28 ; Значение 00:0X для индикации.

cnt1 equ 29 ;переменная исп для задержки времени

cnt2 equ 2A ;переменная исп для задержки времени

cnt_r equ 2B ;переменная исп для задержки времени

temp equ 2C

clok2 equ 2D

temp1 equ 2E

n1 equ 2f

n2 equ 30

Start ; Начальная инициализация.

Clr w

bsf STATUS,RP0 ; Обращение к банку 1.( установка бита)

clrf PORTA ; Обнулить порт А, т.к при загрузке мк. возм. 1

clrf PORTB ; Обнулить порт В, т.к при загрузке мк. возм. 1

movlw b'00010000' ;Определение рабочих вход. портов

movwf TRISA ; RA1 - RA3 выходы, RA0 вход.

movlw b'00000001' ;определение входных портов

movwf TRISB ; RB1 - RB7 выходы.RB0 вход

movlw b'00000101' ;коэффициент предделителя 64 и опр. адреса

movwf OPTION_REG ;рег. управление тактируемого таймера для

настройки предделителя

bcf STATUS,RP0 ; Окончания обращения к банку 0.

movlw b'10100000'

movwf INTCON ;определ. какие прерыв. разрешены в системе

clrf min ;Обнуление минут

clrf sek ;Обнуление секунд

clrf cl_k ;Обнуление часов

movlw 0

movwf TMR0

movlw 01 ; Для контроля дисплея

movwf Dig_x

movlw 02 ; загрузить во все регистры индикации 8.

movwf Dig_y

movlw 03

movwf Dig_z

movlw 04

movwf Dig_exp

movlw .131

movwf clok1

movwf TMR0

movlw .1

movwf temp1

Start1 ; Основной цикл программы.

Mov lw 19 ; Установить счетчик циклов индикации.

movwf cnt_r

loop1 clrwdt

call refresh ;вызов индикаторы.

decfsz cnt_r, f ;уменьшение на 1, если после уменьшение итог

0 , пропустить следующую операцию, результ. f

goto loop1

;***присвоение значения регистрам индикации в зависимости от режима ;индикации******

clrwdt

btfss temp1,0 ;проверка бита на равенство 1, если =1 то

происходит следующая операция

call Temp_min ;переход

btfsc temp1,0 ;проверка бита на равенство 1, если =1 то

происходит следующая операция

call Temp_clk ;переход

;******присвоение значения регистрам индикации

movf n1,0

call Data1 ;переход

movwf Dig_x

movf n1,0

call Data2

movwf Dig_y

movf n2,0

call Data1

movwf Dig_z

clrwdt

movf n2,0

call Data2

movwf Dig_exp

;********клавишы установки режима индикации и времени*******

call Delay ;переход на задержку

btfss PORTA,4 ;сканируем клавишу установки режима RA4 вывод 3

incf temp1,1 ;прибавляем к темпу 1

btfss PORTB,0 ;клавиша установки времени RB0 вывод 6

call Min_clk ;спецпереход

goto Start1 ;безусловный переход

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

Temp_min

movf min,0 ; копирование 0 регистр min

movwf n1 ; копирование числа из w в регистор n1

movf sek,0 ; копирование 0 регистр sek

movwf n2 ; копирование числа из w в регистор n2

return ;возврат

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

Temp_clk

movf cl_k,0 ; копирование 0 регистр cl_k

movwf n1 ; копирование числа из w в регистор n1

movf min,0 ; копирование 0 регистр min

movwf n2 ; копирование числа из w в регистр n2

return ;возврат

;****************выбор прибавить минуты(0) или часы(1)***********

Min_clk

Clrw dt ;очистка аккумулятора

btfss temp1,0 ;проверка бита на равенство 1, если да то

пропускается следующая команда

incf min,1

btfsc temp1,0 ;проверка бита на равенство 0, если да то

припускается следующая команда

incf cl_k ;увеличение на единицу регистра cl_k

;*******проверка 60 мин 24 часа*****************

movf min,0

sublw .60 ;вычитаем 60-w

btfsc STATUS,Z ;проверка бита на равенство 0, если

выполняется то след инструкция пропускается

clrf min ;очистка регистра

movf cl_k,0

sublw .24 ;вычитание 24-w

btfsc STATUS,Z ;проверка бита на равенство 0, если

выполняется то след инструкция пропускается

clrf cl_k ;очистка регистра

clrwdt ;очистка аккумулятора

return

Sek ;*****************деление на125

movlw .131 ;записываем в аккумулятор 131 т.к 256-125=131

movwf clok1

incfsz sek ;увеличение на 1, если при этом результат 0

пропуск след команда

movf sek,0 ;перенос значения в регистр sek,0

sublw .60 ;вычитание 60-w

btfsc STATUS,Z ;проверка бита на равенство 0, если

выполняется то след инструкция пропускается

call Min ;безусловный переход на Min

return

Min

clrf sek ;обнуление регистра sek

incfsz min ;увеличение на 1, если при этом результат 0

пропуск след команда

movf min,0 ;перенос значения в регистр min,0

sublw .60 ;вычитание 60-w

btfsc STATUS,Z ;проверка бита на равенство 0, если

выполняется то след инструкция пропускается

call Clok

retfie ;возврат из спецперехода

Clok

Clr f min ;обнуление регистра min

incfsz cl_k ;увеличение на 1, если при этом результат 0

пропуск след команда

movf cl_k,0 ;перенос значения в регистр cl_k,0

sublw .24 ;вычитание 24-w

btfsc STATUS,Z ;проверка бита на равенство 0, если

выполняется то след инструкция пропускается

clrf cl_k ;обнуление регистра cl_k

retfie ;возврат из спецперехода

Int1 ;процедура обработки прерывания

movlw .131 ;записываем 131 т.к 256-125=131

addwf TMR0,1 ;256(максимальное значение таймера)

incfsz clok1 ;125(нужный коэффициент деления)

return

call Sek

return

;***********************Вывод на индикатор*************

refresh ; Процедура сканирования индикации.

movf Dig_x, W ; Значение деситых.часов для индикации.

call segment ; Преобразование DEC -> семисегментный код.

movwf PORTB ; Вывод цифры на индикатор.

bcf PORTA, 0 ; Активизировать индикатор.

call Delay ; Задержка времени для сканирования.

bsf PORTA, 0 ; Отключить индикатор.

movf Dig_y, W ; Значение ед.часов для индикации.

call segment ; Преобразование DEC -> семисегментный код.

movwf PORTB ; Вывод цифры на индикатор.

bcf PORTA,1 ; Активизировать индикатор.

call Delay ; Задержка времени для сканирования.

bsf PORTA,1 ; Отключить индикатор.

movf Dig_z, W ; Значение десят.минут для индикации.

call segment; Преобразование DEC -> семисегментный код.

movwf PORTB ; Вывод цифры на индикатор.

bcf PORTA,2 ; Активизировать индикатор.

call Delay ; Задержка времени для сканирования.

bsf PORTA,2 ; Отключить индикатор.

movf Dig_exp, W ; Значение ед.минут.

call segment; Преобразование DEC -> семисегментный код.

movwf PORTB ; Вывод цифры на индикатор.

bcf PORTA,3 ; Активизировать индикатор.

call Delay ; Задержка времени для сканирования.

bsf PORTA,3 ; Отключить индикатор.

return

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

Delay ; Подпрограмма задержки времени для сканирования

индикации

clrwdt ;очистка аккумулятора

movlw .5 ;занесения в аккумулятор 5

movwf cnt1 ;копировать число из аккумулятора w в регистр cnt1

nop ;пустая команда

beta movlw .150 ;занесения в аккумулятор 5

movwf cnt2 ;копировать число из аккумулятора w в регистр cnt1

Alfa nop ;пустая команда

Nop ;пустая команда

decfsz cnt2, f ;уменьшение на единицу, если результат 0, то след

команда пропускается

goto Alfa ;переход на метку Alfa

nop ;пустая команда

nop ;пустая команда

decfsz cnt1, f ;уменьшение на единицу, если результат 0, то след

команда пропускается

goto beta ;переход на метку beta

nop ;пустая команда

return ;возврат

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

end