Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.
Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.
Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.
Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.
Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.
Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.
Санкт-Петербургский государственный университет
информационных технологий, механики и оптики
Отчет по домашнему заданию
«Микропроцессорные системы»
«Освещение дома»
Вариант №4
Выполнили студенты группы 4103
А.
Проверил:
доцент
Санкт-Петербург
2008
С помощью LOGO! Должно автоматически включаться внешнее освещение дома. При этом различается два вида освещения: основное и вспомогательное. Основное освещение подсвечивает весь дом, а дополнительное – локальные участки.
Основное освещение дома (Q1) должно включаться с понедельника по воскресенье с 6:00 до 24:00 при срабатывании сумеречного реле (A1). Дополнительное освещение (Q2) должно включаться с 6:00 до 8:00 на 90 секунд при срабатывании датчика движения(L2) и сумеречного реле (A1). Кроме того основное и вспомогательное освещение может включаться в ручном режиме (L4).
· L1 сумеречное реле (аналоговый датчик А1)
· L2 сигнализатор перемещений
· L4 ручное включение освещения
· Q1 основное освещение
· Q2 вспомогательное освещение
//
// $Id$
//
#include <ADuC812.h>
#define true 1
#define false 0
typedef unsigned char byte;
typedef unsigned short word;
typedef unsigned long dword;
typedef char bool;
/// Доступные переключатели
typedef enum
{
asI1,
asI2,
// asMax
} AvailableSwitch;
/// Выходные данные
typedef enum
{
aoQ1,
aoQ2,
aqMax
} AvailableOutput;
/// День недели.
typedef enum
{
dwMonday,
dwTuesday,
dwWednesday,
dwThursday,
dwFriday,
dwSaturday,
dwSunday
} DayOfWeek;
/// Аналоговые датчики.
enum AnalogSensor
{
aseA1 = 0,
aseA2 = 1,
aseMax
};
/// Сколько прошло времени в миллисекундах.
dword data ElapsedTime = 10 * 3600L * 1000L + 0 * 60L * 1000L + 0 * 1000L;
static char Hour = 0, Minute = 0, Second = 0;
static DayOfWeek Day = dwMonday;
static char Timer1Hour = 0, Timer1Minute = 0, Timer1Second = 0;
static char Timer2Hour = 0, Timer2Minute = 0, Timer2Second = 0;
static bool Timer1Enable = false, Timer2Enable = false;
static bool AnalogSensorState[aseMax];
static word AnalogSensorValue[aseMax];
static word AnalogSensorUpperValue[aseMax];
static word AnalogSensorLowerValue[aseMax];
sbit inputI1 = P0 ^ 0;
sbit inputI2 = P0 ^ 1;
sbit inputI4 = P0 ^ 3;
sbit outputQ1 = P3 ^ 0;
sbit outputQ2 = P3 ^ 1;
bool lastI3Value = false, lastI4Value = false;
void SetTimer1()
{
Timer1Hour = Hour;
Timer1Minute = Minute;
Timer1Second = Second;
Timer1Enable = true;
}
void SetTimer2()
{
Timer2Hour = Hour;
Timer2Minute = Minute;
Timer2Second = Second;
Timer2Enable = true;
}
bool CheckTimer1Interval( char hourToCheck, char minuteToCheck, char secondToCheck )
{
char hour = Hour + ( Hour < Timer1Hour ? 24 : 0 ) - Timer1Hour;
char minute = Minute - Timer1Minute;
char second = Second - Timer1Second;
if( second < 0 )
{
second += 60;
minute--;
}
if( minute < 0 )
{
minute += 60;
hour--;
}
if( hour < hourToCheck ) return true;
if( hour > hourToCheck ) return false;
if( minute < minuteToCheck ) return true;
if( minute > minuteToCheck ) return false;
if( second < secondToCheck ) return true;
return false;
}
bool CheckTimer2Interval( char hourToCheck, char minuteToCheck, char secondToCheck )
{
char hour = Hour + ( Hour < Timer2Hour ? 24 : 0 ) - Timer2Hour;
char minute = Minute - Timer2Minute;
char second = Second - Timer2Second;
if( second < 0 )
{
second += 60;
minute--;
}
if( minute < 0 )
{
minute += 60;
hour--;
}
if( hour < hourToCheck ) return true;
if( hour > hourToCheck ) return false;
if( minute < minuteToCheck ) return true;
if( minute > minuteToCheck ) return false;
if( second < secondToCheck ) return true;
return false;
}
void InvalidateParameters()
{
// Основное освещение Q1 - с 6.00 до 24.00
outputQ1 = !AnalogSensorState[aseA1] & Hour >= 6;
// Дополнительное освещение Q2 - с 6.00 до 8.00
outputQ2 = !AnalogSensorState[aseA1] & inputI4 & Hour >= 6 && Hour < 8;
if( Timer2Enable )
Timer2Enable = ( outputQ2 |= CheckTimer2Interval( 0, 1, 0 ) );
//Ручное включение основного и вспомогательного освещения Q1 и Q2
outputQ1 &= inputI2;
outputQ2 &= inputI2;
}
void SetTime( DayOfWeek day, char hour, char minute, char second )
{
Day = day;
Hour = hour;
Minute = minute;
Second = second;
InvalidateParameters();
}
void InitAPI()
{
char i;
for( i = 0; i < aseMax; i++ )
{
AnalogSensorValue[i] = 0;
AnalogSensorState[i] = false;
AnalogSensorLowerValue[i] = 0;
AnalogSensorUpperValue[i] = 0;
}
}
void SetAnalogSensorThreshold( enum AnalogSensor sensor, word lowerValue, word upperValue )
{
AnalogSensorLowerValue[sensor] = lowerValue;
AnalogSensorUpperValue[sensor] = upperValue;
InvalidateParameters();
}
char GetAnalogSensorState( enum AnalogSensor sensor )
{
while( ADCCON3 & 0x80 );
ADCCON2 = 0x10 | ( sensor & 0x7 );
while( ADCCON3 & 0x80 );
AnalogSensorValue[sensor] = ( ( word ) ( ADCDATAH & 0xF ) << 8 ) | ADCDATAL;
if( AnalogSensorState[sensor] )
{
if( AnalogSensorValue[sensor] < AnalogSensorLowerValue[sensor] )
AnalogSensorState[sensor] = false;
}
else
{
if( AnalogSensorValue[sensor] > AnalogSensorUpperValue[sensor]
Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.
Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.
Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.
Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.
Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.
Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.