Главная » Микроконтроллеры
Призовой фонд
на июль 2019 г.
1. 1000 руб
Паяльник
2. Регулируемый паяльник 60 Вт
Паяльник
3. 100 руб.
От пользователей

Часы на PIC16F877A

Представляю вашему вниманию мой вариант электронных часов на микроконтроллере PIC16F877A.

Принципиальная схема часов

На рисунке 1 изображена принципиальная схема часов. Ядром схемы является микроконтроллер PIC16F877A. Микроконтроллер работает по алгоритму, изображенному на рисунке 2. Стоить отметить, что алгоритм весьма условный и отображает два основных цикла работы прибора, это:

  1. Цикл настойки (настройка секунд, минут и часов);
  2. Цикл отображения часов (работа часов).

Алгоритм работы часов

Код программы написан на языке ассемблер, смотреть листинг 16F877ATEMP.ASM.

Данные часы собраны на демонстрационной (отладочной) плате фирмы Microchip PICDEM 2 PLUS. Схему демонстрационной платы PICDEM 2 PLUS можно найти на сайте [1].

Полный цикл внутрисхемного программирования и отладки микроконтроллера PIC16F877A был осуществлён при помощи MPLAB IDE v8.15 (интегрированная среде разработки), компилятор MPASM v5.22 (входит в MPLAB IDE v8.15) и MPLAB ICD 2 (внутрисхемный отладчик - «Дебагер»). Для тех, кто не располагает средствами приведёнными выше, а имеет свою программу для работы с *.HEX файлами и иной программатор, можно в соответствующем проекте найти файл 16F877ATEMP.HEX. Техническую спецификацию микроконтроллера можно найти на сайте [1] и [2].

Микроконтроллер DD1 имеет функциональные выводы RC4, RC5 и RD2 – RD7, которые служат для ввода и вывода информации. Тактовыми кнопками SB1 «Выбор» и SB2 «Ввод» происходит настройка часов. Стоит отметить, что микроконтроллер различает три состояния тактовой кнопки (смотреть листинг):

  1. Не нажата;
  2. Нажата кратковременно (менее 2 секунд);
  3. Нажата и удерживается (более 2 секунд). Если кнопка удерживается более 8 секунд, то происходит переполнение счётчика TMR1 и сбой в работе генератора секунд, после чего нужно заново настраивать часы.

Тактовые кнопки SB1 и SB2 подключены к выводам микроконтроллера RC4 и RC5 через токоограничивающие резисторы R4 и R5. В отжатом положении тактовых кнопок SB1 и SB2 резисторы R6 и R7 имитирует низкий логический уровень (пассивное состояние цепи ввода информации). Микроконтроллер DD1 не имеет функции принудительного сброса, вывод для сброса подключен через резистор R1 к положительному потенциалу питания. Стоить отметить, что если вы повторяете мою работу на демонстрационной плате PICDEM 2 PLUS, то там есть тактовая кнопка для сброса микроконтроллера. Для генерации тактовой частоты используется кварцевый резонатор QZ1 с ёмкостями C1 и C2. Прибор может эксплуатироваться в диапазоне температур от –20 °С до +70 °С.

Для отображения информации используется жидкокристаллический дисплей HG1. Техническую спецификацию дисплея можно найти на сайте [3]. Он имеет контроллер, в котором реализована функция знакогенерации. Отображает две строки по шестнадцать символов в каждой. Управление дисплеем осуществляется через выводы микроконтроллера RD2 – RD7. Загрузка данных происходи полубайтами, через выводы RD4 – RD7. «Защёлка» - RD3. Выбор регистра сигнала формируем на выводе RD2. Резисторами R2 и R3 устанавливаем контрастность дисплея HG1. Стоит отметить, что данный дисплей HG1 имеет светодиодную жёлто-зелёную подсветку на схеме выводы A LED (15) и K LED (16) можно подключить через токоограничивающий резистор к питанию после стабилизации.

Для точного счёта времени модулем TMR1 был использован внешний тактовый генератор на базе кварцевого резонатора QZ2 с ёмкостями C3 и C4. Кварцевый резонатор QZ2 с ёмкостями C3 и C4 подключен к выводам T1OSO и T1OSI. Точность хода времени 1 секунда. Максимальное значение подсчитанного времени 23 часа 59 минут 59 секунд, далее происходит обнуление и подсчёт времени начинается заново.

Прибор запитывается от переменного или постоянного источника напряжения, подключаемого к разъему X1. Номинальное напряжение источника питания 9 – 15 В. Номинальный ток источника питания 0.5 А. Для стабилизации питания используется обычная схема из диодного моста VD1, линейного стабилизатора DA1, фильтрующих конденсаторов C5 – C9.

После включения прибора (подключению к источнику питания) происходит переход в основной режим работы, где на дисплее HG1 виден ход часов (до настройки виден отсчёт секунд). Для настройки часов нужно перейти в режим настройки секунд, для этого нужно нажать любую тактовую кнопку SB1 «Выбор» или SB2 «Ввод». После нажатия кнопки на дисплее HG1 отображаются часы и взятые в прямоугольные скобки секунды. После нажатия тактовой кнопки SB2 «Ввод» происходит инкриминирование регистра секунд и на дисплее HG1 видно приращение секунд на единицу. Для перехода к настройки минут нужно кратковременно нажать тактовую кнопку SB1 «Выбор»,на дисплее HG1 будут видны часы у которых минуты взяты в квадратные скобки. А аналогичным образом настраиваются минуты как и секунды. Далее происходит переход к настройки часов, а затем и секунд, вот такой цикл. Для выхода из режима настройки нужно удерживать более 2 секунд тактовую кнопку SB1 «Выбор».

В данном устройстве можно заменить следующие детали. Микроконтроллер DD1 из серии PIC16F877A-I/P-xxx с рабочей тактовой частотой 20 МГц в корпусе DIP40. Дисплей HG1 подойдет любой из серии WH1602x. Стабилизатор напряжения DA1 отечественный КР142ЕН5А (5 В, 1.5 А). Диодный мост VD1 на рабочее напряжение не меньше 25 В и ток не меньше 0.5 А. Разъём питания X1 аналогичный указанному на схеме с центральным контактом d=2.1 мм. Неполярные конденсаторы С5, С8 и С9 номиналом 0.01 – 0.47 µF x 50 V. Электролитические конденсаторы С6 и С7 ёмкостной номинал тот же, а напряжение не ниже указанного на схеме.

Фото часов

Думаю, что часы на PIC16F877A послужат для Вас отправной точкой для создания более сложного прибора, например, часов с несколькими будильниками, таймерами или коммутаторами нагрузки и т.д. Желаю удачи!

Ссылки в интернете

Название сайтов

Адреса

[1]

Microchip Technology Inc. - a Leading Provider of Microcontroller and Analog Semiconductors

http://www.microchip.com/

[2]

ООО Микро-Чип - микроконтроллеры и источники питания

http://www.microchip.ru/

[3]

Winstar Display Co., Ltd.

http://www.winstar.com.tw/main.php

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
DD1 МК PIC 8-бит
PIC16F877
1 Поиск в Utsource В блокнот
DA1 Линейный регулятор
L7805AB
1 Поиск в Utsource В блокнот
VD1 Диодный мост
2W10
1 Поиск в Utsource В блокнот
С1-С4 Конденсатор33 пФ4 Поиск в Utsource В блокнот
С5, С8, С9 Конденсатор0.1 мкФ3 Поиск в Utsource В блокнот
С6 Электролитический конденсатор220 мкФ 25 В1 Поиск в Utsource В блокнот
С7 Электролитический конденсатор220 мкФ 10 В1 Поиск в Utsource В блокнот
R1, R3 Резистор
10 кОм
2 Поиск в Utsource В блокнот
R2 Резистор
300 Ом
1 Поиск в Utsource В блокнот
R4, R5 Резистор
470 Ом
2 Поиск в Utsource В блокнот
R6, R7 Резистор
4.7 кОм
2 Поиск в Utsource В блокнот
QZ1 Кварцевый резонатор20 МГц1 Поиск в Utsource В блокнот
QZ2 Кварцевый резонатор32.768 кГц1 Поиск в Utsource В блокнот
HG1 LCD-дисплейWH1602A-YYK-CT1 Поиск в Utsource В блокнот
SB1, SB2 Тактовая кнопкаSWT-20-72 Поиск в Utsource В блокнот
X1 Разьем для блока питанияDS-261B1 Поиск в Utsource В блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Ковалев Антон Юрьевич Опубликована: 2011 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (4) | Я собрал (0) | Подписаться

0
RGB #
Спасибо большое за исходник, реальная помощь в изучении МК. Тут и критика для часов можно выбрать и по дешевле МК. Хотя для себя я нашел ценную инфу.
С УВ. RGB.
Ответить
0
Ковалев Антон Юрьеви #
Данный исходный код может быть реализован под PIC16F628A, только нужно порты переписать с PORTD на PORTB (смотреть начало листинга) и подключить соответствующим образом дисплей, желаю удачи!
Ответить
0
Рамиль #
Решил повторить это устройство и заодно немного поучится программированию МК (для меня это было первое устроство на МК). Первое что мне не понравилось, так это использование портов С для кнопок. Сразу же изменил схему и повесил две кнопки на порт B0 и B1 и землёй. Порт B имеет внутренние подтягиваюшие резисторы, этим сразу же отпала необходимость в установки 4 резисторов.
Т.к. кнопки стали инверсными, пришлось заменить все btfss на btfsc и наоборот во всех функциях Buttons.
После этого записал прошивку в МК и вроде бы часы заработали ... Затем решил отображать часы не с 4 позиции, как у автора, а с первой. Вот тут всё и началось ... Для начала я просто закомментировал LCD_Step_Clear. Но после этого через несколько секунд индикатор начинал выводить всякую ерунду. После экспериментов и изучения даташита на индикатор и программы автора я понял для себя, что автор просто бестолково втыкая команды управления индикатором и функции задержки подобрал так тайминг, что часы работали. Но стоило изменить вывод символов с первой позиции, как весь тайминг сбивался.
Для нормальной работы пришлось убрать треть ненужных команд инициализации индикатора и использовать три функции задержки, который я позаимствовал из другого устройства. После правильного программирования индикатора и использования правильных функций задержек работа устройства возобновилась. Прилагаю мои изменения.
main call Clear_SRAM
call Ports_Initializing
call TMR1_Initializing
call LCD_Initializing
; call Pause_LCD //не нужно
; call LCD_Initializing //не нужно
; call Pause_LCD //не нужно
goto Run
Ports_Initializing clrf PORTA
clrf PORTB
clrf PORTC
clrf PORTD
clrf PORTE
bsf STATUS,RP0
movlw 0x3D
movwf TRISA
movlw 0x03
movwf TRISB
bcf OPTION_REG,RBPU // включаем подтягивающие резисторы
movlw 0x03
movwf TRISC
movlw 0x00
movwf TRISD

LCD_Initializing call pause3
movlw b'00110000'
call LCD_WC
call Pause_LCD
movlw b'00100000' ; 4bit
call LCD_WC
movlw b'10000000' ; однострочный дисплей, шрифт 5х8
call LCD_WC
; movlw b'00100000' //не нужно
; call LCD_WC //не нужно
; movlw b'10000000' //не нужно
; call LCD_WC //не нужно
movlw b'00000000'
call LCD_WC
movlw b'11000000' ; дисплей включен
call LCD_WC
movlw b'00000000'
call LCD_WC
movlw b'00010000' ; DISPLAY CLEAR
call LCD_WC
call Pause_LCD
movlw b'00000000'
call LCD_WC
movlw b'01100000' ; ENTRY MODE SET
call LCD_WC
return

Cr1 equ .50 ;длительность 1-й задержки 50 циклов
Cr2 equ .25 ;длительность 2-й задержки 25х50 циклов
Cr3 equ .200 ;длительность 3-й задержки 200х50 циклов

;*** Процедура Паузы 1 (>39 мкс) ************************
pause1
movlw Cr1
movwf T_int ; загрузить значение таймера для паузы в T_int
cikl1 nop
nop
nop
nop
nop
nop
decfsz T_int,1
goto cikl1
return
;*** Процедура Паузы 2 (>1.53 мс) ***********************
pause2
movlw Cr2
movwf T_ext ; загрузить значение для внешнего цикла
cikl2 movlw Cr1
movwf T_int ; загрузить значение для внутреннего цикла
cikl3 decfsz T_int,1
goto cikl3 ; внутренний цикл
decfsz T_ext,1
goto cikl2 ; внешний цикл
return
;*** Процедура Паузы 3 (>30 мс) *************************
pause3
movlw Cr3
movwf T_ext ; загрузить значение для внешнего цикла
cikl4 movlw Cr1
movwf T_int ; загрузить значение для внутреннего цикла
cikl5 nop
decfsz T_int,1
goto cikl5 ; внутренний цикл
decfsz T_ext,1
goto cikl4 ; внешний цикл
return

;**********************************************************************
LCD_WC movwf LCD_BUFFER
bcf LCD_RS
call LCD_PORTB_Write_H
bsf LCD_E
nop
nop
bcf LCD_E
call pause1
return
;**********************************************************************
LCD_WD movwf LCD_BUFFER
bsf LCD_RS
call LCD_PORTB_Write_H
bsf LCD_E
nop
nop
bcf LCD_E
call pause1
call LCD_PORTB_Write_L
bsf LCD_E
nop
nop
bcf LCD_E
call pause1
return
Функция Pause_LCD становится не нужна.
Автору конечно спасибо за статью и программу. Но такой не совсем рабочий пример для начинающих я бы не стал выкладывать.
Ответить
0
aykovalev #
Рад, Рамиль, что вы разобрались самостоятельно и без посторонней помощи
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Программатор Pickit3
Программатор Pickit3
Модуль измерения тока на ACS712 (30А) Паяльник с регулировкой температуры
вверх