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

Похожие статьи:


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

Скачать список элементов (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

AVR-программатор USB ASP
AVR-программатор USB ASP
ELM327 OBD II — адаптер с поддержкой CAN iMAX B6 - зарядное для Lion, LiPo, LiFe, Pb, NiCd и NiMH аккумуляторов
вверх