Если хотите, посмотрите исходник на Basic:
Код:
$regfile = "m128def.dat"
$crystal = 14745600
$framesize = 240
$hwstack = 240
$swstack = 240
$lib "ds1307clock.lib"
' бит чтения
'============ Конфигурация часов
Config Sda = Portd.1
Config Scl = Portd.0
I2cinit
'* * * заводим константы на биты чтения и записи ds1307
Const Ds1307w = &HD0 ' бит записи
Const Ds1307r = &HD1
'Рассчёт на переменные Word или Singl (проверьте в разделе переменных "Токовые величины")
Const Toksng = 29
Const V24sng = 42
Const V12sng = 85
'===================== Константы для переменных в калибровке тока каждого канала спектра
Const Tokd1 = 700 '430 '
Const Tokd2 = 700 '460
Const Tokd3 = 700 '640
Const Tokd4 = 700 '660
Const Tokd5 = 700
'Ограничительные константы
Const Minfan = 50
Const Maxfan = 255
Const Ps = 1
Config Single = Scientific , Digits = 1 'Ограничение плавающей запятой до одного знака после запятой.
'=========== Конфигурация PLC выходов
Nagrev Alias Portc.3 'Нагревательный элемент (рассчитано на твердотельное реле)
Klapanco2 Alias Portc.1 'Клапан CO2 (0,5А - выход с ULN2003)
Produv Alias Portc.4 'Включение циркуляции воздуха
'Переменная FAN для 8 битного значения ШИМ вентилятора для экономии энергии.
'=========== Конфигурация ШИМ
Config Timer1 = Pwm , Pwm = 8 , Compare C Pwm = Clear Up , Compare B Pwm = Clear Up , Compare A Pwm = Clear Up , Prescale = 1
Config Portb.7 = Output : Led1 Alias Pwm1c '===== 430нм
Config Portb.6 = Output : Led2 Alias Pwm1b '===== 460нм
Config Portb.5 = Output : Led3 Alias Pwm1a '===== 640нм
Config Porte.4 = Output : Led4 Alias Pwm3b '===== 660нм
Pwm1c = 0 '430
Pwm1b = 0 '460
Pwm1a = 0 '640
Pwm3b = 0 '660
Pwm3a = 0 'Свет
'===== Освещение
Config Timer3 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Compare C Pwm = Clear Up , Prescale = 1
Config Porte.3 = Output : Led5 Alias Pwm3a '===== Белый свет
Config Porte.5 = Output 'OC3C вентилятор ШИМ
Fan Alias Pwm3c
'=========================== UART
Config Porte.0 = Input
Config Porte.1 = Output
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 7 , Clockpol = 0
Config Com2 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 7 , Clockpol = 0
'Txrs Alias Porte.2
Config Porte.2 = Output
Config Print0 = Porte.2 , Mode = Set
Open "COM1:" For Binary As -->-->-->-->-->-->-->
Open "COM2:" For Binary As #2
Print "OK"
'=========================== Кинематика ================
Errcnc Alias Pinf.3
Config Portf.3 = Input
Oncnc Alias Portf.4
Config Portf.4 = Output
'=========================== Мотор X
Dirx Alias Porta.0
Config Dirx = Output
Stpx Alias Porta.1
Config Dirx = Output
'=========================== Мотор Y
Diry Alias Porta.2
Config Diry = Output
Stpy Alias Porta.3
Config Diry = Output
'=========================== Конечники
Knxp Alias Pinc.0
Knxm Alias Ping.1
Knyp Alias Ping.0
Knym Alias Pind.6
'=========================== Конфигурация АЦП
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Portf.6 = Input ' (ADC6)вход замера 12в.
Config Portf.2 = Input ' (ADC2)замер 24в.
Config Portf.1 = Input ' (ADC1)влажность почвы
Config Portf.0 = Input ' (ADC0)датчик тока
'=========================== Прерывания
Config Porte.7 = Input 'INT7
'On Int7 Vodatrig
'Enable Int7
'Переменные АЦП
Dim Tacp As Word 'Получение токового значения
Dim Tok As Word 'Рассчёт токового значения
Dim Vacp24 As Word 'Замер напряжения 24 вольта
Dim V24 As Single 'Рассчёт 24 вольта
Dim Vacp12 As Word 'Замер напряжения 24 вольта
Dim V12 As Single 'Рассчёт 24 вольта
Const 24sng = 0.00096
Start Adc
Dim Tm As Byte 'программный таймер
Dim Tm2 As Byte 'Программный таймер 2
Dim P As Byte ' Для цикла FOR первого уровня
Dim O As Byte ' Для цикла FOR второго уровня
'============ Токовые величины
Dim Tok1 As Word
Dim Tok2 As Word
Dim Tok3 As Word
Dim Tok4 As Word
Dim Tok5 As Word
Dim Tokpokoya As Byte 'Ток покоя
Dim Takt As Byte
Dim Chas As Byte
Dim Minuta As Byte
Dim Vrb As Byte
Dim Seco As Byte
'======================= Првоеряем часы. Если секунды больше 60ти, значит слетела память, запускаем часы
Gosub Vrema:
If Seco > 60 Then 'Запуск часов если они сброшены!!!!!
Seco = 0
Seco = Makebcd(seco)
I2cstart
I2cwbyte &HD0
I2cwbyte 0
I2cwbyte Seco
I2cstop
End If
'(=============== Проверка часов
Do
Gosub Vrema:
Print -->-->-->-->-->-->--> , Chas ; ":" ; Minuta ; " " ; Seco
Wait 1
Loop
')
'==============================================================================================================================
Goto Prog:
'============================================ GOСУБ ПРОГРАММЫ
Vrema:
Return
'print "ST"
I2cstart
I2cwbyte Ds1307w
I2cwbyte &H00
I2cstart
I2cwbyte Ds1307r
Print "OPROS"
I2crbyte Seco , Ack ' (переменная В Которую Запишем Секунды)
I2crbyte Minuta , Ack ' (переменная В Которую Запишем Минуты)
Print "OKEY"
I2crbyte Chas , Ack ' (переменная в которую запишем часы)
I2crbyte Vrb , Ack ' (переменная в которую запишем номер дня недели)
I2crbyte Vrb , Ack ' (переменная в которую запишем дату)
I2crbyte Vrb , Ack ' (переменная В Которую Запишем Номер Месяца)
I2crbyte Vrb , Nack ' (переменная В Которую Запишем Год)
I2cstop
Minuta = Makedec(minuta)
Chas = Makedec(chas)
Seco = Makedec(seco)
Return
Acp:
Disable Interrupts
Tacp = Getadc(0)
Waitus 80
Vacp24 = Getadc(2)
Waitus 80
Vacp12 = Getadc(6)
Enable Interrupts
If Tacp > 512 Then
Tacp = 0
Else
Tacp = 512 - Tacp
End If
Tok = Tacp * Toksng
V24 = Vacp24 / V24sng
V12 = Vacp12 / V12sng
Return
'============ Калибровка тока
Tokcalibr:
'======================== Подготовка к запуску цикла
'Gosub Plcoff
Led1 = 0
Led2 = 0
Led3 = 0
Led4 = 0
Led5 = 0
Do
Waitms 100
Gosub Acp:
Print -->-->-->-->-->-->--> , "24v=" ; V24 ; " 12v=" ; V12 ; " a=" ; Tok
Loop Until V24 > 22
For P = 1 To 255
For O = 1 To 3
Waitms 1
Gosub Acp:
If Tok > Tokd1 Then
Decr Led1
Elseif Tok < Tokd1 Then
Incr Led1
If Tok = 0 And Led1 > 200 Then Led1 = 0
End If
Next O
Print -->-->-->-->-->-->--> , Tok ; "ma L1:" ; Led1
Next P
If Tok = 0 And Led1 > 100 Then Led1 = 10
Tok1 = Led1
Led1 = 0
For P = 1 To 255
For O = 1 To 3
Waitms 1
Gosub Acp:
If Tok > Tokd2 Then
Decr Led2
Elseif Tok < Tokd2 Then
Incr Led2
If Tok = 0 And Led2 > 200 Then Led2 = 0
End If
Next O
Print -->-->-->-->-->-->--> , Tok ; "ma L2:" ; Led2
Next P
If Tok = 0 And Led2 > 100 Then Led2 = 10
Tok2 = Led2
Led2 = 0
For P = 1 To 255
For O = 1 To 3
Waitms 1
Gosub Acp:
If Tok > Tokd3 Then
Decr Led3
Elseif Tok < Tokd3 Then
Incr Led3
If Tok = 0 And Led3 > 200 Then Led3 = 0
End If
Next O
Print -->-->-->-->-->-->--> , Tok ; "ma L3:" ; Led3
Next P
If Tok = 0 And Led3 > 100 Then Led3 = 10
Tok3 = Led3
Led3 = 0
For P = 1 To 255
For O = 1 To 3
Waitms 1
Gosub Acp:
If Tok > Tokd4 Then
Decr Led4
Elseif Tok < Tokd4 Then
Incr Led4
If Tok = 0 And Led4 > 200 Then Led4 = 0
End If
Next O
Print -->-->-->-->-->-->--> , Tok ; "ma L4:" ; Led4
Next P
If Tok = 0 And Led4 > 100 Then Led4 = 10
Tok4 = Led4
Led4 = 0
For P = 1 To 255
For O = 1 To 3
Waitms 1
Gosub Acp:
If Tok > Tokd4 Then
Decr Led5
Elseif Tok < Tokd4 Then
Incr Led5
If Tok = 0 And Led5 > 200 Then Led5 = 0
End If
Next O
Print -->-->-->-->-->-->--> , Tok ; "ma L4:" ; Led5
Next P
If Tok = 0 And Led5 > 100 Then Led5 = 10
Tok5 = Led5
Led5 = 0
Return
'=========================================================================== ОСНОВНАЯ ПРОГРАММА ==================
Prog:
Fan = Minfan
Gosub Tokcalibr
'Wait 1
'Led1 = Tok1
'Led2 = Tok2
'Led3 = Tok3
'Led4 = Tok4
'Led5 = Tok5
Led1 = 0
Led2 = 0
Led3 = 0
Led4 = 0
Led5 = 0
Do
Led1 = Tok1
Led2 = 0
Led3 = 0
Led4 = 0
Led5 = 0
Wait 30
Led1 = 0
Led2 = Tok2
Led3 = 0
Led4 = 0
Led5 = 0
Wait 30
Led1 = Tok1
Led2 = Tok2
Led3 = Tok3
Led4 = Tok4
Led5 = Tok5
Wait 5
Gosub Tokcalibr:
Loop
Do
Led1 = Tok1
Led2 = Tok2
Led3 = Tok3
Led4 = Tok4
Led5 = Tok5
Wait 30
Led1 = Tok1
Led2 = 0
Led3 = Tok3
Led4 = 0
Led5 = 0
Wait 10
Led1 = 0
Led2 = Tok2
Led3 = 0
Led4 = Tok4
Led5 = 0
Wait 10
Led1 = 0
Led2 = Tok2
Led3 = 0
Led4 = 0
Led5 = 0
Wait 10
Led1 = Tok1
Led2 = 0
Led3 = 0
Led4 = 0
Led5 = 0
Wait 30
Print -->-->-->-->-->-->--> , "24v=" ; V24 ; " 12v=" ; V12 ; " a=" ; Tok ; " L1:" ; Led1 ; " L2:" ; Led2 ; " L3:" ; Led3 ; " L4:" ; Led4 ; " L5:" ; Led5
Loop
End
'============================================================================================================
'============================================================================================================
'============================================================================================================
'Подсчёт расхода воды
Vodatrig:
Return
Dim Brs As Byte 'Бай приёма RS485
Dim Rxtm As Byte 'Счётчик принятых по RS485 байтов
Dim Rx(10) As Byte
Dim Id As Byte
'============================= Приём данных
Rs485:
Brs = Inkey()
Incr Rxtm
Rx(rxtm) = Brs
If Rxtm = 1 And Brs <> Id Then Rxtm = 0
Return
'(
Dataerror:
Data "Ошибка 01. Нет покоя тока, неизвестная нагрузка."
Data "Ошибка 02. Много шума при замере тока."
Data "Ошибка 31. Нет нагрузки, неисправность узла стабилизации тока"
')