- •2. Введение
- •3. Разработка структурной схемы устройства
- •4. Выбор элементной базы
- •5. Принцип построения программы
- •6. Разработка алгоритма работы электронных часов
- •7. Заключение
- •8. Список литературы
- •Приложение 1. Структурная схема микроконтроллера pic16f84
- •Приложение 2. Принципиальная схема электронных часов
- •Приложение 3. Листинг программы для микроконтроллера
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