Представляю вашему вниманию мой вариант электронных часов на микроконтроллере PIC16F877A.
На рисунке 1 изображена принципиальная схема часов. Ядром схемы является микроконтроллер PIC16F877A. Микроконтроллер работает по алгоритму, изображенному на рисунке 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 «Ввод» происходит настройка часов. Стоит отметить, что микроконтроллер различает три состояния тактовой кнопки (смотреть листинг):
- Не нажата;
- Нажата кратковременно (менее 2 секунд);
- Нажата и удерживается (более 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 |
|
[2] |
ООО Микро-Чип - микроконтроллеры и источники питания |
|
[3] |
Winstar Display Co., Ltd. |
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
DD1 | МК PIC 8-бит | PIC16F877 | 1 | Поиск в магазине Отрон | ||
DA1 | Линейный регулятор | L7805AB | 1 | Поиск в магазине Отрон | ||
VD1 | Диодный мост | 2W10 | 1 | Поиск в магазине Отрон | ||
С1-С4 | Конденсатор | 33 пФ | 4 | Поиск в магазине Отрон | ||
С5, С8, С9 | Конденсатор | 0.1 мкФ | 3 | Поиск в магазине Отрон | ||
С6 | Электролитический конденсатор | 220 мкФ 25 В | 1 | Поиск в магазине Отрон | ||
С7 | Электролитический конденсатор | 220 мкФ 10 В | 1 | Поиск в магазине Отрон | ||
R1, R3 | Резистор | 10 кОм | 2 | Поиск в магазине Отрон | ||
R2 | Резистор | 300 Ом | 1 | Поиск в магазине Отрон | ||
R4, R5 | Резистор | 470 Ом | 2 | Поиск в магазине Отрон | ||
R6, R7 | Резистор | 4.7 кОм | 2 | Поиск в магазине Отрон | ||
QZ1 | Кварцевый резонатор | 20 МГц | 1 | Поиск в магазине Отрон | ||
QZ2 | Кварцевый резонатор | 32.768 кГц | 1 | Поиск в магазине Отрон | ||
HG1 | LCD-дисплей | WH1602A-YYK-CT | 1 | Поиск в магазине Отрон | ||
SB1, SB2 | Тактовая кнопка | SWT-20-7 | 2 | Поиск в магазине Отрон | ||
X1 | Разьем для блока питания | DS-261B | 1 | Поиск в магазине Отрон | ||
Скачать список элементов (PDF)
Прикрепленные файлы:
- clock_pic.rar (29 Кб)
Комментарии (4) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
С УВ. RGB.
Т.к. кнопки стали инверсными, пришлось заменить все btfss на btfsc и наоборот во всех функциях Buttons.
После этого записал прошивку в МК и вроде бы часы заработали ... Затем решил отображать часы не с 4 позиции, как у автора, а с первой. Вот тут всё и началось ... Для начала я просто закомментировал LCD_Step_Clear. Но после этого через несколько секунд индикатор начинал выводить всякую ерунду. После экспериментов и изучения даташита на индикатор и программы автора я понял для себя, что автор просто бестолково втыкая команды управления индикатором и функции задержки подобрал так тайминг, что часы работали. Но стоило изменить вывод символов с первой позиции, как весь тайминг сбивался.
Для нормальной работы пришлось убрать треть ненужных команд инициализации индикатора и использовать три функции задержки, который я позаимствовал из другого устройства. После правильного программирования индикатора и использования правильных функций задержек работа устройства возобновилась. Прилагаю мои изменения.
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
Автору конечно спасибо за статью и программу. Но такой не совсем рабочий пример для начинающих я бы не стал выкладывать.