Один из самых известных методов программной реализации нормально распределенной случайной величины основан на центральной теореме: распределение суммы независимых случайных величин приближается к нормальному при неограниченном увеличении n, если выполняются следующие условия:
1) все эти величины имеют конечные математические ожидания и дисперсии;
2) ни одна из величин по своему значению резко не отличается от всех остальных.
Согласно этой теореме можно сконструировать алгоритм реализации случайной величины Х на основе аппроксимации распределения N(0,1) суммой независимых случайных величин R1,R2,…,Rn, равномерно распределенной на интервале [0,1). Так как каждая из них имеет математическое ожидание M(Ri)=1/2 и дисперсию D(Ri)=1/12, i=1,2,…,n, то
Согласно центральной предельной теореме распределение случайной величины
при достаточно больших n приближается к N(0,1). Практика показывает , что при n=12 аппроксимация уже удовлетворительна. Тогда формула принимает вид :
АлгоритмОписание форматов SFR
1. Регистр режима таймера/счётчика TMOD:
М1 | М0 |
Биты М1 и М0 определяют режим работы таймера/счётчика:
М1 | М0 | |
0 | 0 | Режим 0 |
0 | 1 | Режим 1 |
1 | 0 | Режим 2 |
1 | 1 | Режим 3 |
В режиме 0 TL0 работает как 5-битный предделитель частоты.
Режим 1 – 16-битный таймер-счётчик. TH0 и TL0 включены последовательно.
Режим 2 – 8-битный автоперезагружаемый таймер/счётчик. TH0 хранит значение, которое должно быть перезагружено в TL0 каждый раз по переполнению.
Режим 3 – таймер/счётчик 1 останавливается. Таймер/счётчик: TL0 работает как 8-битный таймер/счётчик, и его режим определяется управляющими битами таймера 0. TH0 работает только как 8-битный таймер, и его режим определяется управляющими битами таймера 1 .
Установим таймер/счётчик 0 в режим 1: загружаем в регистр TMOD #01H.
2. Регистр масок прерывания IE.
EA | ET0 |
EA (IE.7) – снятие блокировки прерываний. Сбрасывается программно для запрета всех прерываний независимо от состояний IE4 – IE0.
ET0 – бит разрешения прерывания от таймера 1. Установка/сброс программой для разрешения/запрета прерываний.
(IE)=82h.
3. Регистр управления/статуса таймера TCON.
TR0 |
TR0 – бит управления таймера 0. Устанавливается/сбрасывается программой для пуска/остановки таймера/счётчика.
(TCON)=10H.
4. Таймер/счётчик 0: регистр TL0 – младший байт,
регистр TH0 – старший байт.
Коды, загружаемые в эти регистры, выбираются исходя из частоты дискретизации. Частота дискретизации hд в данной работе принимается равной 100 Гц. Следовательно, прерывания будут происходить через каждые 10 мс.
1000010=271016.
10000h-2710h=0D8F0h.
Кроме того, необходимо учесть количество импульсов, которое поступит на вход счётчика к моменту записи в него младшего байта (допустим это составит 12мкс) и время, потраченное на переход от запроса прерывания к его обработке, например, 9мкс:
0D8F0H+2110=0D905h.
(TL0)=05h, (TH0)=0D9h.
Программа генерации числовой последовательности
с нормальным распределением
CSEG AT 00 ;
LJMP INIT ;
ORG 0BH ;
LJMP START ;
DSEG AT 02H ;
X_Y: DS 2 ;
X_A: DS 2 ;
X_M: DS 2 ;
X_SUM: DS 8 ;
X_SCHET: DS 1 ;
X_Z: DS 2 ;
X_SCHETCHIK: DS 1 ;
X_RES: DS 15 ;
MY_PROG SEGMENT CODE ;
RSEG MY_PROG ;
ORG 30H ;
INIT: MOV THO,#0D9H;
MOV TL0,#05H ;
MOV TMOD,#01H ;
MOV IE, #82H ;
SETB TR0 ;
WAIT: SJMP WAIT ;
START: CLR EA ;
SETB RS0 ;
MOV R4, X_Y ;
MOV R5,X_Y+1 ;
CLR RS0 ;
SETB RS1 ;
MOV R0,#14H ;
MAIN: CLR RS1 ;
SETB RS0 ;
MOV A,X_Y ;
MOV B, X_A ;
MUL AB ;
MOV R0, A ;
MOV R1, B ;
MOV A,X_Y ;
MOV B,X_A+1 ;
MUL AB ;
MOV R2,B ;
ADD A,R1 ;
MOV R1,A ;
JNC NC1 ;
CLR C ;
INC R2 ;
NC1: MOV A,X_A ;
MOV B,X_Y+1 ;
MUL AB ;
ADD A,R1 ;
MOV R1,A ;
XCH A,B ;
JNC NC2 ;
CLR C ;
INC R2 ;
NC2: ADD A,R2 ;
MOV R2,A ;
JNC NC3 ;
CLR C ;
INC R3 ;
NC3: MOV A, X_Y+1 ;
MOV B,X_A+1 ;
MUL AB ;
ADD A,R2 ;
MOV R2,A ;
JNC NC4 ;
CLR C ;
INC R3 ;
NC4: MOV A, R3 ;
ADD A,B ;
MOV R3, A ;
CJNE R3,#00,NV1 ;
CJNE R2,#00, NV3 ;
LJMP NV5 ;
NV1: MOV A,R0 ;
CLR C ;
SUBB A,X_M ;
MOV RO,A ;
JNC NV2 ;
CLR C ;
DEC R1 ;
JNC NV2 ;
CLR C ;
DEC R2 ;
JNC NV2 ;
CLR C ;
DEC R3 ;
CJNE R3,#00,NV2 ;
MOV A, R1 ;
SUBB A,X_M+1 ;
MOV R1, A ;
LJMP NV3 ;
NV2: MOV A,R1 ;
SUBB A,X_M+1 ;
MOV R1, A ;
JNC NV1 ;
CLR C ;
DEC R2 ;
JNC NV1 ;
CLR C;
DEC R3 ;
CJNE R3,#00,NV1 ;
NV3: MOV A,R0 ;
SUBB A,X_M ;
MOV R0,A ;
JNC NV4 ;
CLR C ;
DEC R1 ;
JNC NV4 ;
CLR C ;
DEC R2 ;
CJNE R2,#00,NV4 ;
MOV A,R1 ;
SUBB A,X_M+1 ;
MOV R1,A ;
LJMP NV5 ;
NV4: MOV A,R1 ;
SUBB A, X_M+1 ;
MOV R1, A ;
JNC NV3 ;
CLR C ;
DEC R2 ;
CJNE R2,#00,NV3 ;
NV5: MOV A,R0 ;
SUBB A,X_M ;
MOV R0,A ;
JNC NV6 ;
CLR C ;
DEC R1 ;
NV6: MOV A,R1 ;
SUBB A,X_M+1 ;
MOV R1,A ;
JNC NV5 ;
MOV A,R0 ;
CLR C ;
ADD A,X_M ;
MOV R0, A ;
MOV X_Y,A ;
MOV A,R1 ;
ADDC A,X_M+1 ;
MOV R1,A ;
MOV X_Y+1,A ;
CLR C ;
MOV A,R0 ;
ADD A,R4 ;
MOV R4,A ;
JNC NEXT ;
CLR C ;
INC R5 ;
NEXT: MOV A,R1 ;
ADD A,R5 ;
MOV R5,A ;
JNC NV8 ;
CLR C ;
INC R6 ;
NV8: INC R7 ;
CJNE R7,#12,NV11 ;
MOV R7,#00 ;
SETB RS1 ;
CLR RS0 ;
MOV A,X_SUM+4 ;
CLR C ;
SUBB A,R1 ;
MOV @R0,A ;
INC R0 ;
JNC NV9 ;
CLR C ;
DEC X_SUM+5 ;
NV9: MOV A,X_SUM+5 ;
SUBB A,R2 ;
MOV @R0,A ;
INC R0 ;
JNC NV10 ;
CLR C ;
DEC X_SUM+6 ;
NV10: MOV @R0,X_SUM+6 ;
INC R0 ;
MOV X_SUM+4,#00 ;
MOV X_SUM+5,#00 ;
MOV X_SUM+6,#00 ;
INC R3 ;
CJNE R3,#05, NV11 ;
MOV R3, #00 ;
SETB EA ;
LJMP OUT ;
NV11: LJMP MAIN ;
OUT:
END ;
Отладка системы в целом
В курсовой работе для отладки системы я использовал программу ProView.
ProView фирмы Franklin Software Inc. – интегрированная среда разработки программного обеспечения для однокристальных микроконтроллеров семейства Intel 8051 и его клонов. Она включает в себя всё, что нужно для создания, редактирования, компиляции, трансляции, компоновки, загрузки и отладки программ:
·стандартный интерфейс Windows,
·полнофункциональный редактор исходных текстов с выделением синтаксических элементов цветом,
·организатор проекта,
·транслятор с языка C,
·ассемблер,
·отладчик,
·встроенную справочную систему.
Среда разработки подобна Visual C++ Microsoft и Borland C++ для Windows. Пользователи, знакомые с любым из этих изделий, будут чувствовать себя в ProView, как дома.
Первый этап разработки программы – запись её исходного текста на каком-либо языке программирования.
Затем производится компиляция или трансляция его в коды из системы команд микроконтроллера, используя транслятор или ассемблер. Трансляторы и ассемблеры – прикладные программы, которые интерпретируют текстовый файл, содержащий исходный текст программы, и создают объектные файлы, содержащие объектный код.
После компоновки объектных модулей наступает этап отладки программы, устранения ошибок, оптимизации и тестирования программы.
ProView объединяет все этапы разработки прикладной программы в единый рекурсивный процесс, когда в любой момент времени возможен быстрый возврат к любому предыдущему этапу.
ProView имеет следующие компоненты.
Язык C – универсальный язык программирования, который обеспечивает эффективность кода, элементы структурного программирования и имеет богатый набор операторов. Универсальность, отсутствие ограничений реализации делают язык C удобным и эффективным средством программирования для широкого разнообразия задач. Множество прикладных программ может быть написано легче и эффективнее на языке C, чем на других более специализированных языках.
C51 – полная реализация стандарта ANSI (Американского национального института стандартов), насколько это возможно для архитектуры Intel 8051. C51 генерирует код для всего семейства микроконтроллеров Intel 8051. Транслятор сочетает гибкость программирования на языке C с эффективностью кода и быстродействием ассемблера.
Использование языка высокого уровня C имеет следующие преимущества над программированием на ассемблере:
·глубокого знания системы команд процессора не требуется, элементарное знание архитектуры Intel 8051 желательно, но не необходимо;
·распределение регистров и способы адресации управляются полностью транслятором;
·лучшая читаемость программы, используются ключевые слова и функции, которые более свойственны человеческой мысли;
·время разработки программ и их отладки значительно короче в сравнении с программированием на ассемблере;
·библиотечные файлы содержат много стандартных подпрограмм, которые могут быть включены в прикладную программу;
·существующие программы могут многократно использоваться в новых программах, используя модульные методы программирования.
Ассемблер A51 совместим с ASM51 Intel для всего семейства микроконтроллеров Intel 8051. Ассемблер транслирует символическую мнемонику в перемещаемый объектный код, имеющий высокое быстродействие и малый размер. Макросредства ускоряют разработку и экономят время, поскольку общие последовательности могут быть разработаны только один раз. Ассемблер поддерживает символический доступ ко всем элементам микроконтроллера и перестраивает конфигурацию для каждой разновидности Intel 8051.