Суббота, 20.04.2024, 15:27
progPROTON
Главная | статьи | Регистрация | Вход
Меню сайта
Категории раздела

Часы и вольтметр на Pic16f676

Доработка ранее изготовленных часов ссылка:


04,03,2021 добавил ds1307 при многократном отключении питания время не сбивается

В устройстве используется семисегментный индикатор с драйвером MAX7219 

схема:

фото: 

код:

    '*****************************************************************
    '*  Name    : часы_вольтметр-676-1307-1.bas                        *
    '*  Автор   : Лобзанюк К.П.                                      *
    '*          :                                                    *
    '*          :                                                    *
    '*  Дата    : 29.12.2021                                         *
    '*  Версия  : 2.02                                               *
    '*          :                                                    *
    '*          :                                                    *
    '*****************************************************************   
    
    Device 16F676 
    Xtal 4
     Config CP_OFF, CPD_OFF, MCLRE_ON ,BODEN_OFF, PWRTE_ON, WDT_OFF , INTRC_OSC_NOCLKOUT 
    
    
    'Declare  Optimiser_Level 1    ' Включить оптимизацию программы  
    Declare All_Digital = On                      ' Установить все порты цифровыми
    Declare SDA_Pin PORTA.1                       ' Канал данных для  DS1307 (базовый адрес $D1)
    Declare SCL_Pin PORTA.5                      ' Канал строба для  DS1307
    'Declare 24AA01                                    ' AT24c32 базовый адрес $A1
    '-------------------------- Настройки АЦП ------------------------------------
                                                                       
    Declare  Adin_Res 10   ' Разрядность результата преобразования АЦП
    Declare  Adin_Tad FRC   ' Источник тактирования АЦП
    Declare  Adin_Stime 300   ' Время на подготовку АЦП к новому измерению 50
    ADCON0 = %10000011  '  бит0 1 АЦП включен бит1 1 АЦП выполняет преобразование бит2-4 000 выбран канал AN0
                        ' бит6 0 опорное напряжение Vdd бит7 1 правое выравнивание
    ADCON1 = %01110000   '  выбираем тактовый сигнал, для внутреннего генератора поставил 111 
    ANSEL  = %00000001   ' используем аналоговый вход AN0 ставим 1 на не используемых ставим 0 
    
    
    
    '=======================================================================
    
    
    
    Symbol DIN PORTC.0        'Выход данных
    Symbol CLK PORTC.2     'Выход синхро импульсов 
    Symbol LOAD PORTC.1     'Защелка 
    Symbol  KH1 = PORTA.2     ' Кнопка 1 (установка время)
    Symbol  KH2 = PORTA.4     ' Кнопка 2 (часы)
    Symbol  KH3 = PORTC.4     ' Кнопка 3 (минуты) если нажата до включения питания то происходит инициализация DS1307
'    Symbol  TK = PORTC.3     '    вход  1Hz
    'Symbol DQ = PORTB.1           ' Подключить DS18B20 к выводу PORT
    'Symbol ZBUK PORTC.3       '
    TRISA =%11111111                              '  Порт  на вход для кнопок
    TRISC = %00011000             ' Порт А на выход для исполнительных устройств
    
    
         
    
        Dim Sec         As Byte     
    '   Dim Sec1        As Byte    
        Dim Min        As Byte    
        Dim Min1       As Byte   
        Dim Hr          As Byte   
        Dim Hr1         As Byte    
    '    Dim Day         As Byte    
    '    Dim Date        As Byte     
    '    Dim Date1       As Byte   
    '    Dim Mon         As Byte   
    '    Dim Mon1        As Byte     
    '    Dim Yr          As Byte    
    '    Dim Yr1         As Byte        
        Dim Tmp         As Byte
        Dim Tmp1        As Byte
        Dim n           As Byte
        Dim Value As Byte 'Переменная адрес знакоместа 
        Dim Value1 As Byte 'Переменная для преобразования табличной конвертации 
        Dim flagK1 As Bit     '  флаг кнопка нажата и уже отпущена
        Dim flagK2 As Bit
        Dim flagK3 As Bit
        Dim Var1 As Word '
        Dim TK As Bit
    '    Dim ZBUK1 As Bit
    '    Dim flagB As Bit      ' флаг будильника.
    '    Dim Mins_B      As Byte
    '    Dim Hr_B        As Byte
    '    Dim Sec2        As Byte
    '    Dim VAR1 As Dword
    '    Dim Ctrl As Byte
 If KH3 = 1  Then DelayMS 50 : GoTo  ini_dis: 
      BStart
    BusOut $D1 , 07h, [%00010000]  ' управляюший регистр  (на выходе SOUT 1Hz)
     
       
    BusOut $D1 , 00h, [%00000000]  ' Бит 7 регистра 0 – это  бит  останова  часов если 1 счета нет
    BusOut $D1 , 02h, [%00000000]  ' Бит 6 регистра 2 – это  бит 12\24 если1 то 12ч режим
    BStop 
 
     '-------------------Настройка дисплея-------------------
  ini_dis:  
        Value = %00001111
         Value1 = %00000000
      GoSub DI
      Value = %00001100
         Value1 = %00000001
      GoSub DI 
       Value = %00001011
         Value1 = %00000111
      GoSub DI
       Value = %00001001    ' 
          Value1 = %00000000
      GoSub DI
       Value = %00001010
        Value1 = %00001111
      GoSub DI    
      Value = %00000100   ' погасить не задейственное четвертое знакоместо чтобы не высветилась кракозябра
    Value1 = %00000000
     GoSub DI 
     flagK1 = 0 
     flagK2 = 0 
     flagK3 = 0 
Main:'====================== Основной цикл  ===================================================

     Var1 = ADIn 0   '  АЦП
              DelayUS 1
         Var1 = Var1 * 3
     TK = PORTC.3   ' мигание точкой 
Read_time: '---------------ситчывание времени--------------------------------------
   
    BStart
    BusIn $D0, 0, [Sec,Min,Hr]' BusIn $D0, 0, [Sec,Min,Hr,Day,Date,Mon,Yr]
    BStop 
    'Tmp = Sec
    'GoSub Fix_bcd_in                              
    'Sec1 = Tmp  
    
                    
    Tmp = Min
    GoSub Fix_bcd_in        ' На преобразование полубайтов
    Min1 = Tmp
    Tmp = Hr
    GoSub Fix_bcd_in
    Hr1 = Tmp
    'Tmp = Date
    'GoSub Fix_bcd_in
    'Date1 = Tmp
    'Tmp = Mon
    'GoSub Fix_bcd_in
    'Mon1 = Tmp
    'Tmp = Yr
    'GoSub Fix_bcd_in
    'Yr1 = Tmp
    DelayMS 500 
    GoSub Ind
    GoSub KH_1
    '
    
       
    
    If flagK1 = 1  Then     flagK1 = 0 : GoTo SETTIM 
    GoTo Main
    
 Write_time:  '================ запись времени =========================================================================

    Tmp = Min1    
    GoSub Fix_bcd_out                            
    Min = Tmp 
    Tmp = Hr1                     
    GoSub Fix_bcd_out                             
    Hr = Tmp
    'Tmp = Date1                          
    'GoSub Fix_bcd_out                             
    'Date = Tmp
    'Tmp = Mon1  
    'GoSub Fix_bcd_out                             
    'Mon = Tmp
    'Tmp = Yr1                            
    'GoSub Fix_bcd_out                           
    'Yr = Tmp
    Sec = 0
    BStart
    BusOut $D1, 0, [Sec,Min,Hr]  ' BusOut $D1, 0, [Sec,Min,Hr,Day,Date,Mon,Yr]
    BStop
    GoTo  Read_time
    
    
    '=================================== Установка времени ==========================
    
 SETTIM:
     GoSub KH_1
     GoSub KH_2
     GoSub KH_3
     TK = 0
    If flagK3 = 1 Then Min1 = Min1 + 1 : flagK3 = 0
    If Min1 > 59 Then Min1 = 0
    If flagK2 = 1 Then Hr1 = Hr1 + 1 : flagK2 = 0
    If Hr1 > 23 Then Hr1 = 0
    GoSub Ind
    If flagK1 = 1  Then     flagK1 = 0 : GoTo Write_time:  EndIf   ' 
     GoTo SETTIM
    


     
Ind:         ' индикация
    
    
       n = Dig Min1, 0 'Выделяем из числа единицы 
    GoSub Convert 'и отправляем на табличную конвертацию 
    Value = %00000101
     GoSub DI
     
    n = Dig Min1, 1 'Выделяем из числа десятки 
    GoSub Convert 'и отправляем на табличную конвертацию 
     Value = %00000110
     GoSub DI
     
    n = Dig Hr1, 0 
     If TK = 1 Then  GoSub Convert1 : GoTo Label4
    GoSub Convert
Label4:
     Value = %00000111
     GoSub DI
     
     n = Dig Hr1, 1 
    GoSub Convert '
     Value = %00001000
     GoSub DI
     
         n =  Dig Var1, 1 '
    GoSub Convert 
     Value = %00000001
     GoSub DI
     
    n =  Dig Var1, 2 
    GoSub Convert1 
     Value = %00000010
     GoSub DI
     n =  Dig Var1, 3 
    GoSub Convert '
     Value = %00000011
    
     GoSub DI
         Return 
 DI:
         LOAD = 0
          SHOut DIN, CLK, MsbFirst, [Value  \8,Value1 \8 ]
          LOAD = 1
        
         Return
        Convert: 
        
        Value1 = LookUpL n, [126,48,109,121,51,91,95,112,127,123] 
        '                     0, 1,  2,  3,  4, 5, 6,  7,  8,  9
        Return  
  Convert1:
    
    Value1 = LookUpL n, [254,176,237,249,179,219,223,240,255,251]   ' цифры с точкой
    '                     0,  1,  2,  3,  4,  5,  6,  7,  8,  9
    Return   
    '----------------------------Подпрограмма нажатия кн1-------------------------------------
 KH_1:
          If KH1 = 0  Then DelayMS 50 : flagK1 = 1 : GoTo triger : EndIf           ; 
         GoTo Label1 
    triger: 
     
        If KH1 = 1 And flagK1 = 1 Then  DelayMS 50 : GoTo Label1 :  EndIf 
          GoTo triger                                                            
    Label1:
    
    
    Return
     '----------------------------Подпрограмма нажатия кн2-------------------------------------
 KH_2:
          If KH2 = 0  Then DelayMS 50 : flagK2 = 1 : GoTo triger2 : EndIf           ; 
         GoTo Label12 
    triger2: 
     
        If KH2 = 1 And flagK2 = 1 Then  DelayMS 50 : GoTo Label12 :  EndIf 
          GoTo triger2                                                            
    Label12:
    
    
    Return
    '----------------------------Подпрограмма нажатия кн3-------------------------------------
 KH_3:
          If KH3 = 0  Then DelayMS 50 : flagK3 = 1 : GoTo triger3 : EndIf           ; 
         GoTo Label13 
    triger3: 
     
        If KH3 = 1 And flagK3 = 1 Then  DelayMS 50 : GoTo Label13 :  EndIf 
          GoTo triger3                                                            
    Label13:
    
    
    Return 
    
 Fix_bcd_in: '--------------------------------------------------------------------
        Tmp1 = Tmp & 15       ' 15это 1111  '&' выполняет операцию побитового логического умножения
        Tmp = Tmp >> 4         '
        Tmp = Tmp1 + 10 * Tmp   '
        Return
 Fix_bcd_out: '-------------------------------------------------------------------
        Tmp1 = Tmp / $A                   ' $A это 1010
        Tmp = Tmp - (Tmp1 * $A) 
        Tmp = Tmp + (Tmp1 << 4)    '<<' выполняет побитовый сдвиг влево на 4 бит
        Return          

  
 

 

Часы предназначены для автомобиля. От предыдущего проекта отличается применением другого

процессора и добавлением функции вольтметра. 
Программировал на PicBasic в Proton ide.20033 Compiler версии 3,5,9,5 

архив в протеусе

Категория: о proton и не только | Добавил: Konstantin (16.05.2021)
Просмотров: 375 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Друзья сайта

  • Cайт,BASCOM AVR
  • Информер
    Под стеклом
    Настольная книга если показывает кракозябру в браузере ставлю кодировку UTF-8
  • ПРОГРАММИРОВАНИЕ PIC-МИКРОКОНТРОЛЛЕРОВ В PROTON+IDE на PicBasic