Часы-будильник со случайным временем срабатывания на базе ЭКВМ |
Главная / ЭКВМ / Программы для ЭКВМ / Прикладные задачи |
Если не считать биологических будильников, первые конструкции для подачи сигналов в определенный момент времени были сделаны тысячи лет назад на основе свечей и водяных часов. Первый механический будильник был изобретен в 1787 году. Он отличался тем, что звонил в строго определенное время - в четыре часа утра. Будильник, который можно настраивать на нужное время пробуждения запатентовал в 1847 году француз Антуан Радье. Сейчас производятся будильники "сонных фаз", которые отслеживают движения спящего человека и будят его в момент, который соответствует переходам между фазами сна и наиболее благоприятен для пробуждения. Но исследования в этой области продолжаются. Антинобелевская премия (Ig Nobel Prize) по экономике за 2005 г принадлежит Гаури Нанда из Массачусетского технологического института за изобретение будильника, который убегает и прячется от выключения, заставляя людей просыпаться, что, по задумке изобретателя, должно помочь хотя бы частично устранить проблему опоздания на работу, увеличив фактическую продолжительность рабочего времени. На базе ЭКВМ несложно реализовать будильник, который будет звонить в указанном промежутке времени, при этом точное время срабатывания заранее не будет известно. Это может несколько смягчить ожидание неизбежного утреннего звонка.
Как известно из теории вероятностей, в момент Tm плотность вероятности пробуждения будет максимальна - около 0,39894. Среднее абсолютное отклонение составляет 0,798σ, вероятное отклонение 0,674σ. Из последнего значения следует, что в половине случаев будильник подаст сигнал в границах ±0,674σ Границы 95% вероятности срабатывания составляют приблизительно ±1,96σ, 99% - ±2,58σ и 99,9% - ±3,29σ. Вероятность пробуждения в пределах, кратных стандартному отклонению составит для ±1σ - 68,268%; для ±2σ - 95,45% и ±3σ - 99,73%. То есть вероятность того, что устройство не подаст сигнал в пределах 3σ от Tm составляет всего 0,27%. Для будильника это будет происходить примерно раз в год при ежедневном использовании. Вероятность того, что будильник не зазвонит в пределах ±5σ будет примерно один раз в 50 лет. Для любого конечного значения U будет существовать ненулевая вероятность того, что будильник не подаст сигнал. Хотя вряд ли это может быть хорошим оправданием в случае опоздания на службу или место учебы. Значения интеграла вероятности для других пределов приведены в таблице.
Далее приведена программа для ЭКВМ "Электроника МК", реализующая алгоритм часов с будильником. Длина программы - 626 байт. В связи с изменением механизма определения вектора прерываний с версии 1.09 ПО МК-152 - размещена новая версия программы. Файлы программы версии 2.3 с исходным текстом и для записи в память ЭКВМ: Программа загружается с нулевой страницы. Перед запуском следует записать в регистр R0 установленное время срабатывания будильника (мат. ожидание Tm) в формате "ЧЧ.ММ", в регистр R1 - стандартное отклонение σ в минутах. Для запуска программы нажать "В/О", "С/П"; для останова - "С/П". Вследствие того, что дискретность задания отклонения и времени срабатывания составляет одну минуту, распределение вероятности несколько отличается от теоретического, но для практики это несущественно. Для включения или отключения будильника во время работы программы нажать любую клавишу (кроме "С/П"). При включенном будильнике на экран внизу слева будет выведен знак колокольчика. После каждого срабатывания, переключения или повторного запуска программы время реального срабатывания будильника переустанавливается. В таблице приведена программа на языке МК.
Контрольная сумма ADD 68815, XOR 21, при условии, что остальные байты последней страницы содержат 0FFh. Исходный текст программы для компилятора с комментариями. ; Часы-будильник со случайным временем срабатывания ; Нормальное распределение ; Версия 2.3 от 22.12.08 ; * - установить перед запуском программы ; * R0 - установленное время срабатывания будильника (мат. ожидание) "ЧЧ.ММ" ; * R1 - сигма, в минутах ; R3 = 100 (константа) ; R4 - признак изменений для перерисовки экрана >=1 -есть 0-нет ; R6 - рассчитанное время срабатывания будильника ; R7 = 9000 (константа) для использования "КП7" вместо "РР П 9000" ; R8,R9 - временное хранение ; RA - последнее значение часов ; RB - последнее значение минут ; RC - последнее значение секунд ; RD - последнее значение даты ; RE - текущее значение часов ; R 20 - будильник 1-включен, 0- выключен (используется в прерывании) ; R 21 - временное хранение года при выводе ; Версия ПО МК-152 - 1.09 и выше ; Версия компилятора - 1.08 и выше .CHARSET 1251 .ORG 0 CX 1 P M 20 ; Включить будильник PP M 9148 ; Сброс регистров функций прерывания (ПО МК-152 v1.08) PP M 9130 ; Общее разрешение прерываний 9 EE 3 M 7 ; R7=9000 .NUM KLAVA ; Вектор прерывания - полный адрес (ПО МК-152 v1.09) ENT 2 PP M 9132 ; Прерывание 2 - вектор KLAVA, приоритет 2 PP M 9153 ; Прерывание клавиатуры PP M 9010 ; Очистка экрана F 10^X M 3 ; R3=100 MA ; Значения часов, минут и секунд - для перерисовки MB MC P GSB VREMJA P GSB RIS_D P GSB RIS_B A0: CX M 4 A00: PP RM 9055 ; Время M E K INT M 9 RM A - F X!=0 A1 RM 9 M A K RM 4 ; инкремент R4 - признак перерисовки P GSB RIS_H A1: RM E K FRAC RM3 ;100 * M 8 K INT M 9 RM B - F X!=0 A2 RM 9 M B K RM 4 ; инкремент R4 - признак перерисовки P GSB RIS_M A2: RM 8 K FRAC RM3 ;100 * K INT M 9 RM C - F X!=0 A3 RM 9 M C K RM 4 ; инкремент R4 - признак перерисовки P GSB RIS_S A3: RM 4 P X!=0 A00 K GRPH P GOTO A0 ; Отрисовка часов RIS_H: 20 ENT 30 K M 7 ;PP M 9000 - Начальные координаты 2 PP M 9003 ; Номер шрифта RM A P GSB RIS 20 ENT 56 K M 7 ;PP M 9000 - Начальные координаты 58 PP M 9020 ; двоеточие RM A F X=0 RISH1 GOTO RIS_D RISH1: RTN ; Отрисовка минут RIS_M: 20 ENT 64 K M 7 ;PP M 9000 - Начальные координаты 2 PP M 9003 ; Номер шрифта RM B P GSB RIS P GOTO BUDIL ; Отрисовка секунд RIS_S: 27 ENT 92 K M 7 ;PP M 9000 - Начальные координаты 1 PP M 9003 ; Номер шрифта RM C P GOTO RIS ; Отрисовка даты и дня недели RIS_D: 0 ENT K M 7 ;PP M 9000 - Начальные координаты PP M 9003 PP RM 9056 ; число P GSB RIS 46 PP M 9020 ; точка PP RM 9057 ; месяц P GSB RIS 46 PP M 9020 ; точка PP RM 9058 ; год - полное значение (ПО МК-152 v1.09) RM3 ; 100 / P M 21 K INT ; век P GSB RIS P RM 21 K FRAC RM3 ; 100 * ; год - две цифры P GSB RIS 0 ENT 70 K M 7 ;PP M 9000 - начальные координаты PP RM 9059 ; день недели ; Выбор текста из таблицы 2 * .NUM DAYX + ENT K PRGM RM3 ; 100 * <-> 1 + K PRGM + ; в RX - начало текста дня недели PP M 9021 10 ENT 0 K M 7 ;PP M 9000 - Начальные координаты 10 ENT 127 PP M 9012 ; Вывод линии RTN ; Отрисовка строки будильника RIS_B: 52 ENT 0 K M 7 ;PP M 9000 - Начальные координаты <-> ;52 ENT 127 PP M 9012 ; линия P RM 20 F X=0 RISB1 ; будильник выключен 54 ENT 0 K M 7 ;PP M 9000 - Начальные координаты 4 PP M 9001 ; Атрибуты вывода 4 - инверсия и замена 8 ENT 128 PP M 9013 ; Вывод прямоугольника 0 PP M 9001 ; Атрибуты вывода 0 RTN RISB1: ; будильник включен 55 ENT 0 K M 7 ;PP M 9000 - Начальные координаты .NUM KOLOK PP M 9015 ; Вывод колокольчика 54 ENT 10 K M 7 ;PP M 9000 - Начальные координаты 0 PP M 9003 ; Номер шрифта RM 0 K INT GSB RIS 58 PP M 9020 ; Вывод двоеточия RM 0 K FRAC RM3 ;100 * GSB RIS 55 ENT 70 K M 7 ;PP M 9000 - Начальные координаты .NUM SIGMA PP M 9015 ; сигма 54 ENT 78 K M 7 ;PP M 9000 - Начальные координаты .NUM RAVNO PP M 9021 ; Вывод знака равенства RM 1 PP M 9023 ; Вывод значения сигмы .NUM MINUT PP M 9021 ; Вывод размерности RTN ; Подпрограмма вывода двузначного числа из RX RIS: 10 / M 8 K FRAC 10 * 48 + M 9 RM 8 K INT 48 + PP M 9020 ; Вывод символа RM 9 PP M 9020 ; Вывод символа RTN ; Проверка будильника BUDIL: P RM 20 P X!=0 BUDIL1 ; будильник включен RM 6 RM3 ;100 * K INT RM A RM 3 ;100 * RM B + - F X!=0 BUDIL2 CX PP M 9150 ; Запретить прерывания таймера 0 BUDIL1: RTN BUDIL2: .NUM TIMER0 ; Вектор прерывания - номер страницы ENT 1 PP M 9131 ; Прерывание 1 - вектор TIMER0 приоритет 1 PP M 9150 ; Таймер 0 на прерывании 1 PP M 9149 ; Вызвать прерывание 1 ; Установить реальное время срабатывания будильника VREMJA: 1 PP M 9045 ; Размерность - радианы VREMJA1: K RAN F X!=0 VREMJA1 ; Исключить деление на 0 F 1/X F LN 2 * F SQRT K RAN 2 * F PI * F COS * RM 1 60 / * M 8 K ABS 24 - F X>=0 VREMJA2 ; Отклонение не более суток CX M 8 VREMJA2: RM 8 RM 0 K M->D + F X<=0 VREMJA3 24 + VREMJA3: M 9 24 - F X<=0 VREMJA4 RM 9 VREMJA4: K D->M RM 3 ;100 * 0,5 + K INT RM 3 ;100 / M 6 RTN ; Строки KOLOK: .DB 5, 8, 32, 62, 127, 62, 32 ; Символ колокольчика SIGMA: .DB 5, 8, 28, 34, 34, 26, 1 ; Сигма RAVNO: .TEXT "= \0" MINUT: .TEXT " мин.\0" ; Прерывание таймера TIMER0: 50 PP M 9050 ; Переустановить таймер 0 2000 ENT 25 PP M 9052 ; Звук PP RTN ; Строки DAY1: .TEXT "Понедельник\0" DAY2: .TEXT "Вторник\0" DAY3: .TEXT "Среда\0" DAY4: .TEXT "Четверг\0" DAY5: .TEXT "Пятница\0" DAY6: .TEXT "Суббота\0" DAY7: .TEXT "Воскресенье\0" DAYX: .DA 0, DAY1, DAY2, DAY3, DAY4, DAY5, DAY6, DAY7 ; Таблица адресов ; Прерывание клавиатуры KLAVA: P RM 20 F X=0 KLAVA1 1 P M 20 GOTO KLAVA2 KLAVA1: CX P M 20 PP M 9150 ; Запретить таймер 0 (выключить будильник) KLAVA2: P GSB RIS_B K GRPH PP RTN .END |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
НПП "СЕМИКО" (383) 271-01-25 (многоканальный) |