Device 16F876A '-------------------------------- -----Предустановки--------------------------------------------- Xtal 4 Declare All_Digital = 1 Declare CCP1_Pin PORTC.2 'Вывод для HPWM модуля CCP1 Declare CCP2_Pin PORTC.1 'Вывод для HPWM модуля CCP2 Declare SDA_Pin PORTC.4 Declare SCL_Pin PORTC.3 '-------------------------------------Настройки портов---------------------------------------------- TRISA = %00000011 TRISB = %00001111 TRISC = %00000001 PORTB = %00000000 PORTC = %00000000 '-------------------------------НАСТРОЙКА ПРЕРЫВАНИЙ ПО ПОРТУ B.0----------------------------------- On_Interrupt GoTo OBRABOTCHIK ' Если приозошло прирывание то перейти к указаной метке Symbol INTE = INTCON.4 ' Бит разрешения прерывания по PORTB.0(INT) Symbol GIE = INTCON.7 ' Бит глобального разрешения прерываний Symbol INTF = INTCON.1 ' Флаг внешнего прерывания по PORTB.0(INT) OPTION_REG = %10000000 ' Фронт прерывания - передний, отключим PULLUP PIE1.0 = 1 INTCON.6 = 1 'Разрешим прерывание от периферийных устройств микроконтроллера GIE = 1 '-----------------------------------Конфигурация переменных----------------------------------------- Symbol DS PORTC.5 'Вход данных для сдвигового регистра Symbol SH_CP PORTC.7 'Вход тактовых импульсов для сдвигового регистра Symbol ST_CP PORTC.6 'Защелка сдвигового регистра Dim Value As Byte 'Переменная для преобразования табличной конвертации Dim n As Byte 'Переменная для выделения из числа цифры разряда Dim i As Word 'Переменная организации счетчика цифр Dim j As Word 'Переменная организации счетчика задержки Dim ckl As Byte Symbol setup = PORTB.1 Symbol up = PORTB.2 Symbol down = PORTB.3 Symbol enter = PORTB.4 Symbol rtc_read = %11010001 ' Адрес часов для чтения Symbol rtc_write = %11010000 ' Адрес часов для записи TRISA.1 = 1 Symbol Dy = PORTA.0 ' Подключить DS18B20 к выводу PORTA.4 Symbol Dd = PORTA.1 ' Подключить DS18B20 к выводу PORTA.4 Dim R_Temp As Word ' Переменная для получения значения температуры ' отдельными двумя байтами Dim Temp As Float ' Переменная для преобразования значения ' температуры в данные с плавающей запятой Dim TempIND As Float ' Переменная для вывода на индикацию значени ' температуры Dim C As Bit ' Переменная для хранения бита сигнализации ' окончания преобразования Dim SEC As Byte Dim SEC1 As Byte Dim MINU As Byte Dim MINU1 As Byte Dim CHAS As Byte Dim CHAS1 As Byte Dim DNI As Byte Dim DNI1 As Byte Dim MES As Byte Dim MES1 As Byte Dim GOD As Byte Dim GOD1 As Byte Dim hr As Byte ' часы в формате DS1307 Dim hr1 As Byte ' часы в десятичном формате Dim tmp01 As Byte Dim tmp02 As Byte Dim tmp As Byte Dim tmp1 As Byte Dim temperatura As Byte Dim temperatura1 As Dword 'КАРТА АДРЕСАЦИИ ПАМЯТИ DS1307 Dim ADDRES_0 As Byte Dim ADDRES_1 As Byte Dim ADDRES_2 As Byte Dim ADDRES_3 As Byte Dim ADDRES_4 As Byte Dim ADDRES_5 As Byte Dim ADDRES_6 As Byte Dim ADDRES_7 As Byte '||||||||||||||||||||||||||||||| Dim x As Byte Dim y As Byte y = 0 x = 127 ADDRES_0 = $00 ADDRES_1 = $01 ADDRES_2 = $02 ADDRES_3 = $03 ADDRES_4 = $04 ADDRES_5 = $05 ADDRES_6 = $06 ADDRES_7 = $07 HPWM 1, 255 , 1000 'Сгенерировать ШИМ сигнал для засветки индикатора PORTC.2 = 1 in: ;HBStart BusOut rtc_write, $07, [%00010000] ' ТАКТЫ BusOut rtc_write, $01, [%01011001] ' МИНУТЫ BusOut rtc_write, $02, [%00100011] ' ЧАСЫ BusOut rtc_write, $04, [%10011000] ' ДНИ BusOut rtc_write, $05, [%00000001] ' МЕСЯЦ BusOut rtc_write, $06, [%00010101] ' ГОД ;HBStop GoSub Ind '-------------------------------------Главная программа--------------------------------------------- Start: INTE = 1 GoSub TERMO_ConvertD GoSub TERMO_ConvertY GoSub read_time GoTo Start !!!!!!!!!!!!!!!!!! OBRABOTCHIK: Context Save If INTF = 1 Then 'Если было прерывание по INT INTF = 0 'сбросим флаг прерывания от INT INTE = 0 ' сбросим Бит разрешения прерывания по PORTB.0(INT) If setup = 0 Then SHOut DS, SH_CP, MsbFirst, [$A3] SHOut DS, SH_CP, MsbFirst, [$9C] SHOut DS, SH_CP, MsbFirst, [$A3] SHOut DS, SH_CP, MsbFirst, [$9C] PulsOut ST_CP, 10 DelayMS 1000 'IF up = 0 THEN GOSUB 'IF down = 0 THEN GOSUB 'IF enter = 0 THEN GOSUB End If End If Context Restore Retfie !!!!!!!!!!!!!!!!!!!! '---------------------------------Подпрограмма индикации-------------------------------------------- MENU: Return Ind: x = $FF For ckl = 0 To 23 x = (x ^ 1)/2 SHOut DS, SH_CP, MsbFirst, [x] PulsOut ST_CP, 10 DelayMS 250 Next Return '----------------------------Подпрограмма табличной конвертации------------------------------------- Convert: Value = LookUpL n, [192,249,164,176,153,146,130,248,128,144,156] ' Для схемы индикаторов с ОА 'Value = LookUpL n, [63,6,91,79,102,109,125,7,127,111] ' Для схемы индикаторов с ОК Return read_time: 'HBStart BusIn rtc_read, ADDRES_0,[SEC,MINU,CHAS,SEC,DNI,MES,GOD] ' 'HBStop GoTo TIME1 TIME1: ' ' tmp = MINU GoSub fix_bcd_in tmp01 = tmp ' ' tmp = CHAS GoSub fix_bcd_in tmp02 = tmp GoSub IND1 ' ' tmp = DNI GoSub fix_bcd_in tmp02 = tmp ' ' tmp = MES GoSub fix_bcd_in tmp01 = tmp GoSub IND1 ' ' tmp = GOD GoSub fix_bcd_in tmp01 = tmp GoSub IND2 Return ' ' fix_bcd_in: tmp1 = tmp & 15 tmp = tmp >> 4 tmp = tmp1 + 10 * tmp Return ' ' IND1: For ckl = 0 To 5 n = Dig tmp01, 0 GoSub Convert SHOut DS, SH_CP, MsbFirst, [Value] n = Dig tmp01, 1 GoSub Convert SHOut DS, SH_CP, MsbFirst, [Value] n = Dig tmp02, 0 GoSub Convert SHOut DS, SH_CP, MsbFirst, [Value] n = Dig tmp02, 1 GoSub Convert SHOut DS, SH_CP, MsbFirst, [Value] PulsOut ST_CP, 10 DelayMS 1000 Next Return ' ' IND2: For ckl = 0 To 5 n = Dig tmp01, 0 GoSub Convert SHOut DS, SH_CP, MsbFirst, [Value] n = Dig tmp01, 1 GoSub Convert SHOut DS, SH_CP, MsbFirst, [Value] SHOut DS, SH_CP, MsbFirst, [$C0] SHOut DS, SH_CP, MsbFirst, [$A4] PulsOut ST_CP, 10 DelayMS 1000 Next Return ' --------------------------------------Подготовка DS18S20 к измерениям------------------------------------- TERMO_ConvertD: ' Метка начала подпрограммы измерения температуры OWrite Dd, 1, [$CC,$44] ' Послать датчику DS18S20 команду старта измерения ' температуры Repeat ' Начать внутренний цикл DelayMS 25 ' Ждать окончания преобразования пока не придет бит, ORead Dd, 4, [C] ' сигнализирующий об окончании преобразования Until C > 0 ' Выйти из цикла если от DS18S20 поступил бит конца ' преобразования. OWrite Dd, 1, [$CC,$BE] ' Послать команду чтения из ОЗУ датчика DS18S20 ' значения температуры ORead Dd, 2, [R_Temp.LowByte, R_Temp.HighByte] ' Прочитать значение температуры и записать ' полученные два байта данных в переменную R_Temp ' типа Word, младщий байт в R_Temp.LowByte и ' старший байт в R_Temp.HighByte Temp = R_Temp ' Поместить в переменную Temp содержимое ' переменной R_Temp TempIND = Temp / 16 ' Разделить значение переменной Temp на 16 и ' результат поместить в переменную TempIND If R_Temp > 64654 Then GoSub term_MD If R_Temp > 64654 Then TempIND = Temp / 16 - 4095.93 temperatura = TempIND GoSub term_pD Return TERMO_ConvertY: ' Метка начала подпрограммы измерения температуры OWrite Dy, 1, [$CC,$44] ' Послать датчику DS18S20 команду старта измерения ' температуры Repeat ' Начать внутренний цикл DelayMS 25 ' Ждать окончания преобразования пока не придет бит, ORead Dy, 4, [C] ' сигнализирующий об окончании преобразования Until C > 0 ' Выйти из цикла если от DS18S20 поступил бит конца ' преобразования. OWrite Dy, 1, [$CC,$BE] ' Послать команду чтения из ОЗУ датчика DS18S20 ' значения температуры ORead Dy, 2, [R_Temp.LowByte, R_Temp.HighByte] ' Прочитать значение температуры и записать ' полученные два байта данных в переменную R_Temp ' типа Word, младщий байт в R_Temp.LowByte и ' старший байт в R_Temp.HighByte Temp = R_Temp ' Поместить в переменную Temp содержимое ' переменной R_Temp TempIND = Temp / 16 ' Разделить значение переменной Temp на 16 и ' результат поместить в переменную TempIND If R_Temp > 64654 Then GoSub term_MY If R_Temp > 64654 Then Return temperatura = TempIND GoSub term_pY Return term_pD: For ckl = 0 To 3 n = Dig temperatura, 0 GoSub Convert SHOut DS, SH_CP, MsbFirst, [Value] n = Dig temperatura, 1 GoSub Convert SHOut DS, SH_CP, MsbFirst, [Value] SHOut DS, SH_CP, MsbFirst, [$FF] SHOut DS, SH_CP, MsbFirst, [$88] PulsOut ST_CP, 10 DelayMS 1000 Next Return term_MD: For ckl = 0 To 3 temperatura1 = Temp / 16 - 4095.93 n = Dig temperatura1, 0 GoSub Convert SHOut DS, SH_CP, MsbFirst, [Value] n = Dig temperatura1, 1 GoSub Convert SHOut DS, SH_CP, MsbFirst, [Value] SHOut DS, SH_CP, MsbFirst, [%10111111] SHOut DS, SH_CP, MsbFirst, [$88] PulsOut ST_CP, 10 DelayMS 1000 Next Return term_pY: For ckl = 0 To 3 n = Dig temperatura, 0 GoSub Convert SHOut DS, SH_CP, MsbFirst, [Value] n = Dig temperatura, 1 GoSub Convert SHOut DS, SH_CP, MsbFirst, [Value] SHOut DS, SH_CP, MsbFirst, [$FF] SHOut DS, SH_CP, MsbFirst, [$91] PulsOut ST_CP, 10 DelayMS 1000 Next Return term_MY: For ckl = 0 To 3 temperatura1 = Temp / 16 - 4095.93 n = Dig temperatura1, 0 GoSub Convert SHOut DS, SH_CP, MsbFirst, [Value] n = Dig temperatura1, 1 GoSub Convert SHOut DS, SH_CP, MsbFirst, [Value] SHOut DS, SH_CP, MsbFirst, [%10111111] SHOut DS, SH_CP, MsbFirst, [$91] PulsOut ST_CP, 10 DelayMS 1000 Next Return '--Запись времени в DS1307--- write_time: tmp = MINU GoSub fix_bcd_out MINU = tmp tmp = CHAS GoSub fix_bcd_out CHAS = tmp tmp = DNI GoSub fix_bcd_out DNI = tmp tmp = MES GoSub fix_bcd_out MES = tmp tmp = GOD GoSub fix_bcd_out GOD = tmp SEC = 0 BusIn rtc_write, 0, [SEC,MINU,CHAS,SEC,DNI,MES,GOD] Return fix_bcd_out: tmp1 = tmp / $A tmp = tmp - (tmp1 * $A) tmp = tmp + (tmp1 << 4) Return